织梦CMS - 轻松建站从此开始!

罗索

libmpeg2中逆DCT的MMX优化(8个点)

落鹤生 发布于 2010-04-01 22:35 点击:次 
libmpeg2中idct算法的mmx优化,俺看了一遍,发现并没有用快速idct算法,只不过是利用idct的定义综合了x86 MMX的非常好的simd特点,进行了一些顺序上的调整。
TAG:

libmpeg2中idct算法的mmx优化,俺看了一遍,发现并没有用快速idct算法,只不过是利用idct的定义综合了x86 MMX的非常好的simd特点,进行了一些顺序上的调整。

简要介绍如下:

目标:是将8点的X矢量变换到8点的Y矢量
变换矩阵为8×8的C矩阵
可以写为
Y=X*C

C矩阵本来是cos((2n+1)*k*pi/16)的形式

经过化解得到如下矩阵:
C4 C1 C2 C3 C4 C5 C6 C7
C4 C3 C6 -C7 -C4 -C1 -C2 -C5
C4 C5 -C6 -C1 -C4 C7 C2 C3
C4 C7 -C2 -C5 C4 C3 -C6 -C1
C4 -C7 -C2 C5 C4 -C3 -C6 C1
C4 -C5 -C6 C1 -C4 -C7 C2 -C3
C4 -C3 C6 C7 -C4 C1 -C2 C5
C4 -C1 C2 -C3 C4 -C5 C6 -C7
注:C##n=cos(pi*n/16)

从上面矩阵可以看出两个特点:
1。偶数列的上四行和下四行是对称的
2。奇数列的上四行和下四行是反对称的
有了这俩规律,下面的IDCT代码就顺理成章了

a0=x[0]*C4+x[2]*C2+x[4]*C4+x[6]*C6
a1=x[0]*C4+x[2]*C6-x[4]*C4-x[6]*C2
a2=x[0]*C4-x[2]*C6-x[4]*C4+x[6]*C2
a3=x[0]*C4-x[2]*C2+x[4]*C4-x[6]*C6
b0=x[1]*C1+x[3]*C3+x[5]*C5+x[7]*C7
b1=x[1]*C3-x[3]*C7-x[5]*C1-x[7]*C5
b2=x[1]*C5-x[3]*C1+x[5]*C7+x[7]*C3
b3=x[1]*C7-x[3]*C5+x[5]*C3-x[7]*C1
y[0]=a0+b0;
y[7]=a0-b0;
y[1]=a1+b1;
y[6]=a1-b1;
y[2]=a2+b2;
y[5]=a2-b2;
y[3]=a3+b3;
y[4]=a3-b3;

这么规范的代码,对于MMX来说,正是它的拿手好戏
这个代码转换成mmx应该不是难事了,其实是现成的,我把它整理一下,是希望读mmx代码的时候更容易理解而已

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/8971.html]
本文出处:网络博客 作者:秩名
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容