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('幅值')
以下結果是我的另一個仿真程序的運行結果,通過設定不同的變換點數,可以發現有效避免了“信號泄露”現象。