matlab中FFT的使用
2017-02-14 by:CAE仿真在線 來源:互聯(lián)網
一.調用方法
X=FFT(x);
X=FFT(x,N);%當x的長度小于N,則會在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,值為xn各元素的和。
(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=128、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;
運行結果:
fs=100Hz,Nyquist頻率為fs/2=50Hz。整個頻譜圖是以Nyquist頻率為對稱軸的。并且可以明顯識別出信號中含有兩種頻率成分:15Hz和40Hz。由此可以知道FFT變換數據的對稱性。因此用FFT對信號做譜分析,只需考察0~Nyquist頻率范圍內的福頻特性。若沒有給出采樣頻率和采樣間隔,則分析通常對歸一化頻率0~1進行。另外,振幅的大小與所用采樣點數有關,采用128點和1024點的相同頻率的振幅是有不同的表現(xiàn)值,但在同一幅圖中,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; ?T的數據長度
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;
Ndata=32;
%數據個數
N=128;
?T采用的數據長度
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;
Ndata=136;
%數據個數
N=128;
?T采用的數據個數
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;
Ndata=136;
%數據個數
N=512;
?T所用的數據個數
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;
結論:
(1)當數據個數和FFT采用的數據個數均為32時,頻率分辨率較低,但沒有由于添零而導致的其他頻率成分。
(2)由于在時間域內信號加零,致使振幅譜中出現(xiàn)很多其他成分,這是加零造成的。其振幅由于加了多個零而明顯減小。
(3)FFT程序將數據截斷,這時分辨率較高。
(4)也是在數據的末尾補零,但由于含有信號的數據個數足夠多,FFT振幅譜也基本不受影響。
對信號進行頻譜分析時,數據樣本應有足夠的長度,一般FFT程序中所用數據點數與原含有信號數據點數相同,這樣的頻譜圖具有較高的質量,可減小因補零或截斷而產生的影響。
相關標簽搜索:matlab中FFT的使用 MatLab培訓 MatLab培訓課程 MatLab在線視頻教程 MatLab技術學習教程 MatLab軟件教程 MatLab資料下載 MatLab代做 MatLab基礎知識 Fluent、CFX流體分析 HFSS電磁分析 Ansys培訓 Abaqus培訓