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

基于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 解码器在软件平台上的实时实现是十分必要的。测试实验表明本文所选算
法的可行性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word -- 列表重新编号

Word -- 列表重新编号office一言:我小心翼翼地灌溉,一日复一日地期待,那么费力,植成参天的乔木,岂愿见你终有一日从容赴死?问题 word 文档早就想解决的一个问题,这次遇到了就上网找解决掉了&…

非持久连接和持久连接

非持久连接和持久连接 HTTP既可以使用非持久连接(nonpersistent connection),也可以使用持久连接(persistent connection)。HTTP/1.0使用非持久连接,HTTP/1.1默认使用持久连接。 非持久连接 让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面…

计算机开机键鼠无法识别,我得电脑一开机就检测不到键盘和鼠标

2005-10-18 16:06:131、开机后当出现dos界面时,按一下pause键(这个键在四个方向键的上边,仔细找就能找到),如果计算机启动停止,说明你的键盘起作用,主板在开机时就已经检测到了鼠标键盘。启动后不能使用鼠标键盘&#…

vs2003 局部友元访问私有不可访问_C++ 类:重载运算符与友元

18.类中重载运算符与友元上次节中学习了如何在类中重新定义赋值()运算符,实际上在一个自定义类中除了赋值()运算符外,类的对象是不可以直接使用运算符的,比如你在main函数中写这样的代码会报错:如果想解决这些报错问题&#xff0c…

oracle sqlldr (一) 最基本语法

-- Create table create table DEPT2 (DEPTNO NUMBER(2) not null,DNAME VARCHAR2(14),LOC VARCHAR2(1000) ); alter table DEPT2add constraint DEPT_PK primary key (DEPTNO);------demo.ctl LOAD DATA INFILE * --数据在控制文件中 INTO TABLE DEPT2 INSERT ---默认加…

Django REST framework 视图

上一部分代码在序列化部分 类继承顺序 ############### mixins.py ################ # 类中调用的方法均在 GenericAPIView 类中实现,所以下列类需要结合 GenericAPIView 使用 class ListModelMixin(object) # 查看继承类def list(self, reque…

AVS软件解码器的优化

AVS软件解码器的优化 董斌 , 姜昱明 (西安 电子科技大学计算机学院,陕西 西安,710071)) 摘 要: 主要研究了AVS标准的视频压缩部分,指出了影响解码速度的瓶颈并提出了一种优化方案.使用从程序结构入手结合使用SIMD指令集的方案来优化AVS软件解码器.实验结果表明优化方案可行并且…

IOS7.1.1真的像网上流传的那么好?没有任何问题么??

IOS7.1.1推送更新之后到处看到网上说711好的~~ 那么IOS7.1.1真的像网上现在流传的那么好么? 其实不然,IOS7.1.1目前众多网友反映说升级ios7.1.1之后APPstore连接不上了,提示无法连接到APPstore。 这个问题也不难解决~还是之前的老办法~ 那么今…

三校生计算机对口本科有哪些学校,宝山三校生五月对口高考报名

多次复习生活不可能像你想象得那么好,但也不会像你想象得那么糟。我觉得人的脆弱和坚强都超乎自己的想象。多种方式结合起来复习单一的复习方法,易产生消极情绪和疲劳,如果采用交谈复习法、讨论复习法、自我检查复习法多样化的复习方法&#…

localhost 已拒绝连接_【Python】MongoDB数据库的连接和操作

安装Python 要连接 MongoDB 需要 MongoDB 驱动。pip安装:python3 -m pip3 install pymongo创建数据库import pymongo myclient pymongo.MongoClient("mongodb://localhost:27017/")mydb myclient["loaderman"]注意: 在 MongoDB 中&#xff0c…

checkbox已设置为checked--true-但不勾选问题解决方法(只第一次勾选有效)

一、出现的问题及解决方法: 今天在写一个table相关插件的时候无意中发现了这样一个问题,记得以前在写这种控制checkbox选中与非选中的代码时并没有这种bug,当时也是用的checked属性,而现在却行不通了。 于是乎做了以下测试&#x…

Python 错误和异常小结[转]

原文链接 http://blog.csdn.net/sinchb/article/details/8392827 事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Python异常后的一篇笔记式的记录和小结性质的文章。什么?你还不知道什么是异常,额... 1.Py…

Django REST framework 认证、权限和频率组件

认证与权限频率组件 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。 简单来说就是: 认证确定了你是谁权限确定你能不能访问某个接口限制确定你访问某…

高速率AVS整数变换的汇编实现与优化

1 引言 AVS标准Ⅲ采用的8x8整数变换在获得较H.264更高的压缩率和主观图像质量的同时,增加了算法的实现复杂性和时间开销。本文重点研究AVS编解码器的整数变换模块,针对不同的算法实现模式,在原有Visual C6.0整数变换模…

计算机与广播电视论文,浅谈广播电视中计算机技术的作用论文.pdf

1、计算机技术在广播电视的媒体内容中有重要应用在以往的广播电视中, 媒体内容主要分为音频和视频两种信号, 在传输的过程中使用的是模拟信号, 但模拟信号受到的外界干扰因素较为明显, 因此广播电视传播的媒体内容受到影响&#x…

opencv安装教程python3.7_Mac下安装使用Python-OpenCV,解决opencv3安装完成无法使用的问题 - pytorch中文网...

OpenCV是一个跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 Mac安装OpenCV 在我们的深度学习的过程中,对于图像&#…

NodeJS在CentOs7下安装

node下载地址:https://nodejs.org/en/download/ 1.安装gcc $ yum install gcc-c 2.解压最新版本 $ mkdir /usr/local/node$ tar zxvf node-v6.11.4.tar.gz $ cd node-v6.11.4$ ./configure --prefix/usr/local/node# 在当前目录下编译安装Node$ make$ make install 3.验证安装 …

Python功能之反射

有如下文件: index.py 1<span style"font-family:宋体, SimSun;">#!/usr/bin/env python<br data-filtered"filtered"># -*- coding:utf-8 -*-<br data-filtered"filtered">__author__ ryan<br data-filtered"filter…

Django REST framework 分页

分页模式 rest framework中提供了三种分页模式&#xff1a; from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 全局配置 REST_FRAMEWORK {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.LimitOffsetPaginat…

解析H.264视频编解码DSP实现与优化

引言 基于互联网的数字视频产业前景看好&#xff0c;而3G的规模部署&#xff0c;也会推动移动视频通信成为现实。但数字化后的视频图像具有数据海量性&#xff0c;给图像的存储和传输造成较大的困难。数字视频产业&#xff0c;是指数字内容中以数字视频形态为主的文化创意和传播…