报告NxM离散余弦变换的方法

文档序号:6408766阅读:285来源:国知局
专利名称:报告NxM离散余弦变换的方法
技术领域
本发明总的涉及视频处理,并且更具体地涉及在一个系统中的N×M系数块上执行的离散余弦变换(DCT),所述系统实现一个基于块的、类似于运动图像专家组(MPEG)的视频编码标准。
背景技术
诸如由MPEG开发的那些视频编码标准之类的许多视频编码标准,都是基于对频域抽样的过渡,并采用了二维(2D)正向和逆向离散余弦变换(DCT),其分别用于将光栅数据转换为频率系数块以及将所述压缩的系数块转换回光栅数据。所述2D DCT运算由MPEG标准(例如,ISO/IEC 13818-2,MPEG-2编码标准视频,ISO/IEC 14496-2,MPEG-4编码标准视觉)定义为一个8×8系数块的变换,并可视作是压缩视频处理流水线中最耗时的部分。
例如与由电气及电子工程师学会(IEEE)1180-1990标准(“IEEEStandard Specifications for the Implementation of 8×8Inverse Discrete Cosine Transform(用于实施8×8逆离散余弦变换的IEEE标准规范)”,1997)定义的视频编码标准相比,一些视频编码标准(例如MPEG-4)在DCT精度上强加了额外的限制。因此,所述MPEG-4标准把前面提到的标准要求看作是必要的,但不是充分的“在运算精度没有规定的地方,例如在所述逆DCT的计算中,所述精度将足以使得最终整数值不发生显著的误差。”对于一些编码视频序列,如果利用单精度浮点运算来实施所述DCT运算,那么可以取得满意的结果。但是,浮点运算比在视频处理系统中广泛使用的计算一个8×8 DCT的定点运算所涉及的整数指令更慢。
因此,在保留单精度浮点运算精度的同时,需要提供高速DCT执行的能力。


根据随后对本发明详细的描述,本发明的特征及优点将变得显而易见,其中图1是根据本发明的实施例的示意图,其说明一个8×8的系数块、所述块成为多行的分解、DCT及转换运算的基于行的应用、以及一个中间浮点系数块;以及图2是根据本发明的实施例的示意图,其说明DCT到浮点系数的基于列的应用、浮点到整数的转换、以及所得到的整数系数块。
具体实施例方式
本发明的实施例是一种实现二维N×M逆向和正向离散余弦变换(此后DCT既表示所述逆向运算,又表示所述正向运算)的方法。用于逆向运算的所述方法,比由所述IEEE 1180-1990标准所定义的方法具有更高的精度,并被设计以满足由诸如MPEG-4之类的其它标准所强加的额外的精度限制。本发明实施例的所述正向DCT的精度可以比利用整数定点方法取得的精度更高,并且与现有技术不同,其与输入系数的绝对值成比例。
本发明的实施例包括几个阶段在一个输入系数块的每一行上可以执行一个定点1D DCT(这个阶段采用整数运算),在从前一阶段所得的系数块的每一列上可以执行所述变换的行系数的整数到单精度浮点转换以及单精度浮点1D DCT。
本发明的一个实施例使用32位整数变量来存储中间结果,并为8位和12位整数系数保持计算精度。所述实施例采用整数运算,因此与用完全的浮点方法相比取得了额外的性能。通过利用分解为行和列1DDCT处理阶段的2D DCT,所述实施例利于基于单指令多数据(SIMD)的实现。
因此,本发明的实施例是一种实现在一个N×M系数块上执行2D逆向和正向离散余弦变换(DCT)的方法,其中N和M是自然数。在一个实施例中,N和M可以是8,虽然本发明不限于此。本方法用来取得比用浮点运算所能取得的更高的性能,并取得比整数定点方法所能取得的更精确的结果。因为大多数现代视频编码标准对量化的整数数据进行操作,所以所述公开的DCT方法的输入和输出数据也是整数。
本说明书中提及的本发明的“一个实施例”或“一实施例”指的是与包括在本发明的至少一个实施例中的实施例相结合所描述的特别的特征、结构或特性。因此,出现在本说明书各个地方的短语“在一个实施例中”并不一定指同一实施例。
为了达到前面提到的处理的目标,所述2D N×M DCT运算(a)可以被划分为能够利用SIMD运算有效实现的N行N点DCT和M列M点DCT运算;(b)为了更高的性能采用整数定点计算;(c)将中间结果转换为单精度浮点形式;以及(d)利用浮点计算得到最终DCT值。所述正向2D DCT可以定义如下fnm=cncmΣi=0N-1Σj=0M-1cosπn(2i+1)2Ncosπm(2j+1)2Mxij,]]>所述逆向2D DCT公式为xij=Σn=0N-1Σm=0M-1cosπn(2i+1)2Ncosπm(2j+1)2Mcncmfnm,]]>其中c0=1K,cn=2K,n=1,2,···K-1;]]>K表示DCT长度;fnm表示频域系数;以及xij表示空间域系数。
一个N×M 2D DCT运算等价于施加到一个输入矩阵的行上的N点DCT和施加到列上的M点DCT。
所述正向N点DCT定义如下yn=cnΣk=0N-1cosπn(2k+1)2Nxk,]]>以及所述逆向运算为xk=Σn=0N-1cosπn(2k+1)2Ncnyn,]]>
其中c0=1N,cn=2N,n=1,2,···N-1;]]>yn表示频域系数;以及xk表示空间域系数。
所述正向DCT的矩阵形式是y=C×x所述逆向DCT公式可以写作y=CT×x图1是说明一个8×8的系数块、块到行的分解、DCT及转换运算中基于行的应用、以及一个中间浮点系数块的示意图。本发明的一个实施例在一个8×8整数系数块上运算,尽管对于N和M也可以使用其它选择。
首先,一个定点整数DCT可以应用于行。所述行DCT是一连串的8个系数,并且对于一个有效SIMD DCT的实现,支持元素间的相关性的指令是需要的(例如在英特尔公司的微处理器中可用的pmaddwdMMXTM/SSETM指令)。所述行DCT方法并非一定需要具有乘法的最小数。所以,一种可能的DCT矩阵因子分解定义如下C=P×M×A,其中C是正向DCT算子,以及P,M和A是下面的矩阵A=100000010100001000100100000110001000000-1010000-1000100-1000001-1000]]>
M=c(4)c(4)c(4)c(4)0000c(2)c(6)-c(6)-c(2)0000c(4)-c(4)-c(4)c(4)0000c(6)-c(2)c(2)-c(6)00000000c(1)c(3)c(5)c(7)0000c(3)-c(7)c(1)-c(5)0000c(5)-c(1)c(7)c(3)0000c(7)-c(5)c(3)-c(1)]]>P=1000000000001000010000000000010000100000000000100001000000000001]]>其中c(n)=cosπn16·]]>所述逆向DCT可以通过转置所述正向DCT矩阵(C)来确定。
随后,所述整数定点行DCT的结果可以被转换为单精度浮点值。所述转换运算使用SIMD指令来同时转换若干个元素。应用于所有行的所述行DCT及转换产生一个单精度浮点系数块。该块可以被看作是下一个、列DCT阶段的输入数据。
图2是说明DCT到浮点系数的基于列的应用、浮点到整数的转换、以及所得到的整数系数块的示意图。在这个阶段,所述DCT运算可以应用于前面提到的浮点系数块的多个列。为了利用SIMD资源,若干个相邻列的元素可以被存储在一个SIMD寄存器里并且同时被处理,这意味着所述列DCT基于数据并行化方法,因此可以最小化计算所述列DCT的运算数量。基于离散傅里叶变换(DFT)的算法可以被最优地用来执行这个阶段。
正如Y.Arai,T.Agui,和M.Naka jima在“A Fast DCT-SQ Schemefor Images”,Trans.of IEICE,vol.E-71,no.11,pp.1095-1097,Nov.1988所提出的,一个逆向8点DCT运算可以定义如下
cosπn16cnS8(n)=Re{F16(n)},]]>其中c0=22,cn=12,n=1,2,...7;]]>S8(n)表示已变换的8点DCT系数,以及F16(n)表示16点离散傅里叶变换。
以 乘每列元素等价于以 乘每行的所有元素,其中k表示行下标,并且可以在行DCT矩阵初始化时被预先计算,这样就不会引起计算开销。
所述逆向DFT矩阵可以因式分解为L=B1×M×A1×A2×A3其中B1=1000000000000111001100000000-1-1010100000000001-10100-110000000001-11]]>M=100000000100000000C400000000100000000-C20-C6000000C4000000-C60C2000000001]]>A1=010100000-10100000010000000-10001000000100-1000000010001000-1000-1001]]>A2=0100000-10001010000010-100000010100010000000000001000000-1010000000]]>
A3=1000000-100-100100010000-1001000110100000010010010000011000000-11000]]>其中C2=2cosπ8;C4=2;C6=2sinπ8.]]>在根据上述因子分解执行所述逆向DCT运算之后,所得到的系数可以被转换为整数值。
本发明的一个非限制的示例实施例被列在附录A中。IEEE 1180-1990一致性测试结果被列在附录B中。用商业可得的英特尔公司的奔腾4处理器优化的DCT性能的测量在附录C中示出。本领域的技术人员将认识到,不像任何现有的整数定点实现的精度,本发明的精度与输入系数成比例。
这里描述的技术不限于任何特定的硬件或软件配置;他们可以在任何计算或处理环境中找到其可适用性。所述技术可以在硬件、软件或二者的结合中实现。所述技术可以在可编程机器里面执行的程序中实现,例如移动或固定计算机、个人数字助理、机顶盒、蜂窝电话以及寻呼机和其它电子设备,这些设备中每一个包括一个处理器、一个由所述处理器可读的存储介质(包括易失性和非易失性存储器和/或存储单元)、至少一个输入设备,以及一个或多个输出设备。对利用该输入设备所输入的数据应用程序代码,以便执行所述功能并产生输出信息。所述输出信息可以应用于一个或多个输出设备。本领域的一般技术人员可以理解,本发明可以在各种计算机系统配置中实施,包括多处理器系统、小型计算机、主计算机、便携计算机、等等。本发明也可以在分布式计算环境中实施,在那里任务可以由通过通信网络链接的远程处理设备完成。
每个程序可以在高级的过程或面向对象的编程语言中实现,以便和处理系统通信。但是,如果想要的话,程序可以在汇编或机器语言中实现。在上述情况下,这些语言可以被编译或解释。
可以利用程序指令使得以所述指令编程的通用或专用处理系统执行这里描述的运算。代替地,所述运算可以由包含用于执行所述运算的硬布线逻辑的专用硬件组件或者由可编程计算机组件和定制的硬件组件的任意组合来执行。这里描述的方法可以作为一个计算机程序产品被提供,所述计算机程序产品可以包括一个其上存储有指令的机器可读介质,所述指令用来对一个处理系统或其它电子设备进行编程,以执行所述方法。这里使用的术语“机器可读介质”应当包括能够存储和编码一系列用于由机器执行的指令的,以及使得机器执行任何一个前面所述方法的任何介质。因此,术语“机器可读介质”应该包括但不局限于固态存储器、光和磁盘、以及对数据信号编码的载波。此外,在本领域中这称之为软件,以采取一个动作或引起一个结果的各种各样形式(例如程序、过程、进程、应用、模块、逻辑,等等)。这样的表达仅仅是一种表明由处理系统执行的软件引起所述处理器执行一个动作或产生一个结果的简写方式。
参照说明性的实施例已经描述了本发明,但是这个描述并不是意图在一个限定的意义上被解释。所述说明性实施例的各种修改以及本发明的其它实施例,其对本领域的技术人员是显而易见的,将被看作是落在本发明的精神和范围内。
附录附录A对于逆向8×8 DCT参见idct8×8ssfs.asm对于正向8×8 DCT参见fdct8×8ssfs.asm这些文件要去MicrosoftMa cro Assembler Compiler 6.15或者更高版本。
C++语言的DCT函数原型如下extern″C″void idct8×8ssfs(short*);extern″C″void fdct8×8ssfs(short*);文件fdct8×8ssfs.asm 2002 Intel Corporation.686.xmmxmmword textequ <qword>
.model FLATtws equ esp+4ssetmp_storeequ [tws+0100h];;; ;;; ;;; short-short-float-shortfdct_row2 macro i,scales;;; IN eax->short 8×8 block;;; IN i==row index;;; IN scales->coeffs;;; OUT[esp+4...]=float 8×8 block;;; ;;;INeax->row;;; ;;;OUT xmm5|′3|′2|′1|′0;;; ;;;OUT xmm0|′7|′6|′5|′4;;; ;;;OUT xmm1|″3|″2|″1|″0;;; ;;;OUT xmm3|″7|″6|″5|″4movapsxmm0,xmmword ptr[eax+i*10h] ;;;xmm0|′7|′6|′5|′4|′3|′2|′1|′0movapsxmm1,xmmword ptr[eax+i*10h+10h] ;;;xmm1|″7|″6|″5|″4|″3|″2|″1|″0pshufhw xmm0,xmm0,00011011b;;;xmm0|4|5|6|7|3|2|1|0pshufhw xmm1,xmm1,00011011b;;;xmm1|4|5|6|7|3|2|1|0movaps xmm2,xmm1movhlps xmm2,xmm0 ;;;xmm2|″4|″5|″6|″7|′4|′5|′6|′7movlhps xmm0,xmm1 ;;;xmm0|″3|″2|″1|″0|′3|′2|′1|′0movaps xmm1,xmm0
paddsw xmm0,xmm2 ;;;xmm0|″3+4|″2+5|″1+6|″0+7|′3+4|′2+5|′1+6|′0+7psubsw xmm1,xmm2 ;;;xmm1|″3-4|″2-5|″1-6|″0-7|′3-4|′2-5|′1-6|′0-7movaps xmm3,xmm0punpckldqxmm0,xmm1 ;;;xmm0|′3-4|′2-5|′3+4|′2+5|′1-6|′0-7|′1+6|′0+7punpckhdqxmm3,xmm1 ;;;xmm3|″3-4|″2-5|″3+4|″2+5|″1-6|″0-7|″1+6|″0+7pshufd xmm2,xmm0,01001110b ;;;xmm2|′1-6|′0-7|′1+6|′0+7|′3-4|′2-5|′3+4|′2+5pshufd xmm4,xmm3,01001110b ;;;xmm4|″1-6|″0-7|″1+6|″0+7|″3-4|″2-5|″3+4|″2+5movaps xmm5,xmmword ptr scalesmovaps xmm6,xmmword ptr scales+10hpmaddwd xmm5,xmm0pmaddwd xmm6,xmm2pmaddwd xmm0,xmmword ptr scales+20hpmaddwd xmm2,xmmword ptr scales+30hpaddd xmm5,xmm6paddd xmm0,xmm2movaps xmm1,xmmword ptr scalesmovaps xmm7,xmmword ptr scales+10hpmaddwd xmm1,xmm3pmaddwd xmm7,xmm4pmaddwd xmm3,xmmword ptr scales+20hpmaddwd xmm4,xmmword ptr scales+30hpaddd xmm1,xmm7paddd xmm3,xmm4cvtdq2psxmm5,xmm5cvtdq2psxmm0,xmm0movaps xmm2,xmmword ptr scale_constcvtdq2psxmm1,xmm1cvtdq2psxmm3,xmm3mulps xmm5,xmm2mulps xmm0,xmm2mulps xmm1,xmm2mulps xmm3,xmm2movaps xmmword ptr [tws+i* 20h],xmm5movaps xmmword ptr [tws+i*20h+10h],xmm0movaps xmmword ptr [tws+(i+1)*20h],xmm1movaps xmmword ptr [tws+(i+1)*20h+10h],xmm3endmfdct_rowmacroi,scales;;; IN eax->short 8×8 block;;; IN i==row index;;; IN scales->coeffs;;; OUT[esp+4...]=float 8×8 block;;; ;;;IN eax->row;;; ;;;OUT xmm5|3|2|1|0;;; ;;;OUT xmm3|7|6|5|4movaps xmm0,xmmword ptr [eax+i*10h] ;;;xmm0|7|6|5|4|3|2|1|0pshufhw xmm0,xmm0,00011011b ;;;xmm0|4|5|6|7|3|2|1|0movhlps xmm1,xmm0 ;;;xmm1|x|x|x|x|4|5|6|7movaps xmm2,xmm0psubsw xmm2,xmm1 ;;;xmm2|x|x|x|x|3-4|2-5|1-6|0-7
paddsw xmm0,xmm1 ;;;xmm0|x|x|x|x|3+4|2+5|1+6|0+7punpckldqxmm0,xmm2 ;;;xmm0|3-4|2-5|3+4|2+5|1-6|0-7|1+6|0+7pshufd xmm3,xmm0,01000100b ;;;xmm3|1-6|0-7|1+6|0+7|1-6|0-7|1+6|0+7pshufd xmm4,xmm0,11101110b ;;;xmm4|3-4|2-5|3+4|2+5|3-4|2-5|3+4|2+5movaps xmm5,xmmword ptr scalesmovaps xmm6,xmmword ptr scales+10hpmaddwd xmm5,xmm3pmaddwd xmm6,xmm4pmaddwd xmm3,xmmword ptr scales+20hpmaddwd xmm4,xmmword ptr scales+30hpaddd xmm5,xmm6paddd xmm3,xmm4cvtdq2psxmm5,xmm5cvtdq2psxmm3,xmm3movaps xmm2,xmmword ptr scale_constmulps xmm5,xmm2mulps xmm3,xmm2movaps xmmword ptr [tws+i*20h],xmm5movaps xmmword ptr [tws+i*20h+10h],xmm3endmcvt_store macro i,r,offs;;;OUT[eax...]=coeff.rowcvtps2dq r,rpackssdw r,rif offs EQ 0;;; lowmovlps xmmword ptr [eax+i*10h],relsemovhps xmmword ptr [eax+i*10h+08h],rendifendmfdct_columnmacrooffs;;;IN tws->float 8×8 block(esp+4);;;IN eax->dst(short 8×8 block);;;IN fdct_float_1Dscale;;;OUT[eax...]=short 8×8 blockmovaps xmm3,xmmword ptr[tws+30h*2+offs]movaps xmm6,xmmword ptr[tws+40h*2+offs]movaps xmm4,xmm3addps xmm3,xmm6subps xmm4,xmm6movaps xmm2,xmmword ptr[tws+20h*2+offs]movaps xmm6,xmmword ptr[tws+50h*2+offs]movaps xmm5,xmm2addps xmm2,xmm6subps xmm5,xmm6movaps xmmword ptr ssetmp_store,xmm3movaps xmm1,xmmword ptr[tws+10h*2+offs]movaps xmm3,xmmword ptr[tws+60h*2+offs]movaps xmm6,xmm1addps xmm1,xmm3subps xmm6,xmm3movaps xmm0,xmmword ptr[tws+00h*2+offs]movaps xmm3,xmmword ptr[tws+70h*2+offs]movaps xmm7,xmm0addps xmm0,xmm3subps xmm7,xmm3addps xmm4,xmm5addps xmm5,xmm6addps xmm6,xmm7
movaps xmm3,xmm4subpsxmm3,xmm6mulpsxmm3,xmmword ptr Cp0_382mulpsxmm4,xmmword ptr Cp0_541addpsxmm4,xmm3mulpsxmm6,xmmword ptr Cp1_306addpsxmm6,xmm3mulpsxmm5,xmmword ptr Cp0_707movaps xmm3,xmm7addpsxmm7,xmm5subpsxmm3,xmm5movaps xmm5,xmm3addpsxmm3,xmm4subpsxmm5,xmm4movaps xmm4,xmm7addpsxmm7,xmm6subpsxmm4,xmm6movaps xmm6,xmm0addpsxmm0,xmmword ptr ssetmp_storesubpsxmm6,xmmword ptr ssetmp_storemovaps xmmword ptr ssetmp_store,xmm4movaps xmm4,xmm1addpsxmm1,xmm2subpsxmm4,xmm2movaps xmm2,xmm0addpsxmm0,xmm1subpsxmm2,xmm1addpsxmm4,xmm6mulpsxmm4,xmmword ptr Cp0_707movaps xmm1,xmm6addpsxmm6,xmm4subpsxmm1,xmm4;;;0,7,6,5,2,3,1,ssetmp,[tmp==xmm4]mulpsxmm0,xmmword ptr fdct_float_1Dscale+00hmulpsxmm7,xmmword ptr fdct_float_1Dscale+10hcvt_store0,xmm0,offscvt_store1,xmm7,offsmulpsxmm6,xmmword ptr fdct_float_1Dscale+20hmulpsxmm5,xmmword ptr fdct_float_1Dscale+30hcvt_store2,xmm6,offscvt_store3,xmm5,offsmovaps xmm4,xmmword ptr ssetmp_storemulpsxmm2,xmmword ptr fdct_float_1Dscale+40hmulpsxmm3,xmmword ptr fdct_float_1Dscale+50hcvt_store4,xmm2,offscvt_store5,xmm3,offsmulpsxmm1,xmmword ptr fdct_float_1Dscale+60hmulpsxmm4,xmmword ptr fdct_float_1Dscale+70hcvt_store6,xmm1,offscvt_store7,xmm4,offsendm_TEXTsegment;;;8×8fDCT;整数行阶段,AAN浮点数列阶段,短整数到浮点数/浮点数到短整数转换_fdct8×8ssfsprocnear;;;IN/OUT[esp+4]->short 8×8 blockmov eax,espsub esp,0110h ;;;space for float 8×8 blockand esp,0fffffff0h
pusheaxmov eax,[eax+4];;;eax->short IN/OUT 8×8 block;;;esp+4->float intermediate 8×8 blockfdct_row20,coeffs0wdfdct_row22,coeffs0wdfdct_row24,coeffs0wdfdct_row26,coeffs0wdif 0fdct_row0,coeffs0wfdct_row1,coeffs0wfdct_row2,coeffs0wfdct_row3,coeffs0wfdct_row4,coeffs0wfdct_row5,coeffs0wfdct_row6,coeffs0wfdct_row7,coeffs0wendiffdct_column 00hfdct_column 10hexitmovesp,[esp]ret_fdct8×8ssfsendp_TEXTends_DATAsegment;;;coeffsCp0_382 dd 4 dup(0.382683433)Cp0_541 dd 4 dup(0.541196100)Cp1_306 dd 4 dup(1.306562965)Cp0_707 dd 4 dup(0.707106781)factor equ2.8284271247461903fdct_float_1Dscaledd4 dup(0.3535533905932737875);;;(0.1250000000000)*factordd4 dup(0.2548977895521687286);;;(0.0901199777509)-//-dd4 dup(0.2705980500731764547);;;(0.0956708580913)dd4 dup(0.3006724434675027041);;;(0.1063037618459)dd4 dup(0.3535533905932737875);;;(0.1250000000000)dd4 dup(0.4499881115681958855);;;(0.1590948225716)dd4 dup(0.6532814824381269648);;;(0.2309698831278)dd4 dup(1.2814577238706289522);;;(0.4530637231764);;;1/2^16scale_const dd4 dup(37800000h);;;16-bitcoeffs0w dw5A82h, 5A82h, 7D8Ah, 6A6Eh, 7642h, 30FCh, 6A6Eh,0E708hdw5A82h, 5A82h, 471Dh, 18F9h, 0CF05h,089BFh,08277h,0B8E4hdw5A82h, 0A57Fh,471Dh, 08277h,30FCh, 089BFh,18F9h,0B8E4hdw0A57Fh,5A82h, 18F9h, 6A6Eh, 7642h, 0CF05h,6A6Eh,08277hcoeffs0wd dw5A82h, 5A82h, 7D8Ah, 6A6Eh, 0CF05h,089BFh,08277h,0B8E4h
dw5A82h, 5A82h, 471Dh,18F9h, 7642h,30FCh, 6A6Eh,0E708hdw5A82h, 0A57Fh,471Dh,08277h,7642h,0CF05h,6A6Eh,08277hdw0A57Fh,5A82h, 18F9h,6A6Eh, 30FCh,089BFh,18F9h,0B8E4h_DATAendsend
文件idct8×8ssfs.asm 2002 Intel Corporation.686.xmmxmword textequ<qword>.model FLAT_TEXT segmenttws equesp+4ssetmp_store equ[tws+0100h];;; ;;; ;;;short-floatidct_row2 macroi,scales;;;IN eax->short 8×8 block;;;IN i==row index;;;IN scales->modified coeffs;;;OUT [esp+4...]=float 8×8 block;;;;;;IN eax->row;;;;;;OUT xmm0|3|2|1|0;;;;;;OUT xmm1|7|6|5|4movdqa xmm0,xmmword ptr[eax+i*10h];;;|7|6|5|4|3|2|1|0movaps xmm4,xmmword ptr[eax+i*10h+10h]pshuflw xmm0,xmm0,11011000b ;;;|7|6|5|4|3|1|2|0pshuflw xmm4,xmm4,11011000bpshufhw xmm0,xmm0,11011000b ;;;|7|5|6|4|3|1|2|0pshufhw xmm4,xmm4,11011000bpshufd xmm1,xmm0,10101010b ;;;xmm1|6|4|6|4|6|4|6|4pshufd xmm5,xmm4,10101010bpshufd xmm2,xmm0,01010101b ;;;xmm2|3|1|3|1|3|1|3|1pshufd xmm6,xmm4,01010101bpshufd xmm3,xmm0,0ffh;;;xmm3|7|5|7|5|7|5|7|5pshufd xmm7,xmm4,0ffhpshufd xmm0,xmm0,00h ;;;xmm0|2|0|2|0|2|0|2|0pshufd xmm4,xmm4,00hpmaddwd xmm0,xmmword ptr[scales] ;;;xmm0|2×0|2×0|2×0|2×0pmaddwd xmm4,xmmword ptr[scales+40h]pmaddwd xmm1,xmmword ptr[scales+10h] ;;;xmm1|6×4|6×4|6×4|6×4paddd xmm0,xmm1 ;;;xmm0|e|e|e|epmaddwd xmm2,xmmword ptr[scales+20h] ;;;xmm2|3×1|3×1|3×1|3×1pmaddwd xmm3,xmmword ptr[scales+30h] ;;;xmm3|7×5|7×5|7×5|7×5movdqa xmm1,xmm0pmaddwd xmm5,xmmword ptr[scales+50h]paddd xmm4,xmm5pmaddwd xmm6,xmmword ptr[scales+60h]paddd xmm2,xmm3 ;;;xmm2|o|o|o|omovaps xmm5,xmm4pmaddwd xmm7,xmmword ptr[scales+70h]paddd xmm6,xmm7
paddd xmm0,xmm2 ;;;xmm0|3|2|1|0paddd xmm4,xmm6psubd xmm1,xmm2 ;;;xmm1|4|5|6|7psubd xmm5,xmm6pshufd xmm1,xmm1,00011011b;;;xmm1|7|6|5|4pshufd xmm5,xmm5,00011011bmovaps xmm2,xmmword ptr scale_constcvtdq2ps xmm0,xmm0cvtdq2ps xmm1,xmm1mulps xmm0,xmm2cvtdq2ps xmm4,xmm4cvtdq2ps xmm5,xmm5mulps xmm1,xmm2mulps xmm4,xmm2mulps xmm5,xmm2movaps xmmword ptr[tws+i*20h],xmm0movaps xmmword ptr[tws+i*20h+10h],xmm1movaps xmmword ptr[tws+(i+1)*20h],xmm4movaps xmmword ptr[tws+(i+1)*20h+10h],xmm5endmidct_row macroi, scales;;;IN eax->short 8×8 block;;;IN i==row index;;;IN scales->modified coeffs;;;OUT [esp+4...]=float 8×8 block;;;;;;IN eax->row;;;;;;OUTxmm0|3|2|1|0;;;;;;OUTxmm1|7|6|5|4movdqa xmm0,xmmword ptr[eax+i*10h];;;|7|6|5|4|3|2|1|0pshuflw xmm0,xmm0,11011000b ;;;|7|6|5|4|3|1|2|0pshufhw xmm0,xmm0,11011000b ;;;|7|5|6|4|3|1|2|0pshufd xmm1,xmm0,10101010b ;;;xmm1|6|4|6|4|6|4|6|4pshufd xmm2,xmm0,01010101b ;;;xmm2|3|1|3|1|3|1|3|1pshufd xmm3,xmm0,0ffh;;;xmm3|7|5|7|5|7|5|7|5pshufd xmm0,xmm0,00h ;;;xmm0|2|0|2|0|2|0|2|0pmaddwd xmm0,xmmword ptr[scales] ;;;xmm0|2×0|2×0|2×0|2×0pmaddwd xmm1,xmmword ptr[scales+10h] ;;;xmm1|6×4|6×4|6×4|6×4paddd xmm0,xmm1 ;;;xmm0|e|e|e|epmaddwd xmm2,xmmword ptr[scales+20h] ;;;xmm2|3×1|3×1|3×1|3×1pmaddwd xmm3,xmmword ptr[scales+30h] ;;;xmm3|7×5|7×5|7×5|7×5paddd xmm2,xmm3 ;;;xmm2|o|o|o|omovdqa xmm1,xmm0paddd xmm0,xmm2 ;;;xmm0|3|2|1|0psubd xmm1,xmm2 ;;;xmm1|4|5|6|7pshufd xmm1,xmm1,00011011b ;;;xmm1|7|6|5|4cvtdq2psxmm0,xmm0cvtdq2psxmm1,xmm1movaps xmm2,xmmword ptr scale_constmulps xmm0,xmm2mulps xmm1,xmm2
movapsxmmword ptr[tws+i*20h],xmm0movapsxmmword ptr[tws+i*20h+10h],xmm1endmcvt_store macroi,r,offs;;; OUT[eax...]=coeff.rowcvtps2dq r,rpackssdw r,rif offs EQ 0 ;;;lowmovlps xmmword ptr[eax+i*10h],relsemovhps xmmword ptr[eax+i*10h+08h],rendifendmidct_columnmacrooffs;;;IN tws->float 8×8 block(esp+4);;;IN eax->dst(short 8×8 block);;;OUT [eax...]=short 8×8 blockmovapsxmm5,xmmword ptr[tws+30h*2+offs]movapsxmm6,xmmword ptr[tws+50h*2+offs]movapsxmm7,xmm6addps xmm6,xmm5subps xmm7,xmm5movapsxmm4,xmmword ptr[tws+10h*2+offs]movapsxmm3,xmmword ptr[tws+70h*2+offs]movapsxmm5,xmm4addps xmm4,xmm3subps xmm5,xmm3movapsxmm3,xmm4addps xmm4,xmm6subps xmm3,xmm6mulps xmm3,xmmword ptr Cp1_414fmovapsxmm6,xmm7addps xmm6,xmm5mulps xmm6,xmmword ptr Cp1_847fmulps xmm7,xmmword ptr Cm2_613f;;;;;;;;;addps xmm7,xmm6mulps xmm5,xmmword ptr Cp1_082fsubps xmm5,xmm6subps xmm7,xmm4subps xmm3,xmm7addps xmm5,xmm3movapsxmmword ptr ssetmp_store,xmm4movapsxmm0,xmmword ptr[tws+00h*2+offs]movapsxmm2,xmmword ptr[tws+40h*2+offs]movapsxmm6,xmm0addps xmm0,xmm2subps xmm6,xmm2movapsxmm1,xmmword ptr[tws+20h*2+offs]movapsxmm2,xmmword ptr[tws+60h*2+offs]movapsxmm4,xmm1addps xmm1,xmm2subps xmm4,xmm2mulps xmm4,xmmword ptr Cp1_414fsubps xmm4,xmm1movapsxmm2,xmm0addps xmm0,xmm1subps xmm2,xmm1movapsxmm1,xmm0addps xmm0,xmmword ptr ssetmp_storesubps xmm1,xmmword ptr ssetmp_store
cvt_store0,xmm0,offscvt_store7,xmm1,offsmovaps xmm1,xmm2addpsxmm2,xmm5subpsxmm1,xmm5cvt_store4,xmm2,offscvt_store3,xmm1,offsmovaps xmm5,xmm6addpsxmm6,xmm4subpsxmm5,xmm4movaps xmm4,xmm6addpsxmm6,xmm7subpsxmm4,xmm7cvt_store1,xmm6,offscvt_store6,xmm4,offsmovaps xmm7,xmm5addpsxmm5,xmm3subpsxmm7,xmm3cvt_store2,xmm5,offscvt_store5,xmm7,offsendm;;;8×8 iDCT;integer row stage;AAN float column stage_idct8×8ssfsprocnear;;;IN/OUT[esp+4]->short 8×8 blockmoveax,espsubesp,0110h ;;;space for float 8×8 blockandesp,0fffffff0hpush eaxmoveax,[eax+4];;; eax->short IN/OUT 8×8 block;;; esp+4->float intermediate 8×8 blockidct_row2 0,wcorr0widct_row2 2,wcorr2widct_row2 4,wcorr4widct_row2 6,wcorr6wif 0idct_row0,wcorr0widct_row1,wcorr1widct_row2,wcorr2widct_row3,wcorr3widct_row4,wcorr4widct_row5,wcorr5widct_row6,wcorr6widct_row7,wcorr7wendifidct_column 00hidct_column 10hexitmovesp,[esp]ret_idct8×8ssfs endp_TEXT ends_DATA segment
Cp1_082f dd1.082392200,1.082392200,1.082392200,1.082392200Cp1_414f dd1.414213562,1.414213562,1.414213562,1.414213562Cp1_847f dd1.847759065,1.847759065,1.847759065,1.847759065Cm2_613f dd-2.613125930,-2.613125930,-2.613125930,-2.613125930;;;;;;short-float dataalign 10h;;;even 01 even 23;;;even tail 01 even tail 23;;;odd 01 odd 23;;;odd tail 01 odd tail 23;;;2^17wcorr0w dw4000h,539Fh,4000h, 22A3h, 4000h, 0DD5Eh,4000h,0AC62hdw4000h,22A3h,0C001h,0AC62h,0C001h,539Fh, 4000h,0DD5Ehdw58C5h,4B42h,4B42h, 0EE59h,3249h, 0A73Ch,11A8h,0CDB8hdw3249h,11A8h,0A73Ch,0CDB8h,11A8h, 4B42h, 4B42h,0A73Chwcorr1w dw58C5h,73FCh,58C5h, 300Bh, 58C5h, 0CFF6h,58C5h,08C05hdw58C5h,300Bh,0A73Ch,08C05h,0A73Ch,73FCh, 58C5h,0CFF6hdw7B21h,6862h,6862h, 0E783h,45BFh, 084E0h,187Eh,0BA42hdw45BFh,187Eh,084E0h,0BA42h,187Eh, 6862h, 6862h,084E0hwcorr2w dw539Fh,6D41h,539Fh, 2D41h, 539Fh, 0D2C0h,539Fh,092C0hdw539Fh,2D41h,0AC62h,092C0h,0AC62h,6D41h, 539Fh,0D2C0hdw73FCh,6254h,6254h, 0E8EFh,41B3h, 08C05h,1712h,0BE4Ehdw41B3h,1712h,08C05h,0BE4Eh,1712h, 6254h, 6254h,08C05hwcorr3w dw4B42h,6254h,4B42h, 28BAh, 4B42h, 0D747h,4B42h,09DADhdw4B42h,28BAh,0B4BFh,09DADh,0B4BFh,6254h, 4B42h,0D747hdw6862h,587Eh,587Eh, 0EB3Eh,3B21h, 0979Fh,14C3h,0C4E0hdw3B21h,14C3h,0979Fh,0C4E0h,14C3h, 587Eh, 587Eh,0979Fhwcorr4w dw4000h,539Fh,4000h, 22A3h, 4000h, 0DD5Eh,4000h,0AC62hdw4000h,22A3h,0C001h,0AC62h,0C001h,539Fh, 4000h,0DD5Ehdw58C5h,4B42h,4B42h, 0EE59h,3249h, 0A73Ch,11A8h,0CDB8hdw3249h,11A8h,0A73Ch,0CDB8h,11A8h, 4B42h, 4B42h,0A73Chwcorr5w dw3249h,41B3h,3249h, 1B37h, 3249h, 0E4CAh,3249h,0BE4Ehdw3249h,1B37h,0CDB8h,0BE4Eh,0CDB8h,41B3h, 3249h,0E4CAhdw45BFh,3B21h,3B21h, 0F221h,2782h, 0BA42h,0DE0h,0D87Fhdw2782h,0DE0h,0BA42h,0D87Fh,0DE0h, 3B21h, 3B21h,0BA42hwcorr6w dw22A3h,2D41h,22A3h, 12BFh, 22A3h, 0ED42h,22A3h,0D2C0hdw22A3h,12BFh,0DD5Eh,0D2C0h,0DD5Eh,2D41h, 22A3h,0ED42hdw300Bh,28BAh,28BAh, 0F673h,1B37h, 0CFF6h,098Eh,0E4CAhdw1B37h,098Eh,0CFF6h,0E4CAh,098Eh, 28BAh, 28BAh,0CFF6hwcorr7w dw11A8h,1712h,11A8h, 098Eh, 11A8h, 0F673h,11A8h,0E8EFhdw11A8h,098Eh,0EE59h,0E8EFh,0EE59h,1712h, 11A8h,0F673hdw187Eh,14C3h,14C3h, 0FB22h,0DE0h, 0E783h,04DFh,0F221hdw0DE0h,04DFh,0E783h,0F221h,04DFh, 14C3h, 14C3h,0E783h;;;1/2^17scale_ const dd 37000000h,37000000h,37000000h,37000000h_DATA endsend
附录B以下是逆向DCT IEEE1180-1990兼容测试的结果。
该测试执行了10000次迭代。
在本部分,表中的每个元素对应于8×8系数块的一个输出DCT系数。
1.单精度浮点8×8逆向DCT(a)输入值的范围是[-255;255]误差的绝对值峰值

最大的峰值误差为1(满足协议限制1)均方误差

最差的pmse=0.000200(满足协议限制0.06)总的mse=0.000013(满足协议限制0.02)(b)输入值的范围是[-5;5]误差的绝对值峰值

最差峰值误差为0(满足协议限制1)均方误差

最差的pmse=0.000000(满足协议限制0.06)总的mse=0.000000(满足协议限制0.02)2.混合的整数/单精度浮点8×8逆向DCT(a)输入值的范围[-255;255]误差的绝对值峰值

最差的峰值误差为1(满足协议限制1)均方误差

最差的pmse=0.008700(满足协议限制0.06)总的mse=0.004722(满足协议限制0.02)
(b)输入值的范围是[-5;5]误差的绝对值峰值


最差的峰值误差为1(满足协议限制1)均方误差

最差的pmse=0.000400(满足协议限制0.06)总的mse=0.000109(满足协议限制0.02)3.整数8×8逆向DCT(a)输入值的范围是[-255;255]误差的绝对值峰值

最差的峰值误差为1(满足协议限制1)均方误差

最差的pmse=0.018700(满足协议限制0.06)总的mse=0.014322(满足协议限制0.02)(b)输入值的范围是[-5;5]误差的绝对值峰值

最差的峰值误差为1(满足协议限制1)均方误差

最差的pmse=0.018500(满足协议限制0.06)总的mse=0.014264(满足协议限制0.02)
附录C

逆向

正向

权利要求
1.在一个支持单指令多数据(SIMD)运算的系统中,一种在一个N×M系数块上执行二维(2D)逆向或正向离散余弦变换(DCT)的方法,其中N和M是自然数,包括对所述系数块的行应用一维(1D)整数DCT;将所述1D整数DCT的结果数据转换为单精度浮点值;以及对转换所述结果数据所得到的一个N×M系数块的列应用1D单精度浮点DCT。
2.权利要求1的所述方法,其中应用于行的所述1D整数DCT还包括一个利用定点整数计算所实现的N点DCT运算。
3.权利要求2的所述方法,其中用来表示所述定点整数计算的中间值和所述N点DCT运算的输出值的位的数目至少是表示所述N点DCT输入值的位的数目的两倍。
4.权利要求2的所述方法,其中所述N点DCT的实现是利用支持操作数之间相关性的SIMD运算。
5.权利要求2的所述方法,其中转换结果数据还包括对所述N点DCT的输出值应用转换运算以产生N个单精度浮点系数。
6.权利要求5的所述方法,其中所述转换运算的实现是利用SIMD指令,并且其同时对所述系数块的若干个元素应用所述转换运算。
7.权利要求1的所述方法,其中应用于列的1D单精度浮点DCT还包括一个利用单精度浮点计算所实现的M点DCT。
8.权利要求7的所述方法,其中所述单精度浮点DCT是利用SIMD指令实现的,以便将所述DCT运算同时应用到若干列。
9.一种制品,包括一个具有指令的机器可访问介质,当所述指令在支持单指令多数据(SIMD)运算的处理系统中执行时,使所述处理系统执行一种方法,所述方法对一个N×M系数块应用二维(2D)逆向或正向离散余弦变换(DCT),其中N和M是自然数,通过对所述系数块的行应用一维(1D)整数DCT;将所述1D整数DCT的结果数据转换为单精度浮点值;以及对从转换所述结果数据中得到的一个N×M系数块的列应用1D单精度浮点DCT。
10.权利要求9的所述制品,其中用于应用于行的所述1D整数DCT的指令还包括用于利用定点整数计算所实现的N点DCT运算的指令。
11.权利要求10的所述制品,其中用来表示所述定点整数计算的中间值和所述N点DCT运算的输出值的位的数目至少是表示所述N点DCT输入值的位的数目的两倍。
12.权利要求10的所述制品,其中利用用于支持操作数之间相关性的SIMD运算的指令来实现所述N点DCT。
13.权利要求10的所述制品,其中用于转换结果数据的指令还包括用于对所述N点DCT的输出值应用转换运算以产生N个单精度浮点系数的指令。
14.权利要求13的所述制品,其中所述转换运算是利用SIMD指令实现的,并且其同时对所述系数块的若干个元素应用所述转换运算。
15.权利要求9的所述制品,其中用于应用所述1D单精度浮点DCT到若干列的指令还包括用于一个利用单精度浮点计算所实现的M点DCT的指令。
16.权利要求15的所述制品,其中所述单精度浮点DCT是利用SIMD指令实现的,以便将所述DCT运算同时应用到若干列。
17.一种在一个N×M系数块上执行二维(2D)逆向或正向离散余弦变换(DCT)的装置,其中N和M是自然数,包括对所述系数块的行应用一维(1D)整数DCT的第一功能块;将所述1D整数DCT的结果数据转换为单精度浮点值的第二功能块;以及对从转换所述结果数据中得到的一个N×M系数块的列应用1D单精度浮点DCT的第三功能块。
18.权利要求17的所述装置,其中所述第一功能块还包括利用定点整数计算来实现N点DCT运算的第四功能块。
19.权利要求18的所述装置,其中用来表示所述定点整数计算的中间值和所述第四功能块的输出值的位的数目至少是表示所述第四功能块输入值的位的数目的两倍。
20.权利要求18的所述装置,其中所述第四功能块是利用支持操作数之间相关性的SIMD运算实现的。
21.权利要求18的所述装置,其中所述第二功能块还包括对所述第四功能块的输出值应用转换运算以产生N个单精度浮点系数的第五功能块。
22.权利要求21的所述装置,其中所述第二功能块是利用SIMD指令实现的,并且其同时对所述系数块的若干个元素应用所述第二功能块。
23.权利要求17的所述装置,其中所述第三功能块还包括一个利用单精度浮点计算实现M点DCT的第六功能块。
24.权利要求23的所述装置,其中第三功能块是利用SIMD指令实现的,以便将所述DCT运算同时应用到若干列。
全文摘要
公开了一种执行逆向和正向离散余弦变换(DCT)的快速和精确的方法。所述方法可以用来实现在一个N×M系数块上操作的二维(2D)逆向或正向DCT,并具有比IEEE 1180-1990标准(对于所述逆向运算)所规定的更高的精度。所公开的方法包括以下阶段基于整数运算,在一个输入系数块的每一行上执行一个定点一维(1D)DCT,执行整数到单精度浮点数的结果转换,以及对从前面阶段所得的所述系数块的每一列执行单精度浮点1D DCT。
文档编号G06F17/14GK1653447SQ03810825
公开日2005年8月10日 申请日期2003年3月11日 优先权日2002年3月12日
发明者S·泽尔托夫, S·布拉塔诺夫, R·贝勒诺夫, A·克恩亚泽夫 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1