1、前言html
FFT运算是目前最经常使用的信号频谱分析算法。在本科学习数字信号处理这门课时一直在想:学这些东西有啥用?公式推来推去的,有实用价值么?到了研究生后期才知道,广义上的数字信号处理无处不在:手机等各类通讯设备和WIFI的物理层信号处理、摄像头内的ISP、音频信号的去噪等。各类算法中,FFT是查看信号本质,也就是频谱的重要手段。以前仅直接调用FFT/IFFT IP核,今天深刻探讨下算法自己和实现方案。算法
2、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运算。信号流图表达为:spa
咱们以8点FFT运算为例,拆分过程以下。具体讲解见参考文献2.设计
FFT运算点数 N=2^L。L则为运算级数,每级有N/2个蝶形。若是是频率抽取(DIF)的基2算法,总体结构和蝶形单元都会有区别。3d
3、FFT运算的FPGA实现探讨htm
从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
2 数字信号处理--FFT与蝶形算法 - yu_jianchi - 博客园 https://www.cnblogs.com/luoqingyu/p/5930181.html
3 FFT算法8点12位硬件实现 (verilog) - 清风醉明月 slp_art - 博客园 https://www.cnblogs.com/sleepy/archive/2011/07/20/2112079.html