基于AlteraMegaCore实现FFT的方法来源:互联网0引言FFT(快速傅里叶变换)是计算离散傅里叶变换(DFT)的高效算法,它把计算N点DFT的乘法运算量从N2次下降到N/2log2N次。FFT的出现对数字信号处理的发展起着至关重要的作用,它可应用于傅里叶变换所能涉及的任何领域,为广泛应用数学方法处理数字信号开辟了新局面[1]。传统的FFT实现方法是通过软件(软件编程)和硬件(专用芯片ASIC)这两种方法来实现,而近年来,FPGA发展十分迅速,这给FFT设计提供了一个新思路[2]。为了更好地满足设计人员的需要,各大公司相继推出了IP模块,本文提出了一种采用Altera公司的IPCoreFFTMegaCore来实现FFT的简单方法。1FFTMegaCore核的性能Altera公司的FFTMegaCore是一个高性能、高参数化的快速傅里叶变换处理器,可以高效的完成FFT和IFFT运算,支持的器件系列包括StratixⅡ、StratixGX、StratixⅡGX、Stratix、Cyclone、CycloneⅡ以及CycloneⅢ等,采用基2/4频域抽取(DIF)FFT算法,运算长度从64到16384,使用嵌入式内存,系统最大时钟频率大于300MHz。FFT处理器可以设置两种不同的引擎结构:四输出和单输出,结构图如图1和图2所示[3]。为了增加FFT兆核函数的总吞吐量,也可以在一个FFT兆核函数变量中使用多个并行引擎。复取样数据X[k,m]从内部存储器并行读出并由变换开关(SW)重新排序,排序后的取样数据由基4处理器处理并得到复数输出G[k,m],由于基4按频率抽选(DIF)分解方法固有的数字特点,在蝶形处理器[4]输出上仅需要3个复数乘法器完成3次乘旋转因子(有一个因子为1,不需要乘)计算。这种实现结构在一个单时钟周期内计算所有四个基4蝶形复数输出。同时,为了辨别取样数据的最大动态范围,四个输出由块浮点单元(BFPU)并行估计,丢弃适当的最低位(LSB),在写入内部存储器之前对复数值进行四舍五入并行重新排序。若要求转换时间尽量小,四输出是最佳选择;若要求资源尽量少,单输出比较合适。FFT处理器支持3种I/O数据流结构:连续型、缓冲突发型、突发型。连续型允许在处理过程中连续输入数据;缓冲突发型与连续型相比,占用内存资源较小,但这是以减少平均吞吐量为代价的;突发型与缓冲突发型类似,但占用内存资源更少,也是以减少平均吞吐量为代价的。图1FFT处理器四输出引擎结构图2FFT处理器单输出引擎结构2整体方案整体方案设计框图如图3所示。输入缓冲器和输出缓冲器分别存储预处理数据和FFT变换结果,FFT运算器负责FFT运算;控制器为输入缓冲器和输出缓冲器提供读写地址和控制运算时序及缓冲器的读写操作。下面重点介绍FFT运算器的实现。图3整体方案设计框图3FFT运算器的实现FFT运算器采用FFTMegaCore实现,用QuartusⅡ仿真软件设计时产生的FFTMegaCore模块图如图4所示[5]。这里采用器件为Altera公司的Stratix系列,变化域长度设置为64,数据量精度为24bit,旋转因子量化精度为24bit。引擎结构可以选四输出,I/O数据流结构选连续型[3]。在工程中,设计者也可以根据实际情况选择其他的参数设置。图4FFTMegaCore模块在FPGA硬件设计中,一个乘法器占用的资源要远大于一个加法器占用的资源,而该模块主要是完成复数乘法运算,我们则可以通过数学变换减少乘法器的数量。例如两个复数a+jb和c+jd的乘积结果e+jf,其中e=ac-bd,f=ad+bc,变换得e=(a+b)c-b(c+d),f=(a+b)c-a(c-d),可以看出实际上是增加三个加法器来减少一个乘法器。FFTMegaCore端口定义如下。clk:输入,FFT系统时钟信号;reset:输入,FFT高有效同步复位信号,低时FFT工作;master_sink_dav:输入,指示主接收器数据有效信号;master_sink_sop:输入,输入数据包起始位置指示信号;inv_i:输入,转换方向控制信号,低有效时做FFT,高有效时做IFFT;data_real_in[23..0]:输入,输入实部数据;data_imag_in[23..0]:输入,输入虚部数据;master_source_dav:输入,指示FFT模块收到的数据是否有效;master_sink_ena:输出,指示数据是否写入输入缓存中;fft_real_out[23..0]:输出,输出实部数据;fft_imag_out[23..0]:输出,输出虚部数据;master_source_ena:输出,指示输出数据是否有效;master_source_sop:输出,输出数据包起始位置指示信号;master_source_eop:输出,输出数据包结束位置指示信号;exponent_out[5..0]:输出,每一个数据输出时的一个比例因子,用来保持数据精度和内部最大信噪比。工作流程:系统复位后,数据源将master_sink_dav置位,表示有数据等待输入;作为回应FFTCore将master_sink_ena置位,表示可以接收数据;数据源加在第一个复数数据,同时master_sink_sop置位,表示输入数据包起始位置;下一个时钟,master_sink_sop被清零,输入数据按顺序加入,输入数据达到设置值时,系统启动FFT运算。通过inv_i信号的置位和清零可以改变单个数据包的FFT转换方向,inv_i必须与master_sink_sop严格同步。当FFT转换结束时master_source_ena置位,输出运算结果;在输出过程中master_source_sop和master_source_eop信号被置位,表示输出数据包的起始位置和结束位置;exponent_out为比例因子,是IPCore通过每一次参数的设定自动计算出来的,对于每个数据包来讲,它产生的exponent_out的值是不同的。4结论本文介绍了一种采用Altera公司的FFTMegaCore实现快速傅里叶变换的方法,该方法非常简单,能进一层次简化开发的流程,缩短工程开发周期,节约成本,因此在实际工程中是一种很好的应用。