一种可变点数流水线FFT处理器
技术领域
本发明属于信号处理技术领域,涉及一种信号处理器,特别是涉及一种超长可变点数流水线FFT处理器,可应用于通信或电子战等各种输入序列长度实时可变且芯片面积约束较高的***。
背景技术
在电子侦察中,雷达信号覆盖了较宽的频率范围,为了能够识别不同的雷达信号,电子战接收机必须在较宽的带宽上具有较高的频率分辨率。离散傅立叶变换(DFT)理论指出,利用DFT进行谱分析时,频率分辨率等于fs/N,其中fs为采样频率,N为数据总点数。因此,为使电子战接收机达到较高的频率分辨率,要求FFT处理器能够处理超长的输入序列,如1M点数的FFT。
在取得雷达信号的基本参数后,进行FFT变换的序列长度应该和雷达信号的脉冲宽度相匹配。因为如果采集的数据长度比输入脉冲宽度大得多,那么额外的数据就只包括噪声。所以为了能够处理具有不同参数的雷达信号,要求FFT处理器能够处理不同长度的序列,即FFT的点数是可变的。
另外,对以电子侦察为背景的应用中,对于运算速度有严格要求,要求FFT处理器能够实时地对输入数据进行处理。
综上所述,在电子战领域需要FFT处理器能够实时地处理超长可变点数序列,同样在现代通信领域也有此要求。
超长可变点FFT的实现一直是人们致力解决的问题。数字信号处理(DSP)芯片具有乘加单元,特别适合于完成FFT运算,并且使用软件编程,具有较大的灵活性。但是也有其不足之处:单个DSP芯片的计算能力有限,不适合于实现超长点数的FFT;可以采用多个DSP芯片并行计算,但这种方案增加了设计的复杂性,功耗大;数据倒序处理也花费处理器的大量时间;由于DSP芯片具有有限的带宽,数据的输入输出可能成为其高速运行的瓶颈。与DSP芯片不同,专用集成电路(ASIC)或现场可编程门阵列(FPGA)实现FFT算法可以针对具体的应用环境选择使用与特定的问题相适应的结构,以利于资源优化。
然而,在ASIC或FPGA上实现输入序列长度超长或可变的实时FFT还面临着芯片资源有限、计算精度等问题。
对于大点数的FFT处理器,一般使用递归或级联等传统结构。在文献“A modular pipelined implementation of large fast Fourier transforms”(El-Khashab,A.M.;Swartzlander,E.E.,Jr.;Signals,Systems and Computers,2002.Conference Record of the Thirty-Sixth Asilomar Conferenceon,2002,vol.2:995-999)提出了一种改进的流水线型结构,通过存储器和加权(乘以旋转因子)单元连接两个小点数的FFT单元,在计算大点数FFT时可以减小***对延时存储单元和旋转因子存储器的需求,但其可计算的FFT的长度是固定的。在文献“A pipeline processor for mixed-size FFTs”(Sayegh,S.I.;Signal Processing,IEEE Trans on,1992,Vol.40(8):1892-1900.)提出一种流水线型结构,可以同时计算不同点数的FFT,其缺点是点数较大时,电路规模过于庞大。在文献“可变2n点流水线FFT处理器的设计与实现”(高振斌,陈禾.北京理工大学学报,2005年03期)提及了一种可以连续计算2n点复数序列FFT的流水线结构处理器,但其因采用传统级联方法实现流水线FFT处理,占用存储资源高,难以于单芯片中实现。在文献“A pipelined memory-efficient architecture for ultra-long variable-size FFTprocessors”(Chen He;Wu Qiang;2008 International Conference on ComputerScience and Information Technology,2008,p357-61)提及了一种可以连续计算4n点复数序列FFT的流水线结构处理器,但其不能进行任意2n点复数序列FFT的流水线处理。
发明内容
本发明的目的是为了克服已有技术的缺陷,解决如下问题:可实时处理最大1M点的FFT、在保证处理数据精度的前提下达到***要求的处理速度、可在单芯片ASIC或FPGA上实现,提出一种可变点数FFT运算处理器。
本发明所基于的工作原理如下:
基-2快速傅里叶变换
设N=2p(p>1),将输入序列xn分为下标为偶数和奇数序列:x2n,x2n+1,于是N点DFT就成为:
(公式1)
这种方法称为时间抽取法,按照上述方法可以继续将序列分割成小序列,直到每个序列只有两个成员。
在应用中,基-2快速傅里叶变换递推算法可以更为直观地体现出数据寻址和旋转因子寻址的规律,设被处理的数据长度为2p,递推算法为:
(公式2)
其中:
s为蝶型运算所处的级数,s=0,1,2,3,……,p-1;
n=b22s+1+b1;
b1=0,1,……,2s-1;
b2=0,1,……,2p-s-1-1;
对于旋转因子其含义为再做如下变换:
(公式3)
一般的数据地址变换器以及旋转因子地址变换全部是由这个递推公式演变出来的。
二维快速傅里叶变换
对于超长可变点实时FFT处理,如果直接采用级联方式,用“乒乓”存储器构成流水线结构,则每级均需要大量存储器,***规模过于庞大。可以把一维傅里叶变换转换为二维变换进行,既提高了***并行程度,又减少了***对存储器容量的需求。
假设N是一复合数,N=M×L,则可将n和k分别用下面的公式表示:
n=Mn1+n0其中n1=0,1,...,L-1;n0=0,1,...,M-1;
k=Lk1+k0其中k1=0,1,...,M-1;k0=0,1,...,L-1;
则有:
(公式4)
根据此式,可以得到将一维大点数FFT转换为二维小点数子FFT处理的方法:对于N=M×L点FFT,将数据排为L行M列,先对序列进行M次列变换(L点FFT),结果乘以旋转因子
后,再进行L次行变换(M点FFT)即可。
基于上述工作原理,本发明所采用的技术方案是:
一种可变点数流水线FFT处理器,由下述模块组成:第一1024点可变FFT处理模块、旋转因子处理模块、第二1024点可变FFT处理模块、选择与控制模块。
(1)第一、第二1024点可变FFT处理模块
用于实现大点数FFT的二维小点数处理,可实时地进行1024可变点的FFT处理。
两个模块的结构组成相同,每一个1024点可变FFT处理模块均包括:第一32点可变FFT处理子模块、第二32点可变FFT处理子模块、旋转因子处理子模块、中间数据存储子模块、选择与控制子模块。
其中,32点可变FFT处理子模块中每级基-2运算单元加入输出选择电路,通过控制可实现可变点FFT计算,且32点FFT处理采用块浮点定标方式,获得较高处理精度。
第一、第二32点可变FFT处理子模块均用于进行2点、4点、8点、16点或32点可变实时FFT处理。
旋转因子处理子模块用于完成二维FFT处理的中间旋转因子的产生,并将中间旋转因子同第一32点可变FFT处理子模块的处理结果相乘。
中间数据存储子模块用于存储第一32点可变FFT处理子模块的处理结果,并将其作为第二32点可变FFT处理子模块的输入。可通过两个1024点数据存储器进行“乒乓”存储来实现。
选择与控制子模块用于产生第一和第二32点可变FFT处理子模块、旋转因子处理子模块、中间数据存储子模块的选择与控制信号。
连接关系为:第一32点可变FFT处理子模块、旋转因子处理子模块、中间数据存储子模块、第二32点可变FFT处理子模块依次相连,选择与控制子模块与上述各个模块分别相连。
(2)旋转因子处理模块
完成二维FFT处理的中间旋转因子的产生,并将中间旋转因子同第一1024点可变FFT处理子模块的处理结果相乘,以便进行二维运算。
(3)选择与控制模块
用于产生各种控制信号,对各个模块进行控制与协调,保证整个芯片能够正常工作。
上述组成模块间的连接关系如下:
第一1024点可变FFT处理模块中的第二32点可变FFT处理子模块和旋转因子处理模块相连,旋转因子处理模块另一端与FFT处理器外部的中间数据存储模块相连,处理器外部的中间数据存储模块的另一端与第二1024点可变FFT处理模块中的第一32点可变FFT处理子模块相连,选择与控制模块分别与第一1024点可变FFT处理模块中的选择与控制子模块、旋转因子处理模块、FFT处理器外部的中间数据存储模块、第二1024点可变FFT处理模块中的选择与控制子模块相连。
上述模块之间的信号转换关系为:
N点输入序列进入处理器的第一1024点可变FFT处理模块进行小点数FFT运算。
其中,在第一1024点可变FFT处理模块内部,先在第一32点可变FFT处理子模块内进行2n(n≤5)点FFT运算,处理结果送入旋转因子处理子模块中与旋转因子相乘,以便进行二维运算处理。相乘后的结果送到中间数据存储子模块进行存储。当所有的点数据全部处理完毕之后,送入第二32点可变FFT处理子模块中再次进行2n(n≤5)点FFT运算。
若N小于等于1024时,处理过程到此结束,第一1024点可变FFT处理模块的处理结未直接输出。若N大于1024时,则将第一1024点可变FFT处理模块的处理结果送入旋转因子处理模块中,与此处的旋转因子相乘。相乘结果送到处理器外部的中间数据存储模块中进行存储。当N点数据的相乘结果全部到达后,将全部数据送入第二1024点可变FFT处理模块,数据在第二1024点可变FFT处理模块中进行2n(n≤5)点FFT运算。运算方法与第一32点可变FFT处理子模块内的方法相同。运算结束之后,将第二1024点可变FFT处理模块结果输出。
有益效果
本发明提出的一种可变点数流水线FFT处理器,对比已有技术:
(1)可实时流水处理输入序列数据,并实时更新输出数据;
(2)处理器存储资源大大降低,芯片面积减少,可在单片FPGA或ASIC中实现。由于存储资源的减少,对存储器的操作减少,因此本发明的运算时间加快;
(3)可实时实现N点(N=2p,1≤p≤20)可变FFT处理;
(4)采用块浮点定标方式,使得FFT处理器运算结果的精度较高。
附图说明
图1 可变点FFT处理器结构框图;
图2 1024点可变FFT处理器结构框图;
图3 32点可变基-2流水线结构;
图4 CORDIC算法实现旋转因子处理。
具体实施方式
下面结合附图对本发明的优选实施方式做详细说明。
一种可变点数流水线FFT处理器,包括以下部分:第一和第二1024点可变FFT处理模块、旋转因子处理模块、选择与控制模块,如图1所示。处理器可在单芯片ASIC或FPGA内完成处理器外的中间数据存储模块为两个1M点数据存储器,数据存储器的工作模式为“乒乓”存储,有利于数据的实时处理。
(1)第一、第二1024点可变FFT处理模块
为了降低存储资源,第一、第二1024点可变FFT处理模块均采用二维处理方式。每个1024点可变FFT处理模块均由5个子模块组成:第一32点可变FFT处理子模块、第二32点可变FFT处理子模块、旋转因子处理子模块、中间数据存储子模块、选择与控制子模块,如图2所示。
其中,第一32点可变FFT处理子模块、旋转因子处理子模块、中间数据存储子模块、第二32点可变FFT处理子模块依次相连。第一、第二32点可变FFT处理子模块分别采用级联流水线结构,如图3所示。其它子模块均采用“乒乓”存储结构,以利于数据的实时操作。
第一、第二32点可变FFT处理子模块均用于进行2点、4点、8点、16点或32点的实时FFT处理。当进行点数可变FFT运算时,选择与控制子模块首先根据该模块所分配的点数来激活相应的处理单元。当进行2点、4点、8点、16点或32点FFT运算时,只需激活第一32点可变FFT处理子模块。如果点数超过32,则再激活其他子模块。
为采用基-2FFT算法,32点FFT的处理过程分为五级运算单元,每级基-2运算单元均增加输出选择控制电路,根据电路输入点数的不同,由选择与控制子模块来控制数据由五级中的哪一级输出,从而达到点数可变的目的。在数据输出之前,对输出数据进行块浮点定标处理,防止数据溢出,具体方法是:在每级运算中,将输入数据扩充3位符号位,然后进行蝶形运算。之后,对运算结果有效最高位的前4位进行检查,判断其是否存在溢出。根据溢出情况,确定下一级蝶形运算输入所需的右移位数,以保证在下一级蝶形运算中不发生溢出。所需右移的位数被累计下来,以确定最后结果的比例因子或幂指数。该比例因子或幂指数将用于数据的恢复。
例如:
对于1024点的FFT运算,1024点数输入数据首先按照N=M×L=32×32进行分解。然后使用第一32点可变FFT处理子模块进行32次的32点FFT运算。运算出的1024个结果在旋转因子处理子模块中分别与1024个中间旋转因子相乘,并将这1024个结果存储在中间数据存储子模块中。使用第二32点可变FFT处理子模块对存储数据再进行32次的32点FFT运算,最后将运算结果输出。
(2)旋转因子处理模块
结构如图4所示,包括:二进制计数器、循环移位寄存器和CORDIC处理器。
二进制计数器用于输入数据行序号和列序号的产生与计数。
循环移位寄存器用于确定旋转因子的旋转角度。二进制计数器和循环移位寄存器联合用于旋转因子的生成。
CORDIC处理器用于完成基于CORDIC算法的数据加、减法和移位,由此完成旋转因子与第一1024点可变FFT处理模块的处理结果相乘。
连接关系为:二进制计数器、循环移位寄存器和CORDIC处理器依次连接。
旋转因子处理模块传统的实现方法是包括一个存放旋转因子的存储器和一个复数乘法器,在进行不同点数FFT运算时,旋转因子存储器需要存储最大点数时的值,其它值可以根据不同的情况进行抽取。传统的中间旋转因子处理实现方法占用较多芯片资源,不适合ASIC实现。在本发明中,采用CORDIC算法进行中间旋转因子的处理,CORDIC运用于计算三角函数、双曲函数及其它一些基本函数的运算,采用迭代的思想,不需乘法运算和额外的存储空间,同时该算法可以达到较高的精度。
CORDIC算法的基本原理是初始向量旋转角度θ后得到所求向量。运算统一迭代公式为:
(公式5)
式(5)中,xi为平面直角坐标系中某点的横坐标值;yi为平面直角坐标系中某点的纵坐标值;zi为旋转模式;si为向量的旋转方向;θi为旋转角度。i=0,1,...,n-1,n是总旋转的级数,Si决定旋转的方向:
(公式6)
这样,运算就只有加法、减法和移位。n次迭代后,得到如下结果:
(公式7)
公式7中,xn代表n次迭代后横坐标值;x0代表迭代前横坐标初始值;yn代表n次迭代后纵坐标值;y0代表迭代前纵坐标初始值;z0代表初始旋转角度。
CORDIC算法的思想就是把旋转一个任意角度θ,分成若干步骤,每步旋转一个θi,同时把θ减掉一个θi,然后判断θ的符号,根据θ的正负来决定下一步旋转角θi的正负。依次循环,直到θ趋于零,即该向量已旋转了θ角。
在本处理器中,需要进行FFT处理模块的处理结果与旋转因子
相乘的操作,其中
这个乘法操作可以看成是把一个向量(复数数据)旋转了θ=-2πi/N度。因此CORDIC算法的思想和FFT中序列与旋转因子
相乘的要求相符合,根据公式(5)和公式(6),即可完成中间旋转因子的产生与相乘。
通常的CORDIC算法需要存储器来存储公式(5)中的Si,在循环一位相加的操作中需要一些相应的控制逻辑,对于FFT的乘以旋转因子运算,可以避免使用存储器。因为如果旋转因子的指数i已知,CORDIC处理器的旋转角度就确定了。在两级运算之间的旋转因子的指数等于行的序号乘以列的序号。旋转因子生成器可以很容易的使用二进制计数器和循环移位寄存器来实现,如图5所示。此种方法不仅减小了存储器容量,而且像地址译码器等相应的一些硬件比常规方法也有所减少。
(3)选择与控制模块
本模块根据***要求,产生各种控制、选择、地址等信号,控制处理器中各个模块协调工作。
第一1024点可变FFT处理模块中的第二32点可变FFT处理子模块和旋转因子处理模块中CORDIC处理器的相连,CORDIC处理器的另一端与FFT处理器外部的中间数据存储模块相连,处理器外部的中间数据存储模块的另一端与第二1024点可变FFT处理模块中的第一32点可变FFT处理子模块相连,选择与控制模块分别与第一1024点可变FFT处理模块中的选择与控制子模块、旋转因子处理模块中的循环移位寄存器、FFT处理器外部的中间数据存储模块、第二1024点可变FFT处理模块中的选择与控制子模块相连。
上述模块间的信号转换关系如下:
N点输入序列进入处理器的第一1024点可变FFT处理模块进行小点数FFT运算。
其中,在第一1024点可变FFT处理模块内部,先在第一32点可变FFT处理子模块内进行2n(n≤5)点FFT运算,处理结果送入旋转因子处理子模块中与旋转因子相乘,以便进行二维运算处理。相乘后的结果送到中间数据存储子模块进行存储。当所有的点数据全部处理完毕之后,送入第二32点可变FFT处理子模块中再次进行2n(n≤5)点FFT运算。
若N小于等于1024时,处理过程到此结束,第一1024点可变FFT处理模块的处理结果直接输出。若N大于1024时,则将第一1024点可变FFT处理模块的处理结果送入旋转因子处理模块的CORDIC处理器中,与循环移位寄存器传送过来的旋转因子相乘。相乘结果送到处理器外部的中间数据存储模块中进行存储。当N点数据的相乘结果全部到达后,将全部数据送入第二1024点可变FFT处理模块,数据在第二1024点可变FFT处理模块中进行2n(n≤5)点FFT运算。运算方法与第一32点可变FFT处理子模块内的方法相同。运算结束之后,将第二1024点可变FFT处理模块结果输出。
实施例
当实现超长点数的FFT时,根据选择与控制模块将激活相应的模块来实现,例如实现512K点的FFT时,根据N=M×L=1024×512进行分解,在第一1024点可变FFT处理模块中完成512次1024点FFT处理,经过旋转因子处理模块完成旋转因子产生与复乘,之后数据送入处理器外部中间数据存储模块进行缓存,之后在第二1024点可变FFT处理模块中完成1024次512点FFT处理,形成输出序列。以在第二1024点可变FFT处理模块中完成512点FFT处理为例,首先根据N=M×L=32×16进行分解,数据首先在第一32点可变FFT处理子模块中完成16次32点FFT处理,结果经过旋转因子处理子模块完成旋转因子产生与复乘,之后数据送入中间数据存储子模块进行缓存,之后在第二32点可变FFT处理子模块中完成32次16点FFT处理,结果输出。
各功能模块采用硬件描述语言编写、仿真、调试后下载到FPGA器件内,即可实现FFT芯片。代码也可转至ASIC设计流程,用单片ASIC实现本FFT处理。