matlab中 FFT 函數的使用 學習記錄
1、學習啟示
N=1024; %采樣點數為1024
Fs=1000; %采樣頻率為1000Hz
t=[0:1/Fs:(N-1)/Fs]; %采樣時刻 t的長為N
s=2+3*cos(2*pi*200*t+60*pi/180)+4*cos(2*pi*300*t+120*pi/180); %對信号采樣 這裡注意是連續t 因為已經對時間做了nt處理了
Y=fft(s); %FFT運算
y=abs(Y);
for i=1:N/2;
x(i)=(i-1)*Fs/N; //将時間點換算為相應頻率
yy(i)=y(i); %取N/2點的FFT模值——>FFT的變換是一般部分的點嗎?需要再回顧一下
end
yy=yy/(N/2); %做幅值變換,變換到時域信号的幅值
yy(1)=yy(1)/2;
plot(x,yy);
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP31UeBR1TyEFVNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzITN0UTMxcTM3ITNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
上圖為FFT的幅頻特性圖。由上圖可以看出,在200Hz和300Hz頻點處幅值比原始信号(3、4)要低。這是因為對信号進行非整數倍周期采樣(截斷),産生頻譜洩露。??
在同樣條件下(N=1024,F=1000Hz)對信号s=2+1.5∙cos2π∙125∙t+60°+2.5∙cos2π∙250∙t+120°進行處理得到的FFT幅頻特性圖。可以看到由于是對信号進行整數倍的采樣,不存在截斷誤差引起的頻譜洩露。在125Hz頻點和250Hz頻點處幅值與原始信号相同。
以下實驗心得來自于上面的例子,感謝
一)原文連結:https://blog.csdn.net/fucong59/article/details/89218385
二)原文連結:https://blog.csdn.net/flypassion/article/details/82055703
2、上面待解決的理論問題:
- 對信号進行非整數倍周期采樣,導緻頻譜洩露??
- 計算上再複習FFT運算,看看為什麼是隻要一半N/2的點即可??
- 另外,在看s的表達式時,一開始糊塗了,以為po主寫的不對,應将s離散化,運作才明白,其實一開始已經将t作離散了?,是以在s表達式中就不需要 f*n/fs 了。
3、心得記錄
①假設采樣頻率為Fs,信号頻率為F,采樣點數為N。則FFT之後結果也為N點複數,其中每一個點對應着一個頻率點,該點複數的模值為原始信号在該頻率值下的幅度特性。具體為:
- 假設原始信号在某頻率點的幅值為A,則該頻點對應的FFT點複數的模值為A的N/2倍。而FFT第一點為原始信号的直流分量,其模值為原始信号模值的N倍。
- 對于相位,FFT複數的相位即為原始信号在該頻率點處的相位。
是以,在一開始的實驗中,我的plot(t1,m2)将時間坐标軸與FFT之後的M2序列放在一起畫是錯誤的,不是幅頻響應圖像!這裡應該是下面程式裡的x(i),其意義是x軸的頻率點。他的長度與采樣後的序列長度相等,也如①所說,與FFT的複數序列長度相等,這樣就是一一對應的坐标關系咯。
另外還有上面提到的FFT複數的模值與原始信号幅度對應問題需要 除 以➗ (N/2),如果還要畫相位的話可以不用操作。*
②FFT後的N點複數,第一點表示直流分量(0Hz),而最後一點的下一點(實際不存在,假設為第N+1點)表示的頻率為采樣頻率(Fs),這中間被N-1個點平均分為N等份,每點頻率依次增加。例如,第k點所表示的頻率為:FK=(K-1)Fs/N。是以FFT所能達到的頻率分辨率為Fs/N。
③FFT結果以N/2對稱!!(換算為頻率即為乃奎斯特頻率,Fs/2)
是以我們隻需要前半部分的結果,即在乃奎斯特頻率内的結果。
是以,基于上面例子的啟示完成的我的作業部分如下
m2=fft(c );
y=abs(m2);
for i=1:size(c,1)/2 %隻取前半部分的采樣點 這樣畫出的圖不再對稱咯,隻有靠近縱坐标軸的部分啦
x(i)=(i-1)*44100/size(c,1); % x軸頻率點修改 44100是作業的采樣頻率 k*fs/N
yy(i)=y(i);
end
yy=yy/(size(c,1)/2) %對FFT得到的複數的幅值進行修正 yy/(N/2)
yy(1)=yy(1)/2;
plot(x,yy); %隻取N的一半的采樣點數即可!
4、總結修改的内容
完成我的作業,有了如下改進
- 頻譜關于中間位置對稱,隻需要觀察 0:1:N/2(這N/2+1個點)(時域采集N個點,頻域隻需要觀察N/2+1個點)
- MATLAB中FFT的頻譜,應該看幅值,對複數幅值修正
- X軸頻率點的設定:采樣頻率為Fs,頻譜圖顯示的最高頻率為Fs/2(采樣定理):X軸頻率點:(0:1:N/2)*Fs/N
markdown好難用。。我彩色的标記全無了 L>T_T<I