H.264Baseline中ITIQ模块的硬件实现
2008-12-05
作者:黄志刚,雷 凯,李 挥
摘 要: 阐述H.264标准中的整数反变换运算及反量化" title="反量化">反量化。该硬件原型包含亮度直流系数的反哈达玛变换和反量化以及亮度系数和色度系数的反变换过程。根据蝶形算法,该硬件原型采用分时复用" title="复用">复用技术和全零信号,节省运算时间。仿真结果表明,该设计能满足高清数字视频的实时处理应用。
关键词: H.264;整数变换;反量化;分时复用(TDM)
H.264是由ITU-T的VCEG(视频编码" title="视频编码">视频编码专家组)和ISO/IEC的MPEG(运动图像编码专家组)共同开发的一个新的数字视频编码国际标准,它以提高视频编码在压缩效率和网络环境下更高的稳定性为应用目标。H.264在各功能模块的实现细节上引入一些新的技术,例如帧内预测、1/4精度的运动补偿、基于4×4块的整数变换等。这些措施使得H.264算法具有很高的编码效率,在相同的重建图像质量下,能够比H.263节约50%左右的码率[1,2]。在H.264 Baseline 中,反变换解码和反量化过程中采用了整数DCT逆变" title="逆变">逆变换,并将尺度调整融合到反量化过程中。由于反变换过程仅通过加法和移位操作完成,用整数运算代替浮点运算,不仅提高变换速度,也解决反变换的失配问题,同时反量化过程用乘法和移位操作代替除法运算,因而适合硬件实现。本文针对H.264Baseline高清视频解码芯片中ITIQ模块的设计进行论述及硬件实现结构。
1 H.264的反量化和反变换
反量化公式如式(1)所示:
其中Wij′为反量化后的系数,将作为反变换的输入,Zij为反量化的输入,Qstep为量化步长,PF为缩放因子,系数64用来消除取整误差。H.264标准不直接说明Qstep或PF,而是根据0≤QP≤5和每个系数位置,定义参数Vij=(Qstep×PF×64),QP(量化参数)每增加6,Qstep增大一倍。公式(1)改为:
Vij为缩放比例因素。QP与Qstep的对应关系、Vij与QP%6以及像素位置关系可查表获得[3]。4×4块亮度DC系数在解码器里,先是一个反哈达玛变换,然后是反量化。反哈达玛变换:
反量化:
其中(i,j=0,…,3),V(0,0)对应于Vij位置(0,0)的缩放比例因素,floor( )为取整函数。
反变换:
这是H.264中所用到的整数反变换公式,其变换核CMT W′Cm仅用加减法(和右移)即可实现。中间的点乘操作可以合并到前面的反量化过程中去,由于把变换和量化融合在一起,因而有效地减少了压缩编码的运算量[4]。
2 硬件设计
由于整数DCT逆变换与亮度直流系数哈达玛逆变换在算法上有许多共同点,并且两者在时间上也不会重叠,所以在硬件设计上采用模块复用。相关联模块结构如图1所示,ENTR模块(entropy decode)是H.264 decode IP 中的熵解码模块。INT模块包含帧内预测和帧间预测,它把反变换后的残差值与预测值相加且移位后可得重构的图像像素值。ENTR模块把亮度直流系数传给ITIQ 模块做哈达玛反变换和反量化,ITIQ再把反量化后的亮度直流系数传回ENTR模块。ENTR模块把反量化后的亮度(DC系数和AC系数)和色度(DC系数和AC系数)数据存入CB模块中。CB模块再把数据传给ITIQ模块做反变换,ITIQ模块把结果又传给CB模块,CB模块再把反变换后的残差传给INT模块。色度DC系数的哈达玛反变换和反量化及亮度(DC系数和AC系数)和色度(DC系数和AC系数)的反量化在ENTR模块中完成。
2.1 CB模块的设计
由于反变换分为水平与垂直变换,做完水平变换的数据要先存储,然后再根据存储的数据做垂直变换。CB模块的功能是存储和控制,总共存储两组数据,每组256bit。ENTR模块把经过反量化后的亮度(DC系数和AC系数)和色度(DC系数和AC系数)的数据存入CB模块中,CB模块再把数据传给ITIQ模块做反变换,ITIQ模块做完后把结果又传给CB模块,CB模块再把反变换后的残差给INT模块。CB模块有一计数信号,ENTR模块每写入一组数据加1,当计数信号为2时发信号给ENTR模块不能再写入数据,INT模块每读完一组数据时计数信号减1。CB模块发信号给ITIQ模块启动反变换,当反变换完成时CB模块发信号给INT模块允许读取。在中低码率编码过程中,运动补偿参差值经过整数变换、量化运算后,常常会出现大量的零系数,尤其低速运动的视频序列出现的全零块更多。全零块不需做反变换,可节省运算时间,由ENTR模块发全零块信号ENTR_CB_zero给CB模块,CB模块直接把数据传给INT模块,而省去反变换运算这一步。这种情况要用信号itiq_do_zero控制:当ITIQ模块正在做反变换时,ENTR模块发全零块信号给CB模块,全零数据不能马上传给INT模块,要等待前面的数据传给INT模块后,才能轮到全零块数据。因此当CB_ITIQ_enable为1时,将itiq_do_zero置1,当反变换完成后再置0。刚好只存储两组数据,可采用3信号分别对应3模块来控制数据地址的翻转,起始值都为0。如信号0表示两模块连接0地址,信号1表示两模块连接1地址。ENTR模块每写入一组数据entr_cb_flag加1,entr_cb_flag为0表示数据写入cb[0],entr_cb_flag为1表示数据写入cb[1]。CB模块每完成一次反变换itiq_cb_flag加1,如果itiq_do_zero为1,则在反变换完成后下一时钟周期" title="时钟周期">时钟周期itiq_cb_flag再加1,itiq_cb_flag为0表示数据写入cb[0],itiq_cb_flag为1表示数据写入cb[1]。INT模块每读取完一组数据int_cb_flag加1,int_cb_flag为0表示从cb[0]中读取数据,int_cb_flag为1表示从cb[1]中读取数据。itiq_finish_cnt信号控制INT模块是否读取,当它为1或2时发一读信号给INT模块。当反变换做完时itiq_finish_cnt加1;当ENTR_CB_
zero为1且itiq_do_zero为0时itiq_finish_cnt加1,否则要等反变换做完后下一周期再加1; INT模块每读取完一组数据则减1。
2.2 ITIQ模块的设计
ITIQ硬件结构如图2所示。基于Hadamard反变换和反向整数DCT变换有很多相似之处,并且调用本模块不会同时出现,本模块进行功能复用,根据启动信号选通不同的数据进行运算。输入数据一组为256bit,对应4×4块排列如表1所示。本模块根据面积与速度的协调,采用8个加法器(具体设计如表2所示),一次读取64bit进行运算。总共有8个状态,前4个状态是水平变换,后4个状态是垂直变换。在本模块中采用的算法是蝶形算法,具体算法如图3所示。在反变换水平变换时,a2=r2-r0中r2要先右移一位再减r0,a3=r2+r0 中r0要先右移一位再加r2。
软件模型中反量化系数可通过查表得到,因它是相应固定的值,在硬件中可根据输入当前量化系数直接赋相对应的值。哈达玛逆变换得到的数据再与相对应的反量化系数相乘。当QP值小于36时,在软件模型中的加法可简化为进位则加1(当往右移4位时,如第4位为1则移位后结果再加1,依此类推),其他情况则将相乘后的结果进行相对应的左移。
状态机图如图4所示。状态说明:Idle为起始状态,如果无解码要求(即En=0),则状态机停留在Idlie状态,否则状态机跳转到S1状态。En信号为反变换或哈达玛逆变换启动信号。
S1:读取data_in[63:0]共64bit数据做蝶形运算,En=1跳转到S2状态,否则跳转到Idlie状态。r0=data_in [63:48],r1=data_in[47:32],r2=data_in[31:16],r3=data_in[15:0]。
S2:读取data_in[127:64]共64bit数据做蝶形运算,En=1跳转到S3状态,否则跳转到Idlie状态。r0=data_in[127:112],r1=data_in[111:96],r2=data_in[95:80],r3=data_in[80:64]。
S3:读取data_in[191:128]共64bit数据做蝶形运算,En=1跳转到S4状态,否则跳转到Idlie状态。r0=data_in[191:176],r1=data_in[175:160],r2=data_in[159:144],r3=data_in[143:128]。
S4:读取data_in[255:192]共64bit数据做蝶形运算,En=1跳转到S5状态,否则跳转到Idlie状态。r0=data_in[255:240],r1=data_in[239:224],r2=data_in[223:208],r3=data_in[207:192]。
S5:读取64bit数据做蝶形运算,En=1跳转到S6状态,否则跳转到Idlie状态。r0=data_in[207:192],r1=data_in[143:128],r2=data_in[79:64],r3=data_in[15:0]。
S6:读取64bit数据做蝶形运算,En=1跳转到S7状态,否则跳转到Idlie状态。r0=data_in[223:208],r1=data_in[159:144],r2=data_in[111:96],r3=data_in[31:16]。
S7:读取64bit数据做蝶形运算,En=1跳转到S8状态,否则跳转到Idlie状态。r0=data_in[239:224],r1=data_in[175:160],r2=data_in[111:96],r3=data_in[47:32]。
S8:读取64bit数据做蝶形运算,En=1跳转到S1状态,否则跳转到Idlie状态。r0=data_in[255:240],r1=data_in[191:176],r2=data_in[127:112],r3=data_in[63:48]。
本设计采用的硬件平台是Synopsys公司的VCS,整个设计在Unix环境下进行。在PC机上进行整个IP环境仿真,在QCIF格式下,ITIQ模块完成一个宏块的运算操作需要694个时钟周期。在D1格式下,ITIQ模块完成一个宏块的运算操作需要570个时钟周期。能够满足高清解码的要求。在FPGA上仿真,在最高频率100MHz下解码比较流畅。目前该芯片正在流片中。
参考文献
[1] SCHAFER R,WIEGAND T,SCHWARZ H.The emerging H.264/AVC standard.EBU technical review,2003,(1).
[2] 王嵩,薛全,张颖.H.264视频编码新标准及性能分析[J].电视技术,2003,(6).
[3] H.264/MPEG-4 Part 10 White Paper- transform and quantization.
[4] 毕厚杰.新一代视频压缩编码标准-H.264/AVC[M].北京:人民邮电出版社,2005.