weixin 发表于 2021-4-28 13:52

带你了解到底什么是FFT

时域信号分为周期/非周期,连续和离散,这样有四种样式的傅里叶变换。
如上可以看到,在一个域的离散信号,在另一个域将变成周期的。类似的,在一个域连续的信号,在另外一个域必然是非周期的。

1、DFT
分为实数和复数版本的DFT,实数版本输入是实数,得到的频域点将有两个集合,分别是cos 和sin 函数的系数。复数输入表示的是正负频率。

实 DFT:
对于输入是x(n) 的N 点DFT,将获得N/2+1的两组cos 和sin 系数。
根据系数获取原始输入时,需要对Xre 和Xre除以2。

复 DFT:
对于N 点复数DFT 变换后得到的是N 点X。
变换后的X 是直流分量,1~N/2是正频成分,X 是奈奎斯特频率,接下来的N/2−1是负频分量。

从频谱获得原始输入信号的公式是:
当时域信号是实数时,计算复DFT 时将虚部填零,下图是matlab fft 函数计算的DFT 结果。

2、FFT
FFT 是DFT 计算的快速方法。


FFT结果举例:
假设x 是频率fc=10Hz余弦信号,采样率是fs=32∗fc。


做N=256点FFT:

matlab数组从1开始,输出1-N,频点间隔是Δf=fs/N,先输出直流分量,然后是正频分量,再然后是负频分量。在MATLAB 中使用fftshift 后,将频率按负频分量、直流以及正频分量排列。
实信号:
实数信号以fs 为采样率,那奎斯特采样定理表明混跌频率是fs /2,则实数信号的fft 结果中前半部分是fs/2],后半部分是[fs/2,fs]。由于周期性,在频谱不混跌的情况下,后半部分等于[−fs/2,0],在上图中看到第一个数是36+0i,这就是直流分量。另外,还应该注意到第i 个数,实际上等于第N−i 个数的共轭。所以,实际上实数的快速傅里叶算法会利用这个性质减小运算量和存储空间,这是在代码级别的优化。在实际频率显示时,某些场合期望得到[−fs/2, fs/2]显示频谱,通常会使用matlab 的fftshift 来实现这个功能。

复信号:
对于复信号没有负频率,以fs 采样率的信号,fft 频谱的结果是从fs]。在f>fs/2时,对复信号的fft 结果进行fftshift 会产生频谱混跌。

来源:CSDN shichaog的博客,原题:如何理解FFT。

页: [1]
查看完整版本: 带你了解到底什么是FFT