对于FFT和DFT的理解

此篇文章是对 MiniSTM32F103实现家庭普通电路中的电流谐波检测 一文的补充
本文参考:快速傅里叶变换学习及C语言实现
形象的介绍:什么是傅里叶变换?
手把手教你理解(FFT)

FFT是最重要,也是最难懂的。简单说下原理:
FFT(快速傅里叶变换)是DFT(离散傅里叶变换)的改进算法,其将DFT的N^2 步运算减少至 ( N/2 )log2(N)步。
先来讲讲DFT的原理
离散傅里叶变换(DFT)是傅里叶变换在离散系统中的表示形式,
对于FFT和DFT的理解_第1张图片
k是频率,n是第n个点,N是采集点数,W是旋转因子

这个公式是什么意思呢?来看看这个
对于FFT和DFT的理解_第2张图片
下面可以理解为一个旋转的矢量,在某一时刻,它的长度等于上面时域信号的高度,时域信号中波峰对应离圆心较远的点,波谷对应离圆心较近的点

对于FFT和DFT的理解_第3张图片
3 beats/second的意思是信号的频率,0.20 cycles/second是缠绕圆图像的频率,即是每秒0.2圈

傅里叶变换可以理解为:把上面时域信号波形缠绕在复数域内的单位圆上,巧合的是,当缠绕频率等于信号频率时,缠绕图像会很整齐,而在其他时候,缠绕图像会显得很混乱,例如:
缠绕频率k=0.79Hz时
对于FFT和DFT的理解_第4张图片
缠绕频率k=3Hz时
对于FFT和DFT的理解_第5张图片

那和DFT的式子有什么关系呢?看图
对于FFT和DFT的理解_第6张图片
上面缠绕图像上的点就是采集的离散点,即是x(n)

根据采集点数等分这个单位圆,得到的点也就是旋转因子W,用对应的W去乘以x(n),因为是单位圆(也就是1),所以得到的缠绕图像就是原来信号波形缠绕在圆上,可以理解对单位圆根据x(n)的值进行放缩。在实际处理过程,我们是要把所有采集的点刚好围绕一周,然后从k=1开始,不断增加缠绕图像的缠绕频率,直至得到一个有规律的缠绕图像。
那么问题来了,人可以通过眼睛判断,计算机或者单片机芯片可不认识这样的一个图像,那么如何找出整齐的缠绕图像呢?
当出现这样一个整齐的缠绕图像时,其图像质心点对应的模值也是最大的。
可通过计算其质心来找,也就是最初的公式对于FFT和DFT的理解_第7张图片
例如k=1时,把所有复数域上的点(原始点乘W)都加起来,因为质心的计算公式为对于FFT和DFT的理解_第8张图片是不是和DFT的公式很像?
DFT公式计算的其实就是该缠绕频率(k)下缠绕图形的质心的N倍。(这里就不往下展开了,博主也在想这个问题:FFT后点的模值和信号幅值的关系为啥是N/2,这和DFT计算的是缠绕图像质心的N倍有什么关系?)

说完对DFT的理解,现在来说下FFT是如何改进DFT算法的。
因为一些数学符号难以表达,所有这里手写

对于FFT和DFT的理解_第9张图片

以下参考 快速傅里叶变换学习及C语言实现
例如N=8时的蝶形图为
对于FFT和DFT的理解_第10张图片
该算法的特征是:
1)输入序列顺序位反转,输出所有频率值都是按顺序出现的。
2)计算可以“就地”完成,也就是蝶形所使用的存储位置可以被重写。
3)从图中我们可以看到对于点数为N = 2^L的FFT运算,可以分解为L阶蝶形图级联,每一阶蝶形图内又分为M个蝶形组,每个蝶形组内包含K个蝶形。(迭代算法实现:根据这一点我们就可以构造三阶循环来实现蝶形运算。编程过程需要注意旋转因子与蝶形阶数和蝶形分组内的蝶形个数存在关联。)
对于FFT和DFT的理解_第11张图片
ok,后续再补充思考的问题

你可能感兴趣的:(对于FFT和DFT的理解)