嵌入式学习小组
直播中

刘丽艳

7年用户 225经验值
私信 关注

针对硬件实现的H.264视频编码算法改进,不看肯定后悔

针对硬件实现的H.264视频编码算法改进,不看肯定后悔

回帖(1)

邝计嘉

2021-6-4 11:05:16
  从硬件实现的角度分析了H.264算法,重点研究了占用最多运算时间的预测部分的优化,给出了对帧内预测、哈达马变换以及运动估计算法的改进,通过简化运算复杂、效率不高的模块以及减少模块间数据相关性等,对硬件进行优化。通过对各种测试序列的仿真,证明改进是有效的。
  H.264最初是由ITU-T起草的,在未来将成为ITU-T和MPEG的联合标准。H.264因为提供了很高的编码压缩效率、友好的面向网络的接口,将成为下一代新的视频编码标准。但是编码效率很高的同时,其算法的复杂度也提高了四倍,这在很大程序上限制了它的实现。因此,必须针对硬件的实现做改进和优化。
  H.264的最初测试模型(JM)是为了取得高的编码效果而设计的。在这个测试模型中,有很多的算法需要很大的运算量,但是编码效率的提高却不多,并且很多模拟之间是数据相关的,这一点限制了用并行处理加速硬件的实现。
  以前有文章分析过这种新的视频编码的复杂度。但是这些研究都是通过软件的分析得到H.264算法的复杂度的。这些结果对在软件中的应用是精确的,但是当涉及硬件设计的并行处理时,就不再适用了。
  
  经过试验比较可以得出,在H.264硬件实现上的关键点是预测部分,因为此模块所占的计算时间几乎是总时间的90%。所以改进的重点在预测部分。
  1 H.264算法
  图1是关于一帧图像的帧内预测间预测的算法框图。如果采用帧内预测,帧间预测部分将不进行判断。在进行帧间预测时,会使用多帧预测和可变块大小的运动估计。编码模式选择部分在所有的预测模式中选择一个最佳的预测模式。
  
  预测之后用原始的输入帧和预测帧相减,得到残差数据块。对于亮度残差块做4%26;#215;4整数DCT变换,对于色度残差块的DC系数则进行2x2的整数DCT变换。对变换后的系数做扫描和量化处理后,再对量化后的系数进行熵编码,最终成为输出的码流。编码模式通过模式表,也会输入到熵编码器中。重建的循环过程包括反量化、反DCT变换和反块滤波。最后,将重建帧写入到帧缓冲器中,准备在以后运动估计中使用。
  因为在空间预测和时间预测上几乎花费了所有的计算能力,所以在JM 4.0上的算法改进主要是在这两部分上。在实现过程中,这两部分通过硬件实现,所以要针对硬件进行优化。
  实现编码器所用的硬件系统是基于宏块,也就是说编码器是对一个个连续的宏块进行操作。整个编码系统可以看作一个宏块的流水线,所以有可能在开始编码下一个宏块时,上一个宏块重建过程不定期没有完成,这就影响了流水线的进行。很多基于宏块的商业编码器正是采用这种硬件实现模式,所以处理好这个问题至关重要。
  2 帧内预测
  图1中的编码方框图与H.261、H.263和MPEG-4中的相似。H.264中包含了4%26;#215;4和16%26;#215;16两种帧内预测部分。帧内预测需要图像重建的像素值才能实现。在一个典型的基于宏块的系统中,只有在完成整个编码程序后,重建的像素值才能得到。这种数据之间的相关性,会给硬件的实现带来很大的困难。
  2.1 4x4帧内预测
  图2描述了4x4块帧内预测中数据的相关性。从a到p的像素值是从A到N及Q的像素值预测出来的。用大写字母表示重建的像素值。因为一个宏块由16个4x4的块组成,所以当前块没有完成编码之前是不能得到重建的像素值的。在JM中用了双通道算法实现这些块的编码。为了做一个4x4块的预测,在JM中需要进行变换、量化、反变换到反量化的过程。这对于一个硬件来说太复杂了。在现有的硬件水平上是不可能实现的。
  
  对这一点,需要对算法做如下改进:所有预测中所有的重建帧像素值用输入帧的原始值代替。通过这样的改进,4%26;#215;4的帧内预测和变换可以在宏块的流水线上顺利地实现。
  2.2 16x16帧内预测
  图3给出了16x16帧内预测的数据相关性。当前宏块的预测是基于重建帧中位于当前宏块位置上方的17个像素和左侧的16个像素的。因为对当前宏块进行预测时左边宏块的重建可能并未完全完成,当用到当前宏块位置左侧的那些像素时就用原始像素代替。
  2.3 编码模式选择
  按照前面所给出的改进算法,如果只是简单地用原始像素代替重建像素的话会造成编码模式选择的误差。图4给出了帧内编码的率失真改进的曲线,仿真的序列是“Claire”、10fps。从图4中可以看出,由编码模式选择的误差引起的PSNR下降是很明显的。原始像素是属于同一帧的,而重建像素经过帧间或帧内编码去除了冗余度,所以与重建像素相比原始像素有更高的相关性。因而用改进后的帧内预测算法产生的误差要比用原算法大得多。为了减少编码模式选择的误差,还需要对误差代价函数(error cost function)进行修改。现在的做法是增加一个误差项。这个误差项体现原始像素和重建像素之间的差值。因为量化参数(QP)能够影响原始像素和重建像素之间的不匹配,所以误差项的确定与量化参数值有关。在H.264中,随着量化参数的线性增加,量化对编码的影响是呈指数增加的。为了符合这种影响的增长趋势,误差项的基本形式确定了a/b(51-Qp),其中a和b是待定系数。如何确定a和b是影响误差消除的关键。
  在H.264中,每级Qp的增量是12%,所以理论上与之相匹配的参数b应该设置为1.12。但是误差代价函数的计算是在哈达码变换域中进行的,对每个系数的加权系数是不同的。而且变换后的系数的概率分布是不定的。所以参数b的设定不能用理论值,应该考虑用经验值来确定。
  通过实验仿真结果可以得出:对于4%26;#215;4帧内预测,a设为80、b设为1.07。在对不同的序列测试中,这组参数值的效果最好。从图4中看,改进后的帧内预测基本消除了模式选择误差,其PSNR的表现与原帧内预测算法接近。
  3 运动估计
  在H.264中采用了可变的块大小、1/4像纱和多参考帧的运动估计。在进行运动估计过程中,全局搜索的起始搜索点根据运动预测因子确定。对于整像素搜索,失真用SAD度量。如果需更好的效果,可以将SAD加上补偿项。虽然全局搜索运动估计有各种硬件结构支持,但是从硬件实现角度来看,在H.264中原始的搜索范围和运动预测因子的选择是不实用的。以下介绍相应的改进。
  
  3.1 搜索范围
  硬件实现运动估计过程中,一般会通过使用片内存储弥补片外存储带宽的不足。在图5中给出了一种典型的搜索区域数据重复使用方法,其中搜索范围是-16~+15。图5中左边的3%26;#215;3块表示当前宏块运动估计进行区域,右边的3%26;#215;3表示下一个宏块运动估计进行区域,
  
  它们的重叠区域的数据可以在两次宏块运动估计中重复使用,新增加的数据是最右侧的1x3区域。
  为了配合H.264这种重复使用数据的模式,搜索区域的起始点应该设置在(0,0)。只有当真正的运动矢量超出搜索范围时,这种改变才会造成视频质量的下降。
  3.2 运动预测因子
  在H.264中, 运动预测因子被用来确定运动矢量数据的比特数和计算运动矢量数据编码误差的补偿因子。补偿因子在整个运动估计过程中都会被参考以进行率失真优化。图6表示运动预测因子的相关情况。其中P1到P4是在当前宏块之前的宏块。当前宏块的运动预测因子通过对P1到P4宏块的运动矢量计算得到。但是因为在硬件中,以上基于宏块的处理过程是使用宏块流水时,P1的运动矢量可能是无效的。解决这个问题需要消除运动预测因子计算过程中相关性。具体就是计算过程中只使用P2到P4宏块的运动矢量。而改变的只是针对运动估计补偿因子的计算,因此改进算法仍然符合H.264标准。
  3.3 1/4像素精度的运动估计
  在H.264中,半像素运动估计是通过二维6抽头内插滤波实现的。二维滤波需要使用线路缓存实现转置运算,而线路缓存的硬件实现相当复杂。不过对编码环路中的另一个部分运动补偿时,该宏块的运动矢量已经确定。
  
  为了减少硬件代价,可以使用更简单的方法来产生1/4像素精度的数据。虽然用于运动估计与用于运动补偿的1/4像纱数据没必要相同,但是它们之间的误差还是会对编码效果产生影响。所以不能一味地简化内插过程。使用双线性内插代替二维6抽头内插滤波能够较好地解决这个问题。
  3.4 哈达码变换
  哈达码变换是用简单的变换估算变换后产生的比特数。在H.264的运动估计中用哈达码变换替代SAD,如果要求设计低代价硬件可以将这部分省略。
  4 仿真结果
  软件仿真是在“Foreman”、“grandma”、“salesman”和“carphone”序列上进行的,帧率是每秒10帧。出于硬件的考虑,不采用率失真优化模式,因为在JM4.0上没有采用码率控制,所以率失真曲线是对应Qp的变化产生的。率失真曲线如图7、图8。
  
  从仿真结果中可以看出,在改进的帧内预测算法中,PSNR的下降程序是很低的。在慢速运动序列的整像素运动估计中,PSNR几乎没有下降。对QME算法的改进会造成大约0.4~0.6dB的PSNR值下降。这种改进在低代价系统中是可以接受的。在64kbps的环境下,每一个序列的PSNR的下降不超过0.58dB。
  在基于宏块处理的系统中,采用上述的改进算法,就能实现并行处理。通过软件仿真的结果表明,改进帧内预测和整像素运动估计上的算法后,其PSNR值的下降几乎可以忽略。对低人代价系统来说,QME和哈达马变换的改进也量种可以考虑的方法。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分