H.264量化反量化反变换过程
H264变换与量化

1. 简介为了进一步节省图像传输码率,需要对图像信用进行压缩,通常采用变换编码及量化来消除图像信号中的相关性及减小图像编码的动态范围。
变换编码将图像时域信号变换成频域信号,在频域中,图像信号能量大部分集中在低频区域,相对时域信号,码率有较大下降。
H.264对图像或预测残差采用4x4整数离散余弦变换技术,避免了以往标准中使用的通用8x8离散余弦变换、逆变换经常出现的失配问题。
量化过程根据图像的动态范围大小确定来量化参数,即保留了图像必要的细节,又可减少码流。
在图像编码中,变换编码和量化从原理上讲是相互独立的两个过程。
但在H.264中,将两个过程中的乘法运算合二为一,并进一步采用整数运算,较少编码的运算量,提高了图像压缩的实时性,这些措施对峰值信噪比(PSNR )影响很小,可以忽略不计。
H264的整数变换及量化过程如图1,其中,如果输入块是色度块或帧内16x16预测模式的亮度块,则将宏块中各4x4块的整数余弦变换的直流分量组合起来再进行Hadamard 变换,进一步压缩码率。
DCT 直流系数变换,内16x16预测模式下度块直流系数变换和图1 编码器中变换编码和量化过程2.离散变换H.264协议中的变换方式主要有3种:4x4残差变换(实际为整数DCT 变换);4x4亮度直流系数变换(16x16帧内模式下)(离散哈达玛变换);2x2色度直流系数变换(离散哈达玛变换)。
2.1 整数DCT 变换2.1.1 按理论推导,二维NxN 图像块的DCT 变换的公式实际为(公式1)由于A中的a, b, c都是实数,而图像块X中的元素都是整数,对实数的DCT,由于在解码端存在浮点数运算精度的问题,会造成解码后的数据的失配,进而引起漂移。
由于H.264中使用了较多的预测过程,甚至内部编码模式也依赖于空间预测。
因此H.264对预测漂移是十分敏感的,为此H.264对4x4 DCT中的A军阵进行了改造。
采用整数DCT技术,有效的减少了计算量,同时不损失图像的准确度。
H.264编码流程图

•编码器的核心是基于运动补偿预测(motion compensated prediction, MCP)。
有两条数据通道:前向通道和重建通道。
在前向通道中,编码器的输入是帧Fn,每帧画面是以16×16像素大小的宏块为单位组成的,每个宏块分别进行帧内或帧间预测编码。
在图中,帧间预测的参考帧被限定为前一帧Fn’,但是实际上,参考帧的数量可以多达五帧。
•当前宏块减去其预测值P得到残差宏块Dn,Dn经过块变换和量化得到量化系数X,对量化变换系数进行重排序和熵编码,得到的系数以及一些用于解码的附加信息(例如宏块预测模式、量化步长、运动矢量信息等)经由网络抽象层NAL (network abstraction layer)进行传输和存储。
•在重建通道中,宏块量化系数X被解码,用于构建重建帧(用于做预测)。
如图所示,系数被反量化、反变换后,产生差值宏块Dn’(由于量化过程引入误差,Dn’与先前的Dn并不一致)。
预测宏块P与Dn’相加构成重建宏块uFn’。
再引入滤波器减小块效应失真,得到重建的Fn’。
在编码器中引入重建通道的目的是为了使编码器和解码器使用相同的参考帧来构成预测宏块P,否则,预测宏块P在编码器和解码器中将不一致,这将造成误差积累或编解码器间的“漂移(drifting)”。
H.264中反变换反量化模块的硬件实现

【 关键词 】H. 标 准;反 变换 ;转置矩 阵;反量化 2 4 6 【 中图分类号 】T 9 98 N 1 .1 【 文献标识码 】A
I l nain o Q/ T fr H.6 mpe me tt fI I o DC o 2 4
DU o z ,ZHANG u ,YANG n Gu ~ e Ch n Ku ,W ANG i h a Zh - u
(ntueo colcrnc s gu nvri ,B rn 0 0 4 hn ) Istt fMire t i o Ti ha U iesy e ig 10 8 ,C ia i e o sf n t
维普资讯
1ga F&雌舯 Jie )il it T daL— 1
文 章 编 号 :0 2 8 9 (0 7 S — 0 3 0 10 ~ 6 22 0 ) 10 2— 3
H. 4 2 中反变换反量化模块的硬件实现 6
杜 国泽 ,张 春 ,杨 昆 ,王 志华
来实现 。
图 1 宏 块 内 的 4 4残 差块 扫描 顺序 x
解 码器接收子块的顺序分两种情况 : 1 当 1x 6宏 块 的 预 测方 式 为 1 x 6帧 内 预 测 的 ) 61 61 时 候 , 码 器 所 收 到 的 块 的顺 序 为 : 10 1 … ,5 解 一 ,, , 2 ; 2 当 1x 6 块 的 预 测方 式 为其 他 预测 方 式 的 时 ) 6 1宏
L ma u
Cb
C r
1 反 变换 和 反 量 化 算 法 分 析
1 在解 码 器 中 用 到 的 残差 解 码流 程 . 1 在 H2 4 V 标 准 中 , 了 简 化 硬 件 实 现 , 用 了 . / C 6A 为 采 整数 变 换 , 而 避 免 了浮 点 运 算 。同 时 , 变换 和 反 变换 从 在 中没 有 乘 法 运 算 ,所 有 的计 算 都 可 以用 移 位 和加 法 运 算
AVS和H.264的通用反量化模块设计

第1 期
陈小垒, A S H24 等: V 和 . 的通用反量化模块设计 6
4 7
数. 如果当前解码的是色度块或者帧内 1 ×1 6 6预 测模式的亮度宏块, . 4解码器在进行反量化之 H2 6
以及 Q 值的信息等, 具体命令见表 2
表 2 3 位命 令 2
前, 需要将直流分量进行反 H dm r aa a d变换, 恢复
宁波 大学 学报 ( 工版 )网址 :t : x b . uc 理 hp/ b ue . t / n d n 3
基金项目:浙江省自然科学基金 ( 00 5 Y19 72); 宁波市 自然科学基金 ( 09 107). 2 0A60 8 第一 作者:陈 小垒 ( 93 ), , 南开 封人,在读 硕士研 究 生,主要研 究方 向:数字 音视频 技术 . - alcexal8 50 2 . m 18 一 男 河 Em i hn i e 33 @16 o : oi c
3~ 1 : 2 3 l 序列层, : 3宏块层 2  ̄ 3 8 2
给 出了两者的异同点.
表 1 2 反量 化 算 法 比较 种
注 : VS时低 6 有效 . A 位
() 2 变长解码模块. 解析 2 种标准中的熵编码模
式 . 3描述 其 与反 量化模 块 的接 口设计 ,每次送 表
出整数 4 T变 换 的直流 分 量 . ×4DC J 表 1 分析 了 A VS和 H. 4 准 的反 量化算 法 , 2 标 6
位数 3 0 2 9
命令 IC 编码) P M( 1 V . :.6 : S 0H2 4 A
位数 2~ 27 6l ~
命令 QP色度) ( C P Ibt B (6 i) s QP亮度) (
H.264学习之DCT与IDCT

H.264/A VC 学习之整数变换与量化一、整数变换(Transform)1、为什么进行变换空间图像数据通常是很难压缩的:相邻的采样点具有很强的相关性(相互关联的),而且能量一般平均分布在一幅图像中,从而要想丢掉某些数据和降低数据精度而不明显影响图像质量,就要选择合适的变换,方法,使图像易于被压缩。
2、H.264对变换的要求(与传统DCT 变换的区别)H.264变换是建立在DCT 的基础上但又与传统DCT 不同,表现在:①它是整数变换,其中所有的运算都是整数运算;②如果按照标准进行反变换,将不会产生解码端与编码端的误匹配问题;③核心运算部分只用到加法和移位,不需要乘除运算;④变换中系数的缩放被融入到量化器中。
在本篇的学习中,后面将会讲述整个变换与量化及反变换与反量化过程,从而对以上四点有一个清晰的理解。
3、为什么要进行整数变换传统的变换中,残差解码包含了漂移的可能性,即编码与解码的不匹配。
而漂移的原因是逆变换不完全是整数运算。
传统的设计与IDCT 浮点实现的精度有关。
一方面,精度的选择适应特殊结构的灵活性;但另一方面,这灵活性的代价是预测中引入了漂移。
在线性DCT 变换中,Hx X =)21cos[(2).(Nkn n N c n k H H kkn +==它的缺点就是是无理数,即在进行直接变换或者逆变换时,可能不能确实得到同样的返回数据。
),(n k H 因此,用一个有整数输入的正交矩阵来代替H 是合适的。
且可以采用蝶形算法减少加法和乘法次数。
图1蝶形算法在本篇后文对变换公式的推导可以看到进行整数变换的可能性。
4、整数变换的过程(1)输入为预测残差,输出为准备进行熵编码的数据;(2)对16x16的亮度分量的16个4x4块进行DCT变换后,将每个4x4块的DC系数(还没有经过量化)提取出来,组成一个4x4的luma DC块,进行4x4的Hadamard变换;(3)对8x8chroma分量(色度分量)的4个4x4块进行DCT变换后,也将每个4x4块的DC系数提取出来,组成一个2x2chroma DC块,对其进行2x2的Hadamard变换。
一种基于FPGA高性能H.264变换量化结构设计.

一种基于FPGA高性能H.264变换量化结构设计摘要:H.264作为最新的视频编码标准具有很高的压缩性能,对它的研究具有重要的意义。
根据H.264的变换量化算法设计一种基于FPGA的高性能变换量化处理结构,该结构采用流水线操作和分时复用技术。
结果显示,该设计既节省了资源,又保证了效率;能够同时处理整个4× 4块的全部16个残差输入数据,并在236个时钟内完成对1个宏块的残差数据从输入到反变换输出重建值的完整变换量化过程。
它的处理速度和性能大大提高,可用于硬件加速。
关键词:H.264;变换;量化;FPGA0 引言H.264高效的编码效率是以其高复杂性为代价的,因此制约了它在高分辨率、实时处理等方面的应用。
而FPGA器件采用流水控制策略和并行处理方式,可为H.264复杂的编码模块提供硬件加速引擎。
变换量化模块在H.264编码算法中被频繁调用。
因此研究在尽量合理控制其资源消耗的前提下,提高变换量化模块的工作频率及处理数据的吞吐量,并完成变换量化一系列完整功能的变换量化结构具有重要的实际意义,也成为当前研究的首要问题。
H.264.变换是基于DCT的,其全部采用整数DCT变换,这样就避免了正变换和反变换的失配问题,既不丢失解码精度,也适合于FPGA硬件实现。
1 算法原理及分析1.1 变换算法及分析H.264变换是整数DCT变换,该算法实现了编码端和解码端反变换之间的零匹配,从而减少了解码精度的丢失。
通常H.264变换编码以4×4块为单位,核心变换矩阵如下:当核心变换矩阵中a=1时,为DCT正向变换矩阵Cf,;若将DCT正向变换矩阵Cf,中所有的2变为1,并保持所有符号不变,则变成Hadamard变换矩阵Hi;若将以上矩阵中所有的2变为1,并使a=1/2,保持所有符号不变,则为DCT反向变换矩阵CTi。
1.2 量化算法及分析H.264的分级标量量化器支持多达52个量化步长Qstep,用量化参数QP进行索引。
H.264视频编码介绍资料

H.264解码器
H.264采用的新技术
• H.264标准中诸如帧间预测、变换、量化、熵编码等基本功能模块与 前几个标准(MPEG-1, MPEG-2, MPEG-4, H.261, H.263)并无太大 • • • • • • • 区别,变化主要体现在功能模块的具体细节上。 分层设计 帧间预测编码 帧内预测编码 整数变换 量化处理 熵编码 环路滤波
TTS图解
• 如图所示,搜索步骤如下:
– 第一步:从搜索起点开始,以最大搜索 长度的一半为步长,在周围距离步长的 8个点处进行块匹配计算并比较,图中 用正方形表示,1号为该次搜索最优点。 – 第二步:将步长减半,中心点移到上一 步的最小匹配点,重新在周围距离步长 的8个点处进行块匹配计算并比较,图 中用圆形表示,2号为该次搜索最优点。 – 第三步:在上一步得到的最小匹配点的 中心及周围8个点处找出最匹配点,该 点即为所求,图中用菱形表示,3号为 该次搜索最优点
块的搜索与匹配
• 搜索起点的选择很重要。 • 块搜索算法:
①全搜索法FS ②三步搜索法TTS ③菱形搜索法DS ④六边形搜索法 注:有不少对上述方法的改进及新方法。
• 块匹配准则:
①最小绝对差MAD ②最小均方误差MSE ③归一化互相关函数NCCF ④求和绝对误差SAD
一种高效的H.264反变换反量化结构设计

Ke y wo r d s : H . 2 6 4 ; I n v e r s e T r a n s f o m( r I T ) ; I n v e r s e Q u a n t i z a t i o n ( I Q ) ; l o w p o w e r
MP E G ( Mov n i g P i c t u r e E x p e r t s G r o u p ) 和 V C E G
Uni ie f d c l o c k g a t i n g s c h e me nd a p i p e l i n e t e c h n o l o g y re a a l s o u s e d i n he t d e s i gn .Th e r e s ul t s s h o w t h a t t h e d e s i g n i n c ea r s e s he t s y s t e m t h r o u g h pu t a n d d r o ps he t po we r c o n s u mp t i o n nd a me e t s he t r e a l — t i me d e c o d ng i o f 1 0 8 0 i s t r e a m.
p e r f o ma r nc e a r c h i t e c t u r e . A r e c o r t i f g u r a b l e o n e d i me n s i o n a l I D C T( I n v e r s e D i s c r e t e C o s i n e T r a n s f o m) r r a c h i t e c t u r e o f
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
add4x4_idct( uint8_t *p_dst, int16_t dct[4][4] )//这里进行反变换+预测块的值 {
int16_t d[4][4]; int16_t tmp[4][4]; int x, y; int i;
for( i = 0; i < 4; i++ )//进行一维反DCT变换 {
Wr(i, j) = (Wr(i, Vj) (i, j) ) << (QP / 6) (i, j = 0...3)
#define DEQUANT_SHL( x ) \ dct[y][x] = ( dct[y][x] * dequant_mf[i_mf][y][x] ) << i_qbits//这是在进行 AC 量化系数的
static int quant_4x4( int16_t dct[4][4], uint16_t mf[16], uint16_t bias[16] ) {
int i, nz = 0; for( i = 0; i < 16; i++ )
QUANT_ONE( dct[0][i], mf[i], bias[i] ); return !!nz; }
nz |= (coef); \
} 跟踪代码:
i=0:
dct[0][i]=0x0006,
i=1:
dct[0][i]=0xfffc,
mf[i]=0x05d2, mf[i]=0x03a8,
i=2:
dct[0][i]=0x0016,
mf[i]=0x05d2,
i=3:
dct[0][i]=0x0030,
mf[i]=0x03a8,
参考《H.264 的整数 DCT 变换编码与量化过程》
标准在常规量化的基础上又考虑了两个问题:如何将变换过程中的点乘步骤一并考虑进来;如何避 免除法和浮点运算。
H.264
变换量化的全过程 为:对输入的
4×4
采样差值矩阵
X
进行前向变换 W
=
Cf
XC
T f
,然后
进行分级量化和缩放:
Z
=W
PF Qstep
。设 wij 为 C f
XC
T f
结果中位于第 i 行第
j 列的一个元素,则由(1.2)
与(1.5),它的量化值应为:
zij
=
⎛
round
⎜ ⎜
wij
⎝
PF f Qstep
⎞ ⎟ ⎟⎠
(1.6)
其中, PFf 为 E f 位于 (i, j ) 处的元素值。
Zij = ( Wij .MF + f ) >> qbits (最终量化计算公式)
这里跟踪的是 4x4 的量化过程,进行 DCT 整数变换后的 dct[4][4]= 0x0006 0xfffc 0x0016 0x0030 0x001f 0x0007 0xfff1 0xffe8 0xfff4 0xfffa 0x0008 0xfff8 0x000d 0xfff7 0x000f 0xfff4 nz=x264_quant_4x4(h,dct4x4,i_qp,DCT_LUMA_4x4,1,idx),这里 DCT_DUMA_4x4=2 H->quantf.quant_4x4(dct,h->quant4_mf[i_quant_cat][i_qp],h->quant4_bias[i_quant_cat][i_qp]) 接下来调用 quant_4x4(int16_t,dct[4][4],uint16_t mf[16],uint_t bias[16])
将 idx 子宏 块的非 零个数 保存在 mb.cache.non_zero_count[x264_scan8[idx]] 对应 的位置 上: h->mb.cache.non_zero_count[x264_scan8[idx]] = nz;//将量化的非零系数的个数存储起来
if( nz )
{
h->mb.i_cbp_luma |= 1<<(idx>>2);
dct4x4。 2.反量化过程:
参见《新一代视频压缩编码标准》—H.264/AVC 中 P219 页的残差变换系数的反量化:如果当前 处理的图像块是色度块或帧内 16x16 预测模式的亮度块,则反量化输出矩阵 Wr 中的直流系数 Wr(0,0)。对 DCT 交流分量或图像块不是前面情况的直流分量,计算如下:
H.264 正向变换量化和反变换反量化的实现框图:
H.264 的整数变换过程在 H.264 的整数变换中已分析 1.量化过程
量化是对变换后的系数进行量化。H.264 对变换系数采用等比例标量量化,其基本的前向量化公式 为
Zij
=
round
⎜⎛ ⎜ ⎝
Yij Qstep
⎟⎞ ⎟ ⎠
(.5)
( 其中 Zij 为量化后的系数值,Yij 为变换后的输入系数值, Qstep 为量化步长, round )表示取整。H.264
}
h->zigzagf.scan_4x4( h->dct.luma4x4[idx], dct4x4 );Zigzag 扫描(标准 P164),dct4x4 中存放的是量
化后的非零系数值,h->dct.luma4x4[idx]中存放的是按照 zigzag 扫描顺序后的非零系数值。 跟踪 zigzag 扫描函数:
tmp[i][0] = s02 + s13; tmp[i][1] = d02 + d13; tmp[i][2] = d02 - d13; tmp[i][3] = s02 - s13; }
这里是在进行一维反DCT变换,完成上面公式A中的 CiT (W ⊗ Ei )
s02表示第0行第i列的反量化系数和第2行第i列的反量化系数之和, d02表示第0行第i列的反量化系数和第2行第i列的反量化系数之差,tmp是一维反变换后的结果: matlab验证:
CiT = 一维反DCT变换结果:
CiT (W ⊗ Ei )=
与X264中tmp运行结果一样
for( i = 0; i < 4; i++ )//对一维反DCT变换后的结果进行二维反DCT变换 { const int s02 = tmp[0][i] + tmp[2][i]; const int d02 = tmp[0][i] - tmp[2][i]; const int s13 = tmp[1][i] + (tmp[3][i]>>1); const int d13 = (tmp[1][i]>>1) - tmp[3][i];
const int s02 = dct[0][i]+ dct[2][i]; const int d02 = dct[0][i]- dct[2][i]; const int s13 = dct[1][i]+ (dct[3][i]>>1); const int d13 = (dct[1][i]>>1) - dct[3][i];
h->zigzagf.scan_4x4( h->dct.luma4x4[idx], dct4x4 );
h->quantf.dequant_4x4( dct4x4, h->dequant4_mf[CQM_4IY], i_qp );
h->dctf.add4x4_idct( p_dst, dct4x4 );
反扫描过程。然后将反量化后的系数存放在 dct4x4 中,反量化后 dct4x4={0 0 0 e;其他全为 0} 3.逆 DCT 变换过程 h->dctf.add4x4_idct( p_dst, dct4x4 );//这里是在进行对反量化系数的反变换并获得重建块的过程, dct4x4是上一步反量化的值,p_dst就是反变换之后的亮度值。逆DCT变换原理如下图所示:
dct4x4={0,0,0,1;0,0,0,0;0,0,0,0;0,0,0,0}
h->dct.luma4x4[f]={0,0,0,0;0,0,1,0;0,0,0,0;0,0,0,0}//zigzag 扫描量化系数后存放的值。
h->quantf.dequant_4x4( dct4x4, h->dequant4_mf[CQM_4IY], i_qp );这是反量化,输入为量化后的
bias[i]=0x000e nz=0 bias[i]=0x0017 nz=0 bias[i]=0x0003 nz=0 bias[i]=0x0017 nz=1
i=4:
dct[0][i]=0x001f,
mf[i]=0x03a8,
bias[i]=0x0017 nz=0
i=5:
dct[0][i]=0x0007,
mf[i]=0x0247,
bias[i]=0x0025 nz=0
i=6:
dct[0][i]=0xfff1,
mf[i]=0x03a8,
bias[i]=0x0017 nz=0
i=7:
dct[0][i]=0xffe8,
mf[i]=0x0247,
bias[i]=0x0025 nz=0
i=8-f 依次类推,mf 和 bias 是常量,根据各小块的位置而不同。
X=
这是在 matlab 下进行两次反 DCT 变换后的值
而 d[0][i] = ( s02 + s13 + 32 ) >> 6 是对反变换后的系数进行了缩放取整处理吗? 跟踪代码后有:
d= 0x0002 0xfffd 0x0004 0xfffe 0x0002 0xfffd 0x0004 0xfffe 0x0002 0xfffd 0x0004 0xfffe 0x0002 0xfffd 0x0004 0xfffe 对比 对于缩放取整还不太明白,求指点。 反量化的残差值加上预测值作为重建块,用于预测