概要:

FFT(Fast Fourier transform):快速傅里叶变换,是DFT的工程化实现方法。
DFT直接求解太过于复杂,FFT方法根据DFT求解过程中旋转因子的性质并引入分治算法思想,大大简化计算过程,被广泛应用在频谱分析的工程实践中,如matlab,C,C++,CUDA等底层实现

一,DFT简介

频谱分析是信号处理中的重要环节,从傅里叶变换FT,到拉普拉斯变换LT,离散时间傅里叶变换DTFT,Z变换ZT,到我们所讲的离散傅里叶变换DFT(他们之间的联系和区别见我的其他博客)。
相比于其他变换,DFT被广泛应用的原因是其输入的时域信号是离散的,输出的频域结果也是离散的。这就极大方便了我们进行基于计算机的频谱计算,存储和分析,没办法数字信号处理是大趋势。
​ DFT变换的公式为:
X[k]=∑n=0N−1x[n]e−jk2πKn,k=0,1,2,...,K−1X\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]{{e}^{-jk\frac{2\pi }{K}n}},k=0,1,2,...,K-1} X[k]=n=0∑N−1​x[n]e−jkK2π​n,k=0,1,2,...,K−1
这里不同于一般课本上的是,kkk的取值不再与输入信号nnn的长度0∼N−10\sim N-10∼N−1相同,而是自己设置。这是为了突出kkk的设置本质上是为了对以上 2pi 为周期的连续频谱离散化(DFT是DTFT连续频域结果离散化处理后的结果),也即频谱采样。


但为了分析方便,在FFT的计算过程中,我们依然使用k=0∼N−1k = 0 \sim N-1k=0∼N−1的选取策略。也即,如下:

X[k]=∑n=0N−1x[n]e−jk2πNn,k=0,1,2,...,N−1X\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]{{e}^{-jk\frac{2\pi }{N}n}},k=0,1,2,...,N-1} X[k]=n=0∑N−1​x[n]e−jkN2π​n,k=0,1,2,...,N−1

上式直接求解当然可以,但是需要N2N^2N2次复数乘法和N(N−1)N(N-1)N(N−1)次复数加法:
X[k]=∑n=0N−1x[n]e−jk2πNn=∑n=0N−1x[n]WNknX\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]{{e}^{-jk\frac{2\pi }{N}n}}\text{=}}\sum\limits_{n=0}^{N-1}{x\left[ n \right]W_{N}^{kn}} X[k]=n=0∑N−1​x[n]e−jkN2π​n=n=0∑N−1​x[n]WNkn​
其中,WWW是需要替换的旋转因子:WNkn=e−jk2πNn,W=e−j2πNW_{N}^{kn}={{e}^{-jk\frac{2\pi }{N}n}},W={{e}^{-j\frac{2\pi }{N}}}WNkn​=e−jkN2π​n,W=e−jN2π​

​ 使用FFT算法简化DFT计算过程就是依赖旋转因子WWW的一些性质,简化计算过程。

二、旋转因子WWW的性质

  • 周期性:WNa+N=WNaW_{N}^{a+N}=W_{N}^{a}WNa+N​=WNa​
  • 对称性:WNa+N/2=−WNaW_{N}^{a+N/2}=-W_{N}^{a}WNa+N/2​=−WNa​
  • 缩放性:WN2=WN/21W_{N}^{2}\text{=}W_{N/2}^{1}WN2​=WN/21​

证明方法就是按旋转因子定义,直接拆开就行,就是代数变换。以上性质意味着值相同的就不用了再多计算一遍了,这就能简化DFT的计算过程。

三、FFT蝶形计算证明

​ FFT的计算过程运用了“分治算法”思想,并结合了旋转因子WWW的性质。具体证明过程如下:

  1. 首先,我们把输入的时域信号x[n],n=0,1,...,N−1x[n],n=0,1,...,N-1x[n],n=0,1,...,N−1根据索引分为奇偶两部分:

feven[n]=x[2n]{{f}_{even}}\left[ n \right]=x\left[ 2n \right] feven​[n]=x[2n]

fodd[n]=x[2n+1]{{f}_{odd}}\left[ n \right]=x\left[ 2n+1 \right] fodd​[n]=x[2n+1]

此时,索引范围为:n=0,1,2,...,N/2−1n=0,1,2,...,N/2-1n=0,1,2,...,N/2−1,

​ 2. 对DFT公式(3)进行化简:
X[k]=∑n=0N−1x[n]WNkn,k=0,1,...,N−1X\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]W_{N}^{kn}},k=0,1,...,N-1 X[k]=n=0∑N−1​x[n]WNkn​,k=0,1,...,N−1
得到:
X[k]=∑n为偶数x[n]WNkn+∑n为奇数x[n]WNknk=0,1,...,N−1X\left[ k \right]=\sum\limits_{n为偶数}{x\left[ n \right]W_{N}^{kn}}+\sum\limits_{n为奇数}{x\left[ n \right]W_{N}^{kn}}k=0,1,...,N-1 X[k]=n为偶数∑​x[n]WNkn​+n为奇数∑​x[n]WNkn​k=0,1,...,N−1
这个过程很简单,如下图,就是按奇偶索引把求和分成两部分

详细点写也即:
X[k]=∑m=0(N/2)−1x[2m]WNk⋅2m+∑m=0(N/2)−1x[2m+1]WNk⋅(2m+1),k=0,1,...,N−1X\left[ k \right]=\sum\limits_{m=0}^{(N/2)-1}{x\left[ 2m \right]W_{N}^{k\centerdot 2m}}+\sum\limits_{m=0}^{(N/2)-1}{x\left[ 2m+1 \right]W_{N}^{k\centerdot \left( 2m+1 \right)}},k=0,1,...,N-1 X[k]=m=0∑(N/2)−1​x[2m]WNk⋅2m​+m=0∑(N/2)−1​x[2m+1]WNk⋅(2m+1)​,k=0,1,...,N−1
根据旋转因子的缩放性,可以进一步换算:
X[k]=∑m=0(N/2)−1feven[m]WN/2k⋅m+WNk∑m=0(N/2)−1fodd[m]WN/2k⋅m,k=0,1,...,N−1X\left[ k \right]=\sum\limits_{m=0}^{(N/2)-1}{{{f}_{even}}\left[ m \right]W_{N/2}^{k\centerdot m}}+W_{N}^{k}\sum\limits_{m=0}^{(N/2)-1}{{{f}_{odd}}\left[ m \right]W_{N/2}^{k\centerdot m}},k=0,1,...,N-1 X[k]=m=0∑(N/2)−1​feven​[m]WN/2k⋅m​+WNk​m=0∑(N/2)−1​fodd​[m]WN/2k⋅m​,k=0,1,...,N−1
也即:
X[k]=Feven[k]+WNkFodd[k],k=0,1,...,N−1X\left[ k \right]={{F}_{even}}\left[ k \right]+W_{N}^{k}{{F}_{odd}}\left[ k \right],k=0,1,...,N-1 X[k]=Feven​[k]+WNk​Fodd​[k],k=0,1,...,N−1
其中,Feven[k]{{F}_{even}}\left[ k \right]Feven​[k]为偶数索引输入feven[n]{{f}_{even}}\left[ n \right]feven​[n]的DFT结果,Fodd[k]{{F}_{odd}}\left[ k \right]Fodd​[k]为奇数索引输入fodd[n]{{f}_{odd}}\left[ n \right]fodd​[n]的DFT结果。

  1. 分析Feven[k]{{F}_{even}}\left[ k \right]Feven​[k]和Fodd[k]{{F}_{odd}}\left[ k \right]Fodd​[k]以便进一步转换:

    无论Feven[k]{{F}_{even}}\left[ k \right]Feven​[k]和Fodd[k]{{F}_{odd}}\left[ k \right]Fodd​[k]两个哪一个,他们的时域输入长度都为(N/2)−1(N/2)-1(N/2)−1,但此时的$ k=0,1,…,N-1是输入信号长度的2倍。这就说明是输入信号长度的2倍。这就说明是输入信号长度的2倍。这就说明{{F}{even}}\left[ k \right]和和和{{F}{odd}}\left[ k \right]$都是周期性的(可以理解为,N个点里包含了2个$2\pi $周期的频谱采样),也即:

Feven[k+N/2]=Feven[k]{{F}_{even}}\left[ k+N/2 \right] = {{F}_{even}}\left[ k \right] Feven​[k+N/2]=Feven​[k]

Fodd[k+N/2]=Fodd[k]{{F}_{odd}}\left[ k+N/2 \right] = {{F}_{odd}}\left[ k \right] Fodd​[k+N/2]=Fodd​[k]

  1. 再次简化:

    根据式(13)可以知道,最终结果的前半部分,可以直接被得到:
    X[k]=Feven[k]+WNkFodd[k],k=0,1,...,N/2−1X\left[ k \right]={{F}_{even}}\left[ k \right]+W_{N}^{k}{{F}_{odd}}\left[ k \right],k=0,1,...,N/2-1 X[k]=Feven​[k]+WNk​Fodd​[k],k=0,1,...,N/2−1
    又通过式(14,15),可以将(16)进一步转化:
    X[k+N/2]=Feven[k]+WNkFodd[k],k=0,1,...,N/2−1X\left[ k+N/2 \right]={{F}_{even}}\left[ k \right]+W_{N}^{k}{{F}_{odd}}\left[ k \right],k=0,1,...,N/2-1 X[k+N/2]=Feven​[k]+WNk​Fodd​[k],k=0,1,...,N/2−1
    通过,(16,17)可以看出:一个N点的DFT结果,可以被两个奇偶输入的DFT结果计算得到。举个例子也即,8点的DFT,可以被偶4点DFT结果和奇4点DFT结果计算得到,同理奇/偶4点DFT又可以被2点DFT结果计算得到,以此类推,分治求解。

四、FFT计算过程

​ 步骤1:通过二进制镜像的方法,对时域信号的索引进行二进制编号,如下表最右列,从右向左反推输入计算序列,结果可以对应上图。

二进制:对应计算序列 转换 原始索引:对应二进制
000:0 0:000
100:4 1:001
010:2 2:010
110:6 3:011
001:1 4:100
101:5 5:101
011:3 6:110
111:7 7:11

​ 步骤2:奇偶项逐渐合并计算

五、其他说明

  • 逆DFT过程也可以使用以上方法计算
  • 以上方法为基2的方法,还有基4的方法,具体参考《数字信号处理——原理、算法与应用(第四版)》P380
  • CSDN对Typora的md语法支持并不好,有些公式显示不出来,也没有标号,我已把PDF文档上传到了CSDN。

FFT原理——详细推导理解FFT变换相关推荐

  1. 【机器学习】算法原理详细推导与实现(七):决策树算法

    [机器学习]算法原理详细推导与实现(七):决策树算法 在之前的文章中,对于介绍的分类算法有逻辑回归算法和朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中yyy不仅仅只有{0,1}\{0 ...

  2. SVM 原理详细推导

    SVM 原理详细推导 1 硬间隔最大化 1.1 函数间隔与几何间隔 1.2 间隔最大化 1.3 凸二次规划问题求解 1.4 一个求解例子 2 软间隔最大化 3 线性不可分问题 参考 SVM 是一个分类 ...

  3. FFT运算的加深理解——FFT的增益

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FFT运算的加深理解--FFT的增益 前言 FFT的增益 前言 FFT的一些概念一直迷惑了好多年,包括增益.频谱泄露.加窗.补零.栅栏 ...

  4. FFT原理 C++实现简单FFT代码

    傅里叶变换的意义 为什么我们要用正弦曲线来代替原来的曲线呢? 用正余弦来表示原信号会更加简单,因为正余弦拥有其他信号所不具备的性质:正弦曲线保真度.一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度 ...

  5. 逻辑回归原理详细推导

    1. 基本原理 Logistic Regression和Linear Regression的原理是相似的,可以简单描述为以下过程: (1)找一个合适的预测函数(Andrew Ng的公开课中称为hypo ...

  6. 三维空间旋转变换矩阵原理详细推导

    本文档将说明如何推导三维空间旋转变换矩阵 Copyright © 2020 HIT 余晨, 转载请注明出处. 原理说明 其实推导三维空间的旋转变换矩阵就是对三维空间进行换基而已,如果有学过矩阵分析的人 ...

  7. 深入浅出解释FFT(六)——深入理解fft变换

    (如需交流,请关注公众号:神马观止) FFT(FastFourier Transform,快速傅立叶变换)是离散傅立叶变换的快速算法,也是我们在数字信号处理技术中经常会提到的一个概念.在大学的理工科课 ...

  8. FFT原理最详细易懂的教程

    在正式进入FFT讲解之前,先来弄清楚下面几个概念很重要. 采样率(记为fs):每秒采样的点数,单位为Hz 采样间隔(dt):采样间隔为采样率的倒数,即dt = 1/fs:意思就是每采一个点需要多长时间 ...

  9. 【DSP数字信号处理学习笔记】—— 详细推导DFT的快速实现算法:FFT 基于库利-图基算法的实现

    引言:尽管离散傅里叶变换(DFT)让频谱分析技术在计算机上的实现成为可能,但是受限于DFT算法庞大的计算量 O(N2)O(N^2)O(N2),使得DFT在一开始并没有被广泛使用,直到快速傅里叶变换算法 ...

最新文章

  1. Django 3.2.5博客开发教程:实现网站首页
  2. Ext.grid.GridPanel + asp.net 数据分页
  3. Oracle的distinct关键字
  4. 祖冲之算法c语言实现,3GPP机密性和完整性算法规范128-EEA3和128-EIA3(二)----祖冲之算法的C语言实现...
  5. C# sqlDataReader区别Dataset
  6. USB转TTL接线方法
  7. C# 基础 (3) 垃圾回收机制(Garbage Collector)
  8. iOS---iPhoneXs iPhoneXs Max iPhoneXr
  9. RMXP脚本解析(二十):Game_Actors
  10. Matlab中dir使用中遇到的一些问题
  11. 天使的微笑——《天使爱美丽》
  12. web页面性能优化及SEO优化
  13. 顺序表如何插入元素? 看这里!!
  14. HTML5及CSS3基础知识(持续更新)
  15. EXCEL表格数据合并
  16. Word如何取消打印前自动更新域
  17. 金蝶java笔试_金蝶面试题
  18. 怎样用excel剔除异常数据_(如何剔除excel表格中重复的数据)excel表格怎么剔除异常数据...
  19. IT风云15年的那些人、那些事(一)
  20. 阿里巴巴集团详细股权报告:马云持股8.9%

热门文章

  1. 苹果地图(MapKit)总结
  2. Linux(8)Debain系统测试EC25-EUX模块usbnet0(qmi qcm)问题点
  3. 做系统的关键操作的日志功能
  4. centos服务器环境搭建
  5. 图染色的Python实现
  6. OS ---PV大题
  7. vue input银行卡四位空一格
  8. PHP关于文件上传,下载,删除,读取
  9. php删除上传的文件时删除不了 报错Resource temporarily unavailable
  10. Day841.Executor与线程池-Java 并发编程实战