王永霞,刘 博,张 刚
(太原理工大学信息工程学院,山西太原030024)
AVS是我国自主知识产权的第二代数字音视频信源标准,在2006年2月确定为国家标准并开始实施。它的编码效率与H.264相当,算法复杂度和硬件实现成本比H.264低。尤其是在码率和PSNR相当的情况下,AVS的编码速度比H.264高[1]。AVS视频编码标准采用一系列新技术去除数据传输和存储冗余,因此AVS视频编码过程包含帧内预测、帧间预测、DCT变换、和熵编码[2]等。其中,帧间预测中利用运动矢量来消除图像间的冗余;帧内预测中采用临近宏块相关性来消除图像内部的空间冗余;再通过对预测残差进行DCT变换和量化消除视觉冗余,最后利用熵编码有效减小编码冗余[3]。
由于AVS标准提出的时间较晚,所以FPGA实现的实例较少。由于FPGA具有集成度高和系统结构灵活的特点[4],本文设计选择FPGA为平台,在其上实现了AVS编码器的P帧部分。
完整的AVS编码器框图如图1所示,AVS编码帧分为3种:帧内预测帧(I帧)、前向帧间预测帧(P帧)和双向帧间预测帧(B帧)。下面介绍AVS编码原理[5]。
图1 AVS编码器框图
预测值是由前面已编码的参考图像经运动补偿后获得。为了提高预测精度和压缩比,实际的参考图像可从已重建并滤波的帧中选择,再与当前块相减产生1个残差块,残差块经整数变换(DCT)和量化[6](Quant)后产生一组系数,将这些系数熵编码(CAVLC),并与解码所需的一些头信息整合组成1个压缩后的比特流,经NAL(网络自适应层)传输和存储。为提供进一步预测所用的传输参考图像,利用编码器具有重建图像的功能,将残差图像经反量化(DE-QUANT)和反整数变换(IDCT)[7]得到新的残差块,将其与预测值相加,在本地得到一帧新的图像,经滤波后所得重建图像作为后续编码参考图像[8]。
根据AVS编码器编码算法的特点,P帧编码器包括MV预测模块、运动估计模块、变换量化模块和熵编码模块,再加上重构、残差和CBP头文件等一些外围电路构成。具体实现框图如图2所示。
图2 整体设计原理框图
MV预测模块:当前编码块由临近已编码块的MV预测而得到MVp。
运动估计模块:由于运动图像临近帧之间存在相关性,所以将运动图像分割成若干宏块,并经运动搜索得出当前编码块的最佳匹配块在参考帧中的位置,根据其准确位置即可得到空间相对偏移矢量MV。
变换量化模块:反量化、反DCT变换所得数据与参考块相加得重建帧。
编码模块:主要包括DCT变换和反DCT变换、量化和反量化、ZIG-ZAG扫描和CAVLC熵编码。DCT变换、量化后所得数据经ZIG-ZAG扫描后传送给熵编码,作为CAVLC熵编码的输入数据,CAVLC熵编码形成的码流前加入CBP头文件,得到最终压缩后的比特流8位对齐存入RAM中。
依据FPGA硬件平台的特点,采用硬件描述语言VHD语言设计。本设计的核心模块是MV预测模块、运动估计模块和编码模块。下面以P帧任一宏块为例介绍各个模块的功能和作用。
该模块主要完成MVP_x和MVP_y的获取。实现过程分4个状态完成,分别是空闲、接收、计算和传输,如图3所示。
图3 MV预测状态转移图
Stidle是空闲状态;Streceive是数据接收状态,加载左边块、上边块和右上边块这3个相邻参考块,分别用i_refa,i_refb,i_refc表示,及其相应运动矢量为 mva_x、mva_y,mvb_x、mvb_y,mvc_x、mvc_y;Stcalculate 是计算过程,具体步骤与AVS标准中MV预测过程[4]完全一致;Sttrans是MVP_x和MVP_y的输出过程。用ModelSim仿真,结果如图4所示。
图4 MV预测模块仿真结果(截图)
该模块需要从当前帧和参考帧中获取输入数据,从当前帧中得到当前块数据,从参考帧中获取搜索窗数据。在搜索窗中搜索得到SAD值最小的宏块,作为当前块的最佳匹配块,并用运动矢量的形式记录匹配块的空间位置。此过程主要包括运动搜索、SAD计算、最佳运动矢量和预测模式的获取。由于全搜索算法数据规则容易控制且易并行处理,所以本设计采用的搜索模式为全搜索;利用当前块数据与参考窗数据作绝对差再求和所得结果即为所需SAD值;根据最佳匹配块位置即可得到最佳运动矢量;预测模式包括8×8、8×16、16×8、16×16四种,SAD值最小的预测模式为最佳预测模式。由于最佳搜索模式为16×16的概率最大,因此,以16×16搜索模式为例介绍搜索过程。
实现过程包含空闲、数据接收、SAD计算和输出16×16搜索模式下的最小SAD值4个状态,SAD计算过程和状态转移过程用ModelSim仿真,结果如图5所示。ssad0_inter16×16o~ssad16_inter16×16o输出SAD计算结果其中,dataout_inter16×16o输出数据为16×16搜索模式下的最小SAD,mv_x和mv_y为此SAD值对应的运动矢量,stcurrent_inter16×16o为状态跳转。
图5 16×16运动搜索仿真结果(截图)
此模块由DCT变换、量化、反DCT变换、反量化和熵编码五部分构成。其中,DCT变换和反DCT变换都采用蝶形算法,每次处理8×8块的一行数据,且大量采用加法和移位,这样节省了大量的时间和空间。查表实现量化和反量化,表格存储在ROM中。DCT变换和量化后的数据通过DV_RAM传给熵编码模块,反量化和反DCT变换的数据形成重构残差块。熵编码主要实现ZIG-ZAG扫描、游程编码、码表的查询与切换、哥伦布编码和码流输出;此过程采用占用空间少的存储方法存储码表,并将码表查询与切换、哥伦布编码合并成流水线单元并行完成,省去了中间数据的存储,还将熵编码子过程并行完成,加快了处理速度。
编码模块输入数据是当前块与预测块对应数据作差得到的残差块数据,如图6所示,其中图6a是C代码中输入残差数据,图6b是ModelSim仿真中截取的输入数据流。经DCT变换、量化和熵编码后的码流如图7所示,其中图7a是从AVS算法C代码中截取的码流;图7b是从ModelSim仿真中截取的比特流。通过比较可以看出,2种方法输入数据和所得结果都完全一致,说明FPGA的P帧编码过程可正确输出比特流。
图6 编码输入数据仿真结果对比(截图)
图7 编码输出比特流仿真结果对比(截图)
本设计整个编码过程都是利用VHDL硬件描述语言,Xilinx ISE综合,仿真器选用Xilinx公司的xc5vlx110t-1ff1136,综合后最高工作频率为117.534 MHz下,资源占用情况如表1所示,实验结果表明资源占用少。
表1 资源利用表
CIF分辨率(352×288)YUV4∶2∶0的原始图像,在100 MHz的时钟频率下,编码一个16×16宏块所需周期数限定在=10 101内。由表1看出,本实验所占周期为7 670,完全满足实时编码需求。
一帧图像(以foreman图像为例)编码完之后形成的比特流,利用本实验室自主研发的解码器解码之后所得图像如图8所示,表明本设计编码过程完全正确。
图8 解码所得图像(截图)
本文在FPGA上设计与实现了AVS编码器P帧,经验证和仿真,能达到CIF分辨率下的实时编码。与同类其他研究相比,本文实现过程中采用并行和流水处理,保证了硬件资源的高效运行和最优利用,并且对AVS在FPGA上的发展和完善起到了良好的促进作用。
[1]张欣佑,张晓东,王浩.AVS编码与DSP实现的视频编码器[J].单片机与嵌入式系统应用,2006(12):16-18.
[2]李德斌,易清明,石敏.AVS解码器中码流分割模块的硬件实现[J].电视技术,2009,33(11):35-37.
[3]连云冠,石玥,夏军,等.AVS和H.264编解码性能的比较[J].电信科学,2007(3):18-21.
[4]邓琼,杨立志,刘力政,等.一种基于FPGA的AVS编码加速器的设计[J].微电子学与计算机,2008(6):97-100.
[5] GB/T20090.2—2006,信息技术先进音视频编码第二部分:视频[S].2006.
[6]黄学超,张卫宁.AVS量化和扫描硬件设计与实现[J].电气电子教学学报,2011(2):34-37.
[7]张璐,刘佩林.基于FPGA的AVS反变换的设计与实现[J].电视技术,2006,30(7):20-23.
[8]毕厚杰.视频压缩编码标准—H.264/AVC[M].北京:人民邮电出版社,2005.