实 DFT:
时域信号分为周期/非周期,连续和离散,这样有四种样式的傅里叶变换。
如上可以看到,在一个域的离散信号,在另一个域将变成周期的。类似的,在一个域连续的信号,在另外一个域必然是非周期的。
1DFT
分为实数和复数版本的DFT,实数版本输入是实数,得到的频域点将有两个集 合,分别是cos 和sin 函数的系数。复数输入表示的是正负频率。
实 DFT:
对于输入是x(n) 的N 点DFT,将获得N/2+1的两组cos 和sin 系数。
根据系数获取原始输入时,需要对Xre[0] 和Xre[N/2]除以2。
复 DFT:
对于N 点复数DFT 变换后得到的是N 点X[k]。
变换后的X[0] 是直流分量,1∼N/2是正频成分,X[N/2] 是奈奎斯特频率,接下来的N/2−1是负频分量。
从频谱获得原始输入信号的公式是:
当时域信号是实数时,计算复DFT 时将虚部填零,下图是matlab fft 函数计算的DFT 结果。
2FFT
FFT 是DFT 计算的快速方法。
matlab
x=fft(x,N),%计算X[k]
x=ifft(x,N)
FFT结果举例:
假设x[n] 是频率fc=10Hz余弦信号,采样率是fs=32∗fc。
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]');
做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=fs/N,先输出直流分量,然后是正频分量,再然后是负频分量。在MATLAB 中使用fftshift 后,将频率按负频分量、直流以及正频分量排列。
实信号:
实数信号以fs 为采样率,那奎斯特采样定理表明混跌频率是fs/2,则实数信号的fft 结果中前半部分是[0,fs/2],后半部分是[fs/2,fs]。由于周期性,在频谱不混跌的情况下,后半部分等于[−fs/2,0],在上图中看到第一个数是36+0i,这就是直流分量。另外,还应该注意到第i 个数,实际上等于第N−i 个数的共轭。所以,实际上实数的快速傅里叶算法 会利用这个性质减小运算量和存储空间,这是在代码级别的优化。在实际频率显示时,某些场合期望得到[−fs/2, fs/2]显示频谱,通常会使用matlab 的fftshift 来实现这个功能。
复信号: