MATLAB中FFT的分析總結

2021-08-29 16:17:20 字數 3368 閱讀 3960

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取樣之後變成數碼訊...