數字信號處理專題(3)——FFT運算初探


一、前言

  FFT運算是目前最常用的信號頻譜分析算法。在本科學習數字信號處理這門課時一直在想:學這些東西有啥用?公式推來推去的,有實用價值么?到了研究生后期才知道,廣義上的數字信號處理無處不在:手機等各種通信設備和WIFI的物理層信號處理、攝像頭內的ISP、音頻信號的去噪等。各種算法中,FFT是查看信號本質,也就是頻譜的重要手段。之前僅直接調用FFT/IFFT IP核,今天深入探討下算法本身和實現方案。

二、FFT運算原理及結構

  本文僅對FFT的核心思想、作用和算法結構進行介紹,FFT具體原理和公式推導詳見參考文獻。FFT是DFT的快速算法,旨在降低計算復雜度以減小處理延遲和占用的軟硬件資源,核心思想是將大點數的DFT運算拆分成多個小點數的DFT運算。因此FFT核心公式與DFT相同。

   DFT運算把原始信號采樣點與不同的旋轉因子做乘累加運算,而旋轉因子經過歐拉公式展開后就是角度成倍數關系的正余弦函數。現在DFT在干什么以及怎么干的一目了然:把一段原始信號采樣點與不同頻率的正余弦信號做“相關運算”,從而找出信號的頻率分量。通俗點說就是通過查看信號與不同頻率值正余弦信號的相似程度分析信號本身的頻率成分。工程應用時,了解到這一點就足夠了。

  有了上述理解,再來看FFT算法。公式推導部分只要知道它是根據旋轉因子的對稱性和周期性把大點數的DFT運算拆分成多個小點數DFT運算就行了,真正要掌握的是推導過后的表達式以及算法結構。以時間抽取(DIT)的基2算法為例,它是根據采樣點奇偶序號,不斷對N點DFT運算進行兩兩拆分直到兩點DFT運算為止的快速算法。其中的蝶形運算表達式即為這種拆分思想的精華:

  其中,k=0,1,...,N/2-1.X1(k)和X2(k)分別是信號x(n)的偶數序號采樣點x(2r)和基數序號采樣點x(2r+1)的DFT運算結果。通過上述公式,N點DFT運算拆分成了兩個N/2點的DFT運算。信號流圖表達為:

  我們以8點FFT運算為例,拆分過程如下。具體講解見參考文獻2.

  FFT運算點數 N=2^L。L則為運算級數,每級有N/2個蝶形。如果是頻率抽取(DIF)的基2算法,整體結構和蝶形單元都會有區別。

 三、FFT運算的FPGA實現探討

   從X家FFT/IFFT IP Core的接口信號以及網絡上的資源可以看出,為了使接口與FFT運算點數無關,采用串行輸入-->並行計算-->並串轉換的頂層架構實現FFT功能。並行計算過程中需要求取旋轉因子,常見的做法是使用CORDIC算法計算特定角度的正余弦值。如8點FFT要計算0°、-45°、-90°和-135°的正余弦值。正余弦值應該可以直接查表獲得,但點數較多時會占用大量的存儲資源,如點數為1024,正余弦值位寬為16bit,則存儲容量=1024/2*2*16bit= 16Kbit。除了三角函數,運算過程中還包括復數乘法、復數加減法,都是比較簡單的操作。后續本人會嘗試具體設計FFT運算的迭代和流水線硬件架構及對應的VerilogHDL代碼。

參考文獻:

[圖文]第4章快速傅里葉變換 - 百度文庫 https://wenku.baidu.com/view/3818bb913c1ec5da50e270df.html

數字信號處理--FFT與蝶形算法 - yu_jianchi - 博客園 https://www.cnblogs.com/luoqingyu/p/5930181.html

FFT算法8點12位硬件實現 (verilog) - 清風醉明月 slp_art - 博客園 https://www.cnblogs.com/sleepy/archive/2011/07/20/2112079.html


免責聲明!

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



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