目前,很多针对一维DCT运算的DCT快速算法已经提出。其中,Loeffler算法所需要的计算量最小。Loeffler算法将8点一维DCT运算分为4级,由于各级之间的输入/输出存在依存关系,4级操作必须串行进行,而各级内部的运算可并行处理。
流程图中有三种运算因子:蝶形因子、旋转因子和倍乘因子,分别如图3中的a,b,c所示。蝶形因子的运算关系为:
D0=I0+I1
O1=I0-I1
需要2次加法完成,倍乘因子的输入/输出关系比较简单:,只需1次乘法,旋转因子的运算关系为:
需4次乘法、2次加法完成。如果对其输入/输出关系式做以下变换:
只需要3次乘法、3次加法。其中,
和差都是已知系数,可通过查表获得。
由此计算可知,一个8点DCT的Loeffler算法共需要11次乘法和29次加法。从DSP汇编语言编程的角度来看,一个代数运算应包括取操作数、运算、存操作数三个步骤。因此,该算法大约需要120条指令。C5409的运算能力很强,支持单周期加/减法和单周期乘法运算,并且能够在单周期内完成两个16位数的加/减法运算,再加上DSP中有3组数据总线,因而可以利用长操作数(32位)进行长字运算。在长字指令中,给出的地址存取的总是高16位操作数,因而只需5条长字指令即可计算2个蝶形运算。加上采取其它优化措施,大约需90条指令完成Loeffler算法。
虽然Loeffler算法运算量最小,但是运用于本文系统并不是最优。因为该算法是为高级语言设计,没有利用汇编语言的特点和DSP硬件的特点。本文提出了基于DSP乘法累加单元的DCT快速算法。
DSP的乘法累加单元能在单周期内完成一次乘法和一次累加运算。如汇编指令运用于DCT运算,将大大简化程序的复杂度并减少计算时间。具体算法如下,利用蝶形运算:
从上面表达式可以看出,y(0)-y(7)都是乘法累加运算,而s0-s7可由x(0)一x(7)经过蝶形运算得到,因此,DCT算法由原来的4级运算变成两级,即第一级蝶形运算和第二级乘法累加运算,第一级蝶形运算共要10+4=14(10次计算操作和4次辅助操作)条指令,第二级运算中,每个输出要4+1+1=6条指令(做4次乘法累加运算、1次读取操作和1次存储操作),一共48条指令,这样,计算一个8点DCT要62条指令,大大缩减了运算时间,提高了CPU的工作效率,增强系统的实时性。 |