天天看點

matlab fft輸出,轉:MATLAB中FFT的使用方法

說明:以下資源來源于《數字信号處理的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;

運作結果:

matlab fft輸出,轉: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; �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;

matlab fft輸出,轉:MATLAB中FFT的使用方法

結論:

(1)當資料個數和FFT采用的資料個數均為32時,頻率分辨率較低,但沒有由于添零而導緻的其他頻率成分。

(2)由于在時間域内信号加零,緻使振幅譜中出現很多其他成分,這是加零造成的。其振幅由于加了多個零而明顯減小。

(3)FFT程式将資料截斷,這時分辨率較高。

(4)也是在資料的末尾補零,但由于含有信号的資料個數足夠多,FFT振幅譜也基本不受影響。

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

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

matlab fft輸出,轉:MATLAB中FFT的使用方法

(1)資料點過少,幾乎無法看出有關信号頻譜的詳細資訊;

(2)中間的圖是将x(n)補90個零,幅度頻譜的資料相當密,稱為高密度頻譜圖。但從圖中很難看出信号的頻譜成分。

(3)信号的有效資料很長,可以清楚地看出信号的頻率成分,一個是0.24Hz,一個是0.26Hz,稱為高分辨率頻譜。

可見,采樣資料過少,運用FFT變換不能分辨出其中的頻率成分。添加零後可增加頻譜中的資料個數,譜的密度增高了,但仍不能分辨其中的頻率成分,即譜的分辨率沒有提高。隻有資料點數足夠多時才能分辨其中的頻率成分。

======================評論======================================

1)FFT的算法與奈奎斯特頻率沒有關系,奈奎斯特頻率隻是用來避免頻率的混疊。

2)對稱是因為fft本身算法産生的吧!奈奎斯特頻率是系統最高頻率*2得到的最低采樣頻率,和fft沒有關系啊,如果低于奈奎斯特頻率采樣,就會發生頻譜混疊,是把大于系統最高頻率的部分對稱加到小于的部分,發生混疊現象。

3)"頻譜圖是以Nyquist頻率為對稱軸的"這句話不對。對稱軸是N/2