查看: 11855|回复: 6

基于FPGA IP核的FFT实现与改进

[复制链接]
  • TA的每日心情
    开心
    2013-12-17 13:39
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-2-17 09:42:52 | 显示全部楼层 |阅读模式
    分享到:
    摘要 利用FPGA IP核设计了一种快速、高效的傅里叶变换系统。针对非整数倍信号周期截断所导致的频谱泄露问题,提出了一种通过时输入信号加窗处理来抑制频谱泄露的方法。利用Modelsim和Matlab对设计方案进行了仿真,同时在Altera公司的CycloneⅡ硬件平台上进行了验证。验证结果表明,系统性能良好,改进效果明显。
    FFT是离散傅里叶变换(DFT)的一种快速算法,被广泛应用于频谱分析、音频编码、图像处理等数字信号处理领域。FFT运算复杂,需要大量的存储器和运算单元,其硬件实现平台多种多样。DSP需要外置存储器和特定接口,限制了运算速度。ASIC虽能满足速度要求,但其硬件电路复杂、可扩展性差、且价格昂贵。FPGA具有陕速并行运算、高集成度、低功耗等特点,且具有丰富的IP核资源,方便调用,适合FFT算法的实现。
    对于512点FFT处理器,如果该512个输入数据不是信号周期的整数倍,即非整数倍周期截断,则会出现频谱泄露现象。窗函数处理的宗旨是减小频谱泄露。常规的FFT硬件实现方法均不考虑由于非整数倍截断导致的频谱泄露问题。针对以上问题,本文设计了一种基于Altera IP核的512点FFT系统,同时通过对输入信号的加窗处理,抑制了非整数倍信号周期截断所产生的频谱泄露。
    1 原理概述
    1.1 FFT原理
    离散傅里叶变换(DFT)算法为
    1.jpg
    FFT为DFT的快速算法,其方法多种多样,基本可以分为按时间抽取法和按频率抽取法两类。此处介绍基-4频率抽取法。令N=4M,对式(1)N点的DFT可按如下方法作按频率出抽取
    2.jpg
    4个等式可定义为一个蝶形运算,蝶形运算可看作基-4FFT基本运算单元。参与蝶形运算的4个节点是有规律的,分别为(n)、(n+N/4)、(n+2N/4)和(n+3N/4)。接着再将X(4r)、X(4r+1)、X(4r+2)和X(4r+3)分别分解为4个长度为N/16的序列,基本结构是每一级的运算由N/4个蝶形运算构成,经过迭代log4N次后完成计算。FFT算法的本质是利用系数
    2-1.jpg
    的共轭对称性和周期性,将长序列DFT分解成短序列DFT,避免了大量的重复运算,从而提高运算效率。
    1.2 窗函数原理
    当对输入信号非整数倍周期截断,即512个输入数据不是输入信号周期的整数倍时,会出现频谱泄露现象。对输入信号进行加窗处理,可以有效地抑制频谱泄露。常用的窗函数有矩形窗(Rectangle Window)、汉宁窗(Hanning Window)、海明窗(Hamming Window)、布拉克曼窗(Blackman Window)等,不同的窗函数具有不同的特点,表现在主瓣旁瓣宽度,频率识别精度及幅度识别精度等方面。图1为Matlab仿真图,分别为原始信号,原始信号加窗(海明窗)结果,原始信号做512点FFT结果,原始信号加窗后再做512点FFT结果,这4幅图直观形象地描述了时域信号做FFT后的频域结果,以及原始信号是否加窗对FFT结果的影响。

    3.jpg
    2 FFT IP核
    FFT IP核是高速执行的,参数可配置的FFT处理器,可以实现复数形式的FFT变换和IFFT变换。想要正确地使用FFT IP核,首先需要了解其引擎结构、数据流结构和关键管脚信号。
    2.1 引擎结构
    FFI IP核有两种不同的引擎结构:四输出和单输出,结构如图2(a)和图2(b)所示。核心区别在于FFT蝶形处理器的吞吐量。一个时钟周期内,四输出结构可以计算出所有4个蝶形输出,单输出结构可以计算出一个蝶形输出。

    4.jpg
    2.2 数据流结构
    FFI IP核支持流、变量流、缓冲突发、突发4种数据流结构。流结构允许连续输入数据,同时输出连续的复数数据流。变量流产生一个与流结构类似的连续输出数据流。缓冲突发结构需要存储资源相对较少,但平均吞吐量也相应降低。突发结构的执行过程与缓冲突发结构类似,对于给定的参数设置,突发结构需要更少的存储资源。

    5.jpg
    其中,clk为时钟信号;reset_n为复位信号;inverse为FFT处理器变换模式选择信号,选择FFT或IFFF;sink_valid为输入数据有效信号;sink_sop为输入第一个数据标志信号;sink_eop为输入最后一个数据标志信号;sink_real为输入实部数据;sink_imag为输入虚部数据;sink_error为输入错误标志;source_ready为输出等待状态标志;sink_ready为输入等待状态标志;source_error为输出错误标志;source_real为结果实部数据;source_imag为结果虚部数据;source_exp为结果补偿系数;source_valid为结果有效信号;source_sop为
    输出第一个数据标志信号;source_eop为输出最后一个数据标志信号。
    3 方案设计
    系统主要由三部分组成:A/D采集模块、FPGA处理模块及MCU运算显示模块,系统框图如图4所示。A/D采集外部信号数据,将其存入FPGA内部缓存RAM。当FFT输入有效时,读取缓存中的数据,同时与窗函数表中的对应系数做乘法运算,结果输入FFT核中,FFT核处理结束后将数据存入缓存RAM中。单片机读取缓存RAM中的结果数据,进行相应的模值计算,并通过LCD显示结果频谱图形。该方案的核心在于窗函数与FFT运算核的设计与实现。

    6.jpg
    3.1 窗函数设计
    前端数据缓存采用双口RAM核,深度512,位宽8 bit,存放A/D采集到的信号数据。窗函数表采用ROM核,深度512,位宽8 bit,存放窗函数数据。通过Matlab生成512点Hamming窗函数系数表,由于该数据为浮点数,而本设计中全部采用定点运算,故对窗函数系数进行256倍放大,将其变为定点整数,数据范围为0~255。将系数表生成mif文件,作为ROM的初始化文件。该RAM和ROM采用同一套读出地址,保证相应数据同步读出,做乘法运算,得到16 bit结果数据。由于Hamming窗数据是实际数据的256倍,所以需要对乘法结果进行右移8位操作,得到8bit FFT输入数据。设计模块如图5所示,该模块实现了输入信号数据的加窗处理。
    7.jpg
    3.2 FFT核设计
    FFT核采用MegaWizard FFT v11.1,变换点数选择512,数据精度8 bit,引擎结构选择单输出结构,引擎数为1,I/O数据流结构选择突发(Burst)结构。FFT输出数据有3种:实部数据、虚部数据和补偿指数数据。采用两个双口RAM核,深度均为512,宽度均为8 bit,分别存放
    FFT核的实部结果数据和虚部结果数据。由于每512个FFT输出数据,补偿指数均相同,所以设置一个8 bit的寄存器存放补偿指数即可。设计模块如图6所示,该模块实现了加窗处理后的信号数据的快速傅里叶变换。
    8.jpg
    4 仿真与硬件验证
    4.1 系统仿真
    FPGA开发环境为QuartusII 11.1,仿真环境为Modelsiml0.0。仿真时,由Matlab生成波形数据mif文件,作为仿真测试数据文件存入波形缓存RAM中。通过Quartus II调用Modesim对测试工程进行仿真,仿真时序如图7所示。经时序分析可知,工作时钟频率为100 MHz(period= 10 ns),每进行一次512点处理到全部输出处理结果共耗时36.9μs。

    9.jpg
    将仿真结果数据导入Matlab,得到结果由图8(a)知,对信号周期整数倍截断FFT处理后,得到单一的正确的频谱图;如图8(b)知,对信号周期非整数倍截断FFT处理后,频谱出现严重泄露,且幅度值下降;如图8(c)知,对信号周期非整数倍截断,加窗后做FFT处理,频谱泄露现象有明显的改进,但幅度值因为加窗处理而相应下降。仿真结果表明,FFT系统设计正确,且加窗处理对信号周期非整数倍截断导致的频谱泄露问题有良好的改进效果。
    10.jpg
    4.2 硬件验证
    ADC选用ADS9238,它是一款高速高动态范围A/D转换器,12 bit,最高采样时钟达65 MSample·s-1。MCU选用c8051F120单片机,LCD选用ZLG320240K-FFSSWE-YBC,分辨率为320×240,可以满足字符、汉字及图形等各种显示需求。FPGA选用Altera公司的Cyclone II EP2C8Q208 C8N,该芯片资源丰富,包含8256个LEs,36个4 kbit Block RAM,18个内部乘法器和208个I/O资源,并支持FFT IP核。
    FFT处理时钟为100 MHz,A/D采样率为10 MHz,采样点数为512,故频谱分辨率f=10 MHz/512=19.531 kHz。当输入信号为390.625 kHz时,512个采样点表示20个信号周期;当输入信号为400.390 kHz时,512个采样点表示20.5个信号周期。在加窗和不加窗两种情况下分别对频率为390.625 kHz和400.390 kHz的正弦信号进行采样,得到如图9的结果。
    11.jpg
    图9中(a)为不加窗的情况下对390.625 kHz的输入信号进行采样,由于512个点正好是20倍截断,所以只在频谱的第20个点有单一幅值,说明FFT系统工作正常。而且由于是整数倍截断,结果没有频谱泄露;图9(b)为不加窗的情况下对400.390 kHz的输入信号进行采样,由于512个点正好为20.5倍截断,非整数倍截断,所以结果中存在严重的频谱泄露;图9(c)为加窗的情况下对400.390 kHz的输入信号进行采样,可以看到,频谱泄露现象得到较好的改善。硬件测试结果表明,FFT系统设计正确,且加窗处理对信号周期非整数倍截断导致的频谱泄露问题有良好的改进效果。
    5 结束语
    本文利用Altera公司的IP核设计了一种FFT系统,该方法设计简单、资源利用率高、运算速度快,试验证明具有良好性能。同时针对非整数倍周期截断导致的频谱泄露问题,提出了一种通过加窗改进的方法,经硬件平台验证,其改进效果明显。由于加窗导致的幅值变化问题,本文尚未作详细论证,有待进一步的研究。

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-14 22:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-7-14 22:17:03 | 显示全部楼层
    不错不错好好学习下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-1 21:55:29 | 显示全部楼层
    可以参考下源代码吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-9-8 09:07
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-8-21 11:29:34 | 显示全部楼层
    很不错的资料,感谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-6-17 16:07
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-6-17 16:08:22 | 显示全部楼层
    不错的技术文章  想参考下模块的代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-3-8 19:44
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2016-7-30 13:51:35 | 显示全部楼层
    不错的帖子
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-27 10:32 , Processed in 0.188158 second(s), 30 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.