1. 程式人生 > >fft的vhdl實現

fft的vhdl實現

快速 非對稱 AD 變換 差異化 實際應用 ati 結果 align

  • 所謂的FDRSE就是帶同步復位置位時鐘使能的d觸發器。可以用來做多路數據穩定對齊。

技術分享圖片

N點基-2 FFT算法的實現方法(http://blog.163.com/tianyake@yeah/blog/static/749331412010979109623/)

技術分享圖片

從圖4我們可以總結出對於點數為N=2^L的DFT快速計算方法的流程:

0.旋轉因子存儲問題

由於WN的對稱特性,第二象限為第一象限的實部取反,第三象限為虛實皆取反,第四象限為虛部取反,所以只需要存儲第一象限即可,而且由於可約性,後幾級旋轉皆可以由第一級變換得到。

1.對於輸入數據序列進行倒位序變換。

該變換的目的是使輸出能夠得到X(0)~X(N-1)的順序序列,同樣以8點DFT為例,該變換將順序輸入序列x(0)~x(7)變為如圖4的x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7)序列。(此處倒位序實際上是二進制坐標翻轉即可,原因與fft的基2有關,若為基4則為四進制的翻轉

3.浮點到定點轉換需要註意的關鍵問題
事實上大多嵌入式系統中進行離散傅裏葉變換一般都應該采用定點方式。對於使用蝶形運算的fft我們不能采用這種簡單的放大旋轉因子轉為整數計算的方式。因為fft是一個非對稱叠代過程,假設我們對旋轉因子進行了放大,根據蝶形流圖我們可以發現其最終的結果是,不同的輸入被放大了不同的倍數,對於第一個輸入x(0)永遠也不會放大。舉一個更加形象的例子,還是以圖4為例。從圖中可以看出右側的X(0)可以直接用下式表示:

技術分享圖片


從上式我們可以看到不同輸入項所乘的旋轉因子個數(註意這裏是個數,就算是wn^0,也被考慮進去了,因為在沒有放大時wn^0等於1,放大後所有旋轉因子指數模均不為1,因此需要考慮)。這就導致輸入不平衡,運算結果不正確。經查閱相關資料,比較妥善的做法是,首先對所有旋轉因子都放大2^Q倍,Q必須要大於等於L

,以保證不同旋轉因子的差異化。旋轉因子放大,為了保證其模為1,在每一次蝶形運算的乘積運算中我們需要將結果右移Q位來抵消這個放大,從而得到正確的結果。之所以采用放大倍數必須是2的整數次冪的原因也在於此,我們之後可以通過簡單的右移位運算將之前的放大抵消,而右移位又代替了除法運算,大大節省了時間。

4.計算過程中的溢出問題
最後需要註意的一個問題就是計算過程中的溢出問題。在實際應用中,AD雖然有12位的位寬,但是采樣得到的信號可能較小,例如可能在0~8之間波動,也就是說實際可能只有3位的情況。這種情況下為了在計算過程中不丟失信息,一般都需要先將輸入數據左移P位進行放大處理,數據放大可能會導致溢出,從而使計算錯誤,而溢出的極限情況是這樣:假設我們數據位寬為D位(不包括符號位),AD采樣位數B位,數字放大倍數P位,旋轉因此放大倍數Q位,FFT級聯運算帶來的最大累加倍數L位。我們得到:

技術分享圖片
假設AD位寬12,數據位寬32,符號位1位,因此有效位寬31位,采樣點數N,那麽我們可以得到log2(N)+P+Q<=19,假設點數128,又Q>=L可以得到放大倍數P<=5。 即放大倍數P<=數據有效位寬-log2(采樣點數)-AD采樣位寬-旋轉因子放大倍數(因為定點運算,Q>=log2(采樣點數)),其中log2(采樣點數)表示級聯運算最大累加倍數,因為每一級最多累加後多一位。

fft的vhdl實現