用FPGA实现FFT算法

上传人:桔**** 文档编号:507437868 上传时间:2023-07-02 格式:DOCX 页数:5 大小:38.96KB
返回 下载 相关 举报
用FPGA实现FFT算法_第1页
第1页 / 共5页
用FPGA实现FFT算法_第2页
第2页 / 共5页
用FPGA实现FFT算法_第3页
第3页 / 共5页
用FPGA实现FFT算法_第4页
第4页 / 共5页
用FPGA实现FFT算法_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《用FPGA实现FFT算法》由会员分享,可在线阅读,更多相关《用FPGA实现FFT算法(5页珍藏版)》请在金锄头文库上搜索。

1、用FPGA实现FFT算法引言DFT(Discrete Fourier Transformation)是数字信号分析与处理如图形、语音及图像等领域 的重要变换工具,直接计算DFT的计算量与变换区间长度N的平方成正比。当N较大时,因计算 量太大,直接用DFT算法进行谱分析和信号的实时处理是不切实际的。快速傅立叶变换(Fast Fourier Transformation,简称FFT)使DFT运算效率提高12个数量级。其原因是当N较大时, 对DFT进行了基4和基2分解运算。FFT算法除了必需的数据存储器ram和旋转因子rom外,仍 需较复杂的运算和控制电路单元,即使现在,实现长点数的FFT仍然是很困

2、难。本文提出的FFT 实现算法是基于FPGA之上的,算法完成对一个序列的FFT计算,完全由脉冲触发,外部只输入 一脉冲头和输入数据,便可以得到该脉冲头作为起始标志的N点FFT输出结果。由于使用了双 ram,该算法是流型(Pipelined)的,可以连续计算N点复数输入FFT,即输入可以是分段N点连 续复数数据流。采用 DIF(Decimation In Frequency)-FFT 和 DIT(Decimation In Time)-FFT 对 于算法本身来说是无关紧要的,因为两种情况下只是存储器的读写地址有所变动而已,不影响算 法的结构和流程,也不会对算法复杂度有何影响。算法实现的可以是基2

3、/4混合基FFT,也可以 是纯基4FFT和纯基2FFT运算。傅立叶变换和逆变换对于变换长度为N的序列x(n)其傅立叶变换可以表示如下:NnkVX(k)=DFTx(n) = x(n)Wn=0式(1)其中,W=exp(-2n/N)。当点数N较大时,必须对式(1)进行基4/基2分解,以短点数实现长点 数的变换。而IDFT的实现在DFT的基础上就显得较为简单了:x(n)=IDFT(X(k)rj=召DFTpC(k)r式(2)由式(2)可以看出,在FFT运算模块的基础上,只需将输入序列进行取共轭后再进行FFT运算,输出结果再取一次共轭便实现了对输入序列的IDFT运算,因子1/N对于不同的数据表示格式具 体

4、实现时的处理方式是不一样的。IDFT在FFT的基础上输入和输出均有一次共轭操作,但它们 共用一个内核,仍然是十分方便的。基4和基2A AUHV iCWhDW3C1 4 i CW,: IV r A IW Ifw JW基4和基2运算流图及信号之间的运算关系如图1所示:A1 A+BWbC1 Ci UWR A BU:IT r l?U(b)基2蝶形算法(a)基4蝶形算法以基 4 为例,令 A=rO+jXiO; B=r1+jXi1; C=r2+jXi2; D=r3+jXi3; WkO=cO+jXsO: Wk1=c1+jXs1; Wk2=c2+jXs2;Wk3=c3+jXs3。分别代入图1中的基4运算的四个

5、等式中有:A=r0+(r1Xc1-i1Xs1) + (r2Xc2-i2Xs2) + (r3Xc3-i3Xs3)+ji0+(i1Xc1+r1Xs1) + (i2Xc 2+r2Xs2) + (i3Xc3+r3Xs3)式(3)B=r0+(i1Xc1+r1Xs1)-(r2Xc2-i2Xs2)-(i3Xc3+r3Xs3)+ji0-(r1Xc1-i1Xs1)-(i2Xc 2+r2Xs2) + (r3Xc3-i3Xs3)式(4)C=r0- (r1Xc1-i1Xs1) + (r2Xc2-i2Xs2)-(r3Xc3-i3Xs3)+ji0-(i1Xc1+r1Xs1) + (i2Xc 2+r2Xs2)-(i3Xc3

6、+r3Xs3)式(5)D=r0-(i1Xc1+r1Xs1)-(r2Xc2-i2Xs2) + (i3Xc3+r3Xs3)+ji0+(r1Xc1-i1Xs1)-(i2Xc 2+r2Xs2) (r3Xc3i3Xs3)式(6)可以看出,式(3)至式(6)有多个公共项和类似项,这一点得到充分利用之后可以大大缩减基 4和基2运算模块中的乘法器的个数,如上面A至D的四个等式中的这三对类似项: (r1Xc1-i1Xs 1)与(i1Xc1+r1Xs1)、(r2Xc2-i2Xs2)与(i2Xc2+r2Xs2)、(r3Xc3-i3Xs3) 与(i3Xc3+r3Xs3)以高于输入数据率的时钟进行时分复用,最终可以做到

7、只需要3个甚至1个 复数乘法器便可以实现。基2运算之所以采用图1-(b)中的形式进行基2运算,是为了将基本模 块做成基4/2复用模块,它对于N有着更大的适用性和可借鉴性。在基4、基2和基4/2模块的 基础上,构建基16、基8和基16/8模块有着非常大的意义。算法实现傅立叶变换实现时首先进行基2、基4分解,一般来说,如果算法使用基4实现,虽然使用 的资源多了一些,但速度上的好处足以弥补。如果资源充足,使用基16、基8或基16/8复用模 块,速度可以大大提高。一般FFT实现简单框图如图2所示。在图2中,运算模块即为基2/4/8/16模块或它们的复用模块,Rom表中存储的是N点旋转 因子表。控制模块

8、产生所有的控制信号,存储器1和2的读写地址、写使能、运算模块的启动信 号及因子表的读地址等信号。当然对于运算模块为基16/8复用模块时,控制模块就需要产生模 式选择信号,如对于运算模块是基4/2模块时,该信号就决定了内部运算模块是进行基4运算还 是基2运算。存储器1作为当前输入标志对应输入N点数据的缓冲器,存储器2作为中间结果存 储器,用于存储运算模块计算出的各Pass的结果。在图中的各种地址、使能和数据的紧密配合 下,经过一定延时后输出计算结果及其对应指示标志。图2只是一定点或浮点的FFT实现模块, 如果是块浮点运算,那么必须加入一个数据因子控制器,控制每遍运算过程中的数据大小,并根 据各个

9、Pass的乘性因子之和的大小,对最终输出进行大小控制,以保证每段FFT运算输出增益 致。外部输入为N点数据段流和启动信号(N点之间如无间隔,那么每N数据点输入一脉冲信号), 方面,外部数据存入存储器1中,同时通过控制模块的控制,读出存储器1中的前段N点数据 和Rom表中的因子及相关控制信号送入运算核心模块进行各个Pass的运算,每个Pass的输出都 存入存储器2中,最后一个Pass的计算结果存入存储器2中,并在下一个启动头到来后,输出 计算结果。对图2的实现,除去运算模块,关键是各个Pass数据因子读写地址及控制信号的配 合。速度、资源和精度假定输入数据的速率为fin,那么每数据的持续时间T=

10、1/fin,运算模块的计算时钟频率为 fa,对于N(N=2p, p即为Pass数目)点FFT计算时延与Pass数目直接相关。如果使用基2运算 不考虑控制开销,纯粹的计算时延为td=pxNxTxfin/fa。显然在fapxfin时,在N点内可 完成FFT运算。否那么不能完成,即不能实现流型的变换。这在N很大且输入数据速率较高时以 FPGA实现几乎是不可能的,而且内部计算时钟过高容易导致电路的工作不稳定。设基2时的最 小可流型工作运算频率为faO,那么使用基4实现流型的变换,计算时钟fa= fa0就可以。而使 用基8时计算时钟fa= fa0便可完成,基16时为faO的1/4。上面所讨论的是纯基运算

11、,当N 不为4的幂次方时(如 N=2048=16x 16x8,运算模块为基16/8复用模块),而又希望使用较低倍 的时钟完成运算时,图2中的运算模块必然包括基4/2复用模块(即基16/8复用模块),这也就 是前面提到复用模块的主要用意。由上面的分析可以得出结论,如果计算使用的基越大,完成速 度越快。 但是,使用基16/8模块所使用的逻辑资源要比基4/2模块多将近一倍,这是因为 基16/8复用模块是以基4模块和基4/2复用模块构建而成。当然,可以直接实现基16/8复用模 块,但用FPGA很难解决复杂度和成本问题。另外,如果流型运算间隔比N点数据长度长一倍以 上,可以考虑在较低的计算时钟下使用基2

12、运算模块实现流型FFT。运算结果的精度直接与计算过程中数据和因子位数(浮点算法)相关,如果中间计算的位数、 存储数据位数和 Rom 表中的位数越大,输出精度就越大。当然,位数增大后逻辑运算资源和存储 资源都会直线上升。浮点、块浮点和定点 FFT根据运算过程中对数据位数取位和表示形式的不同,可以将FFT分为浮点FFT、块浮点FFT 和定点FFT。它们在实现时对于系统资源的要求是不同的,而且有着不同的适用X围。浮点 FFT 是基于数据表示为浮点的基础之上的,即数据是由一纯小数和一因子组成,输入要 转成纯小数和因子的浮点表示形式,所有计算过程中保存应得计算结果大小,而输出要变成所需 大小的定点表示形

13、式。只要因子位数足够大,浮点FFT计算是不会溢出的。而定点那么是所有计 算过程中都是定点运算,如果各个Pass的截位规那么不适当,很容易出现溢出,必须要有溢出 控制。块浮点是介于它们之间的一种运算机制,它是根据本Pass的输入数据的大小,在计算之 前进行控制(数据上移一比特或下移一比特或乘以一特定因子),可以保证不溢出,但一般也需要 溢出控制。浮点运算没有溢出,信号平均信噪比高,但由于因子的运算必然导致电路复杂,实现困难。 定点运算实现简单,难以保证不溢出,需要统计得出合适的截位规那么,否那么溢出严重导致输 出结果错误。块浮点由于每个Pass(包括最后输出前)结束后有一统计控制过程,延时较大,但 是可以保证不溢出而且电路又相对浮点来说简单得多。 应根据具体应用的具体要求,选择 合适的FFT。如果要求精度,并且要解决频域很高的单频干扰,就必须使用浮点的FFT,使用数 据位数很大的定点和块浮点也能解决这个问题,但位数的确定十分困难。如果不要求高精度,逻 辑资源和Rom比较紧X,可考虑定点运算。如果输入在频域集中于几个点上或者对精度要求一般, 可以慢速处理,可以采用块浮点运算,就能够保证这几点的信噪比,而忽略其他点处的信噪比。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号