MATLAB中FFT的使用说明(含MATLAB代码)
一 FFT的使用方法
在matlab中常用的FFT函數(shù)有以下幾種方式:(詳細的使用說明可以百度matlab官網(wǎng)中FFT函數(shù)的介紹)
X=FFT(x);
X=FFT(x,N);
x=IFFT(X);
x=IFFT(X,N)
二 下面直接使用案例對FFT函數(shù)進行介紹
案例一:x=1*sin(2*pi*15*t)+4*sin(2*pi*40*t)。采樣頻率fs=100Hz,分別繪制N=128、1024點幅頻圖。
解:fft本質(zhì)上是在頻域?qū)δ承盘柗治?#xff0c;其fft結(jié)果對應的頻率即表示某信號的固有頻率。案例一中的信號含有兩個頻率即15Hz和40Hz,其對應的幅值比例是1:4.下面對上述信號進行fft
fs=100;N=128; %采樣頻率和數(shù)據(jù)點數(shù) 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; %頻率序列figure(1) 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; %對信號采樣數(shù)據(jù)為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;上述代碼運行結(jié)果是:
?分析:fs=100Hz,則Nyquist頻率為fs/2=50Hz。理論上,整個頻譜圖是以Nyquist頻率為對稱軸的。并且可以明顯識別出信號中含有兩種頻率成分:15Hz和40Hz。
由此可以知道FFT變換數(shù)據(jù)的對稱性。因此用FFT對信號做譜分析,只需考察0~Nyquist頻率范圍內(nèi)的幅頻特性。若沒有給出采樣頻率和采樣間隔,則分析通常對歸一化頻率0~1進行。
另外,振幅的大小與所用采樣點數(shù)有關,采用128點和1024點的相同頻率的振幅是有不同的表現(xiàn)值,但在同一幅圖中,40Hz與15Hz振動幅值之比均為4:1,與真實振幅4:1是一致的。為了與真實振幅對應,需要將變換后結(jié)果乘以2除以N即可。
案例2:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t),fs=100Hz,繪制:
1.數(shù)據(jù)個數(shù)N=32,FFT所用的采樣點數(shù)NFFT=32;
2.N=32,NFFT=128;
3.N=136,NFFT=128;
4.N=136,NFFT=512。
上述四種情況下fft代碼如下:
fs=100; %采樣頻率 Ndata=32; %數(shù)據(jù)長度 N=32; %FFT的數(shù)據(jù)長度 n=0:Ndata-1;t=n/fs; %數(shù)據(jù)對應的時間序列 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; %數(shù)據(jù)個數(shù) N=128; %FFT采用的數(shù)據(jù)長度 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; %數(shù)據(jù)個數(shù) N=128; %FFT采用的數(shù)據(jù)個數(shù) 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; %數(shù)據(jù)個數(shù) N=512; %FFT所用的數(shù)據(jù)個數(shù) 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.當數(shù)據(jù)個數(shù)和FFT采用的數(shù)據(jù)個數(shù)均為32時,頻率分辨率較低,但沒有由于添零而導致的其他頻率成分。
2.由于在時間域內(nèi)信號加零,致使振幅譜中出現(xiàn)很多其他成分,這是加零造成的。其振幅由于加了多個零而明顯減小。
3.FFT程序?qū)?shù)據(jù)截斷,這時分辨率較高。
4.也是在數(shù)據(jù)的末尾補零,但由于含有信號的數(shù)據(jù)個數(shù)足夠多,FFT振幅譜也基本不受影響。
5.對信號進行頻譜分析時,數(shù)據(jù)樣本應有足夠的長度,一般FFT程序中所用數(shù)據(jù)點數(shù)與原含有信號數(shù)據(jù)點數(shù)相同,這樣的頻譜圖具有較高的質(zhì)量,可減小因補零或截斷而產(chǎn)生的影響
總結(jié)
以上是生活随笔為你收集整理的MATLAB中FFT的使用说明(含MATLAB代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作312:uni-弹出框显示数据
- 下一篇: [vue-cli]不用vue-cli,你