The T. Agui Y. Arai and M. Nakajima DCT Algorithm (AAN DCT算法)

原文地址:http://www.stefan-kuhr.de/download/thesis2side.pdf

DCT算法是数字图像压缩中非常基本的算法,数字图像压缩时使用的是二维N*N(JPEG中N一般取8)的DCT.定义如下:

如果按公式直接计算,那么计算量是非常巨大的,对于N=8,变换结果有8*8个系数,每个系数都需要进行8*8次乘法和8*8-1次加法。因此总的计算量为8*8*8*8次乘法;8*8*(8*8-1)次加法.实际中的处理是把二维8*8的DCT按转换为按行和按列的两个8次一维8点DCT计算.而8点DCT只需要8*8次乘法加8*(8-1)次加法.8行(列)DCT总共需要8*8*8次乘法加8*8*(8-1)次加法.因此总的计算量为2*8*8*8次乘法,2*8*8*(8-1)次加法,仅为直接计算的1/8.

对于8点DCT.,AAN算法 (T. Agui Y. Arai and M. Nakajima. A fast DCT-SQ Scheme for Images. Transactions of the IEICE, E 71:1095 – 1097, Nov 1988.)只需要13次乘法,29次加法.而且其中8次乘法都发生在计算的最后一步.对于JPEG标准DCT计算后紧跟着就是对DCT系数进行量化,这8次乘法可以合并在量化过程中.因此对于JPEG来说,AAN算法实际只需要5次乘法,29次加法. 其流程图如下

带箭头的连线表示减,不带箭头的边表示加,a1~a5为乘法的常数.
                                          

网上对于AAN算法的介绍不是很多,而且原始论文T. Agui Y. Arai and M. Nakajima. A fast DCT-SQ Scheme for Images. Transactions of the IEICE, E 71:1095 – 1097, Nov 1988 也始终找不到.对于其由来一直很不明白.很多论文现其都是直接对变换矩阵进行分解得到最终算法.最近找到一篇论文,也是用矩阵分解的方法对AAN算法进行了推导.虽然不知道为什么要进行矩阵分解,但由于其分解过程还比较详细.因此翻译记录于此,供日后慢慢领悟.

AAN算法的思路是借助16点实对称序列的WFTA计算8点DCT,原理如下:

2N点实对称序列: 的DFT为:

上式第二项中进行换元k=2N-1-n并利用e的周期性得:

将上式第二项中k带回n得:

(1)式两边同乘

因此2N点实对称序列的前N个DFT系数乘上一个复数比例因子恰好就是N点实序列的DCT系数。正是利用这一关系,借助16点WFTA算法推导出了AAN算法

16点WFTA算法

DFT算法写成矩阵形式就是:

对N=16,记

则变换矩阵M为

其偶数行前后部分相等,奇数行数前后半部分全部相反。因此将M按如下规则重排: 所有偶数行相对位置不变放到前8行,所有奇数行相对位置不变放到后8行.由于奇数行和偶数行的前后数据关系,将重拍后的矩阵看成四个8*8的分块矩阵则:

 再加上奇偶行的重排矩阵得:


    
                                      

对于图片左上角的8*8方阵满足同样的对称关系,因此可以继续进行同样的分解,但右下角的8*8方阵不满足这样的对称关系.只能专门进行分解.暂记为图片的结构为 图片,要想对图片的左上角进行变换,而右下角保持不变,则变换矩阵图片的结构应为图片分别为变换矩阵和单位阵.经过再次分解后:图片

              
         

同样对这次分解后剩下的不具备行对称关系4*4方阵先记为图片.这次分解后剩下的左上角4*4方阵任然具有相似的对称偶数行数据前后相等的关系.因此分解可以继续进行.并且将图片进行分块.左上角为一个4*4方阵,右下角为12*12方阵,其它位置为0。我们只希望变换左上角4*4方阵,而保持其它部分不变,则很容易得出变换矩阵图片的结构应该为图片.

经过再次分解后图片

               


:

为了使图片左上角的2*2方阵对角化,再对图片进行一变换,左乘一个,图片得,图片


                                             

变换矩阵M左边的矩阵图片都是重排列行序用的。可以把每一个图片看成图片的一个置换,这些图片的乘积还是一个对行的排列,不影响计算结果.因此可以用一个图片表示

因此最终

其中图片图片图片分解如下(分解规则:只使用初等行变换,化成只含0,1的一些列矩阵和一个稀疏矩阵之积):

          








备注:

图片的分解结果是4*4,8*8矩阵,运算的时候需要把分解的结果带入到原16*16矩阵中.方法如下.:将原方阵分块后看成一个对角阵,把图片阶方阵也按同样分块,并把分解结果填入到对应位置中即可

例如要将图片的分解结果带回去,已知图片则将图片分成8*8块的分块矩阵:图片

使用WFTA计算DFT所需的计算量复数加法可由 图片以及图片的分解式中每行多余1个正负1的个数确定。复数乘法则由以上矩阵中非1的个数决定,16点WFTA只需要10次复数乘法和74次复数加法.

使用WFTA构建AAN DCT

16点WFTA变换矩阵形式为图片.其中输入图片要求是16点的.但由于计算DCT时图片满足实对称,因此只要其中前面8点确定了,后面8点也就确定了.可以在图片图片之间增加一个映射,当取的数据在后8点时,自动映射成正确的前面8点中的某个位置.

U正是这样的映射.  因此图片前8点数据即为图片 DCT结果(相差一个比例因子)图片都为上节WFTA中的对应矩阵. 图片图片可以合并到一起,记为图片.
                                                                 

因为图片中只有图片含有复数,因此不会出现两个复数相乘的情况.而整个结果又是实数,因此可以完全忽略图片里复数的虚部,可以直接将对应复数虚部置0

由于只需要计算Y[0]~~Y[7]这8个数据,因为可以将以上各矩阵进一步简化以便减少计算.由矩阵P可知,Y[0],Y[2],Y[4],Y[6] 由图片的0,4,2,5行计算出.Y[1],Y[3],Y[5],Y[7]由图片的8,9,10,11行计算出(由矩阵P第i行中1的位置指明使用图片的哪一行计算.)

对于0,4,2,5行.每行的后8点数据都是0,因此这4行可表示成图片

将矩阵图片分别进行适当的分块后可以把它们都看成对角阵.因此图片从左到右的每一步之积也都是对角阵.Y[0],Y[2],Y[4],Y[6]只跟结果矩阵的0,4,2,5行有关,位于矩阵的上部分,而矩阵每一步之积顶部的8行中,后面的一半数据都全为0.因此计算时可以直接取图片的左上角8*8小块.因此Y[0],Y[2],Y[4],Y[6]的计算可以简化为:
                               

图片分别为图片的左上角的8*8小块.

 其中
        最后两行的特殊关系还可进一步分解(交换倒数第一列和倒数第三列,再将倒数第二行的负一倍加到倒数第一行可消去最后一行的两个非零常数)

为了进一步减少运算量,还需对进行简化.

其中

因为有所以有:

由以上关系得:

图片可简化为:图片

如此简化后下半部分可以全部用0代替

同理可分别简化为:

并且的2,3,6,7行可用0代替

并且的1,3,6,7行可用0代替

相邻的矩阵

由于图片中第四行和第七行相差一个-1,这个-1可以合并到图片中去。合并后的图片

最后去掉全为0的行列后得到

其流程图为:


同理,计算基数下表的系数Y[1],Y[3],Y[5],Y[7]时,可以直接采用对应矩阵的右下角8*8方阵进行计算.对应右下角8*8方阵都是单位阵.因此只需要化简


即可

图片图片的右下角8*8分块.

图片

V可分解为:

V的分解式中最后一个矩阵

图片图片相乘.根据图片中每列数据的对称关系,可以修改V的最后一个分解式.将图片每列中两个正负1合并到V的最后一个分解式中去.{合并要求矩阵乘积的结果不变,及V最后一个分解式的修改后每行与图片中每列对应数据相乘的结果都不能改变.记V最后一个分解式一行数据为a[i],图片每列数据为b[i],因此对V最后一个分解式每一行的修改都必须满足图片保持不变.因此只能利用图片}的关系修改a(i) :i位为1时,如果7 - i mod8 的位置为0,则可以将i位的1移动到7 - i mod 8的位置,并改变符号.

因此修改后的V的最后一个分解式为

因此修改后的V的最后一个分解式为

去掉全为0的行列最后可写成

对应流程图为;

寄偶部分下标合在一起即为文章开头部分的整个流程图

...............................................................................完.............................................................................................................

.................................................................2011年3月22号凌晨1点40分初稿................................................................................/

posted on 2011-04-24 13:11  TinyCoder  阅读(1921)  评论(0编辑  收藏  举报