關於FFT的硬件實現


DFT在實際應用中很是重要,能夠計算信號的頻譜,功率譜和線性卷積等。算法

離散傅里葉變換的公式:微信

其中:spa

  稱爲旋轉因子。設計

由歐拉公式可得:3d

直接按DFT變換進行計算,當序列長度N很大時,計算量很是大,所需的時間很是長。blog

FFT是 快速傅里葉變換。其算法原理這裏再也不贅述,網上資料或者相關書籍的介紹不少。主要分爲按時間抽取法和按頻率抽取法。排序

這裏介紹按時間抽取的基2算法的硬件實現。資源

下面介紹的部分須要瞭解蝶形運算是什麼,這裏不作分析。io

先來看一張16點的蝶形運算圖:效率

第1級(第1列)每一個蝶形的兩節點「距離」爲1,第2級每一個蝶形的兩節點「距離」爲2,第3級每一個蝶形的兩節點「距離」爲4,第4級每一個蝶形的兩節點「距離」爲8。由此推得,第m級蝶形運算,每一個蝶形的兩節點「距離」L=2^(m-1)。

對於16點的FFT,第1級有8組蝶形,每組有1個蝶形;第2級有4組蝶形,每組有2個蝶形;第3級有2組蝶形,每組有4個蝶形;第4級有1組蝶形,每組有8個蝶形。由此可推出,對於N點的FFT,第m級有N/2L組蝶形,每組有L=2^(m-1)個蝶形。

從上圖咱們能夠分析出左邊輸入端與右邊輸出端的順序關係,用二進制表示爲:

左邊                                                      右邊

0000                                                     0000

1000                                                     0001

0100                                                     0010

1100                                                     0011

0010                                                     0100

1010                                                     0101

0110                                                     0110

1110                                                      0111

0001                                                     1000

·······                                                      ·······

不難看出,右邊的逆序正是左邊的正序,利用這一點,能夠事先將輸入序列從新排序。

關於旋轉因子,能夠事先計算出來 ,因爲FPGA不擅長作浮點運算,須要將計算出的旋轉因子擴大2^n倍。而後以.mif的格式存放在FPGA片上ROM中。

關於輸入序列的長度N,最好是2的整數次冪。

爲了提升速度,可將FFT的輸入序列存放在FPGA片上RAM中,因此在使用FFT的項目中,選取FPGA芯片時,要考慮片上RAM的容量。

將片上RAM設置爲TRUE DPRAM,兩個口讀,兩個口寫,提升存取效率,實際使用中自有妙用。

根據上圖的蝶形運算圖,能夠大體肯定 FFT的計算量。

直接的DFT算法運算量:

N*N ,單位爲複數乘法的時間MT;

使用FFT算法的運算量:

N/2*log2(N),單位爲數乘法的時間MT;

算法運算量 比較:

根據蝶形運算圖,能夠將FPGA設計層級結構分爲3層:

蝶形級數循環層,

蝶形組數循環層,

蝶形個數循環層。

複數乘法可直接使用FPGA片內自帶的乘法器,注意數據位寬,謹防溢出。

另外,被乘數和乘數必須爲原碼,作乘法時必須考慮數據的正負符號問題。

設計加法器和減法器時,因爲存在符號問題,包括正數+正數,正數+負數,負數+負數,以及正數-正數,正數-負數,負數-正數,負數-負數,這些判斷操做很是繁瑣,設計時格外注意數據的大小及正負。

這裏咱們能夠將設計變的簡單:

將輸入到加法器和減法器的兩個數據先轉換爲補碼,而後作加法運算,輸出時再將補碼轉換成原碼便可。

爲了節省資源,儘量使用移位代替乘法和除法。爲了提升速度,可在適當的地方加入流水線操做。

關於精度問題:因爲FPGA不擅長作浮點運算,必然存在精度問題。

首先,對存入ROM的旋轉因子進行了放大,引入精度問題。

而後,在旋轉因子的乘法中,引入精度問題。

再後續旋轉因子的還原中,也引入精度問題。

提升精度,一方面在放大旋轉因子時,能夠適當提升放大倍數,另外一方面,旋轉因子還原中,儘可能把還原除法放在最後輸出的地方。


版權全部權歸卿萃科技 杭州FPGA事業部,轉載請註明出處

做者:杭州卿萃科技ALIFPGA

原文地址:杭州卿萃科技FPGA極客空間 微信公衆號


掃描二維碼關注杭州卿萃科技FPGA極客空間

相關文章
相關標籤/搜索