用FPGA实现FFT算法

发布者:数据梦行者最新更新时间:2012-01-17 来源: eeworld关键字:FPGA  FFT 手机看文章 扫描二维码
随时随地手机看文章
   

引言
  DFT(Discrete Fourier Transformation)是数字信号分析与处理如图形、语音及图像等领域的重要变换工具,直接计算DFT的计算量与变换区间长度N的平方成正比。当N较大时,因计算量太大,直接用DFT算法进行谱分析和信号的实时处理是不切实际的。快速傅立叶变换(Fast Fourier Transformation,简称FFT)使DFT运算效率提高1~2个数量级。其原因是当N较大时,对DFT进行了基4和基2分解运算。FFT算法除了必需的数据存储器ram和旋转因子rom外,仍需较复杂的运算和控制电路单元,即使现在,实现长点数的FFT仍然是很困难。本文提出的FFT实现算法是基于FPGA之上的,算法完成对一个序列的FFT计算,完全由脉冲触发,外部只输入一脉冲头和输入数据,便可以得到该脉冲头作为起始标志的N点FFT输出结果。由于使用了双ram,该算法是流型(Pipelined)的,可以连续计算N点复数输入FFT,即输入可以是分段N点连续复数数据流。采用DIF(Decimation In Frequency)-FFT和DIT(Decimation In Time)-FFT对于算法本身来说是无关紧要的,因为两种情况下只是存储器的读写地址有所变动而已,不影响算法的结构和流程,也不会对算法复杂度有何影响。算法实现的可以是基2/4混合基FFT,也可以是纯基4FFT和纯基2FFT运算。

傅立叶变换和逆变换
    对于变换长度为N的序列x(n)其傅立叶变换可以表示如下:
           

N
nk
X(k)=DFT[x(n)]= Σ x(n)W
n=0

                         式(1)
   其中,W=exp(-2π/N)。
当点数N较大时,必须对式(1)进行基4/基2分解,以短点数实现长点数的变换。而IDFT的实现在DFT的基础上就显得较为简单了:
             式(2)

    由式(2)可以看出,在FFT运算模块的基础上,只需将输入序列进行取共轭后再进行FFT运算,输出结果再取一次共轭便实现了对输入序列的IDFT运算,因子1/N对于不同的数据表示格式具体实现时的处理方式是不一样的。IDFT在FFT的基础上输入和输出均有一次共轭操作,但它们共用一个内核,仍然是十分方便的。


基4和基2
基4和基2运算流图及信号之间的运算关系如图1所示:

     
   (a)基4蝶形算法       

          (b)基2蝶形算法
以基4为例,令A=r0+j×i0;B=r1+j×i1;C=r2+j×i2;D=r3+j×i3;Wk0=c0+j×s0:Wk1=c1+j×s1;Wk2=c2+j×s2;Wk3=c3+j×s3。分别代入图1中的基4运算的四个等式中有:
A'=[r0+(r1×c1-i1×s1)+(r2×c2-i2×s2)+(r3×c3-i3×s3)]+j[i0+(i1×c1+r1×s1)+(i2×c2+r2×s2)+(i3×c3+r3×s3)] 式(3)
B'=[r0+(i1×c1+r1×s1)-(r2×c2-i2×s2)-(i3×c3+r3×s3)]+j[i0-(r1×c1-i1×s1)-(i2×c2+r2×s2)+(r3×c3-i3×s3)] 式(4)
C'=[r0-(r1×c1-i1×s1)+(r2×c2-i2×s2)-(r3×c3-i3×s3)]+j[i0-(i1×c1+r1×s1)+(i2×c2+r2×s2)-(i3×c3+r3×s3)] 式(5)
D'=[r0-(i1×c1+r1×s1)-(r2×c2-i2×s2)+(i3×c3+r3×s3)]+j[i0+(r1×c1-i1×s1)-(i2×c2+r2×s2)-(r3×c3-i3×s3)] 式(6)
  可以看出,式(3)至式(6)有多个公共项和类似项,这一点得到充分利用之后可以大大缩减基4和基2运算模块中的乘法器的个数,如上面A'至D'的四个等式中的这三对类似项:(r1×c1-i1×s1)与(i1×c1+r1×s1)、(r2×c2-i2×s2)与(i2×c2+r2×s2)、(r3×c3-i3×s3)与(i3×c3+r3×s3)以高于输入数据率的时钟进行时分复用,最终可以做到只需要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点旋转因子表。控制模块产生所有的控制信号,存储器1和2的读写地址、写使能、运算模块的启动信号及因子表的读地址等信号。当然对于运算模块为基16/8复用模块时,控制模块就需要产生模式选择信号,如对于运算模块是基4/2模块时,该信号就决定了内部运算模块是进行基4运算还是基2运算。存储器1作为当前输入标志对应输入N点数据的缓冲器,存储器2作为中间结果存储器,用于存储运算模块计算出的各Pass的结果。在图中的各种地址、使能和数据的紧密配合下,经过一定延时后输出计算结果及其对应指示标志。图2只是一定点或浮点的FFT实现模块,如果是块浮点运算,则必须加入一个数据因子控制器,控制每遍运算过程中的数据大小,并根据各个Pass的乘性因子之和的大小,对最终输出进行大小控制,以保证每段FFT运算输出增益一致。

  外部输入为N点数据段流和启动信号(N点之间如无间隔,则每N数据点输入一脉冲信号),一方面,外部数据存入存储器1中,同时通过控制模块的控制,读出存储器1中的前段N点数据和Rom表中的因子及相关控制信号送入运算核心模块进行各个Pass的运算,每个Pass的输出都存入存储器2中,最后一个Pass的计算结果存入存储器2中,并在下一个启动头到来后,输出计算结果。对图2的实现,除去运算模块,关键是各个Pass数据因子读写地址及控制信号的配合。

速度、资源和精度

  假定输入数据的速率为fin,则每数据的持续时间T=1/fin,运算模块的计算时钟频率为fa,对于N(N=2p,p即为Pass数目)点FFT计算时延与Pass数目直接相关。如果使用基2运算不考虑控制开销,纯粹的计算时延为td=p×N×T×fin/fa。显然在fa>p× fin时,在N点内可完成FFT运算。否则不能完成,即不能实现流型的变换。这在N很大且输入数据速率较高时以FPGA实现几乎是不可能的,而且内部计算时钟过高容易导致电路的工作不稳定。设基2时的最小可流型工作运算频率为fa0,则使用基4实现流型的变换,计算时钟fa= fa0就可以。而使用基8时计算时钟fa= fa0便可完成,基16时为fa0的1/4。上面所讨论的是纯基运算,当N不为4的幂次方时(如N=2048=16×16×8,运算模块为基16/8复用模块),而又希望使用较低倍的时钟完成运算时,图2中的运算模块必然包括基4/2复用模块(即基16/8复用模块),这也就是前面提到复用模块的主要用意。由上面的分析可以得出结论,如果计算使用的基越大,完成速度越快。

  但是,使用基16/8模块所使用的逻辑资源要比基4/2模块多将近一倍,这是因为基16/8复用模块是以基4模块和基4/2复用模块构建而成。当然,可以直接实现基16/8复用模块,但用FPGA很难解决复杂度和成本问题。另外,如果流型运算间隔比N点数据长度长一倍以上,可以考虑在较低的计算时钟下使用基2运算模块实现流型FFT。

  运算结果的精度直接与计算过程中数据和因子位数(浮点算法)相关,如果中间计算的位数、存储数据位数和Rom表中的位数越大,输出精度就越大。当然,位数增大后逻辑运算资源和存储资源都会直线上升。



浮点、块浮点和定点FFT
  根据运算过程中对数据位数取位和表示形式的不同,可以将FFT分为浮点FFT、块浮点FFT和定点FFT。它们在实现时对于系统资源的要求是不同的,而且有着不同的适用范围。

  浮点FFT是基于数据表示为浮点的基础之上的,即数据是由一纯小数和一因子组成,输入要转成纯小数和因子的浮点表示形式,所有计算过程中保存应得计算结果大小,而输出要变成所需大小的定点表示形式。只要因子位数足够大,浮点FFT计算是不会溢出的。而定点则是所有计算过程中都是定点运算,如果各个Pass的截位规则不适当,很容易出现溢出,必须要有溢出控制。块浮点是介于它们之间的一种运算机制,它是根据本Pass的输入数据的大小,在计算之前进行控制(数据上移一比特或下移一比特或乘以一特定因子),可以保证不溢出,但一般也需要溢出控制。

  浮点运算没有溢出,信号平均信噪比高,但由于因子的运算必然导致电路复杂,实现困难。定点运算实现简单,难以保证不溢出,需要统计得出合适的截位规则,否则溢出严重导致输出结果错误。块浮点由于每个Pass(包括最后输出前)结束后有一统计控制过程,延时较大,但是可以保证不溢出而且电路又相对浮点来说简单得多。

  应根据具体应用的具体要求,选择合适的FFT。如果要求精度,并且要解决频域很高的单频干扰,就必须使用浮点的FFT,使用数据位数很大的定点和块浮点也能解决这个问题,但位数的确定十分困难。如果不要求高精度,逻辑资源和Rom比较紧张,可考虑定点运算。如果输入在频域集中于几个点上或者对精度要求一般,可以慢速处理,可以采用块浮点运算,就能够保证这几点的信噪比,而忽略其他点处的信噪比。

关键字:FPGA  FFT 引用地址:用FPGA实现FFT算法

上一篇:DSP复位电源监控,看门狗电路
下一篇:DSP入门知识

推荐阅读最新更新时间:2024-05-02 21:51

微软发明的GPU和FPGA之间数据传输方案
2018年5月,在Bulid大会上,微软宣布 Project Brainwave 开放预览,这是一种用于深度神经网络处理的架构,可以用于Azure与边缘环境,并且可以让Azure成为实时运行人工智能最快的云平台。 为什么微软要基于FPGA来进行人工智能芯片设计呢?这是因为当时微软的搜索引擎都是依靠CPU驱动,尽管英特尔等公司不断改进CPU,但是这些芯片还是不能满足微软的需求。而此时恰好FPGA能弥补这个不足。 图形处理单元(GPU)已经被用于图形应用许多年,近年来也被应用于其他例如图形处理、搜索以及其他一般的应用。虽然FPGA和GPU均可以被视为专用处理器,但是在某些场合,如果FPGA与GPU之间可以进行通信以及任务的共享、转交,
[手机便携]
微软发明的GPU和<font color='red'>FPGA</font>之间数据传输方案
Loto实践干货(7)用示波器进行FFT频谱分析
为了当干货,本文不浪费篇幅阐述FFT的原理和算法,这些信息非常多,我们假定客户们已经知晓,有了一些基础。不过说实话,工程师并不一定需要懂原理和会算法,我们大概知道它的意思就行,毕竟会用才是最关键的。 我们先提炼出几个重要的问题点,一般的工程师们只要了解这几点就够用了。 问题1:我们可以用示波器看到某个信号的时域波形,为什么还要用FFT看这个信号的频域波形? 答案是,现实中很多信号的波形看起来长得很复杂,用数学描述它极其困难,甚至人直观的描述它都做不到,那就更谈不上分析它和处理它了。这时候,我们只能换一个思路和方法,在频域上拆解它,就更容易分析处理了。 举个例子: 上面这张图,左侧是时域波形,右侧是它的频域FFT波形
[测试测量]
Loto实践干货(7)用示波器进行<font color='red'>FFT</font>频谱分析
基于FPGA的实时可编程高精度信号源设计
  1 引言   信号源作为一种电子测量和计量设备,通常可产生大量的标准信号和用户定义信号。由于它具有高精度、高稳定性、可重复性和易操作性等特点,而被广泛用于自动控制系统、震动激励、通讯和仪器仪表领域。它不仅可以模拟各种复杂信号,还可对频率、幅值、相移、波形进行动态、及时的控制,并能与其它仪器进行通讯,组成自动测试系统。在各种实验应用和实验测试处理中,既可根据使用者的要求,作为激励源来仿真各种测试信号,并提供给被测电路,以满足测量或各种实际需要,也可作为一种测量仪器来完成一定的测试功能。然而,由于应用背景的不同和对测试、测量技术要求的提高,对信号源的频率精度、幅值精度、信号形式等要求也越来越高,因此开发高精度信号源具有重大的意义
[单片机]
基于<font color='red'>FPGA</font>的实时可编程高精度信号源设计
一种基于FPGA的栈空间管理器的研究和设计
  航空航天、工业控制、汽车电子和核电站建设等领域的高速发展,对嵌入式操作系统实时性的要求越来越高。同时,由于FPGA的集成度和速度的不断提高,使嵌入式操作系统硬件化实现成为发展趋势。硬实时操作系统中的堆栈管理对系统的实时性和可靠性起着至关重要的作用,而传统操作系统内核是将每个任务的堆栈空间直接进行最大化处理,导致大量存储空间浪费,另外采用通用RAM寻址方式也不能满足对被切换任务信息的快速保护。      基于上述问题,本文提出了一种堆栈空间结构,设计了一款具有自动检验功能的栈空间管理器,并在Xilinx公司的集成开发环境FPGA系统上实现。       1堆栈空间结构      堆栈空间是按先进后出(LIFO)原则分配的连续存储
[嵌入式]
一种基于<font color='red'>FPGA</font>的栈空间管理器的研究和设计
引领创新潮流 石墨存储器架构掀FPGA设计新风
  有芯片新兴公司创始人表示,石墨存储器架构有望给FPGA设计带来一股新风。   新兴公司NuPGA创始人ZviOr-Bach为EETimes年度创新奖得主。在之前他经手成立了eASIC和ChipExpress。Or-Bach已和莱斯大学(RiceUniversity)一同为由JamesTour教授研发的基于碳的存储器工艺制程申请专利。该方案采用石墨打造可重复编程存储器,区别于传统FPGA。   “采用导孔中的石墨作为熔丝是一个非常有意思的想法”,GartnerInc资深分析师DeanFreeman表示,“在接下来的五年里,我们将看到许多非常具有创新性和创造性的想法出现在我们的产品中。”   莱斯大学研究人员开发了一个将纳米
[嵌入式]
如何通过RTL分析、SDC约束和综合向导进行FPGA设计
大多数  FPGA  设计人员都充满热情地开展专业化问题解决和创造性工作,当然,他们工作压力也相当大,工作流程也非常单调乏味。幸运的是,EDA 公司和 FPGA 厂商不断开发新的工具和方法,推进繁琐任务的自动化,帮助设计团队集中精力做好创造性工作。下面我们就来看看 FPGA 工具流程的演进发展,了解一下现代  FPGA  团队是如何利用  RTL 分析、约束生成和综合导向来减少设计迭代的。 如果您已经是一名FPGA设计专业人士,那么将拥有辉煌的职业发展前景,因为越来越多传统上需要 ASIC 实现的设计现已改用 FPGA。随着新一代芯片工艺技术的推出,设计 ASIC的成本正呈几何级数增加。与此同时, FPGA  厂商则能利用最新工艺
[电源管理]
如何通过RTL分析、SDC约束和综合向导进行<font color='red'>FPGA</font>设计
用ARM和FPGA搭建神经网络处理器通信方案
  引言   人工神经网络在很多领域得到了很好的应用,尤其是具有分布存储、并行处理、自学习、自组织以及非线性映射等特点的网络应用更加广泛。嵌入式便携设备也越来越多地得到应用,多数是基于ARM内核及现场可编程门阵列FPGA的嵌入式应用。某人工神经网络的FPGA处理器能够对数据进行运算处理,为了实现集数据通信、操作控制和数据处理于一体的便携式神经网络处理器,需要设计一种基于嵌入式ARM内核及现场可编程门阵列FPGA的主从结构处理系统满足要求。   1人工神经网络处理器   1.1人工神经网络模型   人工神经网络是基于模仿大脑功能而建立的一种信息处理系统。它实际上是由大量的、很简单的处理单元(或称神经元),通过广泛的互相连接而形成
[单片机]
用ARM和<font color='red'>FPGA</font>搭建神经网络处理器通信方案
基于FPGA/CPLD和USB技术的无损图像采集卡
摘要:介绍了外置式USB无损图像采集卡的设计和实现方案,它用于特殊场合的图像处理及其相关领域。针对图像传输的特点,结合FPGA/CPLD和USB技术,给出了硬件实现框图,同时给出了FPGA/CPLD内部时序控制图和USB程序流程图,结合框图和部分程序源代码,具体讲述了课题中遇到的难点和相应的解决方案。 关键词:无损图像采集 图像处理 FPGA/CPLD USB SAA7111A 现场图像采集技术发展迅速,各种基于ISA、PCI等总线的图像采集卡已经相当成熟,结合课题设计了一款USB外置式图像采集卡。该图像采集卡已成功应用于一个图像处理和识别的项目中,由于图像信号不经过压缩处理,对后续处理没有任何影响,因此图像处理和识别的效果比
[半导体设计/制造]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved