如何理解FFT

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

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

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

DFT

分为实数和复数版本的DFT,实数版本输入是实数,得到的频域点将有两个集合,分别是cos” role=”presentation” style=”position: relative;”>coscos函数的系数。复数输入表示的是正负频率。
如何理解FFT_第1张图片

实 DFT

对于输入是x(n)” role=”presentation” style=”position: relative;”>x(n)x(n)系数

Xre[k]=2N∑n=0N−1x[n]cos⁡(2πknN),K=0,1,..,N/2” role=”presentation” style=”text-align: center; position: relative;”>Xre[k]=2Nn=0N1x[n]cos(2πknN),K=0,1,..,N/2Xre[k]=2N∑n=0N−1x[n]cos⁡(2πknN),K=0,1,..,N/2

Xim[k]=2N∑n=0N−1x[n]sin⁡(2πknN),K=0,1,..,N/2” role=”presentation” style=”text-align: center; position: relative;”>Xim[k]=2Nn=0N1x[n]sin(2πknN),K=0,1,..,N/2Xim[k]=2N∑n=0N−1x[n]sin⁡(2πknN),K=0,1,..,N/2

根据系数获取原始输入时,需要对 Xre[0]” role=”presentation” style=”position: relative;”>Xre[0]Xre[0]除以2。

复DFT

对于N点复数DFT变换后得到的是N点X[k]” role=”presentation” style=”position: relative;”>X[k]X[k]

X[k]=1N∑n=0N−1x[n]e−j2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>X[k]=1Nn=0N1x[n]ej2πkn/NX[k]=1N∑n=0N−1x[n]e−j2πkn/N

变换后的 X[0]” role=”presentation” style=”position: relative;”>X[0]X[0]是负频分量。
从频谱获得原始输入信号的公式是:
x[n]=∑k=0N−1X[k]ej2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>x[n]=k=0N1X[k]ej2πkn/Nx[n]=∑k=0N−1X[k]ej2πkn/N

当时域信号是实数时,计算复DFT时,将虚部填零,下图是matlab fft函数计算的DFT结果。
如何理解FFT_第2张图片

FFT

FFT是DFT计算的快速方法。

X[k]=∑n=0N−1x[n]e−j2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>X[k]=n=0N1x[n]ej2πkn/NX[k]=∑n=0N−1x[n]e−j2πkn/N

x[n]=1N∑k=0N−1X[k]ej2πkn/N” role=”presentation” style=”text-align: center; position: relative;”>x[n]=1Nk=0N1X[k]ej2πkn/Nx[n]=1N∑k=0N−1X[k]ej2πkn/N

matlab
x=fft(x,N),%计算X[k]
x=ifft(x,N)
     
     
     
     
  • 1
  • 2
  • 3

FFT结果举例

假设x[n]” role=”presentation” style=”position: relative;”>x[n]x[n]

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

     
     
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如何理解FFT_第3张图片
N=256” role=”presentation” style=”position: relative;”>N=256N=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
     
     
     
     
  • 1
  • 2
  • 3
  • 4

matlab数组从1开始,输出1-N,频点间隔是Δf=fsN” role=”presentation” style=”position: relative;”>Δf=fsNΔf=fsN,先输出直流分量,然后是正频分量,再然后是负频分量,在MATLAB中使用fftshift后将频率按,负频分量,直流以及正频分量排列。
如何理解FFT_第4张图片

实信号

如何理解FFT_第5张图片

如何理解FFT_第6张图片

1)实数信号以fs” role=”presentation” style=”position: relative;”>fsfs,则
2)实数信号的fft结果中前半部分是[0,fs/2]” role=”presentation” style=”position: relative;”>[0,fs/2][0,fs/2],这就是直流分量,
3)另外还应该注意到第i个数,实际上等于第N−i” role=”presentation” style=”position: relative;”>NiN−i个数的共轭,
4)所以实际上实数的快速傅里叶算法会利用这个性质减小运算量和存储空间,这是在代码级别的优化
5)在实际频率显示时,某些场合期望得到[−fs/2,fs/2]” role=”presentation” style=”position: relative;”>[fs/2,fs/2][−fs/2,fs/2]显示频谱,通常会使用matlab 的fftshift来实现这个功能。

复信号

1)对于复信号没有负频率,以fs” role=”presentation” style=”position: relative;”>fsfs
2)在f>fs/2” role=”presentation” style=”position: relative;”>f>fs/2f>fs/2时,对复信号的fft结果进行fftshift会产生频谱混跌。

                                            
                                

看完前辈的解读,似乎更懂傅立叶这家伙了。
转自:https://blog.csdn.net/shichaog/article/details/75692855#reply

你可能感兴趣的:(傅里叶)