网站建设与管理职业分析,唐山免费做网站,指数函数求导公式,梧州房源信息网基于SIMD 的AVS 整数反变换算法设计与优化王玲娟#xff0c;张刚**作者简介#xff1a;王玲娟#xff0c;#xff08;1987-#xff09;#xff0c;女#xff0c;在读硕士#xff0c;主要研究方向#xff1a;视频解码算法通信联系人#xff1a;张刚#xff0c;#…基于SIMD 的AVS 整数反变换算法设计与优化王玲娟张刚**作者简介王玲娟1987-女在读硕士主要研究方向视频解码算法通信联系人张刚1953-男教授主要研究方向语音编码、视频编码、嵌入式系统. E-mail:princessjuan520163.com5 太原理工大学信息工程学院太原 030024摘要AVS 整数反变换是典型的以计算为主的解码过程。为提高解码速率本文通过改进反变换算法并用SIMD 技术对其中计算量最大、耗时最长的部分代码进行了优化。在此之前先进行全零块处理以减少不必要的计算。实验结果表明该优化方案可行并且解码器的运算速度得到显著提高。10 关键词AVS反变换SIMD中图分类号TN919.825 0 引言AVS 作为中国具有自主知识产权的新一代音视频编解码标准在高清数字视频及网络多媒体应用方面表现出好的性能和低的复杂度[1]。在同等画面质量的前提下AVS 标准的数据压缩率比传统的MPEG-2 效率提高了2 到3 倍与MPEG-4AVC/H.264 标准压缩效率相当但比H.264 降低30%到50%的计算资源大大节省了软硬件成本发展前景巨大[2]。而30 目前AVS 官方提供的解码参考软件对于大部分视频图像不能进行实时解码不利于AVS产业化的推广有待于不断地进行改进和优化以达到对基本的CIF、D1 等格式图像的实时解码要求。本文正是基于上面的应用需求对AVS 解码标准进行了研究。依据AVS 整数反变换算法的特点对算法的实现进行结构上的设计并在vc 下利用SIMD 技术对其进行优化。在35 保证解码质量的前提下提高了解码软件的运行速度具有实际的意义。1 SIMD 指令介绍SIMD 指令能在一个指令周期中完成多组数据并行操作计算是当前多媒体信息处理实时实现中一个重要的技术[3]。目前, IA-32 的SIMD 指令包括MMX、SSE、SSE2、SSE3 等几级,它们都是在原来的处理器指令集的基础上添加的扩展指令集, 都是SIMD 指令。40 (1)MMX 简介在通用处理器中, Intel 为了提高其多媒体处理能力, 在PentiumⅡ中引入了MMX 指令,MMX 中定义了57 条新指令、8 个64 位的寄存器和4 种新的数据类型新指令包括算术、比较、转换、逻辑、移位、数据传输指令和状态清空7 类只能处理整数类型数据。(2)SSE 简介45 由于MMX 的寄存器只有64 位在处理浮点运算时就力不从心了容易出现overflow的现象所以在PentiumⅢ中又加入了SSE(String SIMD Extension) 指令集。SSE 指令增加了单精度浮点数的SIMD 支持并且SSE 定义了8 个全新的128 位寄存器,每个寄存器可以存放128 位的整数或浮点数。(3)SSE2 简介50 在PentiumⅣ中扩充了SSE 指令集形成了SSE2 指令集。SSE2 在SSE 基础上增加了对双精度浮点数的支持和一些新指令。SSE2 共有144 个SIMD 指令能处理128 位整数和双精度浮点数运算。SSE2 由两个不同的部分组成: SSE 部分和MMX 部分。前者主要负责处理浮点数, 后者则专门计算整数。在指令处理速度保持不变的情况下,通过SSE2 优化后的应用软件运行速度将提高2 倍。由于SSE2 指令集与MMX 相兼容, 因此将被MMX 优化过的程55 序再进行一次SSE2 的优化, 则优化的程度会更加彻底。2 全零块处理AVS 使用的是预测编码进行反变换的矩阵存放的是残差数据而残差数据很明显的特点是残差值都很小并且很多整个8*8 块的残差数据都为零。统计三个典型标清测试视频的全零残差块的比例如表1。60表1 全零块比例统计Tab.1 All-zero block ratio statisticsQP测试序列(720x480)222836football 15.9% 40.5% 65.0%bus 21.9% 47.4% 72.9%tempete 24.4% 49.4% 76.5%由表1 可以看出残差值全为零的块在整个视频帧中占很大比例特别是量化系数QP65 较大时。利用这个特性本文在解码端进行一些特殊处理解码当前宏块CBP 值后对四个亮度块和两个色度块进行全零检测标志如式2-1所示。若当前解码8*8 块对应coeff 系数为0即为全零块。根据全零的矩阵反变换后仍为零[4]省去对该块的反变换操作则该块的预测值即为像素值。这样利用宏块系数特征就极大的减70 少了运算量。而不全为零的块则需反变换后加上预测值才能得到像素值如图1 所示。图1 全零块的优化示意图Fig.1 Optimization of all-zero block diagram75 3 反变换模块的算法分析AVS 采用基于8×8 块的整数IDCT 算法。二维整数IDCT 算法可以转换为水平和垂直方向的一维IDCT 算法的组合。反变换计算公式为H T C T T 8 8 × × (3-1)其中H 表示反变换后的8×8矩阵C 是8×8变换系数矩阵 8 T 是8×8 反变换矩阵图2T T 8 是8 80 T 的转置矩阵。图2 AVS 中的整数变换矩阵Fig.2 Integral Transformation Matrix of AVS85 AVS 整数反变换的变换系数存在对称性仅用加法、减法和移位就可实现容易使用基8 蝶形算法快速实现[5]。图3 一维反变换蝶形算法Fig.3 One-dimensional Inverse Transform Butterfly Algorithm90图3 为水平反变换的一维8 点快速蝶形算法原理。显然采用两个近似的C 语言代码段就可实现由X 到H 的变换过程。依此设计的Visual C6.0 整数变换模块的算法清晰简单容易更改数据长度代码冗余少但由于C 程序不针对硬件编程其较低的编解码速度不能满足实时性要求因此需要利用单指令多数据技术对AVS 整数IDCT 模块进行优化。95 4 反变换算法的设计与优化4.1 反变换算法的计算次序分析利用矩阵乘法的结合律公式(3-1)可以改写为H T ×C ×T T T × (C ×T T )(T ×C)×T T [(C ×T T )T ×T T ]T [T ×(T ×C)T]T 8 8 8 8 8 8 8 8 8 8从而AVS 整数反变换算法的计算次序可分为4 类1) 垂直反变换-水平反变换计算次序为H (T C) T T 8 8 100 × × 即先垂直反变换H T ×C 8再水平反变换H H T T 8× 2) 水平反变换-垂直反变换计算次序为H T (C T T ) 8 8 × × 3) 水平反变换-转置-水平反变换-转置计算次序为[( ) ]TH C T T T T T 8 8 × × 4) 垂直反变换-转置-垂直反变换-转置计算次序为H [T ×(T ×C)T ]T 8 8 。105 无论采用上述哪种计算次序为获得高质量主观图像效果并避免数据溢出第一次反变换前C 的每一个元素都要由8 位整型数据扩展为16 位第二次反变换结果H 的每个元素都要扩展为32 位。为兼顾较高的图像压缩效率最终输出结果需要紧缩为16 位的整型数据。4.2 基于SSE2 的反变换算法设计考虑到算法精度要求和寄存器有限的情况若采用MMX 指令进行优化则需要多次的110 数据读取而内存单元的访问速度也制约了多媒体指令的优化[6]。因此本文最终决定采用SSE2 指令集实现反变换模块。SSE2 是基于128 位寄存器的指令集其指令功能与MMX 类似但是并行处理能力更强大反变换和矩阵转置比基于MMX 的优化更易实现。采用“垂直反变换-转置-垂直反变换-转置”计算次序能仅以两次转置过程的延时为代价减少水平反变换的代码和时间开销。具体实现步骤1) 第一次垂直反变换H T ×C 8115 各矩阵元素为16 位每次变换一个行向量8次循环后计算得到矩阵H 2) 第一次矩阵转置得到T H 3) 第二次垂直反变换T H T H 8× 每次取矩阵T H 各列的前4 个元素扩展为32 位数据后作组合运算每次变换4 个行向量变换后结果紧缩为16 位数据2120 次循环后计算得到矩阵H 4) 第二次矩阵转置得到T H H 采用与第一次矩阵转置相同的代码段得到H 。4.3 基于SSE2 的反变换算法优化4.3.1 PMADDWD 指令介绍125 图4 PMADDWD 指令Fig.4 PMADDWD instruction图4 中寄存器是128 位的上面两个寄存器分别存储8 个16 位数据。图中显示了紧缩字乘、积相加PMADDWD 指令的执行将两个寄存器相同位置的字组数据对应相乘然后130 将32 位结果逐对相加并作为双字存于寄存器中。该指令用于以下矩阵乘法。4.3.2 矩阵乘法的高效实现以4*4 矩阵为例设计一种高效的矩阵乘法的方法。图5 4*4矩阵乘法135 Fig.5 4*4matrix multiplications图5 中显示了一个典型的4*4 矩阵乘法[7]。如果简单的存储X 的行向量和Y 的列向量分别到两个寄存器后使用PMADDWD 指令显然乘法运算太多和寄存器资源有限使得这样直接变换的汇编代码和时间开销代价非常大。为避免这种问题下面显示了一个高效的矩140 阵乘法的方法。图6 高效的4*4 矩阵乘法的实现Fig.6 Efficient 4*4 matrix multiplication implementation145 图6 中显示了计算结果矩阵的第一行的例子。矩阵X 和Y 以特定的形式存储到寄存器中在这些寄存器对上执行PMADDWD 指令使每对寄存器相同位置的数据对应相乘后结果相加。用类似的方法计算矩阵的后三行在这种情况下不需要重载矩阵Y而每行最后的结果是完全一致的不需要任何额外的操作重新安排他们的顺序。这种以特定形式加载过程的算法将乘积与求和循环运算可用SIMD 指令的组合高效实150 现提高了寄存器的利用率。这种方法可应用于多个4*4 矩阵乘法运算也可以通过修改适应其他大小的矩阵乘法。4.4 优化结果分析本文设计的AVS 解码器的开发平台为Windows7 操作系统编译与调试环境为VisualStudio2008。对反变换模块优化前后的解码速率进行了测试。测试用了两个视频序列1155 帧数为300 帧的Foreman(CIF 352x288)格式序列由xAVS 编码器编码foreman.yuv 标准序列获得2帧数为2380 帧的RiliD1 720x576序列。测试结果如表2 所示。表2 测试序列数据Tab.2 Test Sequences Result解码速度(fps) 测试序列 分辨率 帧数优化前 优化后Foreman CIF 300 60.53 90.62Rili D1 2380 14.65 22.43160从以上测试结果可以看出对于解码cif 格式的视频流速率大约提高了30fps对于解码D1 格式的视频流速率大约提高了8fps。因为只是对程序进行了代码级的优化解码器
的性噪比不会下降图像质量不会受到影响。 5 结论 165 本文对AVS 整数反变换算法的实现进行了设计并利用SIMD 指令对其进行了优化 解决了直接变换的汇编代码和时间开销代价大的问题。在保证解码质量的前提下提高了解 码速率对AVS 解码器在软件平台上的实时实现是十分必要的。测试实验表明本文所选算 法的可行性。