一、前言

  FFT运算是目前最常用的信号频谱分析算法。在本科学习数字信号处理这门课时一直在想:学这些东西有啥用?公式推来推去的,有实用价值么?到了研究生后期才知道,广义上的数字信号处理无处不在:手机等各种通信设备和WIFI的物理层信号处理、摄像头内的ISP、音频信号的去噪等。各种算法中,FFT是查看信号本质,也就是频谱的重要手段。之前仅直接调用FFT/IFFT IP核,今天深入探讨下算法本身和实现方案。

二、FFT运算原理及结构

  本文仅对FFT的核心思想、作用和算法结构进行介绍,FFT具体原理和公式推导详见参考文献。FFT是DFT的快速算法,旨在降低计算复杂度以减小处理延迟和占用的软硬件资源,核心思想是将大点数的DFT运算拆分成多个小点数的DFT运算。因此FFT核心公式与DFT相同。

  DFT运算把原始信号采样点与不同的旋转因子做乘累加运算,而旋转因子经过欧拉公式展开后就是角度成倍数关系的正余弦函数。现在DFT在干什么以及怎么干的一目了然:把一段原始信号采样点与不同频率的正余弦信号做“相关运算”,从而找出信号的频率分量。通俗点说就是通过查看信号与不同频率值正余弦信号的相似程度分析信号本身的频率成分。工程应用时,了解到这一点就足够了。

  有了上述理解,再来看FFT算法。公式推导部分只要知道它是根据旋转因子的对称性和周期性把大点数的DFT运算拆分成多个小点数DFT运算就行了,真正要掌握的是推导过后的表达式以及算法结构。以时间抽取(DIT)的基2算法为例,它是根据采样点奇偶序号,不断对N点DFT运算进行两两拆分直到两点DFT运算为止的快速算法。其中的蝶形运算表达式即为这种拆分思想的精华:

  其中,k=0,1,...,N/2-1.X1(k)和X2(k)分别是信号x(n)的偶数序号采样点x(2r)和基数序号采样点x(2r+1)的DFT运算结果。通过上述公式,N点DFT运算拆分成了两个N/2点的DFT运算。信号流图表达为:

  我们以8点FFT运算为例,拆分过程如下。具体讲解见参考文献2.

  FFT运算点数 N=2^L。L则为运算级数,每级有N/2个蝶形。如果是频率抽取(DIF)的基2算法,整体结构和蝶形单元都会有区别。

三、FFT运算的FPGA实现探讨

  从X家FFT/IFFT IP Core的接口信号以及网络上的资源可以看出,为了使接口与FFT运算点数无关,采用串行输入-->并行计算-->并串转换的顶层架构实现FFT功能。并行计算过程中需要求取旋转因子,常见的做法是使用CORDIC算法计算特定角度的正余弦值。如8点FFT要计算0°、-45°、-90°和-135°的正余弦值。正余弦值应该可以直接查表获得,但点数较多时会占用大量的存储资源,如点数为1024,正余弦值位宽为16bit,则存储容量=1024/2*2*16bit= 16Kbit。除了三角函数,运算过程中还包括复数乘法、复数加减法,都是比较简单的操作。后续本人会尝试具体设计FFT运算的迭代和流水线硬件架构及对应的VerilogHDL代码。

参考文献:

1 [图文]第4章快速傅里叶变换 - 百度文库 https://wenku.baidu.com/view/3818bb913c1ec5da50e270df.html

数字信号处理--FFT与蝶形算法 - yu_jianchi - 博客园 https://www.cnblogs.com/luoqingyu/p/5930181.html

FFT算法8点12位硬件实现 (verilog) - 清风醉明月 slp_art - 博客园 https://www.cnblogs.com/sleepy/archive/2011/07/20/2112079.html

数字信号处理专题(3)——FFT运算初探的更多相关文章

  1. 数字信号处理专题(1)——DDS函数发生器环路Demo

    一.前言 会FPGA硬件描述语言.设计思想和接口协议,掌握些基本的算法是非常重要的,因此开设本专题探讨些基于AD DA数字信号处理系统的一些简单算法,在数字通信 信号分析与检测等领域都会或多或少有应用 ...

  2. 数字信号处理专题(2)——利用FPGA进行基本运算及特殊函数定点运算

    一.前言 FPGA以擅长高速并行数据处理而闻名,从有线/无线通信到图像处理中各种DSP算法,再到现今火爆的AI应用,都离不开卷积.滤波.变换等基本的数学运算.但由于FPGA的硬件结构和开发特性使得其对 ...

  3. 数字信号处理--FFT与蝶形算法

    在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征.尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理.因此至DFT被发现以来, ...

  4. FS,FT,DFS,DTFT,DFT,FFT的联系和区别 数字信号处理

    DCT变换的原理及算法 文库介绍 对于初学数字信号处理(DSP)的人来说,这几种变换是最为头疼的,它们是数字信号处理的理论基础,贯穿整个信号的处理. 学习过<高等数学>和<信号与系统 ...

  5. 《数字信号处理》课程实验1 – FFT的实现

    一.按时间抽选的基-2 FFT实现原理 观察DIT(基2)FFT的流图(N点,N为2的幂次),可以总结出如下规律: (1)共有\(L=\log_2⁡N\)级蝶形运算: (2)输入倒位序,输出自然顺序: ...

  6. 数字信号处理--FFT

    FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原因.另外,FFT可以将 ...

  7. FPGA与数字信号处理

    过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等 ...

  8. 几幅图片弄清DFT、DTFT、DFS的关系 数字信号处理

    原址:http://www.cnblogs.com/BitArt/archive/2012/11/24/2786390.html 很多同学学习了数字信号处理之后,被里面的几个名词搞的晕头转向,比如DF ...

  9. 数字信号处理与音频处理(使用Audition)

    前一阵子由于考博学习须要,看了<数字信号处理>,之前一直不清除这门课的理论在哪里应用比較广泛. 这次正巧用Audition处理了一段音频,猛然发现<数字信号处理>这门课还是很实 ...

随机推荐

  1. 去重是distinct还是group by?

    distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分,因为用错场景的话,效率相差可以倍计. 单纯的去重操作使用di ...

  2. HTTP和SOAP完全就是两个不同的协议

    HTTP只负责把数据传送过去,不会管这个数据是XML.HTML.图片.文本文件或者别的什么.而SOAP协议则定义了怎么把一个对象变成XML文本,在远程如何调用等,怎么能够混为一谈.           ...

  3. MySql常用两大存储引擎简介

    MyISAM存储引擎简介 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件. 首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.M ...

  4. backbone的一些认识

    body,td { font-family: 微软雅黑; font-size: 10pt } 官网:http://backbonejs.org/ 作者:Jeremy Ashkenas 杰里米·阿什肯纳 ...

  5. 推荐《用Python进行自然语言处理》中文翻译-NLTK配套书

    NLTK配套书<用Python进行自然语言处理>(Natural Language Processing with Python)已经出版好几年了,但是国内一直没有翻译的中文版,虽然读英文 ...

  6. DUBBO报错分析—1(连接zookeeper成功,调用方法无反应,不报错)

    思路分析 调用方法时,最后调用执行的是mapper的sql语句,既然调用对应的方法无法获取返回值,多是sql错误,但是并未报sql错误,说明可能是与sql相关的数据源配置错误. 过程调试 经尝试,当直 ...

  7. bootstrap table的样式

    <style> table{ border: 1px solid #ddd; background-color: transparent; border-spacing:; border- ...

  8. 浅谈前端中的mvvm与mvc

    用了vue这么久,却没有认真的关注mvvm与mvc,着实汗颜.趁着周末刚好看了一下网上的文章还有书籍,简单的谈一下我的理解. -以下图片均摘自网络. 一.MVC 特点:单项通讯 视图(View):用户 ...

  9. Python configparser 读取指定节点内容失败

    # !/user/bin/python # -*- coding: utf-8 -*- import configparser # 生成一个config文件 config = configparser ...

  10. OpenCV-Python学习01

    import tensorflow as tf 1 # -*- coding: utf-8 -*- 2 """ 3 Created on Tue Dec 31 19:16 ...