DFT插零FFT演算法理解

2021-08-22 02:40:35 字數 2718 閱讀 7854

圖1 為什麼fft時域補0後,經fft變換就是頻域進行內插?

應該這樣來理解這個問題:

補0後的dft(fft是dft的快速演算法),實際上公式並沒變,變化的只是頻域項(如:補0前fft計算得到的是m*2*pi/m處的頻域值,而補0後得到的是n*2*pi/n處的頻域值),m為原dft長度,n變成了補0後的長度。將(-pi,pi)從原來的m份變成了n份,如果將補0前後的這些頻域值畫在座標上,其中m*2*pi/m和n*2*pi/n重合的部分,它所對應的頻域值(變換後的值)是不變的,而在原來的m份裡多了(n-m)份的分量,即在頻域內多了(n-m)份插值,這樣理解就清楚了。

補零好處有二:

其一是,可使資料點數為2的整次冪,以便於使用fft

其二,對原資料起到了做插值的作用,一方面克服「欄柵」效應,使譜的外觀平滑,

另一方面,由於對資料截短時引起的頻域洩漏,有可能在頻譜中出現一些難以確認的譜峰(見《數字訊號處理》課本147頁圖6-13),補零後有可能消除這種現象。

圖2 dft洩漏和加窗-頻域分析的重要理論 

在最後補零不能提高解析度

因為補零並不能增加資料的有效長度。

書上說了,好處有二:

其一是,可使資料點數為2的整次冪,以便於使用fft

其二,對原資料起到了做插值的作用,一方面克服「欄柵」效應,使譜的外觀平滑,

另一方面,由於對資料截短時引起的頻域洩漏,有可能在頻譜中出現一些難以確認的

譜峰,補零後有可能消除這種現象。

頻域的取樣率不是指頻域解析度,是指在頻域取樣點數

重複會出問題的… 做能量譜的時候… 能量譜做出來後會爽爽的變成乙個柵欄,但柵欄有數的地方還是對的。

圖3 dft解析度、補零和頻域取樣–頻域分析的重要理論

每乙個章節都要檢視一下:

二、柵欄效應與解析度

訊號x(n)的dft相當於對x(n)做z變換,然後在單位圓上對頻率進行n的點(等間隔)的抽樣,所以訊號x(n)被分解成乙個個訊號的組合,這些訊號都是單頻的且彼此之間等間隔離散。頻域離散也可以直接由傅利葉變換公式得到,或者直觀的由圖(d)得到。這些頻率都在基頻的整數倍處,不是連續的頻率函式,我們通過這個離散的頻譜函式來分析原函式的頻率分布。對於離散頻率之間的頻率資訊我們不得而知,這就是柵欄效應。

柵欄效應的本質就是頻率的離散化,它是頻譜率散化的一種形象的描述。

柵欄效應的產生導致了頻譜解析度的問題。頻譜解析度就是頻域兩相鄰譜線之間的頻率間隔。

首先需要明白,頻率有模擬頻率與數字頻率之分,模擬頻率表示的譜線間隔其實際值的數學表示式為fs/n(hz)也就是1/t,t為時域乙個週期的長度,計算公式為1/(ts*n),f為時域抽樣頻率,頻域譜線間隔等於時域週期的倒數,這個關係可以由變換關係式得到,任何形式的傅利葉變換都滿足這樣的關係。;數字角頻率與模擬頻率之間的關係為w=ω*t,其中ω模擬角頻率,所以數字角頻率表示的譜線間隔w=2π/n。

對於真正的頻率(模擬頻率)我們要增加頻譜解析度,表面看有兩種方法,減小取樣頻率和提高n。一般情況下我們是針對已有的取樣資料而言,因為fs已定,不能改變。所以解析度只能通過提高n來得到改善。在不改變原取樣資料的情況下,我們可以在訊號後面補零。這就是常說的補零法。

現在我們從dft公式上分析補零的效果。因為頻域點數和時域點數是相等的,所以首先頻譜點數增多。由正變換公式,設點數由n變為m*n,新變換的頻率用k1表示,當k1滿足m*k時,由exp(j*k1*2π/(m*n)可知此時的頻率點和未補零前k時的頻率點是重合的,此時正變換公式求和項與為補零前的求和項是一樣的,只不過增加了求和點數,不過這些點數也就是補的x(n)值是零,對求和並無影響。如果不化成真正的幅度,那麼這兩個頻譜圖在這些頻率點上頻譜圖是完全重合的。因為n發生了變化,所以真正的幅度以1/m的比例的發生了變化。

**結果如下,m等於2,也就是補了n個零。頻譜的幅度不是真正的幅度,沒有對其做除以n的處理。由於補了一倍的點,圖g可以看出,每隔乙個點,兩個頻譜都是重合的。相對於原來的頻譜函式,在頻域進行了內插,所以頻譜解析度提高了。

補零的結果是對已經截斷得到的訊號的頻譜解析度的提高,而不是對原來為截斷的訊號的解析度的提高。這由圖(d)可以很容易看出,補零後dft的結果使得圖10的譜線變的更密而更加逼近圖(6),而做不到使頻譜逼近圖(2),所以截斷而丟失的資訊無法通過補零而得到。

20180801:0839

第二種方法:相應地,我也可以通過把輸入訊號和每一種頻率的正余弦訊號進行相乘(關聯操作),從而得到原始訊號與每種頻率的關聯程度(即總和大小),這個結果便是我們所要的傅利葉變換結果,下面兩個等式便是我們所要的計算方法:

圖4 第二個式子中加了個負號,是為了保持複數形式的一致,前面我們知道在計算 時又加了個負號,所以這只是個形式的問題,並沒有實際意義,你也可以把負號去掉,並在計算 時也不加負號。

這裡有一點必須明白乙個正交的概念:兩個函式相乘,如果結果中的每個點的總和為0,則可認為這兩個函式為正交函式。要確保關聯性演算法是正確的,則必須使得跟原始訊號相乘的訊號的函式形式是正交的,我們知道所有的正弦或余弦函式是正交的,這一點我們可以通過簡單的高數知識就可以證明它,所以我們可以通過關聯的方法把原始訊號分離出正余弦訊號。當然,其它的正交函式也是存在的,如:方波、三角波等形式的脈衝訊號,所以原始訊號也可被分解成這些訊號,但這只是說可以這樣做,卻是沒有用的。

FFT演算法理解與實現 二

快速傅利葉變換 二 fft演算法參考本書第12章 fft演算法主要流程 1.把乙個n點的時域訊號分解成n個單點時域訊號 2.計算n個單點時域訊號的頻譜 3.將n個頻譜合成乙個n點的頻譜。參考 bit reversal sorting public struct complex public doub...

對於FFT和DFT的理解

此篇文章是對 ministm32f103實現家庭普通電路中的電流諧波檢測 一文的補充 本文參考 快速傅利葉變換學習及c語言實現 形象的介紹 什麼是傅利葉變換?手把手教你理解 fft fft是最重要,也是最難懂的。簡單說下原理 fft 快速傅利葉變換 是dft 離散傅利葉變換 的改進演算法,其將dft...

A 演算法理解

廣度優先 bfs 和深度優先 dfs 搜尋 深度優先搜尋,用俗話說就是不見棺材不回頭。演算法會朝乙個方向進發,直到遇到邊界或者障礙物,才回溯。一般在實現的時候,我們採用遞迴的方式來進行,也可以採用模擬壓棧的方式來實現。如下圖,s代表起點,e代表終點。我們如果按照右 下 左 上這樣的擴充套件順序的話,...