CN1653447A - 报告NxM离散余弦变换的方法 - Google Patents

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

Info

Publication number
CN1653447A
CN1653447A CNA038108259A CN03810825A CN1653447A CN 1653447 A CN1653447 A CN 1653447A CN A038108259 A CNA038108259 A CN A038108259A CN 03810825 A CN03810825 A CN 03810825A CN 1653447 A CN1653447 A CN 1653447A
Authority
CN
China
Prior art keywords
dct
point
row
precision floating
instruction
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.)
Granted
Application number
CNA038108259A
Other languages
English (en)
Other versions
CN100367273C (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

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执行的能力。
附图说明
根据随后对本发明详细的描述,本发明的特征及优点将变得显而易见,其中:
图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可以定义如下:
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.Naka jima在“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 A0381082500103
乘每列元素等价于以 乘每行的所有元素,其中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 ; C 4 = 2 ; C 6 = 2 sin π 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
.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+i*10h]     ;;;xmm0:
|′7|′6|′5|′4|′3|′2|′1|′0
                movaps        xmm1,xmmword ptr[eax+i*10h+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,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+i* 20h],xmm5
         movaps xmmword  ptr [tws+i*20h+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==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|4
         movaps       xmm0,xmmword ptr [eax+i*10h]     ;;;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+i*20h],xmm5
        movaps xmmword ptr [tws+i*20h+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+i*10h],r
else
        movhps              xmmword ptr [eax+i*10h+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+30h*2+offs]
        movaps xmm6,xmmword ptr[tws+40h*2+offs]
        movaps xmm4,xmm3
        addps  xmm3,xmm6
        subps  xmm4,xmm6
        movaps xmm2,xmmword ptr[tws+20h*2+offs]
        movaps xmm6,xmmword ptr[tws+50h*2+offs]
        movaps xmm5,xmm2
        addps  xmm2,xmm6
        subps  xmm5,xmm6
        movaps xmmword ptr ssetmp_store,xmm3
        movaps xmm1,xmmword ptr[tws+10h*2+offs]
        movaps xmm3,xmmword ptr[tws+60h*2+offs]
        movaps xmm6,xmm1
        addps  xmm1,xmm3
        subps  xmm6,xmm3
        movaps xmm0,xmmword ptr[tws+00h*2+offs]
        movaps xmm3,xmmword ptr[tws+70h*2+offs]
        movaps xmm7,xmm0
        addps  xmm0,xmm3
        subps  xmm7,xmm3
        addps  xmm4,xmm5
        addps  xmm5,xmm6
        addps  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
movaps   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_1Dscale+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->short IN/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,coeffs0wdif 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,coeffs0wendif
fdct_column 00h
fdct_column 10hexit:
mov    esp,[esp]
ret_fdct8×8ssfs    endp_TEXT    ends_DATA    segment;;;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  equ    2.8284271247461903fdct_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^16scale_const     dd    4 dup(37800000h)
    ;;;16-bitcoeffs0w              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,08277hcoeffs0wd             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
文件:idct8×8ssfs.asm 2002 Intel Corporation.686.xmmxmword textequ<qword>.model  FLAT_TEXT segmenttws               equ    esp+4ssetmp_store      equ    [tws+0100h];;; ;;; ;;;short-floatidct_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,xmmword ptr[eax+i*10h]    ;;;|7|6|5|4|3|2|1|0
          movaps  xmm4,xmmword ptr[eax+i*10h+10h]
          pshuflw xmm0,xmm0,11011000b           ;;;|7|6|5|4|3|1|2|0
          pshuflw xmm4,xmm4,11011000b
          pshufhw xmm0,xmm0,11011000b           ;;;|7|5|6|4|3|1|2|0
          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 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
          movdqa  xmm1,xmm0
          pmaddwd xmm5,xmmword ptr[scales+50h]
          paddd   xmm4,xmm5
          pmaddwd xmm6,xmmword ptr[scales+60h]
          paddd   xmm2,xmm3                      ;;;xmm2:|o|o|o|o
          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+i*20h],xmm0
movaps xmmword ptr[tws+i*20h+10h],xmm1
movaps xmmword ptr[tws+(i+1)*20h],xmm4
movaps xmmword ptr[tws+(i+1)*20h+10h],xmm5
endmidct_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+i*10h]    ;;;|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+i*20h],xmm0
movaps    xmmword ptr[tws+i*20h+10h],xmm1
endmcvt_store macro    i,r,offs
;;;  OUT[eax...]=coeff.row
cvtps2dq           r,r
packssdw           r,rif offs EQ 0  ;;;low
movlps             xmmword ptr[eax+i*10h],relse
movhps             xmmword ptr[eax+i*10h+08h],rendif
endmidct_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+30h*2+offs]
movaps    xmm6,xmmword ptr[tws+50h*2+offs]
movaps    xmm7,xmm6
addps     xmm6,xmm5
subps     xmm7,xmm5
movaps    xmm4,xmmword ptr[tws+10h*2+offs]
movaps    xmm3,xmmword ptr[tws+70h*2+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    xmmword ptr ssetmp_store,xmm4
movaps    xmm0,xmmword ptr[tws+00h*2+offs]
movaps    xmm2,xmmword ptr[tws+40h*2+offs]
movaps    xmm6,xmm0
addps     xmm0,xmm2
subps     xmm6,xmm2
movaps    xmm1,xmmword ptr[tws+20h*2+offs]
movaps    xmm2,xmmword ptr[tws+60h*2+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,wcorr6wif 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,wcorr7wendif
        idct_column         00h
        idct_column         10hexit:
        mov    esp,[esp]
        ret_idct8×8ssfs      endp_TEXT       ends_DATA       segment
Cp1_082f      dd    1.082392200,1.082392200,1.082392200,1.082392200Cp1_414f      dd    1.414213562,1.414213562,1.414213562,1.414213562Cp1_847f      dd    1.847759065,1.847759065,1.847759065,1.847759065Cm2_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^17wcorr0w 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,0A73Chwcorr1w 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,084E0hwcorr2w 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,08C05hwcorr3w 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,0979Fhwcorr4w 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,0A73Chwcorr5w 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,0BA42hwcorr6w 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,0CFF6hwcorr7w 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^17scale_ 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)输入值的范围是[-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 (24)

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运算同时应用到若干列。
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 US7007055B2 (en) 2002-03-12 2002-03-12 Method of performing NxM Discrete Cosine Transform
US10/096,987 2002-03-12

Publications (2)

Publication Number Publication Date
CN1653447A true CN1653447A (zh) 2005-08-10
CN100367273C 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)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100458646C (zh) * 2006-06-15 2009-02-04 华为技术有限公司 三角函数值确定装置、方法及应用其的通信装置
CN102036075A (zh) * 2010-12-29 2011-04-27 东南大学 一种图像及数字视频编码及解码方法

Families Citing this family (17)

* 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 香港中文大学 离散余弦变换信号与整数余弦变换信号间的信号转换方法
US8385424B2 (en) * 2006-06-26 2013-02-26 Qualcomm Incorporated Reduction of errors during computation of inverse discrete cosine transform
US8699810B2 (en) * 2006-06-26 2014-04-15 Qualcomm Incorporated Efficient fixed-point approximations of forward and inverse discrete cosine transforms
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
US9075757B2 (en) * 2009-06-24 2015-07-07 Qualcomm Incorporated 16-point transform for media data coding
US9081733B2 (en) * 2009-06-24 2015-07-14 Qualcomm Incorporated 16-point transform for media data coding
US8451904B2 (en) 2009-06-24 2013-05-28 Qualcomm Incorporated 8-point transform for media data coding
US9118898B2 (en) * 2009-06-24 2015-08-25 Qualcomm Incorporated 8-point transform for media data coding
TWI415474B (zh) * 2010-07-19 2013-11-11 Mstar Semiconductor Inc 視訊編/解碼器與其方法
US9824066B2 (en) 2011-01-10 2017-11-21 Qualcomm Incorporated 32-point transform for media data coding

Family Cites Families (6)

* 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
US5754457A (en) * 1996-03-05 1998-05-19 Intel Corporation Method for performing an inverse cosine transfer function for use with multimedia information
US5754456A (en) * 1996-03-05 1998-05-19 Intel Corporation Computer system performing an inverse cosine transfer function for use with multimedia information
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

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100458646C (zh) * 2006-06-15 2009-02-04 华为技术有限公司 三角函数值确定装置、方法及应用其的通信装置
CN102036075A (zh) * 2010-12-29 2011-04-27 东南大学 一种图像及数字视频编码及解码方法
CN102036075B (zh) * 2010-12-29 2012-11-28 东南大学 一种图像及数字视频编码及解码方法

Also Published As

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

Similar Documents

Publication Publication Date Title
CN1653447A (zh) 报告NxM离散余弦变换的方法
CN1264085C (zh) 一种用于执行多媒体应用的操作的装置、***和方法
CN1200571C (zh) 正交变换、逆正交变换方法及装置、编码、解码方法及装置
CN1246772C (zh) 处理器
CN1960190A (zh) Ldpc码校验矩阵构造方法及利用该方法的编码解码装置
CN1922890A (zh) 分段可逆视频编码方法、分段可逆视频译码方法、分段可逆视频编码装置、分段可逆视频译码装置和它们的程序及程序记录媒体
CN1624696A (zh) 信息处理设备、方法及其程序、信息处理***及其方法
CN101047390A (zh) 解码设备、控制方法及程序
CN1269052C (zh) 支持缩小代码长度的常量还原型处理器
CN1763712A (zh) 动态确定对网络主页gui环境中选定项执行的动作的方法
CN1947425A (zh) 视频编码器与解码器的流水线体系结构
CN1253013C (zh) 预测装置、编码装置、逆预测装置、解码装置
CN1633749A (zh) 获得循环冗余码
CN1103959C (zh) 数据处理装置和操作数据处理装置的方法
CN1229758C (zh) 正交变换图像的分辨率变换装置和方法
CN1599445A (zh) 数据处理方法、数据处理装置
CN100350433C (zh) 计算路径误差的方法和提取路径断点的方法
CN1825355A (zh) 计算机图形数据编码装置、解码装置、编码和解码方法
CN1245030C (zh) 数据处理***
CN1104679C (zh) 数据处理装置和数据处理方法
CN1886737A (zh) 将数字信号从时间域变换到频率域及其反向变换的方法
CN1254110C (zh) 图像处理方法和图像处理装置
CN1182724C (zh) 压缩和解压缩图像信号的方法及其装置
CN1310192C (zh) 对位置内插器进行编码和译码的方法和装置
CN1529846A (zh) 在以过程语言开发的计算机软件应用程序中的导航

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