CN100367273C - 执行n×m离散余弦变换的方法 - Google Patents
执行n×m离散余弦变换的方法 Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/14—Fourier, Walsh or analogous domain transformations, e.g. Laplace, Hilbert, Karhunen-Loeve, transforms
- G06F17/147—Discrete 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系数块上执行的离散余弦变换(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可以定义如下:
所述逆向2D DCT公式为:
其中
K表示DCT长度;
fnm表示频域系数;以及
xij表示空间域系数。
一个N×M 2D DCT运算等价于施加到一个输入矩阵的行上的N点DCT和施加到列上的M点DCT。
所述正向N点DCT定义如下:
其中
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是下面的矩阵:
其中
所述逆向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运算可以定义如下:
其中
S8(n)表示已变换的8点DCT系数,以及
F16(n)表示16点离散傅里叶变换。
所述逆向DFT矩阵可以因式分解为:
L=B1×M×A1×A2×A3
其中:
其中 C4=
在根据上述因子分解执行所述逆向DCT运算之后,所得到的系数可以被转换为整数值。
本发明的一个非限制的示例实施例被列在附录A中。IEEE 1180-1990一致性测试结果被列在附录B中。用商业可得的英特尔公司的奔腾4处理器优化的DCT性能的测量在附录C中示出。本领域的技术人员将认识到,不像任何现有的整数定点实现的精度,本发明的精度与输入系数成比例。
这里描述的技术不限于任何特定的硬件或软件配置;他们可以在任何计算或处理环境中找到其可适用性。所述技术可以在硬件、软件或二者的结合中实现。所述技术可以在可编程机器里面执行的程序中实现,例如移动或固定计算机、个人数字助理、机顶盒、蜂窝电话以及寻呼机和其它电子设备,这些设备中每一个包括一个处理器、一个由所述处理器可读的存储介质(包括易失性和非易失性存储器和/或存储单元)、至少一个输入设备,以及一个或多个输出设备。对利用该输入设备所输入的数据应用程序代码,以便执行所述功能并产生输出信息。所述输出信息可以应用于一个或多个输出设备。本领域的一般技术人员可以理解,本发明可以在各种计算机系统配置中实施,包括多处理器系统、小型计算机、主计算机、便携计算机、等等。本发明也可以在分布式计算环境中实施,在那里任务可以由通过通信网络链接的远程处理设备完成。
每个程序可以在高级的过程或面向对象的编程语言中实现,以便和处理系统通信。但是,如果想要的话,程序可以在汇编或机器语言中实现。在上述情况下,这些语言可以被编译或解释。
可以利用程序指令使得以所述指令编程的通用或专用处理系统执行这里描述的运算。代替地,所述运算可以由包含用于执行所述运算的硬布线逻辑的专用硬件组件或者由可编程计算机组件和定制的硬件组件的任意组合来执行。这里描述的方法可以作为一个计算机程序产品被提供,所述计算机程序产品可以包括一个其上存储有指令的机器可读介质,所述指令用来对一个处理系统或其它电子设备进行编程,以执行所述方法。这里使用的术语“机器可读介质”应当包括能够存储和编码一系列用于由机器执行的指令的,以及使得机器执行任何一个前面所述方法的任何介质。因此,术语“机器可读介质”应该包括但不局限于固态存储器、光和磁盘、以及对数据信号编码的载波。此外,在本领域中这称之为软件,以采取一个动作或引起一个结果的各种各样形式(例如程序、过程、进程、应用、模块、逻辑,等等)。这样的表达仅仅是一种表明由处理系统执行的软件引起所述处理器执行一个动作或产生一个结果的简写方式。
参照说明性的实施例已经描述了本发明,但是这个描述并不是意图在一个限定的意义上被解释。所述说明性实施例的各种修改以及本发明的其它实施例,其对本领域的技术人员是显而易见的,将被看作是落在本发明的精神和范围内。
附 录
附录A
对于逆向8×8DCT参见:idct8×8ssfs.asm
对于正向8×8DCT参见:fdct8×8ssfs.asm
这些文件要去MicrosoftMa 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,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 == 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+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
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
文件:idct8×8ssfs.asm
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+i*10h] ;;;|7|6|5|4|3|2|1
movaps xmm4,xmmword ptr[eax+i*10h+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+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
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+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
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
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+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 xmmwordi 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, 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函数,优化用于Pentium4处理器 | 时钟 |
逆向 | |
单精度浮点逆向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运算。
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)
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)
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)
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 |
-
2002
- 2002-03-12 US US10/096,987 patent/US7007055B2/en not_active Expired - Fee Related
-
2003
- 2003-03-11 CN CNB038108259A patent/CN100367273C/zh not_active Expired - Fee Related
- 2003-03-11 EP EP03721367A patent/EP1483684A2/en not_active Ceased
- 2003-03-11 WO PCT/US2003/007693 patent/WO2003079218A2/en not_active Application Discontinuation
- 2003-03-11 AU AU2003224684A patent/AU2003224684A1/en not_active Abandoned
Patent Citations (2)
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)
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 |