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;
%% 注釋
% 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過小時會使頻譜圖失真,如下圖所示。
參考**:
【matlab中fft的正確簡單理解】
基於matlab的FFT分析
離散傅利葉變換dft的計算公式如下,fft為dft的一種快速演算法。n 64時 fs 100 取樣頻率 n 64 資料點數 n 0 n 1 抽樣間隔ts 1 fs,所以t n ts n fs為時間序列 t n fs 時間序列 x 0.5 sin 2 pi 15 t 2 sin 2 pi 40 t y...
FFT和Matlab中操作FFT
fft 離散傅氏變換的快速演算法 fft fast fourier transformation 是離散傅氏變換 dft 的快速演算法。即快速傅氏變換。輸入n 1個數,輸出n 1個數 意義不同 輸入是時域,輸出為頻域 輸出是 每個取樣點對應的振幅或者能量值 輸出值的第乙個對應直流分量的振幅,第二個值...
MATLAB中FFT函式的意義
文章 fft是離散傅利葉變換的快速演算法,可以將乙個訊號變換到頻域。有些訊號在時域上是很難看出什麼特徵的,但是如果變換到頻域之後,就很容易看出特徵了。這就是很多訊號分析採用 fft變換的原因。另外,fft可以將乙個訊號的頻譜提取出來,這在頻譜分析方面也是經常用的。模擬訊號經過adc取樣之後變成數碼訊...