解码优化范文
解码优化范文(精选7篇)
解码优化 第1篇
随着“平安城市”等项目建设,人们对于实时视频画面的显示要求越来越高。实时视频画面的显示质量与前端的视频数据采集设备、数据的编码、数据的传输以及数据的解码都有着密切的关系,每种编码格式都有其自身的算法,经数据解码还原算法后,视频画面显示质量还可以从色彩空间转换与图像缩放显示进行画面优化。
1 色彩空间转换优化
视频解码后得到的图像是由亮度Y,红色信号差Cr和蓝色信号差Cb组成,YUV格式为YUV420,即色度分辨率是亮度分辨率的50%。YCrCb到RGB的转换公式如下:
为了避免浮点运算和乘法运算,可以采用查表法由YUV直接得到RGB。Y,U,V的取值范围都是0~255,但是一个[256][256][256]的表格需要16兆的空间,空间要求太大,是非常不利于实际应用的,所以采用查表法必须先经过处理。
首先将三维表的查找转变为四次二维表的查找,即:
通过处理,只需要4个[256][256]的表格,占用空间256K。在此基础上,还可以进一步缩减空间,因为N2070每个点的颜色由16位表示,格式为565,最终只会取R的前5位,G的前6位,B的前5位构成一个点的颜色,因此对于每个R,G,B的值,只需要6 b的精度即可。具体做法是在查表前将Y,U,V的值除以4,即右移两位,得到R,G,B的值后将其乘以4,即左移两位,就得到了真实的R,G,B的值,误差部分会在整合时被忽略掉,可以将左移计算后的结果放在表格中。经过处理,Y,U,V的取值就只有0~64,4个[64][64]的表格只需要16K的空间。最终转换过程如下:
2 图像缩放显示优化
为了保证图像缩放的效果,采用二次线性插值进行图像缩放,其原理如图1所示。
现在要计算缩放后图像Dx,Dy像素点的值,设原始图像的大小为(SWidth,SHeight),缩放后图像的大小为(DWidth,DHeight),根据比例关系可以得出Sx=Dx*SWidth/DWidth,Sy=Dy*SHeight/DHeight。
由于Sx,Sy为浮点数,该位置的像素值需要根据周围的四个像素值插值得到。通过Sx,Sy的整数部分可以找到最左上角的整像素位置A,根据Sx,Sy的小数部分确定该插值点离ABCD各点的远近。
设u=Sx-floor(Sx),v=Sy-floor(Sy),floor(x)返回小于x的最大整数,u,v实际上就是Sx,Sy的小数部分。二次线性插值的公式为:
展开公式:
由于u,v是浮点数,计算过程中会导致速度很慢,必须要将浮点计算转换为整数计算。在插值过程中,由于Dx,Dy是以1为单位递增的,设xinc=((SWidth-1)≪16)(DWidth+1),yinc=((SHeight-1)≪16)DHeight+1,插值的实际位置则根据xinc和yinc来递增。xinc,yinc的高16位表示Sx,Sy的整数部分,用于查找A点的位置;xinc,yinc的低16位表示Sx,Sy的小数部分,用于计算u,v的值。
设src x为xinc在一行内的累计递增,src y为yinc的累计递增,则A点在源图像中的位置为:pA=src[0]+pitch*(src y≫16)+(src x≫16)。为了避免计算u,v的乘积时导致溢出,将小数部分的计算精度降低为8位,此时v=(src y&0xFFFF)≫8,u=(src x&0xFFFF)≫8。插值过程变为:
为了提高计算速度,对色度不进行插值操作,因为亮度像素点每22矩形内的4个点共用一个色度值,而且相邻的色度具有很强的连续性,如图1的插值点(Sx,Sy),也许ABCD四个点刚好共用一个色度值,这时就没必要进行色度插值;也许AB属于一个色度值,CD属于另一个色度值,但由于两个色度值相差很小,也可以不进行插值,对于画面的影响可以忽略不计。
3 结语
在实际应用中,视频画面显示质量随着前端数据采集、数据编解码和传输将不同程度的受到影响。通过色彩空间转换与图像缩放方面进行画面优化,视频画面显示质量有明显提升,具有较强的实用性。
摘要:根据社会发展的需要,智能监控的运用范围日益广泛,人们对于实时监控视频画面的显示要求也越来越高。视频画面的显示质量与数据采集、数据编码、数据传输、数据解码等多方面因素有关,而从色彩空间转换与图像缩放显示进行画面优化,可以有效地提升视频画面显示质量。
关键词:视频,色彩空间,图像缩放,分辨率
参考文献
[1] 马思伟.基于率失真优化的视频编码研究[D].北京:中国科学院研究生院,2005.
[2] 刘冠群.3G环境下手机智能视频监控的设计与实现[D].成都:电子科技大学,2010.
[3] 于宗良,朱秀昌.分布式视频编码技术的研究现状及其展望[J].信号处理,2007(1):156-158.
[4] 卿粼波,何小海,吕瑞,等.基于比特概率优化算法的分布式视频编码[J].光电子·激光,2008(5):48-51.
[5] 胡勋,赵建涛.基于SIP的视频会议系统的设计及应用[J].电力科学与工程,2009(11):198-200.
[6] 董理濛,张永波,郭德春,等.一种快速的块匹配运动估计新算法[J].科学技术与工程,2010(34):128-130.
[7] 苏艳艳,王瑞阳.数字多路视频监控系统的设计与实现[J].计算机应用与软件,2005,22(6):59-61.
[8] 李岩峰,吴渝,徐世龙.基于综合特征分析的视频关键帧检索[J].电视技术,2008(7):235-238.
码字前缀分组的CAVLC解码优化 第2篇
随着数字视频以及多媒体技术的发展, 视频编解码标准也在不断改进。2003年推出的H.264视频编解码标准具有编解码效率高、网络适应性好、抗误码能力强等优点。与以往的视频编解码标准相比, 在相同的码率下, 它能够获得更好的编码效率和最好的图像质量, 因而被普遍认为是最有影响力的行业标准。但其优越性能的获得是以计算复杂度的大大增加为代价的, 据估计编码的计算复杂度大约相当于H.263的3倍, 而解码的复杂度也大约相当于H.263的2倍。
H.264的视频编码层采取的编码框架仍然是传统的混合编码框架。在编码模块中定义了两个熵编码方法:一个是基于上下文自适应的可变长编码 (CAVLC) , 另一个是基于上下文的自适应二进制算术编码 (CABAC) 。CAVLC用于对亮度块和色度残差块的编码, 在传统变长编码的基础上, 通过引入内容自适应模型, 定义了多组结构不同的码表, 根据视频内容, 动态地进行码表切换, 提高编码效率。在CAVLC中, 共有4个变长表格约450个码字可供选择, 其运算量约为解码总运算量的13%左右。
2 CAVLC编解码原理
CAVLC是变长编码VLC的一种改进方法。与以往标准采用的VLC编码不同, H.264采用4×4小块模式进行整数DCT变换后, 系数分布表现为非零系数一般集中到低频分量, 高频分量常常趋近于零, 而且一个块内有非零系数, 最先出现在一连串零后面的第一个非零系数通常是±1, 因此可以将连续的±1表示出来。CAVLC编码过程如下:
(1) 对非零系数的数目 (TotalCoeffs) 以及拖尾系数的数目 (T1S) 进行编码;
(2) 对每个拖尾系数的符号进行编码;
(3) 对除了拖尾系数之外的非零系数的幅值 (Levels) 进行编码;
(4) 对最后一个非零系数千零的数目 (Total Zeros) 进行编码;
(5) 对每个非零系数前零的个数 (RunBefore) 进行编码;
在解码时, 按照同样的步骤, 依次解码出每个4×4块的TotalCoeffs、T1s、TotalZeros和RunBefore等数据。在解码中, 首先根据输入的参数求得输入数据的块类型、输入数据的个数等参数, 这是初始化工作。随后求变量NC, 并且根据变量NC的值选择所要查的表格, 其中变量NA表示与当前块相邻的左边块中非零系数的个数, 变量NB表示与当前块相邻的上边块中非零系数的个数。Coeff_token是一个句法元素, 以这个句法元素为入口参数, 可查表求得非零系数的个数、拖尾系数的个数。由解码原理以及解码流程可以看出, 在H.264中CAVLC的解码需要全搜索来遍历整个码表, 因而解码效率比较低, 在实际的应用中不易满足实时性的要求, 对此有必要对解码器进行一定的优化来提高解码速度。
3 查表算法分析及改进
在CAVLC解码过程中, 除level以外, 其余4个元素的解码都是利用了反向查找给定码表, 以得到解码输出。由于变长编码的码长是不定的, 而解码输入的码流是连续的, 中间并没有间隔符。反向查表需要对输入的码流的字长和数值同时唯一确定才能得到正确的输出。解码时对码流长度的判断大大增加了解码的困难。通常解码是通过不断的搜索和判断最后得到码字和码长的, 这样解码的时间就根据码长的不同而变化很大, 由于码长较短的码字出现概率更大, 总是优先判断短码长的符号, 所以码长较大的码字解码时间也更长。
在CAVLC的解码器的研究中, 查表方法的改进已经成为热点。目前主要有以下这些方法:
(1) 根据二维码表构造哈夫曼树, 将二维表结构转换为哈夫曼树之后, 避免了对整个码表进行遍历, 转变为在哈夫曼树查找相应的码字。
(2) 分层次查表法:将原来的大表格分成许多小表格。出现概率高的就是码长较短的放到表格0中, 出现概率低也就是码长较长的放到更高序号的表格中。如果输入的码字比在当前表格中, 则会到下一序号的表格中查找, 直到找到为止。由于共有62种输入情况, 因此这种方法具有可行性, 但这种分组方法需要对输入的码字进行多次搜索和判断, 延长运行时间, 不适用于实时处理的情况。
(3) 基于码流中1前面0的个数m, 通过下面公式 (1) 和 (2) 来计算得到非零系数的数目 (TotalCoeffs) 和±1的个数 (T1) 。这种解码方法的缺陷是无法立刻得到码流长度, 不能及时将码流长度反馈, 并且m=4时, 必须采用传统方法查表, 增加了解码复杂度。
结合已有的解码方法, 本文在上述方法的基础上, 提出一种新的解码方法。基于输入码流中第一个1以及它前面的0的个数M来对码表进行重建。在确定了M后, 根据新建的码表再读入1后面的N比特, 就可以直接读出码长和系数值。
以coeff_token表为例, 来说明这种快速查表方法。
首先在解码前, 要根据当前块的条件, 对多个码表进行选择。在编码时, 考虑了块与块之间的相关性, 对每个块采用的编码表参考了与之相邻的左边块和上边块, 计算判断条件NC, 如果当前块的上一个和左边一个块都不存在, 则NC=0;如果当前块处在I帧的宏块内部预测模式下, 则NC=16;在其它情况下, N (A) 和N (B) 分别是这两个块的非零系数的个数。当A或B属于帧内编码的宏块或色度宏块时, N (A) 或N (B) 不包括A或B的DC系数, 而仅仅包含AC系数。如果相邻块A和B同时存在, 则NC=[N (A) +N (B) ]/2, 否则NC=N (A) +N (B) 。当0<NC<2, 2<NC<4, 4<NC<8时分别对应于三个不同的表, NC>8时, 按特殊情况处理, 不需要查表即可以编解码。表1为coeff_token表中, 2<NC<4时的部分码表。
在表1中, 第一行表示拖尾系数 (T1s) , 第一列表示非零系数个数 (TotalCoeffs) 。在解码时, 根据M的值可以将码表重新划分得到新的码表表2, 使用此表可以直接得到T1S和TotalCoeffs的值。
使用这种新的码表来解码系数Coeff_token, 可以较快的判断出码长和TotalCoeffs、T1S的值, 避免了重复判断所带来的时间延迟, 加快了处理速度, 而且这种方法不存在例外, 所有62种输入情况都包含在内, 是一种切实可行的解码方法。系数Total_zeros、Run_before重建码表的方法与此类似。通过对码表的分析, 我们将第一个1以及它前面的连续的0这M+1比特作为码字的前缀, 则码字的长度可以迅速的得到为M+1+N。
在CAVLC解码中, Coeff_token码表根据NC值的不同取值范围被分成了5张不同的表格, 具体使用中按照输入NC值的不同采用不同的方法。当NC取值在0≤NC<2、2≤NC<4和4≤NC<8时, 在读出第一个1后, 最多继续读入3个比特的码流即可得到正确的输出;而当NC≥8时, 由于是定长的码表, 只需一次性读入6个比特, 而不需要判断第一个1的输出。
综合上面的介绍, 可知此算法的解码过程如下:
(1) 根据NC的取值范围, 确定所要查找的码表;
(2) 将码流读入, 判断码流中第一个1的位置, 确定1前面0的个数M, 得到码字的前缀码;
(3) 根据M的值, 在优化后的码表中查找确定下一步需要读入的码流位数N;
(4) 根据读入的N位信息来确定系数的码长M+1+N和具体的系数值。
4 实验结论
通过分别对Foreman、Mobile、Salesman (QCIF格式, 30帧) 三个序列的测试, 使用优化后的查表法, 解码速度有了显著的提高, 且图像的质量不会下降。
5 结束语
本文通过对CAVLC编解码原理的介绍, 在现有查表方法的基础上提出了一种基于码流中第一个1的位置对码表进行重建的方法, 加快了解码速度, 节省了内存空间, 是一种可行的方法。
摘要:文章介绍了CAVLC编解码的原理并提出了一种快速查表方法。这种方法对于解码器码流输入, 首先得到第一个1的位置, 并把第一个1以及它前面的0作为码字的前缀。然后根据不同的码字要求, 动态地选择进一步需要读入的码流位数。通过一次查表就可以得到正确输出, 有效提高解码速度。
关键词:H.264,CAVLC解码,码表重组,码字前缀
参考文献
[1]毕厚杰.新一代视频压缩编码标准--H.264/AVC北京:人民邮电出版社, 2005
[2]刘峰.视频图像编码技术及国际标准北京:北京邮电大学出版社, 2005
[3]薛全, 张颖, 刘济林等.基于变步长分组的H.264系数码表优化.电路与系统学报, 2006, 11 (3) :115-117.
[4]Gary J.Sullivan, "Video Compression-From Concepts to the H.264/AVC Standard, "Pro-ceeding of the IEEE, vol.93, No.1, Jan.2005
解码优化 第3篇
1 ARM Cortex A9架构及NEON处理器简介
1.1 ARM Cortex A9架构
ARM Cortex A9是高性能ARM处理器, 可实现各种基于ARM v7体系结构的应用和功能。Cortex A9处理器具备高效的、长度动态可变和多指令执行超标量体系结构, 提供采用乱序猜测方式执行的8阶管道处理器。在消费类、网络、企业和移动应用中, Cortex A9都展示出了极高的性能和效率。
Cortex A9微体系结构既可以配置成可伸缩的多核处理器, 也可以配置成单核处理器。可伸缩的多核处理器和单核处理器支持多种L1高速缓存配置, 同时支持可选的L2高速缓存控制器, Cortex A9的灵活性保证了对各种应用领域和市场的适用性。
1.2 NEON多媒体处理器简介
Cortex-A9的NEON处理器设计是基于ARM v7的SIMD (Single Instruction Multiple Data) 和矢量浮点计算VFP v3 (Vector Floating-Point) 指令集进行的, 在不同的芯片设计中NEON组件是可选的。在多媒体处理领域, 如音视频编解码器、图像处理和语音信号处理, 以及通信领域, 如基带信息处理, NEON处理器都有自己独特的优势。
NEON处理器是ARM Cortex A系列处理器的128位SIMD (单指令多数据) 体系结构扩展, 它具有32个64 bit位宽寄存器或者16个128 bit位宽寄存器, 所有的寄存器都被视为具有相同数据类型的一个向量, 支持多种数据类型, 包括有符号和无符号数据类型, 也包括单精度浮点数据类型。另外, NEON指令都是针对相同数据类型的通道处理的, 即所有通道执行相同的指令操作。
图1是NEON寄存器的视图, 16个128 bit的4 byte寄存器Q0~Q15, 或者32个64 bit的双字寄存器D0~D31。注意NEON寄存器和ARM寄存器存在区别, 但NEON会采用ARM的寄存器作为地址寄存器进行间接寻址。
图2是NEON单个寄存器组的元素分配, 表示了NE-ON可支持的操作类型数据。包括有符号或者无符号的8 bit、16 bit、32 bit和64 bit的整型数据 (I8, S8, U8, I16, S16, U16, I32, S32, U32, I64, S64, U64) 或者单精度浮点数据 (F32) 。
NEON处理器同时支持内存非对齐访问和对齐访问, 对齐访问的速度更快, 可通过指定@bits来确定地址对齐的位数, 如@32, @64, @128等。数据加载和存储支持交错打包方式, 即支持有2、3、4个通道的交错数据加载和存储。除此之外, 还能在标量和向量间进行数据的移动, 但速度较慢。同时, NEON也支持单精度浮点的数据运算。
2 NEON编程优化方法
NEON编程优化方法通常包括如下几种手段:
1) 编写汇编代码
最直接使用NEON的方式是编写NEON汇编代码。相对于其他的DSP编程语言, NEON的编写并不复杂。但要写出高质量的, 能对性能有较大优化的汇编仍然具有一定难度。在对一个模块进行NEON汇编优化之前, 需要先确保对模块的算法优化做到了最佳, 特别是按照NEON的并行处理指令思路来改写模块, 要将模块改写成使其尽量满足NEON的并行处理框架。完成了算法优化后, 即可动手开始编写汇编代码。
和传统的Intel X86汇编、DSP汇编相同, NEON汇编也涉及到出栈入栈操作, 这要求汇编代码编写者小心对待, 以免因为入栈和出栈不一致导致程序运行错误。
2) 采用内联函数 (Intrinsic Function)
内联函数可以被C和C++的程序所调用, 可自动进行类型检测和寄存器分配。内联函数在被编译器编译的时候, 它会被转化为有序的NEON指令进行执行。简单的看, 采用内联函数可以实现在高级语言 (如C/C++) 中直接使用低级语言 (如NEON) 的功能。内联函数最大的好处是程序员不用去接触汇编, 可以减小优化的难度。但采用内联函数获得的优化效率没有直接使用汇编代码获得的优化效率高。
3) 自动矢量化
ARM编译器可针对C/C++代码进行自动矢量化操作, 这样做的一个好处就是程序员不需要编写汇编代码或者使用内联函数, 即可实现NEON优化的效果。用C进行编程同时也保证了在不同平台上的兼容性。
在C语言的for循环内部使用自动矢量化技术可获得较好的性能优化结果。假设在执行循环体操作时, 每次循环内部执行的操作相同, 则可以采用自动矢量化技术, 将多次循环的操作尽可能转换成一次操作完成。在一次操作中, 有多个计算单元按照相同的操作步骤来完成多次循环执行。
4) 使用第三方的NEON库 (NEON Library)
ARM公司本身对常见的算法进行了NEON优化, 并封装成Library。如针对多媒体跨平台API的OPEN-MAX[1], ARM提供了针对OPENAM开发层 (OPENMAX DEVELOPMENT LAYER) 的优化实现。在开源代码社区, 有不少开发者和感兴趣的人提供了很多基于NEON优化的library, 这些Library覆盖了音视频编解码和数字信号处理的常见模块。一个著名的NEON代码优化社区是Project Ne10[2]。
3 H.265解码器NEON优化
本文采用开源的OPENHEVC[3]作为H.265[4]解码器进行优化。相对于H.265标准的参考实现HM[5], OPEN-HEVC解码器同样符合H.265标准的语法语义, 其实现更为简练和高效。解码器主要模块包括熵解码、反量化、反变换、帧内预测、帧间运动补偿 (MC) 、去块效应环路滤波 (Deblocking) 和样本自适应偏移量滤波器 (SAO) 等。其解码器框图如图3所示。
在OPENHEVC解码器中, 由于熵解码模块的串行程度高, 条件分支过多, 不适合采用NEON进行优化, 该模块可用ARM指令和Thumb指令代替NEON指令进行优化。对于其他模块, 如整数反余弦变换 (IDCT) , MC和Deblocking等, 模块算法中对于不同像素点的运算过程可以高度并行, 并且运算步骤基本一致, 适合采用NEON优化。因此对这部分进行了充分的NEON优化。由于优化的模块较多, 这里仅以IDCT为例, 来说明NEON优化的思路及具体实现。
H.265编码标准中对变换单元 (Transform Unit, TU) 通过使用整数正弦变换 (DST) 和整数余弦变换 (DCT) 将时空域信号转换为频域信号, 再进行量化, 达到压缩的目的。相应地, 在H.265解码端, 需要进行整数反正弦变换 (IDST) 和整数反余弦变换 (IDCT) 。
H.265指定了4种不同的TU块尺寸, 分别为44, 88, 1616和3232。在帧内编码中, 44亮度变换块采用DST进行整数变换, 以此提高大约1%的压缩比[6]。除此之外, 其他类型的变换块均统一采用IDCT进行处理。
以88 IDCT为例, 描述如何采用NEON进行加速。
88 IDCT的运算公式如下
式中:X为88 TU块的数据;M为88 IDCT的系数变换矩阵;MT为M的转置矩阵;Z为88 IDCT的最终结果。M具体取值为
观察式 (1) , 可将其变换成如下等式
即首先得到IDCT的一维运算结果Y, 然后将MT和Y做矩阵乘法得到IDCT的二维运算结果Z。
对IDCT的一维运算采用蝶形变换来进行算法优化, 其实现框图如图4所示。
图4中x0到x7表示88 TU块的同一列系数, x0表示该列的第一个系数, x7表示该列的最后一个系数。采用一维快速蝶形运算来实现IDCT算法, 虽然从C代码层面上已经有效降低了计算复杂度, 但每次运算都只针对矩阵中一列系数, 对于88矩阵来说, 需要对8列系数进行8次相同运算, 才能完成整个一维快速蝶形运算。而采用NEON进行并行优化, 可以将4次运算合并为1次, 因此可极大提高运算速度。
基于IDCT的快速蝶形运算思路, 采用NEON对IDCT进行优化的整体思路如下:
1) 在88 IDCT实现中, TU块的系数采用16位无符号整数表示。充分利用NEON的128 bit位宽, 可一次用2个连续的64位D寄存器 (也可以用1个128位Q寄存器表示) 保存TU块一行8个系数。
2) NEON支持最多4个16 bit整数同时进行乘累加, 因此通过前面加载进来的8个系数, 需要执行两次乘累加操作。由于88块左边4列和右边4列的操作完全一样, 因此可以将88 TU块分为左右两个84子块, 对子块采用快速蝶形运算得到84一维运算结果。
以左边84子块为例, 详细描述快速蝶形运算的NEON实现步骤。
(1) 将84 TU块的32个数据加载进D寄存器, 后面的运算将不再从内存中读取数据。
(2) 计算图4中O8_0~O8_3。将M[1][8], M[3][8], M[5][8]和M[7][8]的值赋给D寄存器, 为后面的乘累加操作做准备。
(3) 对4个系数同时进行乘累加, 得到O8_0。其示意图如图5a所示。同理可得到O8_1, O8_2和O8_3的结果。
(4) 计算图4中E8_0~E8_3。将M[1][8], M[3][8], M[5][8]和M[7][8]的值赋给D寄存器, 为后面的乘累加操作做准备。
(5) 如图5b所示, 对4个系数同时进行乘累加, 得到e0。同理得到e1。
(6) 和步骤 (5) 类似, 如图5c计算得到o0, o1。
(7) 将e0, e1, o0和o1进行交叉相加减, 得到E8_0~E8_3。
(8) 最后对E8_0~E8_3, O8_0~O8_3进行交叉相加减, 并最终经过移位操作后得到最终结果。
为方便NEON在做IDCT二维计算的时候, 可以如一维计算一样, 一次加载连续多个数据进入D寄存器, 需要对IDCT一维输出结果进行转置。NEON中的VZIP指令可以帮助实现这样的操作。VZIP指令可交叉存取两个向量的元素。以VZIP.8为例, 如图6所示, 可将dn和dm两个寄存器每8 bit进行交叉存储。
二维运算过程和一维运算过程基本相似, 这里不再叙述。二维运算的结果即最终的IDCT运算结果。
4 OPENHEVC解码器NEON优化结果测
本文采用了内置瑞芯微电子RK3188处理器[7]的SDK开发板作为测试平台, 其CPU为ARM Cortex A9四核, 带NEON和VFP加速处理单元, CPU主频最高可运行至1.6 GHz。
软件平台采用Android 4.4操作系统, 通过对H.265编码视频的解码帧率测试, 来评估NEON优化代码的效率。本文采用了包括各种分辨率和码率的测试序列进行解码测试, 优化效果随着分辨率上升愈显明显。具体优化结果如表1所示。
5 小结
ARM NEON技术广泛应用于多媒体优化中。NEON的SIMD架构使得其非常适合多媒体编解码器中的许多计算密集型模块。NEON在H.265解码器中的优化效果表明, 采用NEON进行多媒体优化效果显著, 能较好地提高多媒体应用的执行效率。
参考文献
[1]The standard for media library portability[EB/OL].[2014-02-05].http://www.khronos.org/openmax/.
[2]An open optimized software library project for the ARM architecture[EB/OL].[2014-02-05].http://projectne10.github.io/Ne10/.
[3]OpenHEVC[EB/OL].[2014-02-05].https://github.com/OpenHEVC/openHEVC.
[4]ITU-T recommendation H.265[EB/OL].[2014-02-05].http://download.csdn.net/download/sugufe/5593167.
[5]HEVC Test Model (HM) documentation[EB/OL].[2014-02-05].https://hevc.hhi.fraunhofer.de/HM-doc/.
[6]SAXENA A, FERNANDES F C.DCT/DST-based transform coding for intra prediction in image/video coding[J].IEEE Trans.Image Processing, 2013, 22 (10) :1685-1688.
H.264软件解码器的结构与优化 第4篇
关键词:H.264,熵编码解码,反离散余弦,帧内预测,环路滤波
H.264是由联合视频专家组(JVT)制定的新一代视频编码标准。由于H.264使用了帧内预测、整数变换、多种块大小的运动估计补偿、多帧参考、1/4像素精度预测、环路滤波等新技术,使得它在编码效率、抗干扰能力以及信道利用率方面都优于现存的编码标准,具有高压缩比的同时还拥有高质量流畅的图像。但是H.264性能的改进是以增加复杂性为代价而获得的,H.264解码复杂度是H.263的2~3倍,而实际应用中对解码器的实时性要求相当高,标准组织的参考模型远不能满足实时的要求,所以要实现H.264格式视频序列的实时解码,必须对解码器作很大的优化。
1. H264软件解码器结构与性能分析
1.1 H.264解码流程
如图1所示H.264解码流程如下:NAL数据(媒体文件原始数据)经过熵编码得到量化后的一组变换系数,再经反量化、反变换得到残差数据。利用解码出的头信息进行帧内预测或者进行运动补偿、帧间预测,得到预测数据。预测数据加上残差数据经过滤波后得到解码输出图像。
1.2 解码器各模块的说明与耗时分析
H.264解码器各模块耗时百分比情况如下:熵编码解码占9.7%,反量化与反离散余弦变换占12.6%,帧内预测占18.8%,运动补偿占32.4%,环路滤波占16.2%,其它处理占10.3%。以下我们对各个模块处理流程及耗时进行分析。
1.2.1 熵编码解码
H.264通常采用基于上下文的自适应二进制算术熵编码(CABAC)。算术编码是使用区间递进的方法来为输入流寻找码字的,它从第一个符号确定的初始区间(0,1)开始,逐个字符地读入输入流,在每一个新的字符出现后根据各字符的概率递归地划分当前区间,处理完最后一个字符后得到最终区间,在最终区间中任意挑选一个数作为输出。解码则是根据给出的一个输出数据反复地查找区间,得到字符,更新区间,最终得到完整的输入流。
为了加快编解码速度,避免乘法、浮点运算,H.264提供上下文模型区间表、量化的概率更新表和乘法查找表优化编解码速度,所以熵编码的过程就是不断查找各个表的过程,执行时间主要消耗在查表操作上。
1.2.2 反量化与反离散余弦变换
为了进一步节省图像传输码率,去除图像信号中的相关性及减小图像编码的动态范围,H.264对预测残差数据采用了44整数离散余弦变换技术(DCT),并对变换后的数据进行量化,减少码流。
二维NN图像块的DCT可以表示为:
Xij是图像块中第i行第j列的数据,Ymn是变换结果。可以用矩阵表示:
其中,AT为A的转置矩阵,变换矩阵A中的系数:
H.264对44图像块进行操作,则相应的44DCT变换矩阵A为:
设,则:
由于a、b和c是实数,直接运算会降低效率,解码时由于精度问题会导致数据漂移。为此,可以对矩阵A进行改造,采用整数DCT技术,可有效地减少计算量,同时不损失图像的准确度。设d=c/b(≈0.414),取d=0.5,变换过程可以表示为:
运算茚表示左边矩阵的每个元素乘以右边矩阵对应位置上的值。⊗右边的矩阵被归纳到量化过程中。简化DCT过程为:
设Zij是对Yij量化后结果,Qstep为量化步长,round=为取整函数,则有:
Qstep作为量化参数进行查表可以得到Eij/Qstep的值。
反量化与反离散余弦变换则是离散余弦变换(IDCT)的逆过程,反量化只需根据Qstep查表,IDCT公式为:
其中IZ为反量化运算后的矩阵,所以IDCT变换执行时间主要消耗在矩阵乘法上。
1.2.3 帧内预测
由于视频图像具有空间相关性,即当前宏块数据与相邻的像素数据变化不大,可以由左边宏块和上边宏块预测出当前宏块的像素值。预测出的值肯定与真实值存在差异,差异以残差数据进行保存。由于图像的空间相关性,经过准确的预测后,与真实值之间的差异(残差数据)会在很小的范围内,对变化很小的一组数据进行熵编码可以节省码流。
44亮度帧内预测有9种模式,88和1616预测有4种模式。帧内预测计算本身不复杂,主要操作是将左边或上边的像素值经过简单运算后保存到当前宏块的相应位置上,之所以耗时是因为要进行频繁的内存数据存取操作,而且被调用的次数相当多。
1.2.4 帧间预测
帧间预测是利用已解码视频帧进行运动补偿的预测模式。为减少传输比特数,可利用邻近分割块较强的相关性,运动矢量(MV)由邻近分割块的MV进行预测后加上运动矢量差异(MVD)得到,MV由x方向和y方向的运动偏移组成。亮度运动偏移单位为1/4像素,色度运动偏移单位为1/8像素。
像素插值图2所示。其中灰色矩形为参考图像的整像素点,白色矩形为1/2与1/4像素插值点。
帧间预测时,首先生成参考图像半像素位置的像素值。半像素点(如b、h、m)通过对相应整像素点进行6抽头滤波得出,权重为(1/32,-5/32,5/8,5/8,-5/32,1/32),如1/2像素点b计算如下:
类似地,h由A、C、G、M、R、T滤波得出,而j则必须等cc、dd、h、m、ee、ff计算完毕后才能开始计算。
半像素点计算出来以后,1/4像素点就可通过线性内插得出,如a=round((G+b)/2)。1/4像素点不参与插值,如p=round((h+s)/2),不能由n和q插值得到。
相应地,色度像素需要1/8精度的MV,通过整像素点二次线性插值得出,如图3所示。
通过上面的分析,可以看到,帧间预测的主要执行时间消耗在像素插值上。
1.2.5 环路滤波
由于H.264编码对每个宏块采用了DCT变换和量化,因此解码后的宏块与原始数据存在一定的误差,另一方面由于运动补偿块的匹配不可能是绝对准确的,所以相邻宏块之间会产生数据不连续的现象,在图像上则表示为方块效应。
环路滤波器可以消除宏块之间的方块效应,但复杂度非常高。主要原因是它具有高度的自适应性,它需要对方块边界及样点量化值进行条件判断和处理,这样,在算法的主要内部循环中不可避免地出现条件分支,这个过程是很耗时的,而且无法优化。另一个高度复杂的原因是H.264的编码算法中残差编码的尺寸,对于44的方块大小及平均在每个方向上对2个点滤波,这样几乎图像中每个点都要被调入到内存中,要么被修正,要么用来判断边界点是否要被修正。
滤波器首先要区分方块是图像的真实边界还是由DCT变换系数量化而造成的假边界,这个过程主要是根据参数查表,通过简单的计算来判断。然后按照规定的顺序计算边界上的点的修正值,再查表对修正值限幅,最后根据修正值对像素点进行修正。
环路滤波计算过程不复杂,主要执行时间消耗在条件判断和分支,以及过多的调用次数上。
2 H.264的解码优化
根据对H.264各个模块处理情况及耗时分析,以下提出各模块的优化方法。
2.1 熵编码解码优化
熵编码解码的执行时间主要消耗在查表操作上,可以采取的优化措施是提高cache命中率。由于H.264采用的是基于上下文的自适应二进制算术编码,相邻参数的上下文区间具有连贯性,在表格中的位置也是相邻的,因此在解码时可以连续解出多个相邻上下文区间的参数后,再对解出的参数进行处理。如果解码一个参数就进行处理会导致cache中的表格数据得不到利用,下次又要从内存中读取,降低查表速度。
2.2 反离散余弦变换优化
IDCT的主要操作为:
如果按照普通矩阵乘法来进行计算,会耗费大量的时间。考虑到前后两个矩阵互为转置矩阵,可以将两个矩阵的运算改为两次同一矩阵的运算,即先对IZ的每行进行一维IDCT运算,然后对经行变换的块的每列再应用一维IDCT运算,即:
而每次一维IDCT运算可以采用蝶形快速算法,以节省计算时间,如图4所示。
其中。
这样经过两次蝶形快速算法,就可以得到反离散余弦变换后的数据。
2.3 帧内预测优化
帧内预测主要时间消耗在频繁的内存数据存取操作上,可以通过减少内存数据的读取次数来进行优化。
对于44的预测块,以垂直预测为例,像素预测值由上方44块的底边决定,即:
对该块进行预测需要读取四次内存,即p[0,-1]、p[2,-1]和p[3,-1]。每个值的大小都为8位,设CPU是32位,因此CPU可以一次读取四个值,保存到unsigned long类型的变量中,再通过移位和&操作就能得到每个字节的值。
该方法可以大大节省访存时间,从而达到优化的目的。
2.4 帧间预测优化
帧间预测主要时间消耗在像素插值上,如b=round((E-5F+20G+20H-5I+J)/32),系数相同的项进行合并可得:b=((E+J)-(F+I*5+(G+H)*20)>>5。由于乘法操作比较费时,可以考虑采用查找表法代替乘法。
整像素点的值在0~255之间,因此可以建立两张表,每张表有511个元素,一张用于成系数20,另一张用于乘系数5。插值时只需将两个整像素点的和作为数组的索引,找到表格中的值,就能避免乘法运算。
b=((E+J)-table_mul5[F+I]+table_mul20[G+H])>>5。
通过查找表进行插值,虽然消除了乘法运算,但增加了内存读取操作。不过图像中的像素具有空间相关性,查表操作能有效利用cache。由于帧间预测占用了整个解码调用过程的3/5左右,最理想的做法是将这两个表锁入CPU的RAM,这样可以显著提高计算速度。
2.5 环路滤波优化
环路滤波主要执行时间消耗在条件判断和分支,以及调用次数较多上,计算过程几乎没有优化的空间。考虑到环路滤波只是消除宏块间的方块效应,而方块效应最主要是由于量化和DCT变换产生的误差而导致。量化步长越大,码率越小,但误差越大,量化步长越小,码率越大,误差越小。
在环路滤波中要检查量化参数,如果小于16是不需要滤波的。但以16为是否进行滤波的界限在N2070中不是很合适,因为量化参数为24以下的320240视频,即使不进行滤波,解码计算也非常吃力。经过多次测试,设定量化参数在26以上才进行滤波,可以在解码速度与画面清晰度之间取得平衡,不管量化参数为多少,画面都不会出现明显的方块,而且可以保证画面的流畅度。
3 结束语
本文从实际应用角度,指出H.264编解码的计算复杂度过大,不适用实时性高的应用要求,必须对其进行优化。通过对H.264解码器各个模块处理流程以及耗时分析,提出优化方法。实践证明,经过以上各模块的优化处理,H.264解码器的实时性能提升了13.2%。
参考文献
[1]喻鑫.基于H.264视频编码的快速算法研究及实现[D].四川大学,2004.
[2]刘冠群.3G环境下手机智能视频监控的设计与实现[D].电子科技大学,2010.
[3]何俊,田应洪,洪志良.基于H.264的熵编码结构[J].计算机工程,2008,(06).
[4]朱琪,朱灿.基于H.264整数变换和量化的研究与软件优化[J].武汉理工大学学报:信息与管理工程版,2006(01).
[5]魏利风.AVC/H.264整数离散余弦变换及反变换的结构设计[J].现代电子技术,2008(04).
[6]杨意仲,张申科,秦肖,等.H.264及AVS视频解码器中IQ/IDCT的设计与实现[J].电子技术应用,2007(03).
[7]张晓燕,谢珺堂.H.264的整数DCT变换编码与量化过程[J].军民两用技术与产品,2005,(05).
[8]张江鑫,冯明.H.264快速帧内预测模式选择算法[J].中国图象图形学报,2008(10).
[9]沈方,支琤.H.264标准的帧间模式选择快速算法[J].微计算机信息,2006(16).
解码优化 第5篇
新一代视频压缩标准H.264采用帧内预测和帧间预测,1/4像素的高精度运动估计,高性能的熵编码方式,并引入去块效应滤波器,较好地改善了图像质量[1,2]。H.264基本档次视频解码流程如图1所示[3]。解码时NALU数据单元首先进行熵解码,熵解码完成后通过反量化、反DCT变换得到残差数据,之后解码器判断预测方式为帧内还是帧间,如帧间通过运动补偿机制得到参考帧图像,参考帧图像像素值与残差数据相加后通过环路滤波器得到解码输出图像。
由于H.264具有先天的网络亲和性[2],将在今后的移动流媒体中占有很重要的地位。以ARM为内核的嵌入式处理器是移动设备的主流处理器,随着ARM处理能力的提高,在ARM平台上实现H.264的解码已成为可能。现阶段国外的Fast VDO、国内的富信掌景等公司都开始研发在ARM核的移动设备上实现H.264基本档次的软件解码器。笔者研究了H.264基本档次解码器对QCIF格式视频的解码优化,针对JM解码器代码中比较耗时的几个模块提出了算法和代码相结合的优化策略,所有优化措施都用C语言实现,可方便移植到各种智能设备中。
2 解码器的优化
H.264基本档次中各个模块在整个解码程序中的耗时比重如表1所示[4,5]。
通过表1可看出,H.264基本档次视频解码过程中运动补偿、熵解码、环路滤波占据了85%的解码时间。下文主要针对这些耗时单元进行优化。
2.1 算法优化
2.1.1 熵解码优化
在H.264的基本档次中,熵编码采用基于上下文的自适应变长编码(CAVLC)。熵解码的耗时在H.264的基本档次中占28%的比重[5],因此熵解码的效率直接影响到整个解码器的速度。
CAVLC熵解码的步骤:1)通过已解码的相邻块的归一化相关系数(NC)求出当前块NC;2)通过NC选择不同的码表进行码字查找;3)通过游程解码将相应的幅度值和游程值存贮到不同的数组中;4)最后计算出所有的残差数据并存储到缓冲区域中。
熵解码过程主要的时间都消耗在码表的查找上。为了避免码表的全遍历,改进算法根据码表中码字前导零的个数使用不同的阈值,将每个码表分成3个子表。查表时首先根据不同的阈值判断使用哪个子码表,然后进入相应的子码表查找。合理的设置阈值,使得3个子码表中包含个数相当的码字,优化后码字的查表速度约为原始代码的3倍。优化后熵解码查表流程如图2所示。
码表中码字的查找流程如图3a所示,由图可知查表过程伴随着不停的读码流,频繁地读取内存会降低解码速度。改进的码字查找流程如图3b所示,在进入查表循环前,首先读入相应子码表中码字长度可能最大的码流,然后在循环的过程中通过移位读入的码流得到相应长度的码流,这样整个查表过程中只需一次读码流,以寄存器的移位操作代替内存的访问,经VTune测试优化过的算法读取码流的速度是原算法的4倍以上。
2.1.2 运动补偿运算优化
H.264采用6抽头滤波器来产生帧间预测参考像素值。首先通过6抽头滤波器求出1/2像素点的值,如果运动矢量要求1/4像素精度,采用线性预测得到1/4像素点的预测值。原始代码6抽头滤波器的计算为
式中:A,B,C,D,E,F表示插值点相邻的像素值,b表示插值得到的1/2像素点。从式(1)看出,计算1个1/2像素点需要4次乘法、1次除法、3次加法和2次减法操作,运动补偿计算的大部分时间消耗在此。文献[6]中提出以查表方法解决大量乘法运算的问题,该方法是在程序的初始化阶段申请一块内存区域,用于存储乘法运算的所有可能值,在调用6抽头滤波器求参考像素值时,直接通过查表的方法取代乘法运算。这种以空间换取时间的处理在计算机上可以接受,但在内存资源紧缺的嵌入式设备中,这样大的内存开销是无法接受的。笔者通过对6抽头滤波器的公式进行相应变形,采用移位操作来代替乘除。经过变型后的公式为
式中,乘5操作在程序中通过引入一个中间变量,采用移位和相加实现。经过改进的差值运算不包含乘除法操作。在计算机平台下使用VTune测试,改进方法的解码效率与文献[6]的查表方法相当,但节省了大量的内存空间,比较适合嵌入式平台。
2.1.3 全零块的处理
参考软件中没有对宏块残差数据全为零的情况进行处理。宏块的残差数据全为零时,没有必要对这些全零宏块进行后续的反变换和反量化处理。据统计,视频序列中出现全零块的几率在80%左右[7],所以处理好全零块能有效提高解码效率。本文参考了文献[7]对全零块做如下处理:首先,在熵解码函数里设置全局数组,用于记录每个宏块中44块的非零情况;在宏块解码完成差值运算后,判断读入的44宏块是否全为零,如果为零跳过ID-CT和IQ处理,直接将参考宏块的像素值存入解码后的缓存区;否则,按照原解码流程进行。优化后的算法流程如图4所示。
2.2 代码优化
2.2.1 内存优化
对存储器的合理分配能提高内存的使用效率[8]。内存单元的频繁申请、读写操作都会严重影响解码效率。代码优化尽量减少程序中不必要的内存分配和读写操作。优化时采用内存复用方法修改解码过程中NALU单元反复申请、释放内存带来的额外开销。
解码过程中大量调用函数Showbit()和Getbit(),这些函数的功能是从码流中读入指定长度的数据。参考代码中码流的读入是按位进行,效率很低。经分析,所有要读入的数据最大长度为16 bit,这样,数据的字节分布就存在1 byte,2 byte,3 byte这3种情况。
改进后的读数据流程如图5所示,先通过要从码流中读入的数据长度和码流的指针在当前字节中的偏移量来确定要读入数据的字节分布,然后采用移位和求与运算得到指定长度的码流。优化后的算法通过2次判断,最多只需读码流3次就可完成读码流操作。经测试,优化后Showbit()和Getbit()的执行速度比原来提高了约5.7倍。
2.2.2 建立静态表格
在解码函数中有很多运算操作都是重复进行的,上次的计算结果在下次调用时同样适用,但是参考代码中每次调用时都重新计算。通过建立静态表格,用查表操作代替重新计算,提高了解码速度。
完成反量化和IDCT变换操作后,像素值可能没有落在0~255之间,为了确保所有的像素值都落在这个区间,解码过程中对运算后的像素值都要进行1次饱和处理,使大于255的值修正为255,小于0的值修正为0。经统计不同类型序列变换完成后像素值的区间,建立静态表格,将这个区间的运算结果全部映射到0~255区间,在需要进行饱和计算时,将变换的结果通过查找映射表实现饱和处理。通过这种以空间换取时间的优化方法,能以较小的内存代价换取较快的解码速度。
2.2.3 其他代码优化措施
程序中过多的判断操作频繁中断处理器的流水线,直接影响解码效率[8]。如在进行差值操作和环路滤波时,都有判断相邻块是否存在的操作。在一帧图像中,只有对处在边缘的块进行相邻块存在判断才有意义,图像中非边缘块的相邻块必然存在。优化过程中根据宏块在帧中的位置信息,将一帧图像的所有宏块划分成边缘宏块和非边缘宏块,只对边缘宏块进行相邻块存在的判断,对于非边缘宏块直接标识相邻块存在。处理后程序中减少了近80%的判断。
将JM参考软件移植到ARM处理器时,由于ARM处理器中没有专门的除法和求模指令,处理器在进行此类操作时要通过复杂的流程,同时由于H.264中与宏块相关的操作基本都是2的幂次数,因此,移植过程中将这些2的幂次操作都采用与、或、移位运算实现,可以有效提高运算效率。
通过以上各个环节的操作,优化了解码环节的算法、简化了重复的和不必要的计算,提高了计算效率,对解码器的速度提高起到重要作用。
3 实验结果与分析
本文分别在PC平台和ARM9平台做了优化前后的解码效率对比实验。采用的参考软件版本为JM10.1,优化均在JM10.1基础上进行。实验步骤为:
1)修改编码器配置文件,设置视频序列均为IPPP格式,QP=28。运行编码器对参考序列进行编码产生H.264文件;
2)在不同平台分别运行10次原始解码器,对不同序列的H.264文件解码并计算平均解码时间;
3)在不同平台分别运行10次优化后的解码器,对不同序列的H.264文件解码并计算平均解码时间;
4)比较优化前后的解码效率。
3.1 PC平台实验
PC配置为主频3 GHz,内存1 Gbyte,操作系统为Windows XP SP2,编译环境Visusl C++6.0(SP6)。实验结果见表2。
由实验数据可以看出,优化过的JM代码在PC平台上针对各种类型视频的解码效率都提高了90%以上,优化后的解码效率是原始代码的12倍多。
3.2 ARM平台实验
由于JM为PC平台参考解码代码不能直接在Win CE5.0平台上运行。实验前首先是通过Platform Build 5.0定制Win CE系统并导出SDK文件,然后在Microsoft Visual Studio 2005下采用定制的SDK完成JM解码器的移植编译工作。实验所用的三星公司SMDK2450开发板基于ARM9平台。处理器为S3C2450,主频400 MHz,操作系统为Win CE5.0。解码时采用的H.264文件与PC平台实验数据相同。实验结果见表3。
由于开发板能提供最大内存为64 Mbyte,无法满足原始代码中MAX_CODED_FRAME_SIZ分配8 Mbyte的内存的需求[9],所以表3中优化前的解码时间是在将MAX_CODED_FRAME_SIZE修改成80 kbyte(满足QCIF格式解码需求)后的结果。
通过ARM平台实验数据可以看出,采用本文的综合优化方法,参考代码的解码效率有80%以上的提高。其中,对于运动缓慢的QCIF格式视频可以达到17 f/s(帧/秒)的解码速率。虽然不能像没有运行Win CE系统那样能达到实时解码,但也能适合一些场合的应用,如视频监控。
4 小结
对H.264参考代码采用算法和代码混合的优化方法在不影响图像质量的前提下提高了解码效率。优化后解码效率在计算机上可达到原始代码的12倍,在ARM9平台上没有使用汇编语言和硬件加速的情况下也能达到很好的解码效果,可以满足一些特殊场合的需求。此外,所有优化方法都是在C语言基础上进行,可以方便地移植到各种嵌入式平台。
摘要:对H.264视频压缩标准的基本档次参考代码进行优化,使其适用于嵌入式平台。对参考代码提出了算法和代码级别优化策略。算法方面采用熵解码码表分割、简化运动补偿运算、全零块跳过等方法。代码优化方面采取减少内存读写、建立静态表格、减少冗余判断等方法来减少运算复杂度。实验表明,优化后的代码移植到嵌入式ARM平台在没有采用汇编语言和硬件加速的情况下能达到很好的解码效率,可以满足一些嵌入式平台的应用需求。
关键词:解码器,优化,熵解码,运动补偿,插值
参考文献
[1]RICHARDSON I E G.H.264and MPEG-4video compression:video coding for next-generation multimedia[M].[S.l.]:John Wiley&Sons,2003.
[2]毕厚杰.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2005.
[3]RICHARDSON I E G.H.264/MPEG-4part10white paper:over view[EB/OL].[2009-12-16].http://bbs.elecfans.com/dispbbs_36_1480.html.
[4]HOROWITZ M,JOCH A,KOSSENTINI F,et al.H.264/AVC baseline profile decoder complexity analysis[J].IEEE Trans.Circuits and System for Video Technology,2003,13(7):704-716.
[5]XUE Quan,LIU Jilin,WANG Shijie,et al.H.264/AVC baseline profile decoder optimization on independent platform[EB/OL].[2009-1216].http://ieeexplore.ieee.org/Xplore/login.jspurl=http%3A%2F%2Fieeexplore.ieee.org%2Fiel5%2F10362%2F32965%2F01544282.pdf&authDecision=-203.
[6]陈维安,李典,余松煜,等.H.264软件解码器的优化[J].数据采集与处理,2005,20(4):493-498.
[7]HUANG Tingyu,JIAN Guoan,CHU Juichin,et al.Joint algorithm/code-level optimization of H.264video decoder for mobile multimedia applications[C]//The33rd IEEE International Conference on Acousrics,Speech,and Signal Processing.[S.l.]:IEEE Press,2008:21892192.
[8]SHESHADRI S B.Optimization of H.264baseline decoder on ARM9TDMI processorer[D].Arlingtion,USA:University of Texas at Arlingtion,2006.
解码优化 第6篇
1 G.729语音编解码器的基本原理
1.1 编码器
CS-ACELP编码基于码激励线性预测 (CELP) 编码模型, 帧长为10ms (80个样点) 。通过对语音信号的分析, 提取CELP模型的参数 (LPC系数, 自适应和固定码书指标和增益) , 其中LPC参数转换为线谱对 (LSP) 参数, 所有这些参数被编码传送。编码器原理如图1所示。
语音信号先进入预处理模块, 信号经过高通滤波和信号幅度衰减后, 再作为后续模块分析的信号。每10 ms帧所示将进行一次LP分析以计算出LP滤波器参数, 这些参数被转换为LSP参数, 并利用预测式两级矢量量化将其量化为18b。激励信号应用分析合成 (ABS) 搜索算法进行选择。在该算法中, 依据感觉加权失真测度使原始与重建语音信号间的误差最小。这是通过用感觉加权滤波器对误差信号滤波来完成的, 滤波器系数由未量化LP滤波器推得。感觉加权的数目通过自适应以提高效果, 使输入信号具有平坦的频响。
激励参数 (固定和自适应码书参数) 每5 ms (40样点) 子帧确定一次。量化和未量化的LP滤波器系数应用到第二子帧, 采用了插值LP滤波器系数 (量化和未量化的) 。一个开环基音延迟每10 ms帧基于感觉加权语音信号估算一次, 然后以下操作每子帧重复一次。使LP残差通过加权合成滤波器W (z) /A (z) 滤波算得目标信号X (n) 。这些滤波器的初始状态, 是通过对LP残差与激励间的误差进行滤波来更新的。这与通常的方法即从加权语音信号中减去加权合成滤波器的零输入响应是等价的。算得加权合成滤波器的冲击响应h (n) , 然后进行闭环基音分析 (以寻找自适应码书和增益) , 利用目标信号X (n) 和冲击响应h (n) , 在开环基音延迟值附近搜索, 采用1/3精度的分数基音延迟, 基音延迟再第一子帧编码为8b, 而在第二子帧采用5b编码。自适应码书贡献 (经滤波) 减去后, 目标信号X (n) 变为X′ (n) , 这个新的目标信号X′ (n) 用在固定码书搜索中以搜索最优激励。一个17b的代数码书用作固定码书激励。自适应和固定码书的增益用7b进行矢量量化 (MA预测应用到固定码书增益中) 。最后, 滤波器的记忆值由已确定的激励信号来更新。
1.2 解码器
解码器原理如图2所示。首先, 在接收到的比特流中提取参量指针。这些指针解码后, 得到对应10 ms语音帧的编码参量。这些参量是LSP系数, 2个分数音调延迟, 2个固定码书矢量, 和两组自适应码书和固定码书的增益。LSP系数在每一子帧中行插值并转化为LP滤波器系数, 然后对每5 ms子帧进如下步骤操作:
1) 激励是由自适应码书矢量和固定码书矢量, 按照它们各自的增益定标后相加而构成的。
2) 合成语音是由激励通过LP合成滤波器滤波而重构。
30重建语音信号再通过一个后处理级, 该后处理级包一个基于长时和短时合成滤波器的自适应后滤波器和个能实现高通和比例缩放的滤波器。
2 TMS320VC5402的特点
TMS320VC5402是美国德州仪器 (TI) 公司推出的一款定点DSP芯片, 它采用先进的修正哈佛结构, 加上高度专业化的指令系统, 使得它具有功耗低, 运算功能强的性能价格比等优点, 可以满足电信等众多领域的实时处理要求。TMS320VC5402是16位定点数字信号处理器, 其主要特点包括:
1) 运算速度快, 速度大于100MIPS (一百万条指令/每秒) 。
2) 优化的CPU结构。采用高性能的改进的哈佛总线结构, 内部包含有1个40位桶形移位寄存器和2个独立的40位累加器。一个1717位并行乘法器, 与40位专用加法器相连, 用于非流水线式单周期乘法/累加器MAC运算。此外, 有专门为数字信号处理所设计的硬件指令集, 用于高效率的程序和数据管理。
3) 丰富的片上外设。包括可编程等待状态发生器和可编程存储器转换、锁相环PL时钟发生器、两个多通道缓冲串口 (McBSP) 、增强型8位并行主机接口、两个16位计数器、6通道直接存储器存取DMA控制器。
4) 低功耗方式。TMS320VC5402核可以在1.8V的低电压下工作, 用IDLE1、IDLE2、IDLE3三种低功耗方式可以节省DSP的功耗。
这些特点使得TMS320VC5402适用于实现高效快速的数字信号处理。
3 G.729在DSP上的优化
在保证合成语音质量的前提下, 对源代码进行适当的简化, 以减少代码存储空间的复杂度。C代码的优化主要分为两个层次:C语言优化及汇编级优化。其中C语言级优化的特点是比较直观, 我们可以先从C语言级优化开始, 如若达不到实时要求则进一步的采取汇编级优化。
3.1 C语言的优化
1) 去除不必要的溢出保护
在G.729的定点C语言程序中, 所有运算之后都要检验结果是否溢出, 尤其在一些基本运算中使用频繁, 因此, 所需执行的溢出检验次数很多。而在实际的运算中, 并不是所有的运算都存在溢出, 我们只需在程序中确实有可能出现溢出的地方加入溢出保护。一般情况下, 可以通过对数据值所处范围进行分析, 发现是否有溢出的可能。例如, 在输入的PCM语音信号经过高通滤波器时, 第一个滤波系数为0x4000, 而PCM语音信号的动态范围是0x8000~0x7fff, 乘以0x4000后, 其范围在0xe0000000~0xlfffc000之间, 不会超出32bit的范围。对这样的运算就不必进行溢出检查了。
2) 使用宏定义
在G.729的定点C语言程序中, 所有基本运算都是以调用子函数的形式执行, 这样虽然对程序的规范化设计有好处, 但在很大程度上降低了程序的执行效率。这些函数由于调用非常频繁, 如果采用直接插入, 会使程序比较繁琐, 可读性降低, 如果改为使用宏定义, 将会在不改变程序可读性的基础上, 节省函数调用的开销, 加快运算速度。这样做虽然可能增大代码量, 但还是在TMS320VC5402芯片存储空间的可接受范围内。有些多周期指令可以用数个单周期宏指令的组合来代替, 以乘法-相减运算L_musNs () 为例, 其源码为:
代码的功能为实现两个16位数相乘后减去一个32位数, 函数的运行周期为127, 用宏指令可替代为:
此宏指令只消耗两个指令周期, 优化效果非常明显。
3) 用指针调用函数和结构体
在C语言程序中, 函数调用往往产生大量代码。当程序调用一个函数时, 它首先把参数传递给寄存器或堆栈。如果函数参数很多, 则调用开销将很大。此外, 还需大量堆栈空间。最坏的情况是函数参数传递的是结构体, 编译器在调用函数时必须首先复制整个结构体到堆栈。此外, 若函数返回的是结构体, 调用程序保留堆栈空间, 传递结构体地址给函数, 调用函数, 然后函数返回。最后, 调用程序还要清除堆栈, 并将返回的结构体复制到另一个结构体。代码和堆栈的开销将是惊人的, 特别是资源有限的DSP。为了避免这种开销, 应禁止传递结构体, 一般用结构体指针替代。如果结构体是不可修改的, 则可用常量结构体指针替代。函数调用的另一方面开销是调用函数的返回值。如果需要返回值, 一般需要在函数返回前复制返回值到返回位置, 然后把结果复制到调用程序中。如果函数的返回值赋值给一个变量或很少使用, 可以考虑传递指向返回值的指针。
经过C语言级优化, 可以在一定程度上提高程序的执行效率, 但由于C代码固有的缺点, 使其效率远远不如手工汇编, 而且用C语言实现对硬件的控制也比较困难, 因此, C语言一般只用于算法不太复杂, 对实时性要求不严格的场合, 像G.729这样较复杂、对实时性又有一定要求的算法, 仅仅C语言级的优化是远远不能满足实际的需要, 必须进行汇编级的优化。
3.2 汇编优化
1) 循环的处理
编译器对于FOR循环的处理, 一般是通过重复指令或条件转移来实现。在大多数情况下, 编译器将FOR循环编译成RPT或RPTB指令, 更多的是RPTB指令。但是53的指令效率更高, 可以使乘法、累加和数据传送等多周期指令在执行一次以后变成单周期指令, 提高指令的执行速度。因此为了产生单重复指令, 通常使用常数作为循环的上限, 对RPTB循环体内的指令进行优化, 充分利用DSP多总线结构和并行操作, 尽量使其用一条指令完成操作。对于循环体内的一些指令操作, 在保证算法正确的前提下, 能放在循环体外执行的语句, 尽量放在循环体外执行。例如:算术运算的饱和、溢出处理, 经常重复处理, 对于这部分代码可以合并, 甚至移到循环体外。对于多重循环, 由于只有一套块重复寄存器, 因此块重复寄存器不能嵌套, 这样外层的那些循环则会多次使用BANZ或其它跳转指令, 可以对循环次数少的循环体进行展开, 减少跳转次数。
2) 避免流水线的冲突
流水线结构是DSP实现高速运算的一个十分行重要的技术手段, 它使实际需要多个周期才一能完成的工作以单周期的方式呈现出来, 即支持并行运算功能, 在DSP的结构部分己经提到, TMS320VC5402采用的是六级流水线, 同时有6条指令在处在不同的执行阶段, 一条指令的多个阶段在连续的几个时针周期完成, 如果一条指令需要使用前一条或前几条指令的运行结果, 而这个结果可能还没有产生, 此时就会出现流水线冲突的现象。实际上, 流水线冲突的发生主要是出现在对存储器映射寄存器及SOT、STI、PMST的控制字段进行写操作时, 与后续的指令在时序上的冲突, 解决的办法一般在这些写操作指令后面插入若干条NOP指令, 或者为了不增加空转指令, 对指令的顺序进行调整。
3) 提高累加器和寄存器的利用率
DSP芯片内部的运算单元运行效率很高, 但DSP在进行内存操作时, 往往需要若干周期的延迟, 因此累加器、寄存器和数据总线之间频繁交换数据时, 将使DSP的执行效率降低。为了减少耗时的内存操作, 在程序进入循环体前, 将频繁使用的数据预先放入寄存器, 然后反复调用, 同时充分利用累加器A和B, 减少数据的加载和存储, 可以很好的提高程序执行的效率。尤其是要充分利用TMS320VC5402提供的8个辅助寄存器AR0~AR7, 辅助寄存器采用间接寻址方式时, 寻址范围可以达到整个数据空间, 而一般利用堆栈指针进行的直接寻址的寻址范围只能达到128字;而且辅助寄存器的内容是由ARAU (辅助寄存器算术单元) 修改的, 因此, 一些算术指令在完成运算的同时可以对辅助寄存器的值进行修改, 这样可以节省修改辅助寄存器的时间:此外辅助寄存器AR2~AR5还可以提供双操作数间接寻址, 同时读取两个操作数, 并自动修改辅助寄存器的值, 产生下两个操作数的地址, 在优化中充分发挥辅助寄存器的这些优势, 可以大大优化程序, 提高执行效率。
4 结束语
G.729语音编解码算法仍有很大的压缩空间, 如何能在一定语音质量要求的条件下获得尽可能低的码率仍是研究的方向, 除了进行C语言级和汇编级的优化, 还可以进行更有效的算法级优化, 采用目前一些新的、复杂度较低的码本搜索的方法, 可以在保证语音质量的前提下, 降低算法的复杂度。
摘要:该文首先分析了G.729语音编解码器的基本原理, 然后介绍了TMS320VC5402的主要特点, 并从C语言级和汇编级进行了优化研究。
关键词:G.729,编码,解码,DSP,优化
参考文献
[1]李昌立, 吴善培.数字语音—语音编码实用教程[M].北京:人民邮电出版社, 2004.
[2]TMS320VC5402 Data Sheet (Rev.F) Texas Instruments, February 2005.
[3]ITU-T Recommendation G.729 Coding of speech at 8kbit/s using conjugate structure algebraic-code-excited linear-prediction (CS-ACELP) , Nov 1996.
解码优化 第7篇
关键词:嵌入式,达芬奇技术,视频会议,RPE,G.722
视频会议系统因其便捷、 高效、 经济、 安全等特点,在政府、 军事、 商贸、 医疗、 教育等部门有着广泛的应用和需求。 随着通信技术和计算机技术的不断发展,实现高集成度、低成本的嵌入式视频会议系统方案已成为可能[1]。
在基于TMS320DM8168 达芬奇多核处理器的嵌入式视频会议媒体服务器的语音编解码器解决方案中,视频流的编解码处理可以使用芯片内部的专用高清视频协处理器(HVICP2)高效完成[2]。 而语音流的编解码处理需要在DSP中自行设计编解码处理算法完成。 此外,还需要提供一种支持ARM端远程控制并调用DSP端算法的解决方案。
本文讨论G.722 编解码器在DM8168 上的C674x DSP核的实现和优化策略, 并将实现的G . 722 编解码算法封装为标准的x DM模块。 此外,本文还介绍一种ARM端调用DSP执行该算法的方案: 利用达芬奇技术的特性, 通过远程处理器执行(RPE) 机制, 在ARM端成功调用DSP上的编解码模块。 实验和测试结果表明,该算法和集成方案可以满足视频会议媒体服务器中的语音编解码处理的功能需求。
1 视频会议媒体服务器系统方案
本设计中,嵌入式视频会议媒体服务器主芯片选用德州仪器公司新近推出的达芬奇系列多媒体处理芯片TMS320DM8168 。 该芯片上集成了1 个1 . 2 GHz的ARM Cortex A8 、 1 个1 GHz的浮定点兼容的C674x DSP 、 3 个高清视频图像协处理器(HDVICP2) 以及大量的外设单元。 其中片上集成的3 个HDVICP2 处理器可以进行3路独立的1 080 p、60 f/s的H.264 编码或解码,或者更多路低分辨率、低帧速率的编码或解码。 DSP则用来做定制算法的开发。 在嵌入式视频会议媒体服务器的系统设计中采用ARM+HVICP2+DSP的异质多核架构, 既能够保持系统构建的灵活性,又能提供强大的处理能力。
嵌入式视频会议媒体服务器的主要功能是: 从会议预先商定的多个网络端口获取来自不同会议终端的视频流,并将遵循H.264 编码标准的视频流解码后进行混合拼接, 将拼接结果重新编码后通过指定网络端口分别发至各会议终端。 语音流的处理类似,媒体服务器将来自各终端的G.722 语音流解码后, 完成混音叠加, 再将不同的混音结果按照G.722 标准编码发送至各与会终端。
本系统的处理框图如图1 所示。 以太网上解包获得的多路H.264 视频流的编解码处理全交由片上的HVICP2 处理器来完成。 ARM端负责系统高层信息流控制和各通道解码后YUV视频流的混合拼接, 以及语音流的混音叠加功能。 本文将着重介绍DSP端的G.722 编解码算法实现、优化,以及在ARM端的调用框架。
2 G . 722 编码算法和优化方案
2 . 1 G . 722 编解码器原理及实现
G . 722 编码器框图如图2 所示, G . 722 编码器核心部分由正交镜像滤波器QMF(Quadrature Mirror Filter) 和2 个结构相似的子带自适应脉冲调制编码器( Subband ADPCM ) 组成[3]。 其中, 编码器正交镜像滤波器由数字滤波器实现,将0~8 k Hz的输入语音信号xin分成高(4 k Hz~8 k Hz) 和低(0~4 k Hz)2 个采样率为8 k Hz的子带信号xH(n)和xL( n ) :
其中:
式(3)、(4) 中的h(i)表示正交镜像滤波器系数。 2 个子带信号xH( n ) 和xL( n ) 分别经过各自的子带自适应脉冲调制编码器后,经合路生成最终的G.722 码流I。
图3 所示为G.722 解码器框图[3], 由于解码器的构成与编码器的构成有较强的对称性,在此不再赘述。
2 . 2 G . 722 算法优化方案
在本设计中, 系统同时存在多路语音输入, 需要实例化多个G.722 解码模块。 为在保证实时性的同时节省计算资源, 有必要研究提升算法性能的方法。 由于G.722算法是在DM8168 内部集成的C674x DSP内核上实现,所以可以通过改进算法的数据结构和DSP操作顺序,充分利用C674x内核的并行性和按字处理的机制, 提高算法执行效率。
G . 722 编码器和解码器的正交镜像滤波器具有一定的对称性, 结合C674x DSP的特点, 可以对正交镜像滤波器进行改进。
如图4 所示, 以编码端为例, 编码正交镜像滤波器执行子带采样和滤波, 需要按照式(1) ~ 式(4) 对输入xin进行滤波处理, 生成xL和xH, 即两个子带自适应脉冲调制编码器的输入。 系统输入的xin为16 bit宽度的有符号整型变量, 在内存空间中连续存储, 可以直接使用DSP32 bit内存访问指令, 一次载入两个16 bit数据( 图4 中I)。同时注意到在系统中, 奇数序号的移位寄存器单元( x [ 2k + 1 ] ) 仅影响奇数部分( 图4 左半部分) 滤波器的输出xodd, 偶数移位寄存器单元仅影响偶数部分( 图4 右半部分)滤波器输出xeven, 移位寄存器工作时也可以按照32 bit数直接处理( 图4 中II)。 此外, 在进行滤波的乘累加运算时,若将两个相邻的16 bit奇数寄存器(如:x[23]和x[21])数据和两个相邻的滤波器系数( 如:h[0] 和h[1]) 数据分组后, 分别以32 bit形式存储, 则可运用C674x DSP提供的半字乘加运算DOTP2,用一个指令完成两次乘运算和一个加运算( 图4 中III、IV)。 使用图4 的结构可以减少DSP在进行编码正交镜像滤波时的所需的指令数。 同样,改进手段也适用于解码部分的正交镜像滤波器。
表1 列出了几种不同优化情况下, 编解码器核心处理函数处理长度为10 ms的单帧语音数据时,C674x DSP上的执行指令数对比。
从运行指令数可以看出, 结合-o2 编译选项和本文提出的代码优化方案后可以大幅度缩减算法执行所需的周期,提高算法性能。
3 G.722 语音处理算法集成
3 . 1 x DM算法标准封装
出于系统开发和集成的考虑, 在达芬奇平台上进行DSP算法开发时需要遵循一定的标准规范, 即TI提出的DSP算法标准x DAIS 。 x DAIS标准是一个庞大的体系, TI在此基础上进行扩展,提供一个轻量级的算法标准框架x DM ( x DAIS for Digital Media ) 。 使用x DM标准可以较快速地将一个开发者自定义的算法实体集成至达芬奇系统。
本设计中, 按照x DMi Universal接口标准, 通过修改数据结构和上层处理调用接口, 将G.722 语音编解码算法代码分别封装为G722ENC和G722DEC两个x DM算法包。
3 . 2 远程调用机制
在达芬奇处理器的软件结构中,ARM负责运行嵌入式Linux操作系统, 主控系统信流, 调度资源并分配任务。 在如上以ARM为主核的机制下,为使ARM能够调度DSP执行特定的算法操作,需要一种跨内核的算法调度机制。 基于TI提供的Codec Engine(CE) 方案是实现该跨核调度机制的一种方法[4]。 然而, 在本视频会议系统中, 由于多路视频处理的需要, 底层选取的多通道处理框架Mc Fw (Multichannel Framework) 与Codec Engine并不兼容。 因此, 本设计方案选取了远程处理器执行框架RPE ( Remote Processor Execution ) 来实现ARM对DSP的跨核调度功能。
如图5 所示,虚线框内是RPE框架。 RPE客户端可以通过x DM解编函数将RPE操作接口执行的操作传输到消息队列;DSP端的RPE根服务器和RPE实例服务器将检查消息队列并控制x DM算法服务器, 创建或调用某个特定的x DM算法实例。 所以ARM调用DSP执行算法的实质是:ARM端通过本地调用RPE操作接口,RPE通过底层的消息队列机制传输操作消息, 由x DM解编函数完成地址转换和参数传递,控制DSP端RPE服务器框架加载并执行指定的x DM算法实例。
3 . 3 编解码器集成性能测试
实际系统中需要在ARM端完成对G.722 编解码器的调用, 同时统计RPE框架和DSP语音数据处理的实际性能,以确保系统对语音处理的实时性。 测试中选取的语音测试向量单帧缓存长度为10 ms, 对应的编码器和解码器输入数据缓存长度分别为320 B和80 B。 ARM端通过RPE机制分别调用G.722 编解码模块处理对应长度缓存的10 000 帧数据,统计计算RPE调用和G.722编解码所需的总时间以及处理单帧所需的平均时间。 测试方法如图6 所示。
表2 展示了编码器和解码器在不同优化条件下的处理单帧语音数据所需时间的统计结果对比。
实际测试结果表明,使用本文提出的代码优化方案后编解码处理效率有明显提高,所需计算资源减少。 而且处理单帧数据所需时间远小于数据间隔(10 ms),可以满足系统实时性的要求, 在多线程的处理处理条件下,可以更大程度上节省DSP的计算开销。
解码优化范文
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


