背景技术
信号处理系统经常需要将信号内容在时域和频域进行转换,快速傅立叶变换算法(FFT)可进行时域和频域间的信号转换。相对于其它转换算法来说,快速傅立叶变换算法具有结构统一、计算量少的优点,因此广泛应用于信号处理系统中。
FFT算法输入N个数据,输出N个数据;一般称时域至频域的变换为正向变换,而频域至时域的变换变逆向变换。FFT算法有多种实现方式,但都由库利-图基算法演变而来。对于N个数据点,基2的库利-图基算法包括log2N个计算级。每个计算级输入N个数,输出N个数;前一计算级的输出经过一定的排序后作为后一计算级的输入。第一级输入为原始数据,最后一级输出为FFT计算结果,如图1所示。图1中假定数据点长度为8,整个计算过程需要计算三个计算级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所示。
图3中,假定数据长度为64,并行粒度为4,即多粒度并行存储器300一次可读写4个数据。此时,两相邻计算级中存在数据相关的4个蝶形303构成一个蝶形组302,两相邻计算级中的蝶形组构成一计算节301。在蝶形组302中,每个蝶形的输入A、B、W仍必须满足其内在的对应关系,因此,并行FFT算法中必须考虑计算数据和旋转因子在存储器中的分布,以及每个蝶形组302的读写地址和读写方式,以保证蝶形计算装置每次都能并行读取所需数据和旋转因子。
大部分并行FFT算法相关的专利都着重讨论如何将长序列的FFT数据分解成多个短序列的FFT,利用多个处理器并行计算各个短序列的FFT,最后对多个短序列的FFT进行交织计算,得到最终的长序列FFT结果。
如美国专利US6,792,441B2(Parallel MultiProcessing For Fast Fourier Transform With Pipeline Architecture)。这一类算法都没考虑多个处理单元同时访问存储器时的冲突问题,以及多个处理器如何交织多个短序列FFT结果。而实际应用中,存储器访问冲突以及处理器之间的同步和通信效率将严重影响FFT的计算效率。
美国专利US6,304,887B1(FFT-Based Parallel System For Array Processing With Low Latency)讨论了FFT算法中数据并行读写的问题,该专利将FFT数据存放在多个存储器中,利用多个数据缓冲区、多个选择器对数据进行排序,以保证每次读写的数据分布在不同的存储器中,实现并行读写。但该专利需要专用的存储器、数据缓冲区和选择器,读写地址计算复杂,难以实现不同数据长度、不同读写粒度的并行FFT算法。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题实现对不同数据算度、不同读写粒度的FFT计算的支持,并提高FFT计算装置的计算效率。
(二)技术方案
本发明提出的一种多粒度并行FFT计算装置包括第一存储器、第二存储器、第三存储器、蝶形计算装置、状态控制单元、数据反序网络和第一选择器,所述第一存储器、第二存储器用于存储蝶形组数据,所述第三存储器用于存储与蝶形组数据对应的旋转因子;所述蝶形计算装置的输入端分别与第三存储器和第一选择器的输出端相连接,根据从第一选择器输出的蝶形组数据和从第三存储器输出的与该蝶形组数据对应的旋转因子,完成一个蝶形组的计算,并将计算结果写回第一存储器或第二存储器;所述状态控制单元用于根据当前计算节和计算级,生成第一、第二和第三存储器的读写地址和读写控制信号;所述数据反序网络用于蝶形组组内数据的反序排列;第一选择器的两个输入端分别接收原始输入数据和经数据反序网络位反序排列后的数据;如果当前处于计算节0,第一选择器选择位反序排列后的数据,否则选择原始数据。
所述第一、第二和第三存储器为多粒度并行存储器,均连接于所述状态控制单元并接受状态控制单元的读写控制。
所述状态控制单元用于根据当前计算节和计算级,生成第一、第二和第三存储器的读写地址和读写控制信号。
所述状态控制单元包括第一计算器、第二计算器和第三计算器,分别用于计算当前计算节号s、当前逻辑Bank号i和当前存储行号j。
所述状态控制单元还包括第一地址产生单元、第二地址产生单元和第三地址产生单元,分别用于产生旋转因子读取地址、数据写地址和数据读地址。
所述第一地址产生单元根据第一、第二、第三计算器分别计算得到的当前计算节号s、当前逻辑Bank号i和当前存储行号j产生旋转因子读取 地址,并将该地址输出到第三存储器。
所述第二地址产生单元根据第二、第三计算器分别计算得到的当前逻辑Bank号i和当前存储行号j产生数据写地址,并输出到地址分发器。
所述状态控制单元还包括第二选择器和地址分发器;
所述第三地址产生单元根据第二、第三计算器分别计算得到的当前逻辑Bank号i和当前存储行号j产生数据读地址,并输出到地址反序逻辑和第二选择器;
所述第二选择器的输入端分别接收原始读地址和经过位反序后的读地址,并根据当前计算节号s进行选择,以输出到地址分发器。
如果当前处理计算节号为0,则该第二选择器选择位反序后的读地址,否则该第二选择器选择原始读地址。
所述地址分发器根据当前计算节号s的值确定读地址输出到第一存储器还是第二存储器,以及确定写地址输出到第一存储器还是第二存储器。
(三)有益效果
本发明提出的多粒度并行FFT计算装置可实现自然序列数据输入,自然序列数据输出,并且实现了一次读写、多级计算,最大程度上减少存储器访问次数,以减少芯片功耗;本发明还可根据需要具体指定并行粒度;本发明利用特定的读写粒度,可从多粒度并行存储器中并行读取蝶形组数据和对应的旋转因子,读取过程中不会产生存储器冲突,也不需要额外的步骤再对读写数据进行排序;同时,可以在读取的同时实现位反序操作,因此,原始数据可以以自然序存放在存储器中。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
在本说明书中,为描述方便,我们首先介绍本发明的多粒度并行FFT计算装置的整体结构,然后对其中包括的各个部件分别进行描述。
多粒度并行FFT计算装置
图4是本发明的多粒度并行FFT计算装置的一个具体实施例的结构示意图,其中包括三个多粒度并行存储器、蝶形计算装置404、状态控制单元405、数据反序网络406和第一选择器407。在此,三个多粒度并行存储器分别称为第一存储器401、第二存储器402、第三存储器403。
其中,第一、第二存储器401、402用于存储蝶形组数据,第三存储器403用于存储与蝶形组数据对应的旋转因子。所述第一、第二和第三存储器401-403均连接于所述状态控制单元405并接受状态控制单元405的读写控制。
数据反序网络406可实现自然序列的位反序排列。数据反序网络406用于蝶形组组内数据的反序排列。当多粒度并行FFT计算装置的并行粒度为2n时,数据反序网络406的读数据线420上的输入数据的个数为2n,输出端上的输出数据的个数也为2n。如果定义输入数据向量为X,从左至右的索引值为i(0≤i<n),X[i]表示第i个输入数据;输出数据向量为Y,从左至右的索引值为j(0≤j<n),Y[j]表示第j个输出数据;br(i)表示对i进行镜像位反序,则数据反序网络406中X与Y的对应关系为:
Y[i]=X[br(i)]
第一选择器407的两个输入端分别为原始数据和经数据反序网络406位反序排列后的数据。如果当前处于计算节0,第一选择器407选择位反序排列后的数据,否则选择原始数据。
所述蝶形计算装置404为多粒度并行FFT蝶形计算装置,其输入端分别与第三存储器403和第一选择器407的输出端相连接,根据从第一选择器407输出的蝶形组数据422和从第三存储器403输出的与该蝶形组数据对应的旋转因子423,完成一个蝶形组的计算,并将计算结果写回第一存储器401或第二存储器402。具体来说,如果计算时从第一存储器401中读取数据,那么计算结果写回第二存储器402;如果计算时从第二存储器402中读取数据,那么计算将结果写回第一存储器401。
所述状态控制单元405用于根据当前计算节和计算级,生成第一、第二和第三存储器401-403的读写地址和读写控制信号。具体来说,该状态控制器的输出包括第一存储器401的读写地址、第二存储器402的读写地址425、第三存储器403的读写地址429、第一存储器401的读写粒度、第二存储器402的读写粒度424以及第三存储器403的读写粒度428。
所述状态控制单元405包括三个计算器408-410,分别用于计算当前计算节号s、当前逻辑Bank号i和当前存储行号j。在此,将该三个计算器分别称为第一计算器408、第二计算器409和第三计算器410。
所述状态控制单元405还包括三个地址产生单元、地址反序逻辑414、第二选择器415和地址分发器416。三个地址产生单元分别用于产生旋转因子读取地址、数据写地址和数据读地址。在此,为方便描述,将其称为第一地址产生单元411、第二地址产生单元412和第三地址产生单元413。
所述第一地址产生单元411根据第一、第二、第三计算器408-410分别计算得到的当前计算节号s、当前逻辑Bank号i和当前存储行号j产生旋转因子读取地址429,并将该地址输出到第三存储器403。
所述第二地址产生单元412根据第二、第三计算器409、410分别计算得到的当前逻辑Bank号i和当前存储行号j产生数据写地址431,并输出到地址分发器416;
所述第三地址产生单元413根据第二、第三计算器409、410分别计算得到的当前逻辑Bank号i和当前存储行号j产生数据读地址430,并输出到地址反序逻辑414和第二选择器415。
所述地址反序逻辑414接收第三地址产生单元413的输入,对输入的读地址的比特位进行镜像反序。
所述第二选择器415的输入端分别接收原始读地址433和经过位反序后的读地址,并根据当前计算节号s进行选择,以输出到地址分发器416。具体来说,如果当前处理计算节号为0,该第二选择器415选择位反序后的读地址,否则该第二选择器415选择原始读地址433。第二选择器415输出读地址431到地址分发器416。
所述地址分发器416根据当前计算节号s的值确定读地址431输出到第一存储器401还是第二存储器402,以及确定写地址430输出到第一存储器401还是第二存储器402。假定原始自然序数据存放在第一存储器401中,则在当前计算节号s为偶数时,地址分发器416将读地址431输出到第二存储器402,将写地址430送入第一存储器401;在当前计算节号s为奇数时,地址分发器416将读地址431输出到第一存储器,将写地址430输出到第二存储器402。
多粒度并行存储器
如上所述,第一存储器401、第二存储器402、第三存储器403均为多粒度并行存储器,以下参照图5和图6具体描述本发明的多粒度并行存储器。
为便于说明,各个数据位宽以存储单元为单位来度量,存储单元定义为存储器的编址单位,也是存储器可读写的最小数据位宽。描述过程中出现包含“位宽为W”的语句都需要理解成W个存储单元的比特位(bit)。如存储单元为8bit的字节类型时,读写端口位宽为4的存储器实际位宽为4×8=32bit。同时,所有对象从0开始,从左至右编号。另外,如前所述,“粒度”是指地址连续的存储单元的个数。在以下的描述过程中,约定以下符号:
·W:存储器读写端口位宽,必须为2的幂次方(即:W为2的n次方,n为自然数);
·K:K=log2W,K+1表示存储器支持的读写粒度种类;
·k:存储器读写粒度参数,为自然数,且0≤k≤K,实际读写粒度为g=2k;
·g:g=2k,存储器读写粒度,1≤g≤W;
·N:一个存储块的大小。
本发明示意图中均假定W=4,但本发明适用于W为2的幂次方的其它情况。
如图5所示,多粒度并行存储器由W个存储块505和一个数据选通网络502构成。每个存储块505是由存储单元503构成的二维阵列,该阵列中的存储行504必须包含W个存储单元503,每个存储块一次可读写一个存储行504。
数据选通网络502在逻辑上根据读写地址和读写粒度从W个存储块505中选择W个存储单元503作为读写对象。
本发明的存储器支持多种读写粒度,在不同的读写粒度下,每个存储块505的起始地址各不相同。我们以参数k来表征不同的读写粒度,实际的读写粒度g=2k。
图6示出了W=4时,存储器在不同读写粒度下每个存储块605的编址。对于读写粒度g,每g个相邻的存储块605拼接成一个逻辑Bank606,所有逻辑Bank606的起始地址相同;逻辑Bank606内的存储块605起始地址前后相接,每个逻辑Bank606的寻址范围为0~gN-1,整个存储器的寻址范围为0~gN-1。
存储器在进行读操作时,将读写地址和读写粒度发送给每个逻辑Bank606,每个逻辑Bank606读取g个存储单元并通过数据选通网络502传递给存储器读写端口501,W/g个逻辑Bank606所读取的数据按从左到右的顺序拼接成位宽为W的输出数据。
存储器在进行写操作时,将存储器读写端口501传递过来的数据拆分成g份,每份数据位宽为W/g,通过数据选通网络502将第i份数据发送给第i个逻辑Bank606(0≤i<g),同时将读写地址和读写粒度发送给每个逻辑Bank606。每个逻辑Bank606写入g个存储单元。
蝶形计算装置
如前所述,本发明的多粒度并行FFT计算装置中包括的蝶形计算装置404为多粒度并行FFT蝶形计算装置,以下参照图7具体描述本发明的蝶形计算装置。
并行粒度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表示旋转因子。
如图7所示,本发明的蝶形计算装置包括:一数据输入缓冲器701、一旋转因子缓冲器703、一数据重排缓冲器704、一计数器705、4个数据选通模块702、4个蝶形计算模块706、一写回控制模块707、一数据输出缓冲器710,每一个数据选通模块702和一个对应的蝶形计算模块706组合起来对一组输入数据进行处理。
数据输入缓冲器701用于存放蝶形组开始计算时所需要的数据;
旋转因子缓冲器703用于存放蝶形组每级蝶形计算所需要的旋转因子;
计数器705用于标识蝶形计算的级数,该计数器为递减计数器,其初始值为L-Rq,当一级蝶形计算完成后该计数器的值减1;
数据选通模块702用于根据计数器705的数值选择读入数据输入缓冲器701中的数据或是数据重排缓冲器704中的数据,也就是说,数据选通模块702的选通信号来自计数器705。当计数器705的值为L-Rq时,数据选通模块702选择数据输入缓冲器701中的8点数据进入蝶形计算模块706,否则选择数据重排缓冲器704中的8点数据,每一个数据选通模块702输入2个数据。
每一蝶形计算模块706用于对于输入数据进行蝶形计算;蝶形计算模块进一步包括:数据分解模块708和蝶形计算单元709,其中:
数据分解模块708用于对参与蝶形计算的数据进行实部和虚部的分解;
蝶形计算单元709用于基于分解完成后的数据进行多级蝶形计算,蝶 形计算所需的旋转因子来自旋转因子缓冲器703,每一级蝶形计算完成后均把计算结果写入数据重排缓冲器704中。
数据重排缓冲器704用于存放当前级蝶形计算的结果,并对当前级的蝶形计算结果进行重排,以满足下一级蝶形计算的顺序读入要求。
写回控制模块707用于控制是否需要将数据重排缓冲器704中的数据写入到数据输出缓冲器710中,其控制信号来自计数器705,当计数器705的值为0时表示当前的蝶形组各级并行计算已完成,需要把数据重排缓冲器704中的数据写入到数据输出缓冲器710中,以输出该蝶形组的蝶形计算结果。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。