1.基本功能
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。通过FFT变换可以对信号进行频谱分析,其对应的数学表达式如下:
在MATLAB对信号的频谱分析中,模拟信号X(t)经过采样后得到含有N个采样点的数字信号X(n),取N点进行FFT变换后,可以得到对应数量的FFT结果。
2.函数调用
Y = fft(X,n,dim)
其中,X为输入离散信号的序列,参数n(可省略)表示采样点数量,参数dim(可省略)影响X中向量的取法,fft函数将返回快速傅里叶变换结果Y。
输入的离散信号X可取向量、矩阵、多维数组,其在MATLAB中的具体取法如下。
参数n为进行FFT变换的点数,与X的信号长度关系如下。
3.参数n对频谱分析的影响
4.编程实现
以信号x(n)为例,通过编程可得到该信号的频谱图。完整代码见文末,此处对求频谱过程的代码进行一些说明。
% 采样点数取1200 FFT变换个数取240 信号周期取(1/50) (1/150)
window=0.2*fs;
kn=2/window*fft(s1(1:window)); % FFT模值与信号幅值关系
z=fftshift(kn); % fftshift
am=abs(z);
phase=angle(z);
FFT幅值与信号幅值关系:假设原始信号的幅值为A,窗长取N,FFT输出的模值为Y,则除了第一个点外的点,信号幅值与FFT模值有如下对应关系:A=2/N*Y,第一个点为直流分量,它的模值就是直流分量的N倍。
原因: FFT结果除以N得到双边谱,再乘以2得到单边谱。零频在双边谱中本没有被一分为二,故只需要除N即可。
对于FFT得到的频谱,横轴显示顺序为:由0开始的由小到大的正频率、0、绝对值由大到小的负频率。故要得到正确的结果,需要以0hz为中心,将右半边的负频率平移至左半边。通过函数fftshift可以实现上述变化。
即:为得到与横坐标轴对应的频谱,需要将fft后的结果通过函数fftshift进行处理。
fftshift后的fft结果
5.fft相位问题
1.噪声信号过滤
为了避免输入信号s(n)经matlab求取FFT后,引入的一些幅值极小但对相位有影响的计算量,需要在相位分析前引入如下代码,实现对FFT结果的过滤。滤除前后对比图如下。
tol = 1e-6;
z(abs(z) < tol) = 0;
theta = angle(z);
滤波前
滤波后
2.初相位设置
中n的取值从1开始时,50Hz信号的初相位为,相位结果如下图:
n取值从0开始时,50Hz信号的初相位才是,即: