如何理解FFT

来源:互联网 发布:公安部网络监察局官网 编辑:程序博客网 时间:2024/06/01 14:56

时域信号分为周期/非周期,连续和离散,这样有四中样式的傅里叶变换。

变换类型 时域信号特性 频谱特性 连续时域FT 连续,非周期 非周期,连续 离散时域傅里叶变换DTFT 离散非周期 周期,连续 傅里叶级数FS 连续,周期 非周期,离散 离散傅里叶变换DFT 离散,周期 周期,离散

如上可以看到,在一个域的离散信号,在另一个域将变成周期的,类似的,在一个域连续的信号,在另外一个域必然是非周期的。

DFT

分为实数和复数版本的DFT,实数版本输入是实数,得到的频域点将有两个集合,分别是cossin函数的系数。复数输入表示的是正负频率。
这里写图片描述

实 DFT

对于输入是x(n)的N点DFT将获得N/2+1的两组cossin系数

Xre[k]=2Nn=0N1x[n]cos(2πknN),K=0,1,..,N/2

Xim[k]=2Nn=0N1x[n]sin(2πknN),K=0,1,..,N/2

根据系数获取原始输入时,需要对Xre[0]Xre[N/2]除以2。

复DFT

对于N点复数DFT变换后得到的是N点X[k]

X[k]=1Nn=0N1x[n]ej2πkn/N

变换后的X[0]是直流分量,1N/2是正频成分,X[N/2]是奈奎斯特频率,接下来的N/21是负频分量。
从频谱获得原始输入信号的公式是:
x[n]=k=0N1X[k]ej2πkn/N

当时域信号是实数时,计算复DFT时,将虚部填零,下图是matlab fft函数计算的DFT结果。
这里写图片描述

FFT

FFT是DFT计算的快速方法。

X[k]=n=0N1x[n]ej2πkn/N

x[n]=1Nk=0N1X[k]ej2πkn/N

matlabx=fft(x,N),%计算X[k]x=ifft(x,N)

FFT结果举例

假设x[n]是频率fc=10Hz余弦信号,采样率是fs=32fc

fc=10;fs=32*fc;%sampling frequency with oversampling factor=32t=0:1/fs:2-1/fs;%2 seconds durationx=cos(2*pi*fc*t);%time domain signal (real number)subplot(3,1,1); plot(t,x);hold on; %plot the signaltitle('x[n]=cos(2 \pi 10 t)'); xlabel('n'); ylabel('x[n]');

这里写图片描述
N=256点FFT

X = fft(x,N);%N-point complex DFT%output contains DC at index 1, Nyquist frequency at N/2+1 th index%positive frequencies from index 2 to N/2%negative frequencies from index N/2+1 to N

matlab数组从1开始,输出1-N,频点间隔是Δf=fsN,先输出直流分量,然后是正频分量,再然后是负频分量,在MATLAB中使用fftshift后将频率按,负频分量,直流以及正频分量排列。
这里写图片描述

实信号

这里写图片描述

这里写图片描述

1)实数信号以fs为采样率,那奎斯特采样定理表明混跌频率是fs/2,则
2)实数信号的fft结果中前半部分是[0,fs/2],后半部分是[fs/2,fs]由于周期性,在频谱不混跌的情况下,后半部分等于[fs/2,0],在上图中看到第一个数是36+0i,这就是直流分量,
3)另外还应该注意到第i个数,实际上等于第Ni个数的共轭,
4)所以实际上实数的快速傅里叶算法会利用这个性质减小运算量和存储空间,这是在代码级别的优化
5)在实际频率显示时,某些场合期望得到[fs/2,fs/2]显示频谱,通常会使用matlab 的fftshift来实现这个功能。

复信号

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

原创粉丝点击