matlab 中fft的用法

一.調用方法

X=FFT(x);
X=FFT(x,N);
x=IFFT(X);
x=IFFT(X,N)

用MATLAB進行譜分析時注意:

(1)函數FFT返回值的數據結構具備對稱性。

例:
N=8;
n=0:N-1;
xn=[4 3 2 6 7 8 9 0];
Xk=fft(xn)


Xk =數據結構

39.0000           -10.7782 + 6.2929i        0 - 5.0000i   4.7782 - 7.7071i   5.0000             4.7782 + 7.7071i        0 + 5.0000i -10.7782 - 6.2929i


Xk與xn的維數相同,共有8個元素。Xk的第一個數對應於直流份量,即頻率值爲0。

(2)作FFT分析時,幅值大小與FFT選擇的點數有關,但不影響分析結果。在IFFT時已經作了處理。要獲得真實的振幅值的大小,只要將獲得的變換後結果乘以2除以N便可。

二.FFT應用舉例

例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。採樣頻率fs=100Hz,分別繪製N=12八、1024點幅頻圖。

clf;
fs=100;N=128;   %採樣頻率和數據點數
n=0:N-1;t=n/fs;   %時間序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信號
y=fft(x,N);    %對信號進行快速Fourier變換
mag=abs(y);     %求得Fourier變換後的振幅
f=n*fs/N;    %頻率序列
subplot(2,2,1),plot(f,mag);   %繪出隨頻率變化的振幅
xlabel('頻率/Hz');
ylabel('振幅');title('N=128');grid on;
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %繪出Nyquist頻率以前隨頻率變化的振幅
xlabel('頻率/Hz');
ylabel('振幅');title('N=128');grid on;
%對信號採樣數據爲1024點的處理
fs=100;N=1024;n=0:N-1;t=n/fs;
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信號
y=fft(x,N);   %對信號進行快速Fourier變換
mag=abs(y);   %求取Fourier變換的振幅
f=n*fs/N;
subplot(2,2,3),plot(f,mag); %繪出隨頻率變化的振幅
xlabel('頻率/Hz');
ylabel('振幅');title('N=1024');grid on;
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2)); %繪出Nyquist頻率以前隨頻率變化的振幅
xlabel('頻率/Hz');
ylabel('振幅');title('N=1024');grid on;

運行結果:
MATLAB中FFT的使用方法 - 飛來瘋 - 瘋在宇宙之巔函數

fs=100Hz,Nyquist頻率爲fs/2=50Hz。整個頻譜圖是以Nyquist頻率爲對稱軸的。而且能夠明顯識別出信號中含有兩種頻率成分:15Hz和40Hz。由此能夠知道FFT變換數據的對稱性。所以用FFT對信號作譜分析,只需考察0~Nyquist頻率範圍內的福頻特性。若沒有給出採樣頻率和採樣間隔,則分析一般對歸一化頻率0~1進行。另外,振幅的大小與所用採樣點數有關,採用128點和1024點的相同頻率的振幅是有不一樣的表現值,但在同一幅圖中,40Hz與15Hz振動幅值之比均爲4:1,與真實振幅0.5:2是一致的。爲了與真實振幅對應,須要將變換後結果乘以2除以N。

例2:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t),fs=100Hz,繪製:
(1)數據個數N=32,FFT所用的採樣點數NFFT=32;
(2)N=32,NFFT=128;
(3)N=136,NFFT=128;
(4)N=136,NFFT=512。

clf;fs=100; %採樣頻率
Ndata=32; %數據長度
N=32; %FFT的數據長度
n=0:Ndata-1;t=n/fs;   %數據對應的時間序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);   %時間域信號
y=fft(x,N);   %信號的Fourier變換
mag=abs(y);    %求取振幅
f=(0:N-1)*fs/N; %真實頻率
subplot(2,2,1),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率以前的振幅
xlabel('頻率/Hz');ylabel('振幅');
title('Ndata=32 Nfft=32');grid on;ui

Ndata=32;   %數據個數
N=128;     %FFT採用的數據長度
n=0:Ndata-1;t=n/fs;   %時間序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
y=fft(x,N);
mag=abs(y);
f=(0:N-1)*fs/N; %真實頻率
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率以前的振幅
xlabel('頻率/Hz');ylabel('振幅');
title('Ndata=32 Nfft=128');grid on;.net

Ndata=136;   %數據個數
N=128;     %FFT採用的數據個數
n=0:Ndata-1;t=n/fs; %時間序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
y=fft(x,N);
mag=abs(y);
f=(0:N-1)*fs/N;   %真實頻率
subplot(2,2,3),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率以前的振幅
xlabel('頻率/Hz');ylabel('振幅');
title('Ndata=136 Nfft=128');grid on;blog

Ndata=136;    %數據個數
N=512;    %FFT所用的數據個數
n=0:Ndata-1;t=n/fs; %時間序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
y=fft(x,N);
mag=abs(y);
f=(0:N-1)*fs/N;   %真實頻率
subplot(2,2,4),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率以前的振幅
xlabel('頻率/Hz');ylabel('振幅');
title('Ndata=136 Nfft=512');grid on;get

MATLAB中FFT的使用方法 - 飛來瘋 - 瘋在宇宙之巔

結論:
(1)當數據個數和FFT採用的數據個數均爲32時,頻率分辨率較低,但沒有因爲添零而致使的其餘頻率成分。
(2)因爲在時間域內信號加零,導致振幅譜中出現不少其餘成分,這是加零形成的。其振幅因爲加了多個零而明顯減少。
(3)FFT程序將數據截斷,這時分辨率較高。
(4)也是在數據的末尾補零,但因爲含有信號的數據個數足夠多,FFT振幅譜也基本不受影響。

     對信號進行頻譜分析時,數據樣本應有足夠的長度,通常FFT程序中所用數據點數與原含有信號數據點數相同,這樣的頻譜圖具備較高的質量,可減少因補零或截斷而產生的影響。it

例3:x=cos(2*pi*0.24*n)+cos(2*pi*0.26*n)grid

MATLAB中FFT的使用方法 - 飛來瘋 - 瘋在宇宙之巔(1)數據點過少,幾乎沒法看出有關信號頻譜的詳細信息;
(2)中間的圖是將x(n)補90個零,幅度頻譜的數據至關密,稱爲高密度頻譜圖。但從圖中很難看出信號的頻譜成分。
(3)信號的有效數據很長,能夠清楚地看出信號的頻率成分,一個是0.24Hz,一個是0.26Hz,稱爲高分辨率頻譜。
        可見,採樣數據過少,運用FFT變換不能分辨出其中的頻率成分。添加零後可增長頻譜中的數據個數,譜的密度增高了,但仍不能分辨其中的頻率成分,即譜的分辨率沒有提升。只有數據點數足夠多時才能分辨其中的頻率成分。程序

相關文章
相關標籤/搜索