基于SIMD 的AVS 整数反变换算法设计与
优化
王玲娟,张刚**
作者简介:王玲娟,(1987-),女,在读硕士,主要研究方向:视频解码算法
通信联系人:张刚,(1953-),男,教授,主要研究方向:语音编码、视频编码、嵌入式系统. E-mail:
princessjuan520@163.com
5 (太原理工大学信息工程学院,太原 030024)
摘要:AVS 整数反变换是典型的以计算为主的解码过程。为提高解码速率,本文通过改进反
变换算法并用SIMD 技术对其中计算量最大、耗时最长的部分代码进行了优化。在此之前先
进行全零块处理以减少不必要的计算。实验结果表明该优化方案可行并且解码器的运算速度
得到显著提高。
10 关键词:AVS;反变换;SIMD
中图分类号:TN919.8
 25 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 statistics
QP
测试
序列
(720x480)
22
28
36
football 15.9% 40.5% 65.0%
bus 21.9% 47.4% 72.9%
tempete 24.4% 49.4% 76.5%
由表1 可以看出,残差值全为零的块在整个视频帧中占很大比例,特别是量化系数QP
65 较大时。利用这个特性,本文在解码端进行一些特殊处理:解码当前宏块CBP 值后对四个
亮度块和两个色度块进行全零检测标志,如式(2-1)所示。
 若当前解码8*8 块对应coeff 系数为0,即为全零块。根据全零的矩阵反变换后仍为零[4],
省去对该块的反变换操作,则该块的预测值即为像素值。这样利用宏块系数特征就极大的减
70 少了运算量。而不全为零的块则需反变换后加上预测值才能得到像素值,如图1 所示。
 图1 全零块的优化示意图
Fig.1 Optimization of all-zero block diagram
75 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 反变换矩阵
(图2),T T 8 是8 80 T 的转置矩阵。
 图2 AVS 中的整数变换矩阵
Fig.2 Integral Transformation Matrix of AVS
85 AVS 整数反变换的变换系数存在对称性,仅用加法、减法和移位就可实现,容易使用
基8 蝶形算法快速实现[5]。
 图3 一维反变换蝶形算法
Fig.3 One-dimensional Inverse Transform Butterfly Algorithm
90
图3 为水平反变换的一维8 点快速蝶形算法原理。显然,采用两个近似的C 语言代码
段就可实现由X 到H 的变换过程。依此设计的Visual C++6.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) 水平反变换-转置-水平反变换-转置:计算次序为[( ) ]T
H 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 8
115 ' :各矩阵元素为16 位,每次变换一个行向量,8
次循环后计算得到矩阵H ' ;
2) 第一次矩阵转置得到
T H ' ;
3) 第二次垂直反变换
T H T H '
8
'' = × :每次取矩阵
T H ' 各列的前4 个元素,扩展为
32 位数据后作组合运算,每次变换4 个行向量,变换后结果紧缩为16 位数据,2
120 次循环后计算得到矩阵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 implementation
145 图6 中显示了计算结果矩阵的第一行的例子。矩阵X 和Y 以特定的形式存储到寄存器
中,在这些寄存器对上执行PMADDWD 指令,使每对寄存器相同位置的数据对应相乘后结
果相加。用类似的方法计算矩阵的后三行,在这种情况下,不需要重载矩阵Y,而每行最后
的结果是完全一致的,不需要任何额外的操作重新安排他们的顺序。
这种以特定形式加载过程的算法将乘积与求和循环运算,可用SIMD 指令的组合高效实
150 现,提高了寄存器的利用率。这种方法可应用于多个4*4 矩阵乘法运算,也可以通过修改适
应其他大小的矩阵乘法。
4.4 优化结果分析
本文设计的AVS 解码器的开发平台为Windows7 操作系统,编译与调试环境为Visual
Studio2008。对反变换模块优化前后的解码速率进行了测试。测试用了两个视频序列:(1)
155 帧数为300 帧的Foreman(CIF 352x288)格式序列,由xAVS 编码器编码foreman.yuv 标准序
列获得;(2)帧数为2380 帧的Rili(D1 720x576)序列。测试结果如表2 所示。
表2 测试序列数据
Tab.2 Test Sequences Result
解码速度(fps) 测试序列 分辨率 帧数
优化前 优化后
Foreman CIF 300 60.53 90.62
Rili D1 2380 14.65 22.43
160
从以上测试结果可以看出,对于解码cif 格式的视频流,速率大约提高了30fps;对于解

码D1 格式的视频流,速率大约提高了8fps。因为只是对程序进行了代码级的优化,解码器

的性噪比不会下降,图像质量不会受到影响。
 5 结论
165 本文对AVS 整数反变换算法的实现进行了设计,并利用SIMD 指令对其进行了优化,
解决了直接变换的汇编代码和时间开销代价大的问题。在保证解码质量的前提下,提高了解
码速率,对AVS 解码器在软件平台上的实时实现是十分必要的。测试实验表明本文所选算
法的可行性。

基于SIMD的AVS整数反变换算法设计与优化相关推荐

  1. 基于Python+Open CV的手势识别算法设计

    素材资料下载: 基于Python+OpenCV的手势识别算法设计源代码材料-机器学习文档类资源-CSDN下载采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库( ...

  2. 孙玄辜教授:基于Linux内核的时间轮算法设计实现【附代码】

    文章目录 1.时间轮算法基本思想 2.定时器的添加 3.定时器到期处理 孙玄:毕业于浙江大学,现任转转公司首席架构师,技术委员会主席,大中后台技术负责人(交易平台.基础服务.智能客服.基础架构.智能运 ...

  3. 基于MATLAB有噪声语音信号处理算法设计

    获取项目源文件,联系Q:1415736481,可指导毕设,课设 摘要 滤波器设计在数字信号处理中占有极其重要的地位,FIR数字滤波器和IIR滤波器是滤波器设计的重要组成部分.利用MATLAB信号处理工 ...

  4. 风力机叶片气动设计 matlab 程序,基于Matlab的1.5MW风力机叶片设计和优化方法

    收稿日期:2012-03-23 基金项目:国家"九七三"重点基础研究发展计划(2007CB714605) 作者简介:李仁年(1963-),男,教授,博士生导师,主要研究方向为水力机 ...

  5. 图算法(十三):Louvain算法【适用场景:用于社团发掘、层次化聚类等场景】【基于模块度的社区发现算法,其优化目标是最大化整个社区网络的模块度】

    一.概述 Louvain算法是基于模块度的社区发现算法,该算法在效率和效果上都表现较好,并且能够发现层次性的社区结构,其优化目标是最大化整个社区网络的模块度. 适用场景:Louvain算法适用于社团发 ...

  6. 基于DSP的注塑机运动控制器和算法设计

    将 D S P 作 为 下 位 机 , ARM 作 为 上 位 机 设 计 了 精 密 的 注 塑 机 控 制 系 统 , 下 位 机 用 于 控 制 算 法 的 运 行 以 及 I/ O 控 制 , ...

  7. “华为杯”研究生数学建模竞赛2020年-【华为杯】A题:基于通信仿真的载波恢复算法设计与 ASIC 实现(附获奖论文及matlab代码实现)

    目录 摘 要: 1. 问题重述 1.1 问题背景 1.2 问题要求 2. 模型假设 3. 符号说明

  8. 基于多智能体混沌鸟群算法的机构优化

    摘要: 平面四连杆机构是一种常见的传动机构,对机构参数进行优化设计是获得最佳动力性能的重要途径.为了解决这一机构参数优化问题,提出了一种多智能体混沌鸟群算法(multi-agent chaos bir ...

  9. 算法设计与优化编程 第十讲 Subway

    Subway Problem Description jiefangxuanyan and yiyi cat are universally acknowledged model couples(配偶 ...

最新文章

  1. 《预训练周刊》第34期:使用图像级监督检测两万个类别、BigScience寻求建立强大的开放语言模型...
  2. 人脸识别中的人脸监测、定位校准和对比等技术
  3. ExecutorService线程池
  4. Linux下安装oracle提示INS-20802 Oracle Net Configuration Assistant
  5. 文件上传下载小结一(转载)
  6. linux操作python
  7. SVN 中更新与资源库同步的区别
  8. mpc5774时钟监控寄存器_单片机如何才能不死机之内外部时钟
  9. Spring Boot——读取.properties配置文件解决方案
  10. orcle10忘记密码
  11. ESP32,使用gitee搭建 ESP-IDF 开发框架
  12. float浮点数的四舍五入
  13. [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景_vortex_新浪博客...
  14. 进程介绍(理论部分)
  15. 文本关键词提取算法总结
  16. 调试Javascript代码(浏览器F12)
  17. 一个前端程序员的费曼技巧练习
  18. 网站使用微软雅黑需要版权吗
  19. windos系统如何获得超级管理员权限
  20. 微软的学术可视化搜索

热门文章

  1. 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字
  2. 【转】微服务架构下分布式事务方案
  3. php 版权信息自动变化,php自动更新版权信息显示的方法
  4. java 读取 image_如何在java读取sql里头读取image格式的数据转换成图片格式
  5. 【BZOJ - 1305】dance跳舞(拆点网络流,建图,最大流,残留网络上跑最大流)
  6. 【HDU - 1247】Hat’s Words(字典树,预处理,tricks)
  7. 【ZOJ - 2836 】Number Puzzle (容斥原理)
  8. 【牛客 - 185A】无序组数 (思维,数学,因子个数)
  9. 【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)
  10. html动态计算高度,透明半透明背景