1、2016-11-30 音视频编码技术课程报告2-D DCT 算法优化姓名:学号: 院系: 电子与信息工程学院指导教师:1摘要离散余弦变换(DCT)是一种正交变换,它本身并不会改变信息源的熵值,因而是一种无损的变换。但是由于离散余弦变换(DCT)变换能够给量化和编码等过程创造很好的条件,因而在数字信号处理领域,特别是语音和图像压缩领域有着很广泛的应用。对于语音信号与图像信号这样相关性很强的信号而言,离散余弦变换(DCT)接近于最优的 KL 变换(Karhunen-Loeve Transform)。传统的 2-D 离散余弦变换(DCT)变换过程是行-列变换,这种方法直观简单但是效率低下,在有些实时
2、性要求较高的图像压缩领域并不能满足要求。从离散余弦变换(DCT)的数学表达式上可以看出,其具有很高的对称性,利用这种对称性可以极大地降低算法的复杂度。本次课程报告在总结前人研究的基础上,展示并实现了一种快速变换和反变换算法,并在 MATLAB 平台上进行了实现与测试。结果表明,这种算法具有高效、简单、易于实现的特点。关键词:快速离散余弦变换,快速离散余弦反变换,快速算法,图像压缩22-D DCT 算法优化一、 引言(一) 研究背景在本次的课程报告中,DCT 的优化算法主要是针对于 2 维输入数据,因而此算法主要针对的是图像处理。在图像处理领域中,图像压缩编码依据原理可以分为熵编码、预测编码、变
3、换编码和混合编码。DCT 属于其中的变换编码,变换编码还包括傅里叶变换和沃尔什变换等等。变换编码是一种数学变换对,通常是将 2 维空间域上的图像经过正交变换映射到另一个空间域上(例如频域) ,并且使得变换后的系数之间的相关性降低。就变换本身而言,它是一种在数学上无损的变换,通过反变换可以恢复原信号。但是这种变换的特点在于,变换后图像的大部分能量只集中在少数几个变换系数上,这就为量化编码和熵编码带来了很大的便利,在对系数进行编码后就能实现图像的压缩。在理论上,K-L 变换是最优的正交变换,它能够完全消除图像块内像素间的线性相关性,经过 K-L 变换后各个系数在统计上不相关,其协方差矩阵是对角阵,
4、因而 K-L 变换能够大大的减小原数据的冗余度。如果在 K-L 变换之后丢弃数值娇小的系数,所造成的均方误差是所有正交变换中最小的。但是 K-L 变换有一个很大的缺点,它的基向量是图像的协方差矩阵的特征向量。这就意味着对于不同的图像,它的基向量是不相同的,为了对图像进行 K-L 变换,就需要先计算每一幅图像的相关矩阵,再对相关矩阵作特征分解,取特征向量作为变换的基向量。这就使得 K-L 变换的使用变得很麻烦,甚至是难以实现。DCT 变换的性能仅次于 K-L 变换,被认为是一种准最佳变换,对于图像这种相关性较大的数据,DCT 的性能接近于 K-L 变换。此外,DCT 的变换矩阵是固定的,与图像无
5、关。而且它是构造成对称的数据序列,避免了子图像边界处的跳跃和不连续现象。傅里叶变换是应用最早的变换之一,并且也有快速算法。但是傅里叶变换存在一个很明显的缺陷,恢复出来的边界会存在不连续现象,这使得恢复的图3像存图 1 离散余弦变换(DCT)效果图在明显可见的方格,影响图像质量。沃尔什变换比 DCT 简单,实时性更高,但是性能比 DCT 略差。基于以上的特点,DCT 具有广泛的应用,在常见的 JPEG 静态图像编码以及MJPEG、MPEG 动态图像编码等标准中都有应用。这种应用的广泛也对 DCT 的算法效率提出了更高的要求,对 DCT 快速算法也有着更加迫切的需求。(二) 前人研究由于 DCT
6、在语音和图像压缩领域的广泛应用,已经有人提出了许多快速算法和快速计算 DCT 的 VLSI 架构。DCT 的传统计算方法是行-列法,先对行计算 1-D DCT,再对列计算 1-D DCT。对于 大小的图像而言,这种算法需要计算N2N 个 1-D DCT,算法的复杂度为 。因而为了更加高效地进行 DCT 运算,(2)有人提出了直接对整个 2 维矩阵做 DCT 运算。目前,最为高效的 DCT 算法是由Duhamel 和 Guillemot 在 1990 年的一篇论文中提出的多项式变换计算方法。在这种方法中,2-D DCT 运算的乘积运算相对于传统的方法而言减小了 50%。还有人提出基于 FFT 的
7、算法,这种算法的复杂度在传统方法的 50%到 75%之间。此外,Cho 和 Lee 提出了专门针对于矩阵大小为 快速 DCT 算法,这种算法仅444仅局限于大小为 的变换,如果要进行扩展更大的维数,则需要与迭代算法44相结合,但是如果维数很大,这种迭代算法这会大大增加整体算法的复杂度。在本次的课程报告中所展示的是一种有别于以上快速算法的方法,这种方法和 Cho 与 Lee 提出的算法有异曲同工之处,本质上来说是对他们算法的一种扩展。这种算法对于大小为 的矩阵而言,仅仅需要计算 N 个 1-D DCT,但N是要求 。算法需要的乘积运算次数仅仅为传统算法的 50%,与N=2,Duhamel 和 G
8、uillemot 的算法有着相同复杂度。但是相比于 Duhamel 和Guillemot 的算法而言,这种算法的结构有着更高的对称性,更加简单直观,同时能够更加容易的应用到硬件的并行处理中,也更加适合 VLSI 的实现。(三) 报告的章节安排本次报告的主要内容和章节安排如下:1. 快速 DCT 算法的理论分析从数学上对算法进行理论分析,相关公式推导,总结出最终的算法结构。2. 相应的快速 IDCT 算法的理论分析基于前面的理论推导,总结出快速 IDCT 算法的结构。3. 与其他快速算法的复杂度比较将此算法与传统的算法、其他算法的复杂度作数值上的比较。4. 算法的实现与测试在前面理论分析的基础上
9、,在 MATLAB 平台上实现 的快速算法,44并对图像做 DCT 和 IDCT 变换,检验算法的有效性,同时与 MATLAB 自带的 DCT 和 IDCT 函数的运算时间进行比较。5. 总结与展望分析此算法的优缺点与可改进的空间。5二、 理论分析(一) 2-D DCT 理论分析对于一个给定的大小为 的二维矩阵 XN, ,=0,1,2,1假设二维 DCT 矩阵为 Y , ,=0,1,2,1DCT 变换公式为:(2.1)=()()1=01=0(2+1)2)(2+1)2)其中,()= 1, =02,0 ()= 1, =02,0定义 为 对 做归一化得到的变量y()()(2.2.a)y=1=01=0
10、(2+1)2)(2+1)2)(2.2.b)=()()y利用积化和差公式,可以进行如下的变换,(2.3)cos(2+1)2)cos(2+1)2)=12(cos(2+1)+(2+1)2 )+cos(2+1)(2+1)2 )将(2.3)带入到(2.2.a)中,得到y=12(1=01=0cos(2+1)+(2+1)2 )+1=01=0cos(2+1)(2+1)2 ),(2.4) ,=1,2,1同时,我们定义两个新的变量 , (2.5.a)=1=01=0cos(2+1)+(2+1)2 )6(2.5.b)=1=01=0cos(2+1)(2+1)2 )所 可以表示为y(2.6)y=12(+)从(2.5)与(
11、2.6)中,可以发现,二维的 DCT 变换可以分解为两个分量的叠加,并且这两个分量( 与 )的形式类似于一维 DCT 的形式。那么下面的目标就在于如何将 与 转换成一维 DCT 的形式。从而达到对于 的矩 阵而言,只需要计算 N 次一维 DCT 就可以获得二维 DCT。一维 DCT 的表达式为=()1=0(2+1)2 )与(2.5.a)和(2.5.b)对比可以发现,如果 可以转换为(2+1)(2+1)的形式,那么就可以将 与 转换成一维 DCT 的形式。(2+1), 由于 ,那么 的值要么等于 整数倍除,=0,1,2,1 (2+1) (2+1)以 的余数,要么等于 除以 的余数。2 2减去 (
12、2+1)的整数倍 2(2.7.a)(2+1)=(2+1) 2或者(2.7.a)(2+1)=2(2+1) 2其中 ,如果 超过这个范围,这会得到相同的 的值。p=1,3,5,7,1 p (2+1)将(2.7)进行化简,就可以得到(2.8.a)=(+12) 2或者(2.8.a)=(112) 2其中 。p=1,3,5,7,1从(2.8)中可以发现,如果 取 0 到 的不同值,那么对应得到的 的 (1) 序列是不一样的,这样就得到了 个不同的 组合,这说明,依据( 2.8)的N2 (,)公式可以遍历 矩阵内的所有元素。N此外每一个 的值都对应着一个 的序列,这意味着,依据( 2.8)可以对输 j7入数
13、据分成 N 组,每一个组内元素的下标 都满足( 2.8) ,每一个分组表示(,)为(2.9.a)(|)=(+12) 2或者(2.9.a)(|)=(112) 2其中, ,p=1,3,5,7,1 =0,1,2,1二维输入数据 通过(2.9)就可以分成 N 个一维数据, ,=0,1,2,1x,(), =1,2,1, =1,3,5,1或者x,(), =1,2,1, =1,3,5,1用 和 来表示每一组数据R RR=x,(), =1,2,1, ()=(+12 ) 2,p=1,3,5,7,1 R=x,(), =1,2,1, (|)=(112 ) 2,p=1,3,5,7,1(2.10)为了进一步进行简化,假
14、设已知 除以 N 的商为 ,于是(2.10)可以(+12) 化简为R=x,(), =1,2,1, ()=+12 ,p=1,3,5,7,1 R=x,(), =1,2,1, (|)=112 + 2,p=1,3,5,7,1(2.10)按照(2.10)中的分组, 与 可以表达为,(2.11.a)=1 (,)+(,)8(2.11.b)=1 (,)+(,)其中(2.12.a)(,)=(2+1)+(2+1)2 )(2.12.b)(,)=(2+1)+(2+1)2 )(2.12.c)(,)=(2+1)(2+1)2 )(2.12.d)(,)=(2+1)(2+1)2 )把(2.11)带入到(2.6)中,可以得到,(
15、2.13)y=1 12(,)+(,)+(,)+(,)为了把 表示为一维 DCT 的和的形式,需要将y转换成一维 DCT 的形式。把(2.10)带(,)、 (,)、 (,)、 (,)入到(2.12.a)中,可以得到,(,)=1()(2+1)+(2+2)22 )将上面的式子拆分为 n 为奇数和偶数两种情况:当 n 为奇数时(,)=1=0()(2+1)+(+)2 ) (2.14.)当 n 为偶数是(,)=1=0(1)()(2+1)+(+)2 ) (2.14.)那么以同样的方式,可以获得 的表达式,(,)、 (,)、 (,)(,)=1=0()(2+1)+()2 ), (2.15.)1=0(1)()co
16、s(2+1)+()2 ), (2.15.)9(,)=1=0()(2+1)+()2 ), (2.16.)1=0(1)()(2+1)+()2 ), (2.16.)(,)=1=0()(2+1)+(+)2 ), (2.17.)1=0(1)()(2+1)+(+)2 ), (2.17.)把(2.14)-( 2.17)带入到(2.13)中,可以得到 的新表达式,y=121(1=0()+()cos(2+1)(+)2 + 1=0()+()cos(2+1)()2 ), (2.18.)121(1=0(1)()()cos(2+1)(+)2 + 1=0(1)()()cos(2+1)()2 ), (2.18.)可以发现,
17、 1=0()+()cos(2+1)(+)2 (2.19.)1=0()+()cos(2+1)()2 (2.19.)1=0(1)()()cos(2+1)(+)2 (2.19.)1=0(1)()()cos(2+1)()2 (2.19.)(2.19.a)和(2.19.b)分别是 序列的一维 DCT 变换序列的第()+()和 个元素;(2.19.c)和(2.19.d)分别是(+) ()序列的一维 DCT 变换序列的第 和 个元(1)()() (+) ()素。定义两个量: 和=1=0()+()cos(2+1)2 (2.20)10=1=0(1)()+()cos(2+1)2 (2.21)那么(2.19.a)和
18、(2.19.b)就分别对应着 ;(2.19.c )和, =0,1,2,1(2.19.d)就分别对应着 。这就意味着,大小为 矩, =0,1,2,1 阵的二维 DCT 只需要先计算出 N 个一维 DCT。从(2.18)可以看出,要计算出 ,可以先计算出 和 ,然后再将相对y 应的 和 进行线性叠加,得到最终结果。已知,n 为偶数时,cos(2+1)()2 )=cos(2+1)(+)2 ) (2.22)如果把 表达为:ff=1=0()+()cos(2+1)(+)2 那么把(2.22)带入就可以得到,f()=1=0()+()cos(2+1)(+()2 (2.23)同样的方式,当 n 为奇数时,=1=
19、0(1)()+()cos(2+1)(+)2 ()()=1=0(1)()+()cos(2+1)(+()2 (2.24)上面的两个式子意味着, 总是会以 的形式出现。同样, 会以f f() 的形式出现。()()基于以上的分析,假如输入矩阵的大小为 ,那么这个算法就可以用以88下的图来表示,11图 2 8X8 DCT 算法结构图,O 表示相加,虚线表示取反图 2(续)8X8 DCT 算法结构图,O 表示相加,虚线表示取反(二) 2-D IDCT 理论分析对于正交变换而言,如果不考虑系数的影响,那么其相对应的反变换就直接是正变换的反过程而已。那么可以利用这个来推导出快速 IDCT 算法。如果在 DCT
20、 变换中不考虑(2.1 )中前面的系数,那么反变换的算法结构就仅仅是正变换算法结构的取反。例如对于 8X8 的 IDCT 变换而言,如果不考虑系数,那么其算法结构如图 3 所示。可以看到,相对于图 2 而言,图 3 仅仅是将图 2 中信号的流向做了取反,相当于是反向做运算,然后做 N 个一维 IDCT,其运算量与(一)中分析的 DCT 的运算量相当,相对于传统的 IDCT 算法而言也仅仅需要 50%的一维 DCT 变换次数。12图 3 8X8 IDCT 算法结构图,O 表示相加,虚线表示取反图 4(续) 8X8 IDCT 算法结构图,O 表示相加,虚线表示取反但是如果将系数考虑进来,就需要做一
21、些额外的调整,调整的过程如下:1) 对于初始输入数据对相对应的 DCT 系数做归一化处理2) 将第一步得到的数据乘以系数183) 每个一维 IDCT 的第一个输入数据需要再乘以系数12经过以上三个步骤,处理后就可以得到相对应的 IDCT 数据。(三) 算法的复杂度分析从(一)和(二)部分的内容中可以看到对于 为的 DCT 变换,仅仅需N13要计算 N 个一维的 DCT。我们在本小节中以需要的乘法运算的次数和加法运算次数来作为算法复杂度比较的标准。由于 大小的二维 DCT 变换仅仅需要 N 次一维的 DCT 变换,那么相对于N传统的二维 DCT 算法而言,本报告中的算法所需要的乘法运算量就仅仅是
22、传统方法的 50%。而对于一维 DCT 的算法复杂度,目前比较高效的算法需要的乘法运算量为 2log2如果在二维 DCT 变换中使用这个一维 DCT 算法,那么所需乘法运算量为,22log2 (2.25)表格 1 所需乘法运算次数比较矩阵大小 传统算法 1 2 3 本报告算法4X4 32 24 16 16 168X8 192 144 104 96 9616X16 1024 768 568 512 51232X32 5120 3840 2740 2560 2560表格 2 所需加法运算次数比较矩阵大小 传统算法 1 2 3 本报告算法4X4 72 72 70 68 748X8 464 464 4
23、62 484 46616X16 2592 2592 2558 2531 253032X32 13376 13376 12950 12578 12738至于所需的加法运算量,从前面的分析中可以知道,除了 DCT 运算的加法运算量,其他地方加法运算量为 。而对于一维 DCT2(1+log2)2(2)变换而言,所需的加法运算量为 。所以二维 DCT 算法所需的加32log2+1法运算量为,522log22+2 (2.26)依据(2.25)和(2.26)和其他参考文献中的快速算法,列出了表格 1 和表格 2,分别展示了各个算法所需的乘法运算次数和加法运算次数。从表格中可以发现,本报告中的算法所需的乘法
24、运算量与文献3中一样,并且比其他算法都要低。同时,加法运算量与其他算法基本一致。14三、 实现与测试在本章节中,将根据第二章节中的 DCT 和 IDCT 快速算法的理论分析,在MATLAB 平台上实现相应的 DCT 变换算法和 IDCT 变换算法。然后利用这两个算法对一个实际图像做变换与反变换处理,观察处理的效果。(一) 算法的实现在本小节里面,将会依据第二章节的分析,在 MATLAB 平台上实现 4X4 的快速 DCT 与 IDCT 算法。从第二章中的分析中可以知道,快速算法可以用流向图很简洁地表示出来。那么依据前面的公式,对于 4X4 的 DCT 和 IDCT 变化可以得到以下的流向图,(
25、 a )( b )图 5 4X4 算法结构图, (a)DCT(b)IDCT那么依据图 5,算法的流程图如下:开始输入数据大小是否为 4 X 4结束否根据 ( 2 . 1 0 ) 分组是根据 ( 2 . 1 9 ) 做线性组合1 - D D C T根据 ( 2 . 2 3 )( 2 . 2 4 ) 做线性组合图 6 快速 DCT 算法流程图15开始输入数据大小是否为 4 X 4结束否归一化处理是根据 ( 2 . 2 3 )( 2 . 2 4 ) 做相反的线性组合1 - D I D C T根据 ( 2 . 1 0 ) 做相反的线性组合乘以 ( 1 / 8 )图 7 快速 IDCT 算法流程图(二)
26、 算法的测试测试环境:Dell 商用台式机,MATLAB 2013a,测试图片大小为 614x614.16原原DCT原原原 原原原图 8 快速 DCT 与 IDCT 测试效果图从图 8 的实际测试结果来看,原图经过了 4X4 的 DCT 变换之后,在每个4X4 大小的方格内,图像的能量都集中分布于少数几个系数上,这符合正交变换的特点。同时经过了 IDCT 变换之后,可以完整的恢复图像原来的模样,且不存在失真与格纹现象。这证明了算法的正确性。表格 3 程序运行时间比较自定义函数 MATLAB 已有函数函数名称 调用次数 运行时间 函数名称 调用次数 运行时间main 1 3.969s main
27、1 6.804sfdct2 23716 1.594s dct2 23716 3.228sfidct2 23716 1.396s idct2 23716 2.674s表格 3 是 MATLAB 利用 CPU 的运行时间计算出来的结果,虽然结果的具体数值并不具有很高的可靠性,但是在相同条件下得出来的结果,相互之间具有可比性。通过比较可以发现,在相同的调用次数的条件下,无论是 fdct2 函数还17是 fidct2 函数,其运行时间都比 MATLAB 已有函数的运行时间减少了将近50%。四、 总结与展望本次课程报告首先分析了离散余弦变换(DCT)在图像压缩领域的重要性,它本身虽然不具有压缩能力,但是
28、变换给后续的编码和量化操作带来了便利,在多个图像、视频标准中都有应用。DCT 的广泛应用也为人们对它的研究增添了动力,由于传统计算方法的效率低下,许多文献提出了相关的 DCT 快速算法。本次报告就研究、实现和分析了其中一种性能比较优越的快速算法。这种快速算法的乘法运算量仅仅只有传统算法的 50%,而加法运算量和其他方法相当,具有很高的效率,同时,这种算法可以能够用流向图来直观的表示,简单而直观。而且由于这种算法具有比较好的对称性,它能够很容易地应用到多线程并行处理中,这样效率又可以得到很大的提升,同时这种算法还可以直接用 VLSI结构来实现,这说明这种算的应用相对简单。在进行了理论分析之后,基
29、于理论分析在 MATLAB 平台上实现了此算法,并用实际图片进行了测试,测试结果表明,此算法可以快速地进行 DCT 变换和 IDCT 变换,能够完整的恢复出原图。此外,还将此算法与 MATLAB 自带的 DCT 变换和 IDCT 变换函数在相同的条件下进行了运行时间比较,比较结果表明,此算法的运行时间相对于 MATLAB 自带的函数减少了将近 50%,具有较高的效率。虽然这种的算法具有很高的效率,但是它依然有它的局限性。这种算法的最大的局限性在于,如果二维矩阵的维数很大,那么这种算法将会难以实现。因为这种算法需要对输入数据进行排列,在进行了一维 DCT 后还需要进行多次的线性运算,这种排列与线
30、性运算的组合并不具有很明显的规律性。在算法的实现过程中,对于 16X16 大小的矩阵,需要列出 256 个式子;但是对于 32X32的矩阵,需要的式子达到了 1024 个。所以对于大型的矩阵,这种方法是不适合的,比较适合于 16X16 以下的矩阵。18五、 参考文献1 C.Ma, “A fast recursive two dimension cosine transform”, Intelligent Robots and Computer Visio: Seventh in a Series, David P. Casasent, Ed., in Proc. SPIE 1002, pp.5
31、41-548, 1988.2 M. Vetterli, “Fast 2-D discrete cosine transform ,” in Proc. ICASSP85, Mar. 1985.P. Duhamel and C. Guillemot, “Polynomial transform computation of 2-D DCT,” in Proc. ICASSP 90 , pp. 1515-1518, Apr. 1990.3 N. I. Cho and S. U. Lee, “A fast 4X4 DCT algorithm for the recursive 2-D DCT,” I
32、EEE Trans. Acoust., Speech, Signal Processing, submitted for publication.4 F. A. Kamangar and K. R. Rao, “Fast algorithm for the 2-D discrete cosine tansform,” IEEE Trans, Comput., vol. C-31, pp. 899-906, Spet. 1982.5 B. G. Lee, “A new algorithm to compute the discrete cosine transform ,” IEEE Trans
33、. Acoust., Speech, Signal Processing, vol. ASSP-32, pp. 1243-1245, Dec. 1987.7 杨帆.数字图像处理与分析.北京:北京航空航天大学出版社, 20078 全红艳,曹桂涛. 数字图像处理原理与实现方法. 北京:机械工业出版社,201419六、 附件(一) 函数 fdct2 源码function Y = fdct2( X )%快速 4X4 DCT 变换函数% By 黄跃辉 2016/11/30%检测输入量a,b = size(X);if a = 4 | b = 4Y = zeros(4,4);return;end%A = z
34、eros(4,4);B = zeros(4,4);A(1,1) = X(1,1)+X(1,4);A(2,1) = X(2,2)+X(2,3);A(3,1) = X(3,3)+X(3,2);A(4,1) = X(4,4)+X(4,1);A(1,2) = X(1,1)-X(1,4);A(2,2) = X(2,2)-X(2,3);A(3,2) = X(3,3)-X(3,2);A(4,2) = X(4,4)-X(4,1);A(1,3) = X(1,2)+X(1,3);A(2,3) = X(2,1)+X(2,4);A(3,3) = X(3,4)+X(3,1);A(4,3) = X(4,3)+X(4,2)
35、;A(1,4) = X(1,2)-X(1,3);A(2,4) = X(2,4)-X(2,1);A(3,4) = X(3,1)-X(3,4);A(4,4) = X(4,3)-X(4,2);%获取变换矩阵T=zeros(4);for i=0:3for j=0:3T(i+1,j+1)=cos(pi*(j+0.5)*i/4);endend%对 A 中的每一列做一维 DCT,得到 Bfor i=1:4B(:,i) = T*A(:,i);endclear A T%由 B 元素的线性组合得到结果Y = zeros(4,4);Y(1,1) = (B(1,1)+B(1,3)*0.25;Y(2,1) = (B(2
36、,1)+B(2,3)*sqrt(2)/4;Y(3,1) = (B(3,1)+B(3,3)*sqrt(2)/4;Y(4,1) = (B(4,1)+B(4,3)*sqrt(2)/4;Y(2,2) = 0.5*(B(3,2)+B(3,4)+B(1,2)*0.5;Y(1,2) = (B(2,2)+B(4,4)*sqrt(2)/4;Y(4,4) = 0.5*(B(1,2)-B(3,2)-B(3,4)*0.5;Y(3,4) = 0.5*(B(2,2)-B(4,4)-B(4,2)-B(2,4)*0.5;Y(3,3) = 0.5*(B(1,1)-B(1,3)*0.5;Y(2,3) = 0.5*(B(2,1)-
37、B(2,3)+B(4,1)-B(4,3)*0.5;Y(1,3) = (B(3,1)-B(3,3)*sqrt(2)/4;Y(4,3) = 0.5*(B(2,1)+B(4,3)-B(2,3)-B(4,1)*0.5;Y(2,4) = 0.5*(B(3,2)-B(1,4)-B(3,4)*0.5;Y(1,4) = (B(4,2)-B(2,4)*sqrt(2)/4;Y(4,2) = 0.5*(B(1,4)+B(3,2)-B(3,4)*0.5;Y(3,2) = 0.5*(B(2,2)-B(4,4)+B(4,2)+B(2,4)*0.5;end1(二) 函数 fidct2 源码function Y = fidc
38、t2( X )%快速 4X4DCT 反变换% By 黄跃辉 2016/11/30%检测输入量a,b = size(X);if a = 4 | b = 4Y = zeros(4,4);return;end%对 X 做归一化处理X(1,1) = X(1,1)*4;X(2,1) = X(2,1)*4/sqrt(2);X(3,1) = X(3,1)*4/sqrt(2);X(4,1) = X(4,1)*4/sqrt(2);X(2,2) = X(2,2)*2;X(1,2) = X(1,2)*4/sqrt(2);X(4,4) = X(4,4)*2;X(3,4) = X(3,4)*2;X(3,3) = X(3,3)*2;X(2,3) = X(2,3)*2;X(1,3) = X(1,3)*4/sqrt(2);X(4,3) = X(4,3)*2;X(2,4) = X(2,4)*2;X(1,4) = X(1,4)*4/sqrt(2);X(4,2) = X(4,2)*2;X(3,2) = X(3,2)*2;X = X./8;%对归一化 X 做线性组合B = zeros(4,4);B(1,1) = 0.5*(X(1,1)+2*X(3,3);B(2,1) = X(2,1)+X(2,3)+X(4,3);B(3,1) = X(3,1)+X(1,3);B(4,1) = X(4,1)+X(2,3)-