FFT就是快速傅里叶变换(Fast Fourier Transform),在Matlab中它是实现离散傅立叶变换DFT(Discrete Fourier Transform)的快速算法。作为对信号进行频谱分析的有力工具,它的实现很简单,一条语句就可以:
Y = fft(x) 或 Y = fft(x, N)
可以自己指定FFT变换的点数为N,也可以不指定,变换后Y的维数与x完全一致。
设x的维数为m,若m<N, 则fft函数会在x 序列末尾添加0,增加其长度到N; 若m>N, 则会截取x 的前N个序列元素进行fft变换。
频率分析的目的是通过分析信号的频谱组成,实现对信号特性的分析,便于后续的处理。时域信号一般可分为连续和离散信号,在计算机中处理的信号都要求为离散信号,即对于实际系统输入的连续模拟信号,首先要进行模/数转换(A/D转换)变为数字信号,之后才能在计算机中处理分析,这一般通过数据采集卡的A/D转换模块来完成。
对于已经采集到计算机中的离散数字信号,可以通过FFT变换实现原时域信号的频谱分析。这其中要考虑的几个重要问题包括:
1) 采样频率的设定:
Nyquist条件给出了采样频率设定的基本原则, 即采样频率必须大于等于信号频率的2倍。具体设定时,采样频率要能够大于等于信号中最高频率分量值的2倍,令fs表示采样频率,fh表示信号频谱的最高频率,那么要求: fs>=2fh, 否则将出现频谱混叠现象。一般在工程上选择采样频率为信号最高频率的5~10倍。
2) 采样长度的设定:
在模拟进行频谱分析时,要自行设定采样点数N或采样的时间长度T。
在FFT变换后,频谱中能够区分出的最小频率刻度就是变换后的频率分辨率,满足:df=fs/n, n为FFT 变换的点数;即FFT结果只能表示k*df (k=0,1,2,…)频率坐标上的信号幅值,如果信号中的频率分量值不等于k*df,而介于k*df与(k+1)*df之间时,FFT变换的结果会将该频率分量的幅值泄露到其邻近的频率坐标位置上,从而出现FFT分析的信号泄露情况。因此,应当合理设定采样点数,使得信号中的各频率分量值能够被df整除,从而使得变换后的信号频谱能够更好地描述信号特性。
3) FFT变换特性:
FFT算法特性使得变换后不仅包括正频率部分,也包括负频率部分,如设置采样频率为120Hz,采样信号中包括频率分量10Hz、50Hz,则可知满足Nyquist采样定理,不会出现频谱混叠;经过FFT变换后,在频率坐标的10Hz和50Hz位置处将出现频谱峰值,而在110Hz和70Hz位置也同样出现,其实即是变换后的负频率成分-10Hz、-50Hz搬移120Hz后的结果。因此在分析上仅使用单边的变换结果就够用了。
Matlab中FFT变换实现频谱分析的基本代码如下:
fs = 100; % 设定采样频率
N = 100; % 设定采样的点数
t = [0:(N-1)]*(1/fs);
% 生成仿真的时域信号,用采样频率fs对其采样
x = 1/fs*sin(2*pi*25*t); % 信号频率为25Hz
% 画出时域波形
figure(1)
plot(t,x);
grid on
title('时域信号x(t)');
xlabel('t')
ylabel('x(t)')
% 对x(t)进行FFT变换
Y = fft(x)/N;
magY = 2*abs(Y(1:1:N/2)); % 求出信号的频谱幅值
f = (0:N/2-1)*fs/N; % 设定频域的频率坐标轴分量值,频率分辨率为fs/N
figure(2)
plot(f,magY); % 绘制连续的幅频响应曲线
figure(3)
h = stem(f,magY,'fill','--'); % 采用stem函数绘制离散的幅频响应曲线
set(h,'MarkerEdgeColor','red','Marker','*')
grid on
title('x(t)的幅频响应');
xlabel('频率(Hz)')
ylabel('幅值')
以下结果是我的另一个仿真程序的运行结果,通过设定不同的变换点数,可以发现有效避免了“信号泄露”现象。