背景技术
信号处理系统经常需要将信号内容在时域和频域进行转换,快速傅立叶变换算法(FFT)可进行时域和频域间的信号转换。相对于其它转换算法来说,快速傅立叶变换算法具有结构统一、计算量少的优点,因此广泛应用于信号处理系统中。
FFT算法输入N个数据,输出N个数据;一般称时域至频域的变换为正向变换,而频域至时域的变换为逆向变换。FFT算法有多种实现方式,但都由库利-图基算法演变而来。对于N个数据点,基2的库利-图基算法包括log2N个计算级。每个计算级输入N个数,输出N个数;前一计算级的输出经过一定的排序后作为后一计算级的输入。第一级输入为原始数据,最后一级输出为FFT计算结果。对于8点长度的FFT计算,其计算流程如图1所示,整个计算过程需要三个计算级103:S0,S1,S2。每个计算级103由N/2个蝶形102组成,蝶形的计算结构如图2所示。每个蝶形输入有两个数据点A和B,以及一个旋转因子W,经过蝶形计算后得到两个计算结果:A+BW和A-BW。每个蝶形计算中,输入数据A和B的序号具有确定的对应关系,该对应关系由蝶形所在的计算级以及输入数据A或B的序号来确定;同时,旋转因子W的值由当前蝶形所在的计算级103、输入数据A或B的序号、FFT数据长度确定。如图1中S0计算级中的第1个数据必定与第0个数据构成一蝶形,并且第0个数据为蝶形输入的A,第1个数据为蝶形输入的B,而W的值为1。而S1计算级中的第1个数据必定与第3个数据构成一蝶形,并且第1个数据为蝶形输入的A,第3个数据为蝶形输入的B,而W的值为1。
计算级之间存在数据相关,后一计算级必须等待前一计算级完成以后才能开始计算。因此,每级计算完成后都需要将结果存放在存储器中,下一级计算从存储器中读取上一级的计算结果作为本级计算的输入。计算级内的蝶形相互独立,蝶形的计算顺序不影响计算结果,但每个蝶形所读取的数据A、B和旋转因子W必须满足内在的对应关系。
在并行FFT计算中,运算部件从多粒度并行存储器中读取多个蝶形所需数据及对应的旋转因子,并行计算多个、多级蝶形,然后将计算结果并行写入存储器,以便进行一下级计算,如图3所示。图中假定数据长度为64,并行粒度为4,即多粒度并行存储器305一次可读写4个数据。此时,两相邻计算级中存在数据相关的4个蝶形303构成一个蝶形组302,两相邻计算级中的蝶形组构成一计算节301。蝶形计算模块从多粒度并行存储器305并行读取一个蝶形组所需数据点和旋转因子,完成一个蝶形组计算后,再将计算结果并行写回多粒度并行存储器305。
在蝶形组302中,每个蝶形的输入A、B、W仍必须满足其内在的对应关系,因此,并行FFT算法中必须考虑计算数据和旋转因子在存储器中的分布,以及每个蝶形组302的读写地址和读写方式,以保证蝶形计算模块每次都能并行读取所需数据和旋转因子。
对于并行FFT算法,目前国内外有一些相关的研究,如专利200910054018.9(基于FPGA实现并行结构FFT处理器的方法),专利201110163600.6(基于并行处理的FFT装置及其方法),专利US6,792,441B2(Parallel MultiProcessing For Fast Fourier Transform WithPipeline Architecture)。该类专利都着重讨论如何将长序列的FFT数据分解成多个短序列的FFT,利用多个处理器并行计算各个短序列的FFT,最后对多个短序列的FFT进行交织计算,得到最终的长序列FFT结果。但是对短序列的FFT运算,存在多级蝶形计算,每级蝶形计算都需要相关的存储器读写操作,占用很大的延时。因此,该类并行蝶形计算方法速度仍受到很大的制约。
发明内容
为了解决上述问题,本发明提出一种使用多个缓冲器装置对输入数据进行多粒度并行FFT蝶形计算的方法及相应的装置。
根据本发明的一方面,提出一种使用多个缓冲器装置对输入数据进行多粒度并行FFT蝶形计算的方法,其中第一和第二缓冲器装置用于缓存并行FFT蝶形组每级蝶形计算所需要的数据,第三缓冲器装置用于缓存并行FFT蝶形组每级蝶形计算所需要的旋转因子,第四缓冲器装置用于缓存经过并行FFT蝶形组计算完成后的结果数据,其特征在于,
N点输入数据分成
个计算节,每个计算节中包含
个蝶形组,蝶形组是并行蝶形计算的基本单位,其中,
表示向上取整,L为并行粒度因子,其决定了并行读取且可独立进行蝶形计算的数据个数为2
L;
所述蝶形组中的FFT蝶形计算方法包括以下步骤:
步骤1,设定计数器的初始值i=L-Rq;
步骤2,通过MUX选通器从所述第一或第二缓冲器装置中读入蝶形计算所需要的2L个数据,将2L个数据分为2L-1组,并从所述第三缓冲器装置中顺序读取2L-1个并行蝶形计算所需要的旋转因子;
步骤3,对所述2L-1组数据进行一级并行蝶形计算;
步骤4,将蝶形计算结果写入所述第二缓冲器装置中,对数据进行重排;
步骤5,修改当前计数器i的值为i=i-1;
步骤6,判断i的值是否为0,如果i=0,表示当前蝶形组计算完成,转向步骤7,否则返回到步骤2;
步骤7,将所述第二缓冲器装置中的数据写入所述第四缓冲器装置中,完成一个蝶形组计算。
根据本发明的另一方面,提出了一种对输入数据进行多粒度并行FFT蝶形组计算的装置,其特征在于,该装置包括:多个缓冲器装置、一计数器、多个数据选通模块、多个蝶形计算模块、一写回控制模块,其中,
第一和第二缓冲器装置用于缓存并行FFT蝶形组每级蝶形计算所需要的数据;
第三缓冲器装置用于缓存并行FFT蝶形组每级蝶形计算所需要的旋转因子;
第四缓冲器装置用于缓存经过并行FFT蝶形组计算完成后的结果数据;
所述计数器用于标识蝶形组完成蝶形计算所需要的级数,所述计数器为递减计数器,其初始值为L-Rq,当一级蝶形计算完成后该计数器的值i减1,L为并行粒度因子,其决定了并行读取且可独立进行蝶形计算的数据个数为2L,Rq表示当前蝶形组从第Rq级开始计算。
所述多个数据选通模块用于根据所述计数器的数值选择从所述第一或第二缓冲器装置中读入蝶形计算所需要的2L个数据,每一个数据选通模块输入2个数据;
所述多个蝶形计算模块中的每一个从与其相应的数据选通模块中读取数据,根据所述第三缓冲器装置中缓存的旋转因子对读取的数据进行蝶形计算,并将计算结果写入所述第二缓冲器装置中;
所述写回控制模块根据计数器的值决定是否需要将所述第二缓冲器装置中的数据写入到所述第四缓冲器装置中。
本发明的方法每次从输入缓冲器和旋转因子缓冲器中获取并行FFT蝶形计算所需的数据和旋转因子。输入缓冲器和旋转因子缓冲器中数据和旋转因子已根据特定的并行粒度和数据格式准备好,不需要额外的位反序操作,读取后数据和旋转因子可直接进行FFT蝶形计算。从输入缓冲器和旋转因子缓冲器中读取蝶形计算所需的数据和旋转因子后,蝶形组302内部多级蝶形计算在运算部件内部并行实现,多级蝶形计算完成后把蝶形计算结果写回输出缓冲器,中间不会访问缓冲器。在整个并行FFT蝶形计算中,每级蝶形计算并非原址操作,蝶形计算完成后需要对结果进行数据重排,以满足下一级的蝶形计算能正确执行,数据重排通过数据重排缓冲器实现。
本发明的装置,每次从输入缓冲器和旋转因子缓冲器中读取一个蝶形组计算所需的数据和旋转因子,之后用统一的蝶形表达式并行地进行多级蝶形计算并把计算结果写回到输出缓冲器中,最大限度地减少了访问缓冲器的次数,大大提高了蝶形计算的速度,并减少了功耗,本发明能高效、并行地执行多粒度、多数据格式的蝶形计算,还可以根据具体实现指明蝶形计算的并行粒度和数据格式,对平衡组和非平衡组的FFT蝶形计算均适用。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
为了实现并行FFT读写和计算,首先定义:
并行粒度2L(L为正整数):并行粒度是指从缓冲器中并行读取并且可独立进行蝶形计算的数据个数,其中L为并行粒度因子。
蝶形组开始计算级Rq:表征当前蝶形组开始的计算级,当N点FFT为平衡组时,即N=Lk,其中,k为正整数,每个蝶形组均有L级蝶形,Rq始终为0;当为非平衡组时,即N≠Lk,最后计算节中蝶形组不需要L级蝶形,根据N点不同设置Rq为1~(L-1),即从第Rq级蝶形开始计算,也即表示当前FFT蝶形组计算所需要的蝶形计算级数为L-Rq。
FFT的一个基本蝶形计算结果表示为A±B*W,其中A、B分别表示FFT蝶形计算所需的第一、二个数据,W表示旋转因子。
如图3所示,为本发明中蝶形计算、蝶形组、计算级、计算节的示意图,整个N点FFT运算由多个计算节301组成。计算节的数目受蝶形组并行粒度2
L影响,对于N点FFT计算,若蝶形组并行粒度为2
L,那么计算节的数目为
其中,
表示向上取整。每一计算节301内部包含
个蝶形组302,一个蝶形组由多个计算级304构成,蝶形组302是并行FFT蝶形计算的最小并行单位。在平衡组FFT中,每一计算节中的蝶形组结构相同,运算流程也相同,也就是说,将N点输入数据以蝶形组为基本单位进行
次的重复处理,直到获得最终所需的处理结果。在非平衡组FFT中,最后计算节中蝶形组与之前计算节蝶形组结构不同,但其基本运算流程仍是相同的。首先蝶形计算装置从输入缓冲器中和旋转因子缓冲器(数据从多粒度并行存储器305读出放入输入缓冲器和旋转因子缓冲器)读取一个蝶形组302计算所需的数据和旋转因子,之后进行相关的蝶形计算并把计算结果写回到输出缓冲器(数据最终从输出缓冲器中取出写回到多粒度并行存储器305,缓冲器是存储器和运算单元数据交互的一个中间媒介)。
图4为本发明提供的多粒度并行FFT蝶形组计算方法流程图,如图4所示,本发明所提出的多粒度并行FFT蝶形组计算方法包括以下步骤:
步骤401,设定计数器的初始值i=L-Rq,其中,L为并行粒度因子,其决定了并行读取且可独立进行蝶形计算的数据个数:2L,其中,Rq表示当前蝶形组从第Rq级蝶形开始,在平衡组FFT中Rq始终为0,在非平衡组FFT中Rq根据N的不同设置为1~(L-1)。将i初始化为L-Rq,表示当前FFT蝶形组计算所需要的蝶形计算级数。
步骤402,通过多路复用(MUX)选通器读入蝶形计算所需要的2L个数据,将2L个数据分为2L-1组,并从旋转因子缓冲器中顺序读取2L-1个并行蝶形计算所需要的旋转因子;
该数据可能来自输入缓冲器,也可能来自数据重排缓冲器。MUX的控制信号来自计数器i的值,当i=L-Rq时读入数据输入缓冲器中的数据,否则读入数据重排缓冲器中的数据;
所述旋转因子缓冲器中存储的旋转因子满足以下条件:如果输入数据为2L个,那么所述旋转因子缓冲器共存储有(L-Rq)*2L-1个旋转因子,这(L-Rq)*2L-1个旋转因子被分为L-Rq组,每一组有2L-1个旋转因子,其中,第L-Rq组中的2L-1个旋转因子各不相同;第L-Rq-1组中2L-1个旋转因子每2个相同,即有2L-2个不同的旋转因子;第L-Rq-2组中2L-1个旋转因子每4个相同,即有2L-3个不同的旋转因子,依次类推。
步骤403,对所述2L-1组数据进行一级并行蝶形计算。
步骤404,将蝶形计算结果写入数据重排缓冲器中,对数据进行重排,以进行下一级蝶形计算。
步骤405,修改当前计数器i的值为i=i-1,表征后面还需要蝶形计算的级数。
步骤406,判断i的值是否为0,如果i=0,表示当前蝶形组计算完成,转向步骤407,否则返回到步骤402进行计算。
步骤407,将数据重排缓冲器中的数据写入数据输出缓冲器中,完成一个蝶形组计算。
以8点输入数据为例,图5为本发明中8点蝶形组算法示意图,如图5所示,本发明8点蝶形组计算包括以下步骤:
步骤51,从输入缓冲器501和旋转因子缓冲器中分别读取8点蝶形计算所需的数据和旋转因子(旋转因子缓冲器在图5中没有标示出);
步骤52,将读取到的8点蝶形计算所需的数据和旋转因子分成4组,构成4个基本蝶形502,完成第一级蝶形504计算;
步骤53,将经第一级蝶形504计算后得到的结果写入到数据重排缓冲器503中,以对第一级蝶形计算结果重新排序;
步骤54,将重排后的数据从数据重排缓冲器503中取出,进行第二级蝶形505计算;
步骤55,将经第二级蝶形505计算后得到的结果写入数据重排缓冲器503中进行重新排序;
步骤56,将重排后的数据从数据重排缓冲器503中取出,进行第三级蝶形506计算;
步骤57,将经第三级蝶形506计算后得到的结果写入数据重排缓冲器503中进行重新排序,数据重排缓冲器503将最终重排后的数据写入到输出缓冲器507。
图6为当FFT蝶形计算工作在L=3时的8点FFT蝶形组内部硬件结构图,其中8点输入数据被分为4组并行进行处理,如图6所示,本发明所提出的多粒度并行FFT蝶形组计算装置包括:一数据输入缓冲器601、一旋转因子缓冲器603、一数据重排缓冲器604、一计数器605、4个数据选通模块602、4个蝶形计算模块606、一写回控制模块607、一数据输出缓冲器610,每一个数据选通模块602和一个对应的蝶形计算模块606组合起来对一组输入数据进行处理。
其中:
数据输入缓冲器601用于存放蝶形组开始计算时所需要的数据;
旋转因子缓冲器603用于存放蝶形组每级蝶形计算所需要的旋转因子;
计数器605用于标识蝶形计算的级数,该计数器为递减计数器,其初始值为L-Rq,当一级蝶形计算完成后该计数器的值减1;
数据选通模块602用于根据计数器605的数值选择读入数据输入缓冲器601中的数据或是数据重排缓冲器604中的数据,也就是说,数据选通模块602的选通信号来自计数器605。当计数器605的值为L-Rq时,数据选通模块602选择数据输入缓冲器601中的8点数据进入蝶形计算模块606,否则选择数据重排缓冲器604中的8点数据,每一个数据选通模块602输入2个数据。
每一蝶形计算模块606用于对于输入数据进行蝶形计算;蝶形计算模块进一步包括:数据分解模块608和蝶形计算单元609,其中:
数据分解模块608用于对参与蝶形计算的数据进行实部和虚部的分解;
蝶形计算单元609用于基于分解完成后的数据进行多级蝶形计算,蝶形计算所需的旋转因子来自旋转因子缓冲器603,每一级蝶形计算完成后均把计算结果写入数据重排缓冲器604中。
数据重排缓冲器604用于存放当前级蝶形计算的结果,并对当前级的蝶形计算结果进行重排,以满足下一级蝶形计算的顺序读入要求。
写回控制模块607用于控制是否需要将数据重排缓冲器604中的数据写入到数据输出缓冲器610中,其控制信号来自计数器605,当计数器605的值为0时表示当前的蝶形组各级并行计算已完成,需要把数据重排缓冲器604中的数据写入到数据输出缓冲器610中,以输出该蝶形组的蝶形计算结果。
如图7所示,为本发明提供的8点数据重排缓冲器数据处理示意图,其中,Y(i)表示当前级的蝶形计算结果,x(i)为对Y(i)的重新排序,同时也是下一级蝶形计算的输入数据。
对于2L点长的数据重排缓冲,满足以下重排规律:
如图8所示,为该发明提供的一个基本蝶形计算模块(如图6中的蝶形计算模块606)内部硬件结构图。
设A=a+j*b,B=c+j*d,W=e+j*f;那么一个基本的蝶形运算结果可以表示为:
复数分离模块(801、802、803)对参与蝶形运算的数据和旋转因子分别进行复数分离,得到各自的实部和虚部。分离后的数据A的实部a分别进入加法器813和816,虚部b分别进入加法器814和815;分离后的数据B和旋转因子W的实部和虚部分别进入相应的4个乘法器804、805、806、807得到ce、df、cf和de四个乘法结果。加法器809对ce和df经取负模块(808)后的-df进行相加,得到B*W的实部;加法器810对cf和de进行求和操作,得到B*W的虚部。B*W的实部和虚部各自有两条数据流向,一条路径直接进入后续的加法器814和816,另一条路径分别经取负模块811和812作用后进入加法器813和815。加法器814和加法器816分别计算A+B*W的实部和虚部,最终经复数结合模块817得到A+B*W蝶形计算结果。另外一个蝶形计算结果A-B*W通过加法器813、815和复数结合模块818的相关计算得到。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。