1. 程式人生 > >MATLAB中FFT的分析總結

MATLAB中FFT的分析總結

1、取樣頻率和取樣週期的設定: 取樣頻率的設定應滿足奈奎斯特准則,當取樣頻率設定之後求倒數即為取樣週期。 如: Fs = 1000; % Sampling frequency 取樣頻率 T = 1/Fs; % Sampling period 取樣週期

2、取樣點數的確定: – 若想要規定取樣點數,則採用如下方式: L = 1000; % Length of signal 對訊號的取樣點數 t = (0:L-1)*T; % Time vector 取樣的時間點序列 –若想要規定時間範圍則採用如下方式: t = -5:T:5; L = length(t);

3、頻率的解析度: 時域的取樣頻率決定了頻域的最大值(fmax=fs),所以在已知訊號的時域取樣率後,可得頻率域的解析度ff,即ff=fs/N. 其中N為做FFT的點數,可以根據解析度的需要來自行設定,在沒有輸入N的情況下系統預設為訊號時域的取樣點數L!但是注意設定的N值要產生的最小解析度要小於被分析訊號頻率間的最小差值,要不然會失真! 如: –不輸入N時,fft(X)中N預設為為取樣點數L。 –輸入N時,fft(X,N)即對X做N(可自由設定)點fft。 N值雖可以自由設定,但N值越小,頻率解析度越大,當頻率解析度大於訊號最小頻率分量時,得到的頻譜會失真。

4、頻率軸的處理 頻率軸的歸一化: 經過N點FFT得到的頻譜被分成N份範圍為[0 fs],不是真實的頻域。要想獲得真正的頻率軸,需要對頻率軸進行歸一化處理: f = Fs*(0:(N-1))/N; 頻率軸歸一化之後做平移(利用fftshift())使其關於0對稱: 做完fft之後在做fftshift(),同時對頻率軸進行歸一化和平移處理 Y = fft(X); Y1 = fftshift(Y); f = Fs*(((-L)/2):(L/2-1))/L;

參考程式碼: clc; clear; close;

%% 註釋 % MATLAB_help註釋 + 個人理解註釋 Fs = 1000; % Sampling frequency 取樣頻率 T = 1/Fs; % Sampling period 取樣週期 % 根據需要設定L和t序列;想要確定取樣點數則用方式1;想要確定時間範圍則用方式2 % L = 1000; % Length of signal 對訊號的取樣點數 % t = (0:L-1)*T; % Time vector 取樣的時間點序列 t = -5:T:5; L = length(t);

%% 對訊號進行取樣 S = 0.7sin(2pi50t) + sin(2pi120t); X = S + 1randn(size(t));

%% 對取樣訊號做一系列FFT處理 fft(x)預設做L點的FFT,L為取樣點數 figure(1); plot(1000*t(1:100),X(1:100)) title(‘Signal Corrupted with Zero-Mean Random Noise’) xlabel(‘t (milliseconds)’) ylabel(‘X(t)’)

% 對加噪聲訊號做FFT Y = fft(X); Y1 = fftshift(Y); figure(2) plot(abs(Y)) title(‘未做歸一化處理的FFT結果’)

P2 = abs(Y/L); f = Fs*(0:(L-1))/L; figure(3); plot(f,P2) title(‘Single-Sided Amplitude Spectrum of X(t)’) xlabel(‘f (Hz)’) ylabel(’|P1(f)|’) legend(‘fft變換後,歸一化且對頻率進行正確化後的頻譜圖’);

P1 = P2(1:L/2+1); % P1(2:end-1) = 2P1(2:end-1); f = Fs(0:(L/2))/L; figure(4); plot(f,P1) title(‘Single-Sided Amplitude Spectrum of X(t)’) xlabel(‘f (Hz)’) ylabel(’|P1(f)|’) legend(‘fft變換後,歸一化且對頻率進行正確化後,取一半的 頻譜圖’);

f = Fs*(((-L)/2):(L/2-1))/L; figure(5); plot(f,abs(Y1)/L) title(‘Single-Sided Amplitude Spectrum of X(t)’) xlabel(‘f (Hz)’) ylabel(’|P1(f)|’) legend(‘fft變換後,歸一化且對頻率進行正確化後,並做了頻譜搬移 頻譜圖’);

%% 對取樣訊號做一系列N點的FFT處理 fft(x,N) N = 128; y1 = fft(X,N); y1 = abs(y1)/N; f = Fs*(0:(N-1))/N; plot(f,y1) title(‘Single-Sided Amplitude Spectrum of X(t)’) xlabel(‘f (Hz)’) ylabel(’|P1(f)|’)

程式對應的模擬結果: 在這裡插入圖片描述

為了便於顯示,僅取時域波形的一段進行顯示。

在這裡插入圖片描述

從圖中可以看出,未做歸一化處理之前,縱軸值很大,橫軸對應著fft的點數。

在這裡插入圖片描述

從圖中可以看出,歸一化處理之後,頻譜圖的範圍為[0 fs],但實際的頻譜範圍應該為[-fs/2  fs/2],所以還需要做一下平移,如下圖所示。

在這裡插入圖片描述

當進行N點fft時,N過小時會使頻譜圖失真,如下圖所示。

在這裡插入圖片描述