基于并行处理的FFT装置及其方法
技术领域
本发明公开了一种应用DSP实现高速FFT处理的装置与方法,它涉及到数字信号的并行处理。
背景技术
FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换的快速算法。在数字信号处理的发展中,许多算法都可以化为离散傅里叶变化来实现,因此DFT及其快速算法FFT是数字信号处理领域的核心组成部分,FFT算法多种多样,按数据抽取方式不同又可以分为基2、基4等。
FFT算法可以使用通用的DSP实现也可以通过FPGA来实现。两者相对来讲,DSP开发相对简单,技术成熟,但通用的DSP速率较慢。基于此情况,本发明在DSP的基础上添加支持FFT算法的指令,提高FFT装置的运算速度。
基2 FFT的基本原理及算法结构
FFT算法可以分为二类:时域抽取法,频域抽取法。
1.算法原理
设序列点数N=2L,L为整数。若不满足,则补零。N为2的整数幂的FFT算法。称基-2FFT算法
将序列x(n)按n的奇偶分成两组:
k=0,Λ,N-1
先将x(n)按n的奇偶分为两组,作变量置换:
当n=偶数时,令n=2r;
当n=奇数时,令n=2r+1;
得到:x(2r)=x1(r);x(2r+1)=x2(r);r=0...N/2-1;
k=0,1ΛN/2-1
其中:
k=0,Λ,N/2-1
·一个N点的DFT被分解为两个N/2点DFT。X1(k),X2(k)这两个N/2点的DFT按照:
又合成N点DFT中的前半部分k=0,1ΛN/2-1
·再应用W系数的周期性,求出用X1(k),X2(k)表达的后半部的X(k+N/2)的值。
∴
看出:后半部的k值所对应的X1(k),X2(k)则完全重复了前半部分的k值所对应的X1(k),X2(k)的值。
又
∴后半部分:
频域中的N个点频率成分为:
前半部分:
后半部分:
结论:只要求出(0~N/2-1)区间内的各个整数k值所对应的X1(k),X2(k)值,即可以求出(0~N-1)整个区间内全部X(k)值,这就是FFT能大量节省计算的关键。
·由于N=2M,因此N/2仍为偶数,可以依照上面方法进一步把每个N/2点子序列,再按输入n的奇偶分解为两个N/4点的子序列,按这种方法不断划分下去,直到最后剩下的是2点DFT,两点DFT实际上只是加减运算。
N=2时
X(0)=x(0)+x(1)X(1)=x(0)-x(1)
则可得其DFT为两部分:
k=0,Λ,N/2-1
对于8点FFT可以分解如图1,FFT的算法实现上可以看出,数据是按照倒序输入,正序输出。输入数据x(n)不能按自然顺序存入存储单元中,而是按照x(0),x(4),x(2),x(6),x(1),x(3),x(5),x(7)的顺序存入存储单元。这种顺序看起来相当杂乱,虽然它是有规律可寻,但是这种方式非常不适合数字信号的并行处理。
发明内容
对于任何流图,只要保持各节点所连续的支路及其传输系数不变,则不论节点位置怎么排列所得流图总是等效的,最后所得结果都是x(n)的离散傅里叶变换的正确结果。只是数据的提取和存放的次序不同而已。
FFT算法变换后的流图如图2所示。
FFT变换后的流图输入输出数据均为自然顺序,每一级算法的输出数据都作为下一级的输入数据,均为原址运算;算法在保持了FFT算法的性能的同时,每阶的每个蝶形运算的数据输入间距保持一致,使得输入端的数据存储地址连续,适用于数字信号处理系统的并行处理。
由FFT的流图可以看出,每次蝶形运算有一次复数乘法,两次复数加法。而一次复数乘法又需要四次实数乘法和2次实数加法。可见大量的复数计算成为算法中最耗时的部分。
为了解决上述问题,本发明提供一种基于并行处理的FFT装置及其方法,充分利用数据信号的并行处理,添加有效指令,以较快的速度较少的指令来完成复数乘法操作,从而提高FFT装置的处理能力。
本发明的基于并行处理的FFT装置,如图3,其包括:
指令存储单元,用来存储将要执行的指令代码;
数据存储单元,用来存储指令代码执行所需要的数据;
指令读取和分发单元,该单元将指令代码从指令存储单元中读取并发送给所有的执行单元;
矢量数据处理单元,该单元用来执行指令代码当中的矢量处理指令;
标量数据处理单元,该单元用来执行指令代码当中的标量处理指令;
矢量寄存器组,包含矢量寄存器VR0,VR1,...,VRn,用来存放来自数据存储单元的数据,其运算单元则从矢量寄存器组中读写数据;
标量寄存器组,包含标量寄存器R0,R1,....,Rn,用来存放来自数据存储单元的数据,其运算单元则从标量寄存器组中读写数据;
所述FFT装置的并行处理是按照VLIW处理器的操作过程在矢量数据处理单元中完成。
根据数据的并行处理,本发明的并行处理的FFT装置可以一次处理8个蝶形运算,8个蝶形运算的复数乘法并行处理。此外蝶形运算内部采用流水与并行方式,能有效的减少时钟的周期,提高系统的整体速度。数据存储单元中存储的输入数据,包括数据的实部和虚部。根据FFT算法原位计算的特点,每一级算出的数据可以存入相同的数据存储单元中,把之前的数据覆盖。
为了提高数据的并行处理能力同时使用更少的指令,本发明的并行处理的FFT装置使用更有效的指令集,本发明的并行处理的FFT装置是处理器的一个组成部分,其执行的过程按照VLIW(超长指令字)处理器的操作过程进行。
本发明所述的基于并行处理的FFT方法,一个蝶形运算主要包含以下步骤(如图4):
步骤一、加载矢量X1放入VR1中
指令读取和分发单元从所述指令存储单元中读取矢量加载指令,然后分发给所述矢量数据处理单元,所述矢量数据处理单元根据所述矢量加载指令执行矢量加载操作;即所述矢量数据处理单元根据所述矢量加载指令将待加载数据队列从所述数据存储单元加载到所述矢量寄存器组源寄存器中,所述源寄存器的指定是由所述矢量加载存储指令决定的;
步骤二、加载系数矢量W放入VR2,具体的实施同步骤一;
步骤三、做矢量复数乘法VR1*VR2,结果放入VR3
指令读取和分发单元从所述指令存储单元中读取矢量乘法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量乘法指令将矢量寄存器组源寄存器的内容相乘,结果存入目的寄存器中,所述源寄存器的指定是由所述矢量加载指令中的目的寄存器决定的;
步骤四、对VR1进行重排操作,结果存入VR4中
指令读取和分发单元从所述指令存储单元中读取矢量重排指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量重排指令将矢量寄存器组源寄存器的内容重排,结果存入目的寄存器中,所述源寄存器的指定是由所述矢量加载指令中的目的寄存器决定的;
步骤五、完成矢量寄存器的乘法操作;VR2*VR4结果存放与VR5中;具体的实施同步骤三;
步骤六、对VR5、VR3进行重排操作,结果依然存放在VR3、VR5中,重排的根据图5所示;
步骤七、完成矢量寄存器的加法操作;VR3+VR5,结果存放在VR6
指令读取和分发单元从所述指令存储单元中读取矢量加法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量加法指令将矢量寄存器组源寄存器的内容相加,结果存入目的寄存器中;
步骤八、做矢量加减法VR1+VR6,VR1-VR6操作
指令读取和分发单元从所述指令存储单元中读取矢量加法或减法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量加或减指令将矢量寄存器组源寄存器的内容相加减,结果存入目的寄存器中。
本发明除了涉及到并行处理的FFT装置,还涉及到一些特殊的指令,此类指令对加速FFT的运算速度及并行处理能力起到关键作用。如重排,乘法重排指令。在乘法重排指令中,我们把乘法和重排有效的结合起来,为FFT节约一个CLK时钟周期。
乘法重排的结构图如图6所示,以矢量寄存器为256位为例,具体实现方式是256位的矢量寄存器,可以看作16个16位的寄存器,32个8位寄存器,8个32位寄存器。
图6是以16个16位寄存器为例。把源操作数1第一个16位寄存器与源操作数的第二个16位寄存器相乘,结果存入目的寄存器的第一个16位寄存器。把源操作数1第二个16位寄存器与源操作数的第一个16位寄存器相乘,结果存入目的寄存器的第二个16位寄存器。把源操作数1第三个16位寄存器与源操作数的第四个16位寄存器相乘,结果存入目的寄存器的第三个16位寄存器。把源操作数1第四个16位寄存器与源操作数的第三个16位寄存器相乘,结果存入目的寄存器的第四个16位寄存器。以此类推。
如果利用乘法重排指令,一个蝶形运算的步骤可以缩减为7步,具体实现方式如下所示:
步骤一、加载矢量X1放入VR1中
指令读取和分发单元从所述指令存储单元中读取矢量加载指令,然后分发给所述矢量数据处理单元,所述矢量数据处理单元根据所述矢量加载指令执行矢量加载操作;即所述矢量数据处理单元根据所述矢量加载指令将待加载数据队列从所述数据存储单元加载到所述矢量寄存器组源寄存器中,所述源寄存器的指定是由所述矢量加载存储指令决定的;
步骤二、加载系数矢量W放入VR2,具体的实施同步骤一;
步骤三、做矢量复数乘法VR1*VR2,结果放入VR3
指令读取和分发单元从所述指令存储单元中读取矢量乘法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量乘法指令将矢量寄存器组源寄存器的内容相乘,结果存入目的寄存器中,所述源寄存器的指定是由所述矢量加载指令中的目的寄存器决定的;
步骤四、做矢量乘法和重排操作,结果放入VR5中。
步骤五、对VR5、VR3进行重排操作,结果依然存放在VR3、VR5中,重排的根据图5所示;
步骤六、完成矢量寄存器的加法操作;VR3+VR5,结果存放在VR6
指令读取和分发单元从所述指令存储单元中读取矢量加法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量加法指令将矢量寄存器组源寄存器的内容相加,结果存入目的寄存器中;
步骤七、做矢量加减法VR1+VR6,VR1-VR6操作
指令读取和分发单元从所述指令存储单元中读取矢量加法或减法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量加或减指令将矢量寄存器组源寄存器的内容相加减,结果存入目的寄存器中。
这样每个蝶形运算都为FFT处理节省一个CLK时钟周期,随着点数的增加,这种处理带来的好处越来越明显。
所述FFT的并行处理装置及其方法中涉及到的矢量操作指令为:
矢量加载:LD.v Dst,[Src]
寄存器的内容为地址,把此地址的数据送到矢量目的寄存器中。以矢量寄存器为256位为例,把矢量寄存器分为16个16位的,以16位数据为操作单位;
矢量存储:ST.v[Dst],Src
目的寄存器的内容为地址,把源目的寄存器的数据送到以目的寄存器的内容为地址的数据存储单元中。以矢量寄存器为256位为例把矢量寄存器分为16个16位的,以16位数据为操作单位;
矢量乘法:MUL.v Dst,Src1,Src2
源寄存器Src1,Src2的数据相乘,放入目的寄存器中。以矢量寄存器为256位为例把矢量寄存器分为16个16位的,以16位数据为操作单位;
矢量重排:SHF.v Src1,Src2
源寄存器Src1,Src2的内容互换重排。重排的过程如图5所示。以矢量寄存器为256位为例把矢量寄存器分为16个16位的,以16位数据为操作单位;
矢量加法:Add.v Dst,Src1,Src2
源寄存器Src1,Src2的内容相加,相加的结果存入目的寄存器中。以矢量寄存器为256位为例把矢量寄存器分为16个16位的,以16位数据为操作单位;
附图说明
图1为FFT变换前的流图;
图2为FFT变换后的流图;
图3为并行运算处理的FFT装置的结构框图;
图4为FFT方法流程图;
图5为FFT装置的重排指令的结构图;
图6为FFT装置的乘法重排的结构图;
图7为蝶形运算中复数的乘法操作的具体实施步骤图;
图8以矢量寄存器为256位为例FFT流程图。
具体实施方式
本发明所述的基于并行处理的FFT装置,包括:
指令存储单元,用来存储将要执行的指令代码;
数据存储单元,用来存储指令代码执行所需要的数据;
指令读取和分发单元,该单元将指令代码从指令存储单元中读取并发送给所有的执行单元;
矢量数据处理单元,该单元用来执行指令代码当中的矢量处理指令;
标量数据处理单元,该单元用来执行指令代码当中的标量处理指令;
矢量寄存器组,包含矢量寄存器VR0,VR1,...,VRn,用来存放来自数据存储单元的数据,其运算单元则从矢量寄存器组中读写数据;
标量寄存器组,包含标量寄存器R0,R1,...,Rn,用来存放来自数据存储单元的数据,其运算单元则从标量寄存器组中读写数据;
对于并行的FFT算法中一个蝶形运算的具体实现方式如下:
以矢量寄存器为256位为例,256位的矢量寄存器,可以看作16个16位的寄存器并行处理,即一次可以对8个复数进行并行处理。下面以8个复数为例,设要完成复数乘法的复数为
A0=a0+ib0,A1=a1+ib1,A2=a2+ib2,A3=a3+ib3,A4=a4+ib4,A5=a5+ib5,A6=a6+ib6,A7=a7+ib7,A8=a8+ib8。
B0=c0+id0,B1=c1+id1,B2=c2+id2,B3=c3+id3,B4=c4+id4,B5=c5+id5,B6=c6+id6,B7=c7+id7,B8=c8+id8,以下指令将同时完成A0xB0,A1xB1,A2xB2,A3xB3,A4xB4,A5xB5,A6xB6,A7xB7。
具体步骤如图7所示
步骤1:A0加载到矢量寄存器VR1中,此A0相当于输入数据x(n)。
步骤2:B0加载到矢量寄存器VR2中,此B0相当于系数矢量。
步骤3:完成矢量寄存器的乘法操作;VR1*VR2结果存放与VR3中。
步骤4:对VR1进行重排操作,结果存入VR4中。
步骤5:完成矢量寄存器的乘法操作;VR2*VR4结果存放与VR5中。
步骤6:对VR5,VR3进行重排操作,结果依然存放在VR3,VR5中,重排的根据图6所示。
步骤7:完成矢量寄存器的加法操作;VR3+VR5,结果存放在VR6。
步骤8:完成矢量寄存器的加法和减法操作。
如果不依靠数据处理的并行处理,每一个复数乘法需要经过4次实数乘法,2次实数加法,并需要若干数据载入。而将算法分解为适合于并行运算的步骤,并通过本装置,只需要7条指令即可完成8个蝶形运算的复数运算。第7步做完后就完成了输入数据与系数矢量的复数乘法运算,可见本装置及本装置所涉及到的指令对算法性能的提高时显而易见的。第8步完成蝶形运算中的加法和减法操作,生成第一级的蝶形运算结果,如果矢量寄存器足够的话,结果不必存入数据存储器中,可以继续参与运算。第二级蝶形运算,第三级蝶形运算以此类推。
如果再考虑乘法重排指令,上述步骤4可以和步骤5合为一步,省去重排操作。节约一个时钟周期。
本发明所述的基于并行处理的FFT方法的具体实现方式如图8所示:
步骤一、定义寄存器R1为系数表指针,初始化R1
步骤二、定义寄存器R0为源数据指针,初始化R0指令。加载标量源数据指针放入R0中指令读取和分发单元从所述指令存储单元中读取标量加载存储指令,然后分发给所述标量数据处理单元,所述标量数据处理单元指令执行标量加载操作;所述标量数据处理单元根据所述标量加载指令将待加载数据队列从所述数据存储单元读入到所述标量寄存器组源寄存器中,所述源寄存器的指定是由所述标量加载存储指令决定的;
步骤三、寄存器R10清零。具体实施如步骤一所示。
步骤四、从存储器地址R0处取连续8个点数据放入矢量寄存器VR0。加载矢量放入VR0中,指令读取和分发单元从所述指令存储单元中读取矢量加载存储指令,然后分发给所述矢量数据处理单元,所述矢量数据处理单元根据所述加载指令执行矢量加载操作;所述矢量数据处理单元根据所述矢量加载指令将待加载数据队列从所述数据存储单元读入到所述矢量寄存器组源寄存器中,所述源寄存器的指定是由所述矢量加载存储指令决定的,此处源寄存器为RO,目的寄存器为VRO;
步骤五、从存储器地址R0+32处取连续8个点数据放入矢量寄存器VR1。具体实施步骤如步骤三所示,此处源寄存器为RO+32,目的寄存器为VR1。
步骤六、从存储器地址R1处取出8个系数放入矢量寄存器VR2。具体实施步骤如步骤三所示,此处源寄存器为R1,目的寄存器为VR2。
步骤七、VR1和VR2做矢量复数乘法,结果放入VR3。做矢量复数乘法VR1*VR2,结果放入VR3指令读取和分发单元从所述指令存储单元中读取矢量乘法存储指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量乘法指令将矢量寄存器组源寄存器的内容相乘,结果存入目的寄存器中,所述源寄存器的指定是由所述矢量加载存储指令中的目的寄存器决定的;
步骤八、VR0和VR3做矢量复数加法,结果放入VR0。做矢量加法VR0+VR3,结果放入VR0指令读取和分发单元从所述指令存储单元中读取矢量加法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量加法指令将矢量寄存器组源寄存器的内容相加,结果存入目的寄存器中;
步骤九、VR1和VR3做矢量复数减法,结果放入VR1。做矢量减法VR1-VR3,结果放入VR1指令读取和分发单元从所述指令存储单元中读取矢量减法指令,然后分发给所述矢量数据处理单元;所述矢量数据处理单元根据所述矢量减指令将矢量寄存器组源寄存器的内容相减,结果存入目的寄存器中;
步骤十、将VR0写入存储器地址R0处。指令读取和分发单元从所述指令存储单元中读取矢量存储指令,然后分发给所述矢量数据处理单元,所述矢量数据处理单元指令执行矢量存储操作;所述矢量数据处理单元根据所述矢量存储指令将待存储数据VRO中的数据读入到以R0的内容为地址的数据存储单元中;
步骤十一、将VR1写入存储器地址R0+32处。指令读取和分发单元从所述指令存储单元中读取矢量存储指令,然后分发给所述矢量数据处理单元,所述矢量数据处理单元指令执行矢量存储操作;所述矢量数据处理单元根据所述矢量存储指令将待存储数据VR1中的数据读入到以R0的内容加32为地址的数据存储单元中;
步骤十二、R0=R0+32。 标量单元加法操作。做标量加法R0=R0+32,结果放入R0指令读取和分发单元从所述指令存储单元中读取标量加法指令,然后分发给所述标量数据处理单元;所述标量数据处理单元根据所述标量加法指令将标量寄存器组源寄存器的内容相加,结果存入目的寄存器中RO中;
步骤十三、R1=R1+32。具体实施方案如步骤十一所示,结果存入目的寄存器中R1中;
步骤十四、R10=R10+8。具体实施方案如步骤十二所示,结果存入目的寄存器中R10中;
步骤十五、如果R10小于256,则返回第4步;否则继续;
步骤十六、如果是第8次进入步骤16,则程序结束;否则返回第2步。
在本发明中,矢量寄存器的长度可以为2n,原则上n可以取大于0的任意整数,但考虑实际需求,n一般大于等于6,。因此矢量寄存器的长度可以是64,128,256,512,1024等。但为了容易说明并行FFT算法的装置,我们以256位为例,但此发明绝不仅限于256位,所有的矢量寄存器为2n(n>=6)的长度都在此发明之内。