MATLAB中FFT的使用方法

來源:互聯網
上載者:User

轉自:http://hi.baidu.com/zhaolinger_789/item/1b4d9ff47b10e3d86325d28c

說明:以下資源來源於《數字訊號處理的MATLAB實現》萬永革主編

一.調用方法

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=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點的相同頻率的振幅是有不同的表現值,但在同一幅圖中,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;

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;

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;

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;

結論:
(1)當資料個數和FFT採用的資料個數均為32時,頻率解析度較低,但沒有由於添零而導致的其他頻率成分。
(2)由於在時間域內訊號加零,致使振幅譜中出現很多其他成分,這是加零造成的。其振幅由於加了多個零而明顯減小。
(3)FFT程式將資料截斷,這時解析度較高。
(4)也是在資料的末尾補零,但由於含有訊號的資料個數足夠多,FFT振幅譜也基本不受影響。

對訊號進行頻譜分析時,資料樣本應有足夠的長度,一般FFT程式中所用資料點數與原含有訊號資料點數相同,這樣的頻譜圖具有較高的品質,可減小因補零或截斷而產生的影響。

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

(1)資料點過少,幾乎無法看出有關訊號頻譜的詳細資料;
(2)中間的圖是將x(n)補90個零,幅度頻譜的資料相當密,稱為高密度頻譜圖。但很難看出訊號的頻譜成分。
(3)訊號的有效資料很長,可以清楚地看出訊號的頻率成分,一個是0.24Hz,一個是0.26Hz,稱為高解析度頻譜。
可見,採樣資料過少,運用FFT變換不能分辨出其中的頻率成分。添加零後可增加頻譜中的資料個數,譜的密度增高了,但仍不能分辨其中的頻率成分,即譜的解析度沒有提高。只有資料點數足夠多時才能分辨其中的頻率成分。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.