【STM32F407的DSP教程】第26章 FFT變換結果的物理意義


 完整版教程下載地址: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 初學者重要提示

  1.   本章為大家介紹FFT結果的物理意義,如果之前沒有了解過,有必要了解下。
  2.   下個章節為大家介紹兩個重要知識點:頻譜泄露和柵欄效應,推薦學習完畢本章后看一下。

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變換結果的物理意義應該有更深入的理解了,通過后面章節的繼續會讓大家有更加深入的認識。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM