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極客空間