快速理解FFT算法(完整无废话)
首先请忘掉你在高赞看到的多项式系数表示法点值表示法,FFT是搞傅里叶变换的!首先得把傅里叶变换搞清楚了!连傅里叶变换的意义都没搞清楚就上FFT,是不可能完全理解的!高赞里的系数表示法点值表示法只是一个FFT的应用!高赞答主可能是直接把别人的应用照搬过来了,其实对于理解FFT 没有帮助,只会让人云里雾里。
我们需要明白:FFT算法实质上就是DFT算法的改良版,而DFT算法则是傅里叶变换的离散版。按傅里叶变换→DFT→FFT的思路推导,即可理解FFT。
1. 傅里叶变换的物理意义
为使文章简明,此处略过傅里叶变换的详细数学推导,仅说明物理意义。
如果你知道它的物理意义,可以跳过本节,直接从2. DFT开始即可。不知道傅里叶变换是啥的,请移步其他单纯介绍傅里叶变换的文章,或者翻高数教材。
我们知道,周期函数的傅里叶级数实质上是将函数 





而对于非周期函数,傅里叶变换则是求频谱密度函数,该函数的自变量是 
如果上面的物理意义你没有看明白,可以接着往下看。如果明白了,可以跳转至2. DFT。
为什么这么说呢?我们将周期函数的傅里叶级数转化为指数形式,即
然而傅里叶级数显然是以 
那么对于非周期函数,我们把它的周期看作无穷大。基频 





我们会发现这里的 
将它代入
得到
则非周期函数的傅里叶变换定义为
我们可以发现 


我们一般也用频率 
所以我们可以说,傅里叶变换的目的就是将信号转化为无数个不同频率的正弦信号的叠加,然后揭示这些正弦信号的强度和频率的关系。
2. DFT
懂DFT的朋友们可以跳过本节,直接进入3.FFT。
我们说过,傅里叶变换的目的就是得到信号的频谱密度函数(自变量是 
对于傅里叶变换
我们做数学题时碰到的 



同时,计算机也只可能计算出有限个频率上对应的幅值密度,即 
DFT就是 

2.1 关于采样
懂采样的朋友们可以跳过本节,直接进入2.2节。
采样的具体操作是什么?我们首先引入冲激函数(也叫Dirac函数)的概念。
当 


根据它的定义,我们可知 


但是Dirac函数一次只能选取一个函数值,所以我们将很多个采样点不同的Dirac函数叠加起来,就可以实现时域上的采样了。这样叠加的函数被称为梳状函数,表达式为
其中 
将时域上的连续信号与它相乘,即可得到 
2.2 时域离散化计算
对于采样得到的 
根据傅里叶变换的定义
则
交换积分与求和顺序,得到
根据Dirac函数的筛选特性,
这样就完成了我们的时域离散化计算。
2.3 频域离散化计算
时域离散化得到的结果 


我们首先解决N为无穷大的问题。对于连续信号 


在一个周期内,离散信号的表达式为
离散信号的傅里叶级数
其中,
交换积分和求和次序,
根据狄拉克函数的筛选特性,
即
为更加简明,令 ![简述fft的计算流程_简述fft算法的基本原理插图87 X[k]=X(k\omega_0)T_s](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图89 x[n]=x(nT_s)](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
2.4 DFT的复杂度
对于一个特定的k值,要求 ![简述fft的计算流程_简述fft算法的基本原理插图93 X[k]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图95 x[n]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)

而需要这样运算的k值总共有多少个?一般来说,由于 
可得复杂度为 
3. FFT
3.1 数学原理部分
上面讲到DFT的计算表达式为 ![简述fft的计算流程_简述fft算法的基本原理插图91 X[k]=\frac{1}{N}\sum_{n=0}^{N-1}x[n]e^{-j\frac{2\pi}{N}kn}](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)






![简述fft的计算流程_简述fft算法的基本原理插图93 X[k]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)

如何减小它的复杂度?能否利用 
我们令 ![简述fft的计算流程_简述fft算法的基本原理插图111 W[n, k]=e^{-j\frac{2\pi}{N}nk}](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
将 ![简述fft的计算流程_简述fft算法的基本原理插图93 X[k]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
当n为奇数时,我们可以提取一个 
![简述fft的计算流程_简述fft算法的基本原理插图125 W[n, k]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
我们令偶数部分为 ![简述fft的计算流程_简述fft算法的基本原理插图127 E[k]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图129 O[k]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图133 x[2n]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图135 ,x[2n+1]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图137 W[2n, k]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图139 W[2n, k]=W[2n, k+N/2]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
那么, ![简述fft的计算流程_简述fft算法的基本原理插图141 E[k]=E[k+N/2]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图143 O[k]=O[k+N/2]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![简述fft的计算流程_简述fft算法的基本原理插图145 W[1,k]=-W[1, k+N/2]](https://sigusoft.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
我们可以得出结论
以N=8为例,
显然,
也就是说,只要得到X[k],我们必然可以得到X[k+N/2]。
3.2 算法流程
在上面的N=8的例子中,想求X[0]和X[4],我们只需要求E[0]和O[0]即可。
在实际应用中,对于每对X[k]和X[k+N/2]而言,只要得知了其中一者的偶数部分,就相当于得知了另一者的偶数部分。奇数部分同理。
所以计算时,经过每一对的相互配合,X[k]可以只求偶数或奇数部分。如图所示
利用递归的思想,k=0~3的偶数部分我们可以如法炮制。
这里面2n=0, 2, 4, 6,令 
很多文章提供了蝶形图,想看蝶形图的朋友们可以移步这篇回答(这里面分解到最后一步的蝶形图有错误,我想想办法画个更简明没有错误的图贴上来)如何理解和掌握快速傅里叶变换的计算和概念?
3.3 FFT的复杂度
对数据结构与算法、FFT算法的复杂度为何是 
数据结构与算法这门课程里有时间复杂度的概念,我们上面提到的复杂度也均指时间复杂度。一个算法的时间复杂度是指:该算法处理数据量为N的一个数据集,需要进行运算的次数。我们用 
那么FFT的 
为什么是这个规律?还是以N=8为例,我们需要求X[k](k=0~7),对于每个k,将X[k]分解为n为偶数部分(n=0, 2, 4, 6)、n为奇数部分(n=1, 3, 5, 7)。
在蝶形图中,可以看出我们只需要求E[0], E[1], E[2], E[3]以及O[4], O[5], O[6], O[7]。求出这些量的数值后,再经过N=8次加法,即可得到X[k]。
利用递归思想,将E[0], E[1], E[2], E[3]当成另一个X[k],记作X'[k](k=0, 1, 2, 3)。
我们知道,偶数部分的n=0, 2, 4, 6。令 
奇数部分同理。
得到该规律以后,就是单纯的数学问题了。
分解到最后只有一项,只需要进行一次乘法运算即可。所以T(1)=1。
顺便提一嘴, 

完结撒花~
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/93963.html

