完整版教程下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547
第26章 FFT變換結果的物理意義
FFT是離散傅立葉變換的快速算法,可以將一個信號變換到頻域。有些信號在時域上是很難看出什么特征的,但是如果變換到頻域之后,就很容易看出特征了。這就是很多信號分析采用FFT變換的原因。另外,FFT可以將一個信號的頻譜提取出來,這在頻譜分析方面也是經常用的。本章節的主要內容是講解FFT變換結果的物理意義。
特別聲明:部分知識整理自網絡。
26.1 初學者重要提示
26.2 FFT變換結果的物理意義
26.3 FFT變換的頻譜泄露問題
26.4 總結
26.1 初學者重要提示
- 本章為大家介紹FFT結果的物理意義,如果之前沒有了解過,有必要了解下。
- 下個章節為大家介紹兩個重要知識點:頻譜泄露和柵欄效應,推薦學習完畢本章后看一下。
26.2 FFT變換結果的物理意義
26.2.1 理論闡釋
雖然很多人都知道FFT是什么,可以用來做什么,怎么去做,但是卻不知道FFT之后的結果是什意思、如何決定要使用多少點來做FFT。
一個模擬信號,經過ADC采樣之后,就變成了數字信號。采樣定理告訴我們,采樣頻率要大於信號頻率的兩倍(要滿足奈奎斯特采樣定律)。
采樣得到的數字信號,就可以做FFT變換了。N個采樣點,經過FFT之后,就可以得到N個點的FFT結果。為了方便進行FFT運算,通常N取2的整數次方。
假設采樣頻率為Fs,信號頻率F,采樣點數為N。那么FFT之后結果就是一個為N點的復數。每一個點就對應着一個頻率點。這個點的模值,就是該頻率值下的幅度特性。具體跟原始信號的幅度有什么關系呢?假設原始信號的峰值為A,那么FFT的結果的每個點(除了第一個點直流分量之外)的模值就是A的N/2倍。 而第一個點就是直流分量,它的模值就是直流分量的N倍。而每個點的相位呢,就是在該頻率下的信號的相位。第一個點表示直流分量(即0Hz),而最后一個點 N的再下一個點(實際上這個點是不存在的,這里是假設的第N+1個點,可以看做是將第一個點分做兩半分,另一半移到最后)則表示采樣頻率Fs,這中間被 N-1個點平均分成N等份,每個點的頻率依次增加。例如某點n所表示的頻率為:
由上面的公式可以看出,Fn所能分辨到頻率為 Fs/N,如果采樣頻率Fs為1024Hz,采樣點數為1024點,則可以分辨到1Hz。1024Hz的采樣率采樣1024點,剛好是1秒,也就是說,采樣1秒時間的信號並做FFT,則結果可以分析到1Hz,如果采樣2秒時間的信號並做FFT,則結果可以分析到0.5Hz。如果要提高頻率分辨力,則必須增加采樣點數,也即采樣時間。頻率分辨率和采樣時間是倒數關系。假設FFT之后某點n用復數a+bi表示,那么這個復數的模就是:
相位就是:
根據以上的結果,就可以計算出n點(n≠1,且n<=N/2)對應的信號的表達式為:
對於n=1點的信號,是直流分量,幅度即為A1/N。由於FFT結果的對稱性,通常我們只使用前半部分的結果,即小於采樣頻率一半的結果。
26.2.2 理論計算和Matlab實際計算結果對比
下面以一個實際的信號來做說明:
假設我們有一個信號,它含有2V的直流分量,頻率為50Hz、相位為-30度、幅度為3V的交流信號,以及一個頻率為75Hz、相位為90度、幅度為1.5V的交流信號。用數學表達式就是如下:
x = 2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
式中cos參數為弧度,所以-30度和90度要分別換算成弧度。我們以256Hz的采樣率對這個信號進行采樣,總共采樣256點。按照我們上面的分析,Fn=(n-1)*Fs/N,我們可以知道,每兩個點之間的間距就是1Hz,第n個點的頻率就是n-1。我們的信號有3個頻率:0Hz、50Hz、75Hz,應該分別在第1個點、第51個點、第76個點上出現峰值,其它各點應該接近0。實際情況如何如下:
- 第一步:在matlab上新建.m文件,文件內容如下:
Fs = 256; % 采樣率 N = 256; % 采樣點數 n = 0:N-1; % 采樣序列 t = 0:1/Fs:1-1/Fs; % 時間序列 x = 2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180) ; %原始信號 y = fft(x); %對原始信號做FFT變換 M = abs(y); %求FFT轉換結果的模值 plot(n, M); %繪制FFT轉換模值的曲線
- 第二步:運行后顯示效果如下:
- 第三步:從matlab的工作區獲得幾個關鍵點及其附近兩個點的幅值:
1點,2點,3點的數值如下:
50點,51點,52點的數值如下:
75點,76點,77點的數值如下:
按照上面說的公式,可以計算出:
直流分量為: 512/N=512/256=2;
50Hz信號的幅度為:384/(N/2)=384/(256/2)=3;
75Hz信號的幅度為:192/(N/2)=192/(256/2)=1.5。可見,從頻譜分析出來的幅度是正確的。
- 第四步:計算相位
計算相位要獲取FFT變換后相應頻率點幅值的實部和虛部,這里看第一步代碼中的y變量數值即可。
由於直流信號沒有相位可言。這里主要看50Hz的相位和75Hz的相位。
1、計算50Hz信號的相位。
y變量的第51點對應數值:332.553755053225 - 192.000000000000i
那么atan2(-192, 332.553)=-0.5236,這個結果是弧度,換算成角度180*(-0.5236)/pi=-30.0001。
這個結果與cos(2*pi*50*t-pi*30/180)中相位是相符的。
2、計算75Hz信號的相位。
y變量的第76點對應數值:3.43858275186904e-12 + 192.000000000000i
那么atan2(192, 3.43858275186904e-12)=1.5708弧度,換算成角度180*1.5708/pi=90.0002。這個結果與cos(2*pi*75*t+pi*90/180)中的相位是相符的。
- 總結
根據FFT結果以及上面的分析計算,我們就可以寫出信號的表達式了,它就是我們開始提供的信號。
總的來說,這個過程就是這樣:假設采樣頻率為Fs,采樣點數為N,做FFT之后,某一點n(n從1開始)表示的頻率為:Fn=(n-1)*Fs/N;該點的模值除以N/2就是對應該頻率下的信號的幅度(對於直流信號是除以N);該點的相位即是對應該頻率下的信號的相位。相位的計算可用函數atan2(b,a)計算。atan2(b,a)是求坐標為(a,b)點的角度值,范圍從-pi到pi。要精確到xHz,則需要采樣長度為1/x秒的信號,並做FFT。要提高頻率分辨率,就需要增加采樣點數,這在一些實際的應用中是不現實的,需要在較短的時間內完成分析。解決這個問題的方法有頻率細分法,比較簡單的方法是采樣比較短時間的信號,然后在后面補充一定數量的0,使其長度達到需要的點數,再做FFT,這在一定程度上能夠提高頻率分辨力。具體的頻率細分法大家可參考相關文獻。
26.3 FFT變換的頻譜泄露問題
為了說明頻譜泄露的問題,這里我們具一個求解方波FFT變換的例子。在matlab中運行如下代碼:
Fs = 256; % 采樣率 N = 256; % 采樣點數 n = 0:N-1; % 采樣序列 t = 0:1/Fs:1-1/Fs; % 時間序列 x = square(2*pi*30*t, 50); %原始信號 y = fft(x); %對原始信號做FFT變換 M = abs(y); %求FFT轉換結果的模值 plot(n, M); %繪制FFT轉換模值的曲線
運行代碼,輸出結果如下:
與方波的理論計算值相比,上面的幅頻響應圖中出現了很多小毛刺,其實這個就是頻譜泄露的結果導致的。
下面就說說什么是頻譜泄露:
對於頻率為fs的正弦序列,它的頻譜應該只是在fs處有離散譜。但是,在利用DFT求它的頻譜做了截短,結果使信號的頻譜不只是在fs處有離散譜,而是在以fs為中心的頻帶范圍內都有譜線出現,它們可以理解為是從fs頻率上“泄露”出去的,這種現象稱 為頻譜“泄露"(結合上面的例子就更形象了)。
在實際問題中遇到的離散時間序列x(n)通常是無限長序列,因而處理這個序列的時候需要將它截斷。截斷相當於將序列乘以窗函數w(n)。根據頻域卷積定理,時域中x(n)和w(n)相乘對應於頻域中它們的離散傅立葉變換X(jw)和W(jw)的卷積。因此,x(n)截矩后的頻譜不同於它以前的頻譜。
為了減小頻譜“泄露”的影響,往往在FFT處理中采用加窗技術,典型的加窗序列有Hamming、Blackman、Gaussian等窗序列。此外,增加窗序列的長度也可以減少頻譜“泄露”。
時域上乘上窗函數,相當於頻域進行卷積。長度為無窮長的常數窗函數,頻域為delta函數,卷積后的結果和原來一樣。如果是有限矩形窗,頻域是Sa函數,旁瓣電平起伏大,和原頻譜卷積完,會產生較大的失真。
窗的頻譜,越像delta函數(主瓣越窄,旁瓣越小),頻譜的還原度越高。加窗就不可避免頻譜泄漏,典型的加權序列有Hamming、Blackman、Gaussian等窗序列主要是為了降低降低旁瓣,對於降低頻譜泄漏效果遠不如增加窗序列的長度明顯。
周期信號加窗后做DFT仍然有可能引起頻譜泄露,設fs為采樣頻率,N為采樣序列長度,分析頻率為:m*fs/N(m=0,1....),以cos函數為例,設其頻率為f0,如果 f0不等於m*fs/N,就會引起除f0以外的其他m*fs/N點為非零值,即出現了泄露。
DFT作為有限長的運算,對於無限長的信號必須要進行一定程度的截斷,既然信號已經不完整了,那么截斷后的信號頻譜肯定就會發生畸變,截斷由窗函數來完成,實際的窗函數都存在着不同幅度的旁瓣,所以在卷積時,除了離散點的頻率上有幅度分量外,在相鄰的兩個頻率點之間也有不同程度的幅度,這些應該就是截斷函數旁瓣所造成的。
26.4 總結
通過本章節的講解,大家應該對FFT變換結果的物理意義應該有更深入的理解了,通過后面章節的繼續會讓大家有更加深入的認識。