CN100367273C - 执行n×m离散余弦变换的方法 - Google Patents

执行n×m离散余弦变换的方法 Download PDF

Info

Publication number
CN100367273C
CN100367273C CNB038108259A CN03810825A CN100367273C CN 100367273 C CN100367273 C CN 100367273C CN B038108259 A CNB038108259 A CN B038108259A CN 03810825 A CN03810825 A CN 03810825A CN 100367273 C CN100367273 C CN 100367273C
Authority
CN
China
Prior art keywords
dct
functional block
point
xmm0
integer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CNB038108259A
Other languages
English (en)
Other versions
CN1653447A (zh
Inventor
S·泽尔托夫
S·布拉塔诺夫
R·贝勒诺夫
A·克恩亚泽夫
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Intel Corp
Original Assignee
Intel Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Intel Corp filed Critical Intel Corp
Publication of CN1653447A publication Critical patent/CN1653447A/zh
Application granted granted Critical
Publication of CN100367273C publication Critical patent/CN100367273C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/14Fourier, Walsh or analogous domain transformations, e.g. Laplace, Hilbert, Karhunen-Loeve, transforms
    • G06F17/147Discrete orthonormal transforms, e.g. discrete cosine transform, discrete sine transform, and variations therefrom, e.g. modified discrete cosine transform, integer transforms approximating the discrete cosine transform

Landscapes

  • Physics & Mathematics (AREA)
  • Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Mathematical Analysis (AREA)
  • Data Mining & Analysis (AREA)
  • Computational Mathematics (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Optimization (AREA)
  • Theoretical Computer Science (AREA)
  • Discrete Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Algebra (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)
  • Complex Calculations (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

公开了一种执行逆向和正向离散余弦变换(DCT)的快速和精确的方法。所述方法可以用来实现在一个N×M系数块上操作的二维(2D)逆向或正向DCT,并具有比IEEE 1180-1990标准(对于所述逆向运算)所规定的更高的精度。所公开的方法包括以下阶段:基于整数运算,在一个输入系数块的每一行上执行一个定点一维(1D)DCT,执行整数到单精度浮点数的结果转换,以及对从前面阶段所得的所述系数块的每一列执行单精度浮点1D DCT。

Description

执行N×M离散余弦变换的方法
本专利文件公开的一部分包含受到版权保护的内容。当所述专利文件或所述专利公开出现在专利和商标局的专利文件或记录上时,版权所有人不反对任何人对其的影印复制,除此之外保留所有的版权。
技术领域
本发明总的涉及视频处理,并且更具体地涉及在一个系统中的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执行的能力。
发明内容
本发明提供了在一个支持单指令多数据SIMD运算的系统中,一种在一个N×M系数块上执行二维2D逆向或正向离散余弦变换DCT的方法,其中N和M是自然数。所述方法包括:对所述系数块的行应用一维1D整数DCT;将所述1D整数DCT的结果数据转换为单精度浮点值;以及对转换所述结果数据所得到的一个N×M系数块的列应用1D单精度浮点DCT。
在一个实施例中,应用于行的所述1D整数DCT还包括一个利用定点整数计算所实现的N点DCT运算。用来表示所述定点整数计算的中间值和所述N点DCT运算的输出值的位的数目至少是表示所述N点DCT输入值的位的数目的两倍。所述N点DCT的实现是利用支持操作数之间相关性的SIMD运算。转换结果数据还包括对所述N点DCT的输出值应用转换运算以产生N个单精度浮点系数。
在上述实施例中,所述转换运算的实现是利用SIMD指令,并且其同时对所述系数块的若干个元素应用所述转换运算。
在另一实施例中,应用于列的1D单精度浮点DCT还包括一个利用单精度浮点计算所实现的M点DCT。其中所述单精度浮点DCT是利用SIMD指令实现的,以便将所述DCT运算同时应用到若干列。
本发明还提供了一种在一个N×M系数块上执行二维2D逆向或正向离散余弦变换DCT的装置,其中N和M是自然数。所述装置包括:对所述系数块的行应用一维1D整数DCT的第一功能块;将所述1D整数DCT的结果数据转换为单精度浮点值的第二功能块;以及对由于转换所述结果数据而得到的一个N×M系数块的列应用1D单精度浮点DCT的第三功能块。
附图说明
根据随后对本发明详细的描述,本发明的特征及优点将变得显而易见,其中:
图1是根据本发明的实施例的示意图,其说明一个8×8的系数块、所述块成为多行的分解、DCT及转换运算的基于行的应用、以及一个中间浮点系数块;以及
图2是根据本发明的实施例的示意图,其说明DCT到浮点系数的基于列的应用、浮点到整数的转换、以及所得到的整数系数块。
具体实施方式
本发明的实施例是一种实现二维N×M逆向和正向离散余弦变换(此后DCT既表示所述逆向运算,又表示所述正向运算)的方法。用于逆向运算的所述方法,比由所述IEEE1180-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可以定义如下:
f nm = c n c m Σ i = 0 N - 1 Σ j = 0 M - 1 cos πn ( 2 i + 1 ) 2 N cos πm ( 2 j + 1 ) 2 M x ij ,
所述逆向2D DCT公式为:
x ij = Σ n = 0 N - 1 Σ m = 0 M - 1 cos πn ( 2 i + 1 ) 2 N cos πm ( 2 j + 1 ) 2 M c n c m f nm ,
其中 c 0 = 1 K , c n = 2 K , n = 1,2 , . . . K - 1 ;
K表示DCT长度;
fnm表示频域系数;以及
xij表示空间域系数。
一个N×M 2D DCT运算等价于施加到一个输入矩阵的行上的N点DCT和施加到列上的M点DCT。
所述正向N点DCT定义如下:
y n = c n Σ K = 0 N - 1 cos πn ( 2 k + 1 ) 2 N x k ,
x k = Σ n = 0 N - 1 cos πn ( 2 k + 1 ) 2 N c n y n , 以及所述逆向运算为:
其中 c 0 = 1 N , c n = 2 N , 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 = 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 - 1 0 1 0 0 0 0 - 1 0 0 0 1 0 0 - 1 0 0 0 0 0 1 - 1 0 0 0
M = c ( 4 ) c ( 4 ) c ( 4 ) c ( 4 ) 0 0 0 0 c ( 2 ) c ( 6 ) - c ( 6 ) - c ( 2 ) 0 0 0 0 c ( 4 ) - c ( 4 ) - c ( 4 ) c ( 4 ) 0 0 0 0 c ( 6 ) - c ( 2 ) c ( 2 ) - c ( 6 ) 0 0 0 0 0 0 0 0 c ( 1 ) c ( 3 ) c ( 5 ) c ( 7 ) 0 0 0 0 c ( 3 ) - c ( 7 ) - c ( 1 ) - c ( 5 ) 0 0 0 0 c ( 5 ) - c ( 1 ) c ( 7 ) c ( 3 ) 0 0 0 0 c ( 7 ) - c ( 5 ) c ( 3 ) - c ( 1 )
P = 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
其中 c ( n ) =cos πn 16 .
所述逆向DCT可以通过转置所述正向DCT矩阵(C)来确定。
随后,所述整数定点行DCT的结果可以被转换为单精度浮点值。所述转换运算使用SIMD指令来同时转换若干个元素。应用于所有行的所述行DCT及转换产生一个单精度浮点系数块。该块可以被看作是下一个、列DCT阶段的输入数据。
图2是说明DCT到浮点系数的基于列的应用、浮点到整数的转换、以及所得到的整数系数块的示意图。在这个阶段,所述DCT运算可以应用于前面提到的浮点系数块的多个列。为了利用SIMD资源,若干个相邻列的元素可以被存储在一个SIMD寄存器里并且同时被处理,这意味着所述列DCT基于数据并行化方法,因此可以最小化计算所述列DCT的运算数量。基于离散傅里叶变换(DFT)的算法可以被最优地用来执行这个阶段。
正如Y.Arai,T.Agui,和M.Nakajima在“A Fast DCT-SQ Schemefor Images”,Trans.of IEICE,vol.E-71,no.11,pp.1095-1097,Nov.1988所提出的,一个逆向8点DCT运算可以定义如下:
cos πn 16 c n S 8 ( n ) = Re { F 16 ( n ) } ,
其中 c 0 = 2 2 , c n = 1 2 , n = 1,2 , . . . 7 ;
S8(n)表示已变换的8点DCT系数,以及
F16(n)表示16点离散傅里叶变换。
Figure C0381082500094
乘每列元素等价于以
Figure C0381082500095
乘每行的所有元素,其中k表示行下标,并且可以在行DCT矩阵初始化时被预先计算,这样就不会引起计算开销。
所述逆向DFT矩阵可以因式分解为:
L=B1×M×A1×A2×A3
其中:
B 1 = 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 - 1 - 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 - 1 0 1 0 0 - 1 1 0 0 0 0 0 0 0 0 0 1 - 1 1 M = 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 C 4 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - C 2 0 - C 6 0 0 0 0 0 0 C 4 0 0 0 0 0 0 - C 6 0 C 2 0 0 0 0 0 0 0 0 1
A 1 = 0 1 0 1 0 0 0 0 0 - 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 - 1 0 0 0 1 0 0 0 0 0 0 1 0 0 - 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 - 1 0 0 0 - 1 0 0 1 A 2 = 0 1 0 0 0 0 0 - 1 0 0 0 1 0 1 0 0 0 0 0 1 0 - 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - 1 0 1 0 0 0 0 0 0 0
A 3 = 1 0 0 0 0 0 0 - 1 0 0 - 1 0 0 1 0 0 0 1 0 0 0 0 - 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 - 1 1 0 0 0
其中 C 2 = 2 cos π 8 ; C4= C 6 = 2 sin π 8 .
在根据上述因子分解执行所述逆向DCT运算之后,所得到的系数可以被转换为整数值。
本发明的一个非限制的示例实施例被列在附录A中。IEEE 1180-1990一致性测试结果被列在附录B中。用商业可得的英特尔公司的奔腾4处理器优化的DCT性能的测量在附录C中示出。本领域的技术人员将认识到,不像任何现有的整数定点实现的精度,本发明的精度与输入系数成比例。
这里描述的技术不限于任何特定的硬件或软件配置;他们可以在任何计算或处理环境中找到其可适用性。所述技术可以在硬件、软件或二者的结合中实现。所述技术可以在可编程机器里面执行的程序中实现,例如移动或固定计算机、个人数字助理、机顶盒、蜂窝电话以及寻呼机和其它电子设备,这些设备中每一个包括一个处理器、一个由所述处理器可读的存储介质(包括易失性和非易失性存储器和/或存储单元)、至少一个输入设备,以及一个或多个输出设备。对利用该输入设备所输入的数据应用程序代码,以便执行所述功能并产生输出信息。所述输出信息可以应用于一个或多个输出设备。本领域的一般技术人员可以理解,本发明可以在各种计算机系统配置中实施,包括多处理器系统、小型计算机、主计算机、便携计算机、等等。本发明也可以在分布式计算环境中实施,在那里任务可以由通过通信网络链接的远程处理设备完成。
每个程序可以在高级的过程或面向对象的编程语言中实现,以便和处理系统通信。但是,如果想要的话,程序可以在汇编或机器语言中实现。在上述情况下,这些语言可以被编译或解释。
可以利用程序指令使得以所述指令编程的通用或专用处理系统执行这里描述的运算。代替地,所述运算可以由包含用于执行所述运算的硬布线逻辑的专用硬件组件或者由可编程计算机组件和定制的硬件组件的任意组合来执行。这里描述的方法可以作为一个计算机程序产品被提供,所述计算机程序产品可以包括一个其上存储有指令的机器可读介质,所述指令用来对一个处理系统或其它电子设备进行编程,以执行所述方法。这里使用的术语“机器可读介质”应当包括能够存储和编码一系列用于由机器执行的指令的,以及使得机器执行任何一个前面所述方法的任何介质。因此,术语“机器可读介质”应该包括但不局限于固态存储器、光和磁盘、以及对数据信号编码的载波。此外,在本领域中这称之为软件,以采取一个动作或引起一个结果的各种各样形式(例如程序、过程、进程、应用、模块、逻辑,等等)。这样的表达仅仅是一种表明由处理系统执行的软件引起所述处理器执行一个动作或产生一个结果的简写方式。
参照说明性的实施例已经描述了本发明,但是这个描述并不是意图在一个限定的意义上被解释。所述说明性实施例的各种修改以及本发明的其它实施例,其对本领域的技术人员是显而易见的,将被看作是落在本发明的精神和范围内。
                 附   录
Figure C0381082500121
                   附录A
对于逆向8×8DCT参见:idct8×8ssfs.asm
对于正向8×8DCT参见:fdct8×8ssfs.asm
这些文件要去MicrosoftMa cro Assembler Compiler 6.15或者更高版本。
C++语言的DCT函数原型如下:
extern″C″void idct8×8ssfs(short);
extern″C″vOid fdct8×8ssfs(short);
Figure C0381082500122
文件:fdct8×8ssfs.asm
2002 Intel Corporation
.686
.xmm
xmmword textequ <qword>
.model FLAT
tws              equ     esp+4
ssetmp_store     equ     [tws+0100h]
;;; ;;; ;;; short-short-float-short
fdct_row2           macro  i,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    xmm0:|′7|′6|′5|′4
        ;;; ;;; OUT    xmm1:|″3|″2|″1|″0
        ;;; ;;; OUT    xmm3:|″7|″6|″5|″4
        movaps  xmm0,xmmword ptr  [eax+i10h]      ;;;xmm0:
|′7|′6|′5|′4|′3|′2|′1|′0
        movaps  xmm1,xmmword ptr  [eax+i10h+10h]  ;;;xmm1:
|″7|″6|″5|″4|″3|″2|″1|″0
        pshufhw xmm0,xmm0,00011011b                ;;;xmm0:
|4|5|6|7|3|2|1|0
        pshufhw xmm1,xmm1,00011011b                ;;;xmm1:
|4|5|6|7|3|2|1|0
        movaps  xmm2,xmm1
        movhlps xmm2,xmm0                           ;;;xmm2:
|″4|″5|″6|″7|″4|″5|″6|″7
        movlhps xmm0,xmm1                           ;;;xmm0:
|″3|″2|″1|″0|″3|″2|″1|″0
        movaps xmm1,xmm0
    paddsw  xmm0,xmm2;;;xmm0:
|″3+4|″2+5|″1+6|″0+7|′3+4|′2+5|′1+6|′0+7
    psubsw  xmm1,xmm2;;;xmm1:|″3-4|″2-5|″1-6|″0-7|′3-
4|′2-5|′1-6|′0-7
    movaps  xmm3,xmm0
    punpckldq     xmm0,xmm1          ;;;xmm0:|′3-4|′2-5|′3+4|′2+5|′1-
6|′0-7|′1+6|′0+7
    punpckhdq     xmm3,xmm1          ;;;xmm3:|″3-4|″2-5|″3+4|″2+5|″1-
6|″0-7|″1+6|″0+7
    pshufd  xmm2,xmm0,01001110b     ;;;xmm2:|′1-6|′0-7|′1+6|′0+7|′3-
4|′2-5|′3+4|′2+5
    pshufd  xmm4,xmm3,01001110b     ;;;xmm4:|″1-6|″0-7|″1+6|″0+7|″3-
4|″2-5|″3+4|″2+5
    movaps  xmm5,xmmword ptr scales
    movaps  xmm6,xmmword ptr scales  +10h
    pmaddwd xmm5,xmm0
    pmaddwd xmm6,xmm2
    pmaddwd xmm0,xmmword ptr scales+20h
    pmaddwd xmm2,xmmword ptr scales+30h
    paddd   xmm5,xmm6
    paddd   xmm0,xmm2
    movaps  xmm1,xmmword ptr scales
    movaps  xmm7,xmmword ptr scales+10h
    pmaddwd xmm1,xmm3
    pmaddwd xmm7,xmm4
    pmaddwd xmm3,xmmword ptr scales+20h
    pmaddwd xmm4,xmmword ptr scales+30h
    paddd   xmm1,xmm7
    paddd   xmm3,xmm4
    cvtdq2ps         xmm5,xmm5
    cvtdq2ps         xmm0,xmm0
    movaps           xmm2,xmm2,xmmword ptr scale_const
    cvtdq2ps         xmm1,xmm1
    cvtdq2ps         xmm3,xmm3
    mulps            xmm5,xmm2
    mulps            xmm0,xmm2
    mulps            xmm1,xmm2
    mulps            xmm3,xmm2
    movaps xmmword ptr  [tws+i20h],xmm5
    movaps xmmword ptr  [tws+i20h+10h],xmm0
    movaps xmmword ptr  [tws+(i+1)20h],xmm1
    movaps xmmword ptr  [tws+(i+1)20h+10h],xmm3
    endm
fdct_row    macro    i,scales
    ;;;IN  eax -> short 8×8 block
    ;;;IN  i == rowindex
    ;;;IN  scales->coeffs
    ;;;OUT[esp+4...]=float 8×8 block
    ;;; ;;;IN     eax->row
    ;;; ;;;OUT    xmm5:|3|2|1|0
    ;;; ;;;OUT    xmm3:|7|6|5|4
    movaps  xmm0,xmmword ptr  [eax+i10h]   ;;;xmm0:
|7|6|5|4|3|2|1|0
    pshufhw xmm0,xmm0,00011011b             ;;;xmm0:
|4|5|6|7|3|2|1|0
    movhlps xmm1,xmm0                        ;;;xmm1:
|x|x|x|x|4|5|6|7
    movaps xmm2,xmm0
    psubsw  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+7
        punpckldq    xmm0,xmm2               ;;;xmm0:|3-4|2-5|3+4|2+5|1-
6|0-7|1+6|0+7
        pshufd       xmm3,xmm0,01000100b    ;;;xmm3:|1-6|0-7|1+6|0+7|1-
6|0-7|1+6|0+7
        pshufd       xmm4,xmm0,11101110b    ;;;xmm4:|3-4|2-5|3+4|2+5|3-
4|2-5|3+4|2+5
        movaps    xmm5,xmmword ptr scales
        movaps    xmm6,xmmword ptr scales+10h
        pmaddwd   xmm5,xmm3
        pmaddwd   xmm6,xmm4
        pmaddwd   xmm3,xmmword ptr scales+20h
        pmaddwd   xmm4,xmmword ptr scales+30h
        paddd     xmm5,xmm6
        paddd     xmm3,xmm4
        cvtdq2ps  xmm5,xmm5
        cvtdq2ps  xmm3,xmm3
        movaps    xmm2,xmmword ptr scale_const
        mulps     xmm5,xmm2
        mulps     xmm3,xmm2
        movaps    xmmword ptr [tws+i20h],xmm5
        movaps    xmmword ptr [tws+i20h+10h],xmm3
        endm
cvt_store    macro    i,r,offs
        ;;;OUT[eax...]=coeff.row
        cvtps2dq    r,r
        packssdw    r,r
if offs EQ 0  ;;;low
        movlps    xmmword ptr [eax+i10h],r
else
        movhps    xmmword ptr [eax+i10h+08h],r
endif
        endm
fdct_column    macro    offs
        ;;;IN  tws -> float 8×8 block (esp+4)
        ;;;IN  eax -> dst (short 8×8 block)
        ;;;IN  fdct_float_1Dscale
        ,;;OUT  [eax...]=short 8×8 block
        movaps   xmm3,xmmword ptr [tws+30h2+offs]
        movaps   xmm6,xmmword ptr [tws+40h2+offs]
        movaps   xmm4,xmm3
        addps    xmm3,xmm6
        subps    xmm4,xmm6
        movaps   xmm2,xmmword ptr [tws+20h2+offs)
        movaps   xmm6,xmmword ptr [tws+50h2+offs)
        movaps   xmm5,xmm2
        addps    xmm2,xmm6
        subps    xmm5,xmm6
        movaps   xmmword ptr ssetmp_store,xmm3
        movaps   xmm1,xmmword ptr [tws+10h2+offs]
        movaps   xmm3,xmmword ptr [tws+60h2+offs]
        movaps   xmm6,xmm1
        addps    xmm1,xmm3
        subps    xmm6,xmm3
        movaps   xmm0,xmmword ptr [tws+00h2+offs]
        movaps   xmm3,xmmword ptr [tws+70h2+offs]
        movaps   xmm7,xmm0
        addps    xmm0,xmm3
        subps    xmm7,xmm3
        addps    xmm4,xmm5
        addps    xmm5,xmm6
        vaddps   xmm6,xmm7
        movaps  xmm3,xmm4
        subps   xmm3,xmm6
        mulps   xmm3,xmmword ptr Cp0_382
        mulps   xmm4,xmmword ptr Cp0_541
        addps   xmm4,xmm3
        mulps   xmm6,xmmword ptr Cp1_306
        addps   xmm6,xmm3
        mulps   xmm5,xmmword ptr Cp0_707
        movaps  xmm3,xmm7
        addps   xmm7,xmm5
        subps   xmm3,xmm5
        movaps  xmm5,xmm3
        addps   xmm3,xmm4
        subps   xmm5,xmm4
        mmovaps xmm4,xmm7
        addps   xmm7,xmm6
        subps   xmm4,xmm6
        movaps  xmm6,xmm0
        addps   xmm0,xmmword ptr ssetmp_store
        subps   xmm6,xmmword ptr ssetmp_store
        movaps  xmmword ptr ssetmp_store,xmm4
        movaps  xmm4,xmm1
        addps   xmm1,xmm2
        subps   xmm4,xmm2
        movaps  xmm2,xmm0
        addps   xmm0,xmm1
        subps   xmm2,xmm1
        addps   xmm4,xmm6
        mulps   xmm4,xmmword ptr Cp0_707
        movaps  xmm1,xmm6
        addps   xmm6,xmm4
        subps   xmm1,xmm4
;;; 0,7,6,5,2,3,1,ssetmp,[tmp==xmm4]
        mulps xmm0,xmmword ptr fdct_float_1Dscale+00h
        mulps xmm7,xmmword ptr fdct_float_1Dscale+10h
        cvt_store    0,xmm0,offs
        cvt_store    1,xmm7,offs
        mulps xmm6,xmmword ptr fdct_float_1Dscale+20h
        mulps xmm5,xmmword ptr fdct_float_1Dscale+30h
        cvt_store    2,xmm6,offs
        cvt_store    3,xmm5,offs
        movaps xmm4,xmmword ptr ssetmp_store
        mulps  xmm2,xmmword ptr fdct_float_1Dscale+40h
        mulps  xmm3,xmmword ptr fdct_float_1Dscale+50h
        cvt_store       4,xmm2,offs
        cvt_store       5,xmm3,offs
        mulps    xmm1,xmmword ptr fdct_float_lDscale+60h
        mulps    xmm4,xmmword ptr fdct_float_1Dscale+70h
        cvt_store    6,xmm1,offs
        cvt_store    7,xmm4,offs
        endm
_TEXT    segment
;;;8×8fDCT;整数行阶段,AAN浮点数列阶段,短整数到浮点数/浮点数
到短整数转换
_fdct8×8ssfs    proc    near
        ;;;IN/OUT[esp+4) -> short 8×8 block
        mov    eax,esp
        sub    esp,0110h    ;;;  space for float 8×8 block
        and    esp,0fffffff0h
        push    eax
        mov     eax,[eax+4]
        ;;;eax -> shortIN/OUT 8×8 block
        ;;;esp+4 -> float intermediate 8×8 block
        fdct_row2    0,  coeffs0wd
        fdct_row2    2,  coeffs0wd
        fdct_row2    4,  coeffs0wd
        fdct_row2    6,  coeffs0wd
if 0
        fdct_row     0,  coeffs0w
        fdct_row     1,  coeffs0w
        fdct_row     2,  coeffs0w
        fdct_row     3,  coeffs0w
        fdct_row     4,  coeffs0w
        fdct_row     5,  coeffs0w
        fdct_row     6,  coeffs0w
        fdct_row     7,  coeffs0w
endif
        fdct column  00h
        fdct column  10h
exit:
        mov    esp,[esp]
        ret
_fdct8×8ssfs    endp
_TEXT    ends
_DATA    segment
;;;coeffs
Cp0_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  equ   2.8284271247461903
fdct_float_1Dscale    dd    4 dup(0.3535533905932737875);;;(0.1250000000000)
factor
                      dd    4 dup(0.2548977895521687286);;;(0.0901199777509)
-//-
                      dd    4 dup(0.2705980500731764547);;;(0.0956708580913)
                      dd    4 dup(0.3006724434675027041);;;(0.1063037618459)
                      dd    4 dup(0.3535533905932737875);;;(0.1250000000000)
                      dd    4 dup(0.4499881115681958855);;;(0.1590948225716)
                      dd    4 dup(0.6532814824381269648);;;(0.2309698831278)
                      dd    4 dup(1.2814577238706289522);;;(0.4530637231764)
        ;;;1/2^16
scale_const    dd    4 dup(37800000h)
        ;;;16-bit
coeffs0w    dw    5A82h,  5A82h,  7D8Ah,  6A6Eh,  7642h,  30FCh,  6A6Eh,
0E708h
            dw    5A82h,  5A82h,  471Dh,  18F9h,  0CF05h, 089BFh, 08277h,
0B8E4h
            dw    5A82h,  0A57Fh, 471Dh,  08277h, 30FCh,  089BFh, 18F9h,
0B8E4h
            dw    0A57Fh, 5A82h,  18F9h,  6A6Eh,  7642h,  0CF05h, 6A6Eh,
08277h
coeffs0wd   dw    5A82h,  5A82h,  7D8Ah,  6A6Eh,  0CF05h, 089BFh, 08277h,
0B8E4h
             dw    5A82h,    5A82h,  471Dh,  18F9h,  7642h,  30FCh,  6A6Eh,
0E708h
             dw    5A82h,    0A57Fh, 471Dh,  08277h, 7642h,  0CF05h, 6A6Eh,
08277h
             dw    0A57Fh,   5A82h,  18F9h,  6A6Eh,  30FCh,  089BFh, 18F9h,
0B8E4h
_DATA    ends
         end
Figure C0381082500181
文件:idct8×8ssfs.asm
Figure C0381082500182
2002 Intel Corporation
.686
.xmm
xmmword textequ<qword>
.model  FLAT
_TEXT   selqment
tws    equ    esp+4
ssetmp_store  equ    [tws+0100h]
;;; ;;; ;;;short-float
idct_row2    macro    i,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|4
        movdqa  xmm0,xmrnword ptr [eax+i10h]    ;;;|7|6|5|4|3|2|1
        movaps  xmm4,xmmword ptr[eax+i10h+10h]
        pshuflw xmm0,xmm0,11011000b              ;;;|7|6|5|4|3|1|2
        pshuflw xmm4,xmm4,11011000b
        pshufhw xmm0,xmm0,11011000b              ;;;|7|5|6|4|3|1|2
        pshufhw xmm4,xmm4,11011000b
        pshufd  xmm1,xmm0,10101010b              ;;;xmm1:
|6|4|6|4|6|4|6|4
        pshufd  xmm5,xmm4,10101010b
        pshufd  xmm2,xmm0,01010101b              ;;;xmm2:
|3|1|3|1|3|1|3|1
        pshufd  xmm6,xmm4,01010101b
        pshufd  xmm3,xmm0,0ffh                   ;;;xmm3:
|7|5|7|5|7|5|7|5
        pshufd  xmm7,xmm4,0ffh
        pshufd  xmm0,xmm0,00h                    ;;;xmm0:
|2|0|2|0|2|0|2|0
        pshufd  xmm4,xmm4,00h
        pmaddwd xmm0,xmmword ptr  [scales]        ;;;  xmm0:
|2×0|2×0|2×0|2×0
        pmaddwd xmm4,xmmword ptr  [scales+40h]
        pmaddwd xmml,xmmword ptr  [scales+10h]    ;;;xmm1:
|6×4|6×4|6×4|6×4
        paddd    xmm0,xmm1                        ;;;xmm0:|e|e|e|e
        pmaddwd xmm2,xmmword ptr  [scales+20h]    ;;;xmm2:
|3×1|3×1|3×1|3×1
        pmaddwd xmm3,xmword ptr  [scales+30h]     ;;; xmm3:
|7×5|7×5|7×5|7×5
        movdqa    xmm1,xmm0
        pmaddwd   xmm5,xmmword ptr  [scales+50h]
        paddd     xmm4,xmm5
        pmaddwd   xmm6,xmmword ptr  [scales+60h]
        paddd     xmm2,xmm3                       ;;;xmm2:|0|0|0|0
        movaps    xmm5,xmm4
        pmaddwd   xmm7,xmmword ptr  [scales+70h]
        paddd     xmm6,xmm7
          paddd    xmm0,xmm2              ;;;xmm0:|3|2|1|0
          paddd    xmm4,xmm6
          psubd    xmm1,xmm2              ;;;xmm1:|4|5|6|7
          psubd    xmm5,xmm6
          pshufd   xmm1,xmm1,00011011b   ;;;xmm1:|7|6|5|4
          pshufd   xmm5,xmm5,00011011b
          movaps   xmm2,xmmword ptr scale_const
          cvtdq2ps xmm0,xmm0
          cvtdq2ps xmm1,xmm1
          mulps    xmm0,xmm2
          cvtdq2ps xmm4,xmm4
          cvtdq2ps xmm5,xmm5
          mulps    xmm1,xmm2
          mulps    xmm4,xmm2
          mulps    xmm5,xmm2
          movaps   xmmword ptr [tws+i20h],xmm0
          movaps   xmmword ptr [tws+i20h+10h],xmm1
          movaps   xmmword ptr [tws+(i+1)20h],xmm4
          movaps   xmmword ptr [tws+(i+1)20h+10h],xmm5
          endm
idct_row        macro    i,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|4
          movdqa  xmm0,xmmword ptr(eax+i10h]   ;;;|7|6|5|4|3|2|1|0
          pshuflw xmm0,xmm0,11011000b           ;;;|7|6|5|4|3|1|2|0
          pshufhw xmm0,xmm0,11011000b           ;;;|7|5|6|4|3|1|2|0
          pshufd  xmm1,xmm0,10101010b           ;;;xmm1:
|6|4|6|4|6|4|6|4
          pshufd  xmm2,xmm0,01010101b           ;;;xmm2:
|3|1|3|1|3|1|3|1
          pshufd  xmm3,xmm0,0ffh                ;;;xmm3:
|7|5|7|5|7|5|7|5
          pshufd  xmm0,xmm0,00h                 ;;;xmm0:
|2|0|2|0|2|0|2|0
          pmaddwd xmm0,xmmword ptr [scales]      ;;;xmm0:
|2×0|2×0|2×0|2×0
          pmaddwd xmm1,xmmword ptr [scales+10h]  ;;;xmm1:
|6×4|6×4|6×4|6×4
          paddd   xmm0,xmm1                      ;;;xmm0:|e|e|e|e
          pmaddwd xmm2,xmmword ptr [scales+20h]  ;;;xmm2:
|3×1|3×1|3×1|3×1
          pmaddwd xmm3,xmmword ptr [scales+30h]  ;;;xmm3:
|7×5|7×5|7×5|7×5
          paddd   xmm2,xmm3                      ;;;xmm2:|o|o|o|o
          movdqa  xmm1,xmm0
          paddd   xmm0,xmm2                      ;;;xmm0:|3|2|1|0
          psubd   xmm1,xmm2                      ;;;xmm1:|4|5|6|7
          pshufd  xmm1,xmm1,00011011b           ;;;xmm1:|7|6|5|4
          cvtdq2ps    xmm0,xmm0
          cvtdq2ps    xmm1,xmm1
          movaps      xmm2,xmmword ptr scale_const
          mulps       xmm0,xmm2
          mulps       xmm1,xmm2
        movaps  xmmword ptr [tws+i20h],xmm0
        movaps  xmmword ptr [tws+i20h+10h],xmm1
        endm
cvt_store    macro    i,r,offs
        ;;;  OUT  [eax...] = coeff.row
        cvtps2dq    r,r
        packssdw    r,r
if offs EQ 0    ;;;  low
        movlps    xmmword ptr [eax+i10h],r
else
        movhps    xmmword ptr [eax+i10h+08h],r
endif
        endm
idct_column   macro    offs
        ;;;IN  tws -> float 8×8 block  (esp+4)
        ;;;IN  eax -> dst(short 8×8 block)
        ;;;OUT [eax...]= short 8×8 block
        movaps  xmm5,xmmword ptr [tws+30h2+offs]
        movaps  xmm6,xmmword ptr [tws+50h2+offs]
        movaps  xmm7,xmm6
        addps   xmm6,xmm5
        subps   xmm7,xmm5
        movaps  xmm4,xmmword ptr [tws+10h2+offs]
        movaps  xmm3,xmmword ptr [tws+70h2+offs]
        movaps  xmm5,xmm4
        addps   xmm4,xmm3
        subps   xmm5,xmm3
        movaps  xmm3,xmm4
        addps   xmm4,xmm6
        subps   xmm3,xmm6
        mulps   xmm3,xmmword ptr Cp1_414f
        movaps  xmm6,xmm7
        addps   xmm6,xmm5
        mulps   xmm6,xmmword ptr Cp1_847f
        mulps   xmm7,xmmword ptr Cm2_613f    ;;; ;;; ;;;
        addps   xmm7,xmm6
        mulps   xmm5,xmmword ptr Cp1_082f
        subps   xmm5,xmm6
        subps   xmm7,xmm4
        subps   xmm3,xmm7
        addps   xmm5,xmm3
        movaps  xmmwordi ptr ssetmp_store,xmm4
        movaps  xmm0,xmmword ptr [tws+00h2+offs]
        movaps  xmm2,xmmword ptr [tws+40h2+offs]
        movaps  xmm6,xmm0
        addps   xmm0,xmm2
        subps   xmm6,xmm2
        movaps  xmm1,xmmword ptr [tws+20h2+offs]
        movaps  xmm2,xmmword ptr [tws+60h2+offs]
        movaps  xmm4,xmm1
        addps   xmm1,xmm2
        subps   xmm4,xmm2
        mulps   xmm4,xmmword ptr Cp1_414f
        subps   xmm4,xmm1
        movaps  xmm2,xmm0
        addps   xmm0,xmm1
        subps   xmm2,xmm1
        movaps  xmm1,xmm0
        addps   xmm0,xmmword ptr ssetmp_store
        subps   xmm1,xmmword ptr ssetmp_store
        cvt_store    0,xmm0,offs
        cvt_store    7,xmm1,offs
        movaps   xmm1,xmm2
        addps    xmm2,xmm5
        subps    xmm1,xmm5
        cvt_store    4,xmm2,offs
        cvt_store    3,xmm1,offs
        movaps    xmm5,xmm6
        addps     xmm6,xmm4
        subps     xmm5,xmm4
        movaps    xmm4,xmm6
        addps     xmm6,xmm7
        subps     xmm4,xmm7
        cvt_store    1,xmm6,offs
        cvt_store    6,xmm4,offs
        movaps  xmm7,xmm5
        addps   xmm5,xmm3
        subps   xmm7,xmm3
        cvt_store    2,xmm5,offs
        cvt_store    5,xmm7,offs
        endm
;;;8×8 iDCT;integer row stage;AAN float column stage
_idct8×8ssfs    proc    near
        ;;;IN/OUT [esp+4] -> short 8×8 block
        mov    eax,esp
        sub    esp,0110h      ;;;space for float 8×8 block
        and    esp,0fffffff0h
        push   eax
        mov    eax,[eax+4]
        ;;; eax -> short IN/OUT 8×8 block
        ;;; esp+4 -> float intermediate 8×8 block
        idct_row2    0,  wcorr0w
        idCt_row2    2,  wcorr2w
        idct_row2    4,  wcorr4w
        idct_row2    6,  wcorr6w
if 0
        idct_row    0,wcorr0w
        idct_row    1,wcorr1w
        idct_row    2,wcorr2w
        idct_row    3,wcorr3w
        idct_row    4,wcorr4w
        idct_row    5,wcorr5w
        idct_row    6,wcorr6w
        idct_row    7,wcorr7w
endif
        idct_column    00h
        idct_column    10h
exit:
         mov    esp,[esp]
         ret
_idct8×8ssfs    endp
_TEXT    ends
_DATA    segment
Cp1_082f    dd    1.082392200,    1.082392200,    1.082392200,
1.082392200
Cp1_414f    dd    1.414213562,    1.414213562,    1.414213562,
1.414213562
Cp1_847f    dd    1.847759065,    1.847759065,    1.8 47759065,
1.847759065
Cm2_613f    dd    -2.613125930,   -2.613125930,    -2.613125930,    -
2.613125930
;;; ;;;short-float data
             align 10h
;;;even 01      even 23
;;;even tail 01 even tail 23
;;;odd  01      odd  23
;;;odd  tail 01 odd  tail 23
;;;2^17
wcorr0w dw    4000h,  539Fh,  4000h,  22A3h,  4000h,  0DD5Eh,4000h,  0AC62h
        dw    4000h,  22A3h,  0C001h, 0AC62h, 0C001h, 539Fh, 4000h,  0DD5Eh
        dw    58C5h,  4B42h,  4B42h,  0EE59h, 3249h,  0A73Ch,11A8h,  0CDB8h
        dw    3249h,  11A8h,  0A73Ch, 0CDB8h, 11A8h,  4B42h, 4B42h,  0A73Ch
wcorrlw dw    58C5h,  73FCh,  58C5h,  300Bh,  58C5h,  0CFF6h,58C5h,  08C05h
        dw    58C5h,  300Bh,  0A73Ch, 08C05h, 0A73Ch, 73FCh, 58C5h,  0CFF6h
        dw    7B21h,  6862h,  6862h,  0E783h, 45BFh,  084E0h,187Eh,  0BA42h
        dw    45BFh,  187Eh,  084E0h, 0BA42h, 187Eh,  6862h, 6862h,  084E0h
wcorr2w dw    539Fh,  6D41h,  539Fh,  2D41h,  539Fh,  0D2C0h,539Fh,  092C0h
        dw    539Fh,  2D41h,  0AC62h, 092C0h, 0AC62h, 6D41h, 539Fh,  0D2C0h
        dw    73FCh,  6254h,  6254h,  0E8EFh, 41B3h,  08C05h,1712h,  0BE4Eh
        dw    41B3h,  1712h,  08C05h, 0BE4Eh, 1712h,  6254h, 6254h,  08C05h
wcorr3w dw    4B42h,  6254h,  4B42h,  28BAh,  4B42h,  0D747h,4B42h,  09DADh
        dw    4B42h,  28BAh,  0B4BFh, 09DADh, 0B4BFh, 6254h, 4B42h,  0D747h
        dw    6862h,  587Eh,  587Eh,  0EB3Eh, 3B21h,  0979Fh,14C3h,  0C4E0h
        dw    3B21h,  14C3h,  0979Fh, 0C4E0h, 14C3h,  587Eh, 587Eh,  0979Fh
wcorr4w dw    4000h,  539Fh,  4000h,  22A3h,  4000h,  0DD5Eh,4000h,  0AC62h
        dw    4000h,  22A3h,  0C001h, 0AC62h, 0C001h, 539Fh, 4000h,  0DD5Eh
        dw    58C5h,  4B42h,  4B42h,  0EE59h, 3249h,  0A73Ch,11A8h,  0CDB8h
        dw    3249h,  11A8h,  0A73Ch, 0CDB8h, 11A8h,  4B42h, 4B42h,  0A73Ch
wcorr5w dw    3249h,  41B3h,  3249h,  1B37h,  3249h,  0E4CAh,3249h,  0BE4Eh
        dw    3249h,  1B37h,  0CDB8h, 0BE4Eh, 0CDB8h, 41B3h, 3249h,  0E4CAh
        dw    45BFh,  3B21h,  3B21h,  0F221h, 2782h,  0BA42h,0DE0h,  0D87Fh
        dw    2782h,  0DE0h,  0BA42h, 0D87Fh, 0DE0h,  3B21h, 3B21h,  0BA42h
wcorr6w dw    22A3h,  2D41h,  22A3h,  12BFh,  22A3h,  0ED42h,22A3h,  0D2C0h
        dw    22A3h,  12BFh,  0DD5Eh, 0D2C0h, 0DD5Eh, 2D41h, 22A3h,  0ED42h
        dw    300Bh,  28BAh,  28BAh,  0F673h, 1B37h,  0CFF6h,098Eh,  0E4CAh
        dw    1B37h,  098Eh,  0CFF6h, 0E4CAh, 098Eh,  28BAh, 28BAh,  0CFF6h
wcorr7w dw    11A8h,  1712h,  11A8h,  098Eh,  11A8h,  0F673h,11A8h,  0E8EFh
        dw    11A8h,  098Eh,  0EE59h, 0E8EFh, 0EE59h, 1712h, 11A8h,  0F673h
        dw    187Eh,  14C3h,  14C3h,  0FB22h, 0DE0h,  0E783h,04DFh,  0F221h
        dw    0DE0h,  04DFh,  0E783h, 0F221h, 04DFh,  14C3h, 14C3h,  0E783h
        ;;;1/2^17
scale_const    dd    37000000h,37000000h,37000000h,37000000h
_DATA    ends
         end
附录B
以下是逆向DCT IEEE1180-1990兼容测试的结果。
该测试执行了10000次迭代。
在本部分,表中的每个元素对应于8×8系数块的一个输出DCT系数。
1.单精度浮点8×8逆向DCT
(a)输入值的范围是[-255;255]
误差的绝对值峰值:
  0   1   0   0   0   0   0   0
  0   1   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
  0   0   0   0   1   0   0   0
  1   0   0   0   0   1   0   0
  0   0   0   0   0   0   1   0
  0   0   0   1   0   0   0   0
  0   0   0   0   0   0   0   0
最大的峰值误差为1(满足协议限制1)
均方误差:
  0.0000   0.0002   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0001   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0001   0.0000   0.0000   0.0000
  0.0001   0.0000   0.0000   0.0000   0.0000   0.0001   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0001   0.0000
  0.0000   0.0000   0.0000   0.0001   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
最差的pmse=0.000200(满足协议限制0.06)
总的mse=0.000013(满足协议限制0.02)
(b)输入值的范围是[-5;5]
误差的绝对值峰值:
  0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0
最差峰值误差为0(满足协议限制1)
均方误差:
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0001   0.0000   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000
最差的pmse=0.000000(满足协议限制0.06)
总的mse=0.000000(满足协议限制0.02)
2.混合的整数/单精度浮点8×8逆向DCT
(a)输入值的范围[-255;255]
误差的绝对值峰值:
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
最差的峰值误差为1(满足协议限制1)
均方误差:
  0.0006   0.0039   0.0018   0.0030   0.0027   0.0027   0.0039   0.0013
  0.0016   0.0071   0.0038   0.0035   0.0047   0.0061   0.0068   0.0025
  0.0027   0.0073   0.0060   0.0050   0.0057   0.0069   0.0080   0.0019
  0.0022   0.0069   0.0077   0.0062   0.0074   0.0069   0.0071   0.0031
  0.0023   0.0086   0.0071   0.0072   0.0067   0.0071   0.0082   0.0028
  0.0023   0.0080   0.0062   0.0071   0.0058   0.0058   0.0087   0.0032
  0.0026   0.0060   0.0058   0.0044   0.0064   0.0043   0.0057   0.0025
  0.0013   0.0030   0.0030   0.0041   0.0031   0.0020   0.0029   0.0010
最差的pmse=0.008700(满足协议限制0.06)
总的mse=0.004722(满足协议限制0.02)
(b)输入值的范围是[-5;5]
误差的绝对值峰值:
  1   1   1   1   1   0   0   0
  0   0   1   0   0   1   1   0
  0   0   1   1   1   1   1   1
  1   1   1   0   1   1   1   0
  1   1   1   1   1   1   1   1
  0   1   1   0   1   1   1   1
  1   1   1   0   1   1   1   1
  0   0   1   0   0   1   0   1
最差的峰值误差为1(满足协议限制1)
均方误差:
  0.0001   0.0001   0.0001   0.0001   0.0002   0.0000   0.0000   0.0000
  0.0000   0.0000   0.0001   0.0000   0.0000   0.0002   0.0001   0.0000
  0.0000   0.0000   0.0002   0.0002   0.0003   0.0002   0.0004   0.0001
  0.0001   0.0002   0.0001   0.0000   0.0001   0.0001   0.0002   0.0000
  0.0001   0.0003   0.0002   0.0001   0.0001   0.0002   0.0001   0.0001
  0.0000   0.0001   0.0003   0.0000   0.0002   0.0001   0.0002   0.0002
  0.0002   0.0001   0.0001   0.0000   0.0001   0.0003   0.0001   0.0001
  0.0000   0.0000   0.0002   0.0000   0.0000   0.0002   0.0000   0.0001
最差的pmse=0.000400(满足协议限制0.06)
总的mse=0.000109(满足协议限制0.02)
3.整数8×8逆向DCT
(a)输入值的范围是[-255;255]
误差的绝对值峰值:
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
最差的峰值误差为1(满足协议限制1)
均方误差:
  0.0126   0.0118   0.0130   0.0126   0.0110   0.0125   0.0127   0.0119
  0.0154   0.0161   0.0156   0.0159   0.0153   0.0167   0.0168   0.0173
  0.0172   0.0151   0.0160   0.0134   0.0154   0.0167   0.0187   0.0137
  0.0135   0.0126   0.0125   0.0145   0.0132   0.0136   0.0120   0.0116
  0.0127   0.0133   0.0140   0.0119   0.0120   0.0119   0.0118   0.0139
  0.0157   0.0159   0.0154   0.0157   0.0163   0.0143   0.0175   0.0160
  0.0158   0.0147   0.0183   0.0172   0.0152   0.0152   0.0146   0.0150
  0.0133   0.0133   0.0119   0.0128   0.0134   0.0146   0.0132   0.0129
最差的pmse=0.018700(满足协议限制0.06)
总的mse=0.014322(满足协议限制0.02)
(b)输入值的范围是[1-5;5]
误差的绝对值峰值:
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
  1   1   1   1   1   1   1   1
最差的峰值误差为1(满足协议限制1)
均方误差:
  0.0132   0.0147   0.0132   0.0125   0.0121   0.0109   0.0121   0.0116
  0.0145   0.0176   0.0166   0.0177   0.0159   0.0147   0.0157   0.0161
  0.0160   0.0181   0.0185   0.0144   0.0159   0.0158   0.0170   0.0145
  0.0128   0.0110   0.0136   0.0140   0.0128   0.0127   0.0119   0.0136
  0.0122   0.0122   0.0134   0.0126   0.0113   0.0136   0.0120   0.0115
  0.0175   0.0156   0.0157   0.0142   0.0160   0.0156   0.0153   0.0148
  0.0174   0.0138   0.0173   0.0159   0.0139   0.0160   0.0147   0.0163
  0.0107   0.0125   0.0132   0.0136   0.0128   0.0137   0.0118   0.0141
最差的pmse=0.018500(满足协议限制0.06)
总的mse=0.014264(满足协议限制0.02)
附录C
  DCT函数,优化用于Pentium4处理器   时钟
  逆向
  单精度浮点逆向DCT   560
  混合的整数/浮点数逆向DCT   416
  整数逆向DCT   306
  正向
  单精度浮点正向DCT   540
  混合的整数/浮点数正向DCT   412
  整数正向DCT   272

Claims (16)

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的所述方法,其中所述1D单精度浮点DCT是利用SIMD指令实现的,以便将所述DCT运算同时应用到若干列。
9.一种在一个N×M系数块上执行二维2D逆向或正向离散余弦变换DCT的装置,其中N和M是自然数,所述装置包括:
对所述系数块的行应用一维1D整数DCT的第一功能块;
将所述1D整数DCT的结果数据转换为单精度浮点值的第二功能块;以及
对由于转换所述结果数据而得到的一个N×M系数块的列应用1D单精度浮点DCT的第三功能块。
10.权利要求9的所述装置,其中所述第一功能块还包括利用定点整数计算来实现N点DCT运算的第四功能块。
11.权利要求10的所述装置,其中用来表示所述定点整数计算的中间值和所述第四功能块的输出值的位的数目至少是表示所述第四功能块输入值的位的数目的两倍。
12.权利要求10的所述装置,其中所述第四功能块是利用支持操作数之间相关性的SIMD运算实现的。
13.权利要求10的所述装置,其中所述第二功能块还包括对所述第四功能块的输出值应用转换运算以产生N个单精度浮点系数的第五功能块。
14.权利要求13的所述装置,其中所述第二功能块是利用SIMD指令实现的,并且其同时对所述系数块的若干个元素应用所述第二功能块。
15.权利要求9的所述装置,其中所述第三功能块还包括一个利用单精度浮点计算实现M点DCT的第六功能块。
16.权利要求15的所述装置,其中第三功能块是利用SIMD指令实现的,以便同时对若干列应用DCT运算。
CNB038108259A 2002-03-12 2003-03-11 执行n×m离散余弦变换的方法 Expired - Fee Related CN100367273C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US10/096,987 2002-03-12
US10/096,987 US7007055B2 (en) 2002-03-12 2002-03-12 Method of performing NxM Discrete Cosine Transform

Publications (2)

Publication Number Publication Date
CN1653447A CN1653447A (zh) 2005-08-10
CN100367273C true CN100367273C (zh) 2008-02-06

Family

ID=28039091

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB038108259A Expired - Fee Related CN100367273C (zh) 2002-03-12 2003-03-11 执行n×m离散余弦变换的方法

Country Status (5)

Country Link
US (1) US7007055B2 (zh)
EP (1) EP1483684A2 (zh)
CN (1) CN100367273C (zh)
AU (1) AU2003224684A1 (zh)
WO (1) WO2003079218A2 (zh)

Families Citing this family (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100925427B1 (ko) * 2002-12-27 2009-11-06 엘지전자 주식회사 채널 등화기
CN100433837C (zh) 2004-03-18 2008-11-12 华中科技大学 视频编码的整数变换方法
CN100391262C (zh) * 2004-07-26 2008-05-28 香港中文大学 离散余弦变换信号与整数余弦变换信号间的信号转换方法
CN100458646C (zh) * 2006-06-15 2009-02-04 华为技术有限公司 三角函数值确定装置、方法及应用其的通信装置
US8699810B2 (en) * 2006-06-26 2014-04-15 Qualcomm Incorporated Efficient fixed-point approximations of forward and inverse discrete cosine transforms
US8385424B2 (en) * 2006-06-26 2013-02-26 Qualcomm Incorporated Reduction of errors during computation of inverse discrete cosine transform
US8300698B2 (en) * 2006-10-23 2012-10-30 Qualcomm Incorporated Signalling of maximum dynamic range of inverse discrete cosine transform
TWI342501B (en) * 2006-10-25 2011-05-21 Ind Tech Res Inst Integrated transformation method and device
US8755515B1 (en) 2008-09-29 2014-06-17 Wai Wu Parallel signal processing system and method
US9110849B2 (en) * 2009-04-15 2015-08-18 Qualcomm Incorporated Computing even-sized discrete cosine transforms
US8762441B2 (en) * 2009-06-05 2014-06-24 Qualcomm Incorporated 4X4 transform for media coding
US9069713B2 (en) * 2009-06-05 2015-06-30 Qualcomm Incorporated 4X4 transform for media coding
US8451904B2 (en) 2009-06-24 2013-05-28 Qualcomm Incorporated 8-point transform for media data coding
US9081733B2 (en) * 2009-06-24 2015-07-14 Qualcomm Incorporated 16-point transform for media data coding
US9118898B2 (en) 2009-06-24 2015-08-25 Qualcomm Incorporated 8-point transform for media data coding
US9075757B2 (en) * 2009-06-24 2015-07-07 Qualcomm Incorporated 16-point transform for media data coding
TWI415474B (zh) * 2010-07-19 2013-11-11 Mstar Semiconductor Inc 視訊編/解碼器與其方法
CN102036075B (zh) * 2010-12-29 2012-11-28 东南大学 一种图像及数字视频编码及解码方法
US9824066B2 (en) 2011-01-10 2017-11-21 Qualcomm Incorporated 32-point transform for media data coding

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5754457A (en) * 1996-03-05 1998-05-19 Intel Corporation Method for performing an inverse cosine transfer function for use with multimedia information
CN1217077A (zh) * 1996-03-05 1999-05-19 英特尔公司 执行与多媒体信息一起使用的逆余弦变换函数的计算机系统

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
SG45281A1 (en) * 1992-06-26 1998-01-16 Discovision Ass Method and arrangement for transformation of signals from a frequency to a time domain
US5428567A (en) * 1994-05-09 1995-06-27 International Business Machines Corporation Memory structure to minimize rounding/trunction errors for n-dimensional image transformation
US5801975A (en) * 1996-12-02 1998-09-01 Compaq Computer Corporation And Advanced Micro Devices, Inc. Computer modified to perform inverse discrete cosine transform operations on a one-dimensional matrix of numbers within a minimal number of instruction cycles
US5859788A (en) * 1997-08-15 1999-01-12 The Aerospace Corporation Modulated lapped transform method

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5754457A (en) * 1996-03-05 1998-05-19 Intel Corporation Method for performing an inverse cosine transfer function for use with multimedia information
CN1217077A (zh) * 1996-03-05 1999-05-19 英特尔公司 执行与多媒体信息一起使用的逆余弦变换函数的计算机系统

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Approximating the DCT with the Lifting Scheme:SystematicDesign and Applications. Jie Liang ET AL.PISCATAWAY,NJ,USA,IEEE,USA,Vol.1 . 2000 *
Optimization of H.263 Video EncodingUsingaSingleProcessorComputer:PerformanceTradeoffs andBenchmarking. Shahriar M. Akramullah ET AL.IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY,Vol.11 No.8. 2001 *
The BinDCT:Fast Multiplierless Approximation of the DCT. Trac D. Tran.IEEE SIGNAL PROCESSING LETTERS,Vol.7 No.6. 2000 *

Also Published As

Publication number Publication date
CN1653447A (zh) 2005-08-10
EP1483684A2 (en) 2004-12-08
US7007055B2 (en) 2006-02-28
WO2003079218A2 (en) 2003-09-25
AU2003224684A1 (en) 2003-09-29
WO2003079218A3 (en) 2004-08-12
AU2003224684A8 (en) 2003-09-29
US20030177158A1 (en) 2003-09-18

Similar Documents

Publication Publication Date Title
CN100367273C (zh) 执行n×m离散余弦变换的方法
JP5529101B2 (ja) 基準化および非基準化インタフェースを用いた変換設計
US5467131A (en) Method and apparatus for fast digital signal decoding
US5394349A (en) Fast inverse discrete transform using subwords for decompression of information
US20070200738A1 (en) Efficient multiplication-free computation for signal and data processing
Linzer et al. New scaled DCT algorithms for fused multiply/add architectures
Huang et al. CORDIC based fast radix-2 DCT algorithm
Abel et al. Applications tuning for streaming SIMD extensions
Alam et al. A new time distributed DCT architecture for MPEG-4 hardware reference model
KR100227271B1 (ko) 역이산 여현변환방법
US6832232B1 (en) Dual-block inverse discrete cosine transform method
Thomas et al. Fixed-point implementation of discrete Hirschman transform
Szyld The mystery of asynchronous iterations convergence when the spectral radius is one
Fan et al. Pruning fast Fourier transform algorithm design using group-based method
Zucker et al. Reuse of high precision arithmetic hardware to perform multiple concurrent low precision calculations
US6742010B1 (en) Dual-block discrete consine transform method
Boussakta A novel method for parallel image processing applications
Shahbahrami et al. Avoiding conversion and rearrangement overhead in SIMD architectures
Kiryukhin et al. Implementation of 2D-DCT on XC4000 series FPGA using DFT-based DSFG and DA architectures
CN100573666C (zh) 子带分析/合成滤波方法
Huang et al. Variable length Reconfigurable algorithms and architectures for DCT/IDCT based on modified unfolded cordic
M. Perera et al. Efficient Split-Radix and Radix-4 DCT Algorithms and Applications
Hsu et al. Software optimization of video codecs on Pentium processor with MMX technology
Li et al. An improved practical efficient implementation of ICT used in H. 264
Dorner High speed array processing method applied to 2-D and 3-D image processing

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20080206

Termination date: 20150311

EXPY Termination of patent right or utility model