談談FFT到底有何用(謹以此獻給致力於FFT算法晶片設計的同行們)

2021-01-14 21ic電子網

FFT(快速傅立葉變換)是數位訊號處理的超級經典算法,學過DSP或者晶片設計的人大多知道這個算法。但是,大家是否想過,為什麼數位訊號處理會有那麼多FFT呢?有人會說,為了分析信號的頻譜。那麼下邊的問題就是,分析頻譜對我們的日常需求,比如手機打電話,雷達測量速度和方向等等一些與實際需求有什麼聯繫?為什麼FFT如此重要?本文舉一些簡明的例子,闡釋一下FFT到底有什麼用。

先回憶一下FFT是什麼。上世紀70年代之前,我們主要通過模擬電路來進行信號處理,比如大家熟悉的用二極體和電容進行AM調製信號的包絡檢波一樣,隨著數字系統的普及,我們可以用處理器或者數字電路更為精確的處理信號,比如我們做AM檢波,實際上可以用載波把信號混頻(與餘弦函數做乘法),再進行低通濾波,那麼這個過程可以用數字電路的乘法器和FIR濾波器來做,FIR比二極體和電容構成的低通濾波器階數高的多,性能自然更為理想,同時,由於數字電路易於做成集成電路,因此我們更多地是將原先的模擬信號(比如麥克風的音頻)通過模擬-數字轉換器,轉換為數字值後進行處理。


這樣的系統有幾個問題,一個是信號需要被採樣,其次是信號被分成若干量階。信號被採樣,也就意味著我們得到的不是原先的連續的信號了,而是一個離散的一些採集的樣點。那麼對時域信號進行採樣,必然造成頻譜的周期化,如果原先頻譜僅限於有限的帶寬,那麼周期化之後,只要周期大於原先的帶寬,那麼實際上沒有混疊失真。而數字電路限制我們只能進行乘加等二進位域的計算,獲得另一些離散的點,因此我們不得不將頻譜也進行「採樣」,頻域的抽樣導致時域上又周期化了,好在如果我們只取有限的長度,可以假定沒採集的部分進行的是周期化延拓(由於平穩系統認為信號可以分解為正餘弦函數的組合,而正餘弦函數是可以周期延拓的,所以這個假設沒有問題),那麼我們得到了時域和頻域都是離散的周期延拓的點集。


既然是周期延拓的,那麼延拓的部分和主值區間(靠近0的那個周期)是重複的數值,因此我們只保留主值區間的部分,這樣的時域點集到頻域點集的變換關係叫離散傅立葉變換(DFT)。然而它的運算過於複雜,因此庫裡和圖基(Cooley,Tukey)兩人力圖化簡它,找到了這個算法的一些內在運算規律,得到的運算量由原來的平方級降為NlogN級,這個算法就叫按時間抽取快速傅立葉變換,桑德和圖基研究按頻率抽取也可以得到類似的低複雜度算法,這類算法統稱快速傅立葉變換(FFT),FFT的計算結果和DFT是完全等價的,只是運算量降低了。又由於時頻變換能量不變(Parseval定理),所以頻域的絕對數值沒有意義了,只要獲得相對數值即可,因此數字系統中的量化階數以及數字系統溢出後的縮放調整對FFT的計算結果影響僅在於精度,而不是對錯,從而,FFT正好滿足數字系統可以處理的前提,同時運算複雜度不高,因此獲得了廣泛的應用。


那麼,模擬系統能不能做類似的FFT呢?可以,構造與頻點數量相同個數的帶通濾波器,組成一個陣列,信號進入這個帶通濾波器組,每個濾波器只保留了相應頻點為中心的類似於sinc的頻響函數,那麼就可以得到FFT的結果。當然,這個代價不是一般的系統可以負擔的。所以,在沒有數字電路普及的年代裡,FFT基本是數學算法,是不可實現的。


現在知道FFT是什麼了,它是傅立葉變換的時頻離散後的可數字計算的一個變換算法,這個算法計算的對象是時域上周期延拓的點集的主值區間部分(有限個數),計算的結果是頻譜,也是周期延拓的點集的主值區間部分,與傅立葉變換等價的前提是採樣速率大於信號最大頻率的2倍(高頻延拓不混疊),同時時域有限長度之外的部分假定按周期延拓到無窮。為了滿足第一個前提,我們往往在信號處理之前(甚至是模數轉換之前)加入一個低通濾波器,使得高頻分量被抑制,對於比如聲音或者在某個頻帶內的通信系統,高頻分量本身就是無意義的,因此這個前提可以滿足。


為了滿足第二個前提,我們需要保證採集的樣本在採集區外的數值與假想的周期延拓的數值一致,這顯然做不到,做不到導致的結果是什麼呢?頻譜出現洩漏,也就是頻譜能量會分散到帶外(比如餘弦不再是一根譜線,而是sinc),分散的過程可以看做時域加矩形窗(和門函數相乘)導致的,那麼頻譜相當於和sinc函數的卷積,時域窗越小(也就是採集的點越少),頻譜sinc的主瓣越寬,頻譜洩露越嚴重,也就是原先一個頻點的能量會被散發到更大的附近範圍裡,而自己的峰值會降低,如果相鄰點各有個峰值,那麼散發後就難以分辨了,所以系統的實際解析度與時域窗的長度成反比,採集更多的點,才有可能獲得更精細的頻譜。那麼,有沒有辦法減輕這個洩露呢?那麼,最好讓邊界處的取值點起的作用小一點,中間的部分權重大一點,那麼實際上就乘了一系列加權的數值,這些數值形成的是一個時域的窗函數,加窗之後,頻譜洩露會減輕,能量會集中一些,但是主瓣會更寬,這是一個權衡。就這樣,兩個前提條件得以近似滿足,雖然不是完全,但是也夠用了。


這些都是比較基礎的知識了,下面說說有趣的事情。如果FFT只用於分析確定性的平穩信號,類似於正弦或者若干正弦的複合的無限長周期信號之類,看看譜線什麼的,它將不會有今天的地位。它還能用來幹嘛呢?


相關焦點

  • 用FPGA實現FFT算法(圖)
    當n較大時,因計算量太大,直接用dft算法進行譜分析和信號的實時處理是不切實際的。快速傅立葉變換(fast fourier transformation,簡稱fft)使dft運算效率提高1~2個數量級。其原因是當n較大時,對dft進行了基4和基2分解運算。fft算法除了必需的數據存儲器ram和旋轉因子rom外,仍需較複雜的運算和控制電路單元,即使現在,實現長點數的fft仍然是很困難。
  • 每日函數——fft
    fft快速傅立葉變換語法Y  = fft(X)Y  = fft(X
  • 通俗易懂的講解FFT的讓你快速了解FFT
    相信網上現在有很多關於FFT的教程,我曾經也參閱了很多網上的教程,感覺都不怎麼通俗易懂。在基本上的研究FFT,並且通過編程的形式實現之後。我決定寫一篇通俗易懂的關於FFT的講解。因此我在接下來的敘述中儘量非常通俗細緻的講解。 本人最早知道傅立葉變換的時候是沉迷於音樂的頻譜跳動無法自拔,當時就很想做一個音樂頻譜顯示器。
  • 基於MSP430系列微控制器的FFT算法實現
    摘要:傅立葉變換算法在供電質量監測系統中被用來進行諧波分析,如何加快分析速度和降低系統成本是當前這種監測系統設計關注的主要問題。
  • matlab下實現FFT信號分析
    利用matlab做頻譜分析前我們需要了解分析過程中的一些基礎知識,matlab中的 fft 函數用法、fftshift 函數的用法函數 1  fft :作用:快速傅立葉變換。語法:Y = fft(X)Y = fft(X,n)Y = fft(X,n,dim)語法:Y = fft(X) 用快速傅立葉變換 (FFT) 算法計算 X 的離散傅立葉變換 (DFT)。
  • MATLAB實驗——FFT變換
    實驗基本原理與設計1 應用傅立葉變換進行圖像處理傅立葉變換是線性系統分析的一個有力工具,它能夠定量地分析諸如數位化系統、採樣點、電子放大器、卷積濾波器、噪音和顯示點等的作用。通過實驗培養這項技能,將有助於解決大多數圖像處理問題。對任何想在工作中有效應用數字圖像處理技術的人來說,把時間用在學習和掌握博裡葉變換上是很有必要的。
  • 數字與信號處理實驗3 用FFT進行譜分析
    實驗三 用FFT進行譜分析                 一、實驗要求 進一步加深DFT 算法原理和基本性質的理解
  • 用C語言實現FFT算法
    /*****************fft programe*********************/#include typedef.h #include math.h本文引用地址:http://www.eepw.com.cn/article/150637.htmstruct compx
  • 史上最簡單的FFT(快速傅立葉變換)
    FFT1 簡述FFT是專門用來求解多項式乘法的一個高效算法。我們發現,用點值表達式做多項式乘法是單位圓上的點有什麼特殊性質麼?(cp *a,int n,int inv){ if(n==1) return; int m=n/2; for(int i=0;i<m;i++){ tmp[i]=a[2*i]; tmp[i+m]=a[2*i+1]; } for(int i=0;i<n;i++) a[i]=tmp[i]; fft(a,
  • 基於DSP的FFT算法實現
    虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。2、基於DSP的FFT算法實現  用C語言實現FFT算法/*****************fft programe*********************/#include "typedef.h" #include "math.h" struct compx EE(struct compx b1,struct compx b2){
  • 快速傅立葉變換FFT在MATLAB中的實現
    FT、FS、DTFT,至少都有一個域不是離散的,計算機無法處理;DFS滿足時域和頻率離散的要求,但其時域為無窮長的周期序列;通過對DFS的推導,得到適合計算機計算的離散傅立葉變換 (DFT)。因此,周期序列實際上只有N個樣值有信息,通過推導可得到DFT、時域和頻域 (DFT) 上的有限長序列,可以用來「代表」周期序列,DFT在時域和頻域上均離散,且為有限長序列,可以用計算機進行處理。
  • ISSCC 2019 | 清華大學團隊研製高能效通用神經網絡處理器晶片...
    該晶片在算法,架構和電路三方面進行了聯合優化,在變換域進行神經網絡加速,並使用可轉置存儲器復用數據,使得晶片的能效和面積相較於之前的研究都有顯著的提升。隨著 AI 技術的不斷發展,單一的網絡結構已經很難滿足不同領域的任務需求。常見的應用諸如圖像識別或機器翻譯分別需要卷積神經網絡或循環神經網絡的支持。而不同網絡意味不同的計算模式,在帶寬和計算資源上也會有各自的限制。
  • DSP集成開發環境中的混合編程及FFT算法的實現
    前者可以脫離DSP晶片,在PC機上模擬DSP指令集與工作機制,主要用於前期算法實現和調試。後者實時運行在DSP晶片上,可以在線編制和調試應用程式。        2  C語言和彙編語言的混合編程        TMS320 C5000系列的軟體設計通常有三種方法:        (1   ) 用C語言開發;        (2) 用彙編語言開發;        (3) C和彙編的混合開發。
  • 利用FFT IP Core實現FFT算法
    FFT傳統實現方法無非是軟體(軟體編程)和硬體(專用晶片ASIC)兩種,FPGA的出現使人們在FFT的實現方面又多了一種選擇。FPGA同時具有軟體編程的靈活性和ASIC電路的快速性等優點,適合高速數位訊號處理。大多數FPGA廠商都提供了可配置的邏輯核(Core)實現各種算法功能,其中包括FFT IP Core(智慧財產權核)。
  • 使用STM32 的DSP庫進行FFT變換
    * 使用三角函數生成採樣點,供FFT計算* 進行FFT測試時,按下面順序調用函數即可:* dsp_asm_init();* dsp_asm_test();*/#include "stm32f10x.h"#include "dsp_asm.h"#include "stm32_dsp.h"#include "table_fft.h"
  • 用FPGA實現FFT算法
    當N較大時,因計算量太大,直接用DFT算法進行譜分析和信號的實時處理是不切實際的。快速傅立葉變換(Fast Fourier Transformation,簡稱FFT)使DFT運算效率提高1~2個數量級。其原因是當N較大時,對DFT進行了基4和基2分解運算。FFT算法除了必需的數據存儲器ram和旋轉因子rom外,仍需較複雜的運算和控制電路單元,即使現在,實現長點數的FFT仍然是很困難。
  • FFT
    最近在項目中需要用到FFT,之前對於FFT也只是有一個模糊的印象也並不清楚他的具體物理意義,之前幾次想學習都被擱置了,現在項目需要又從新學習,在此把我收穫的和大家分享一下
  • 基於Cyclone II FPGA開發平臺實現語音識別算法程序的設計
    首先,它是SoC,即由單個晶片完成整個系統的主要邏輯功能;其次,它是可編程系統,以FPGA為硬體基礎,具有靈活的設計方式,可裁減、可擴充、可升級,並具備軟硬體系統在線可編程的能力。經過分析研究發現,本設計算法中的瓶頸主要集中在加窗、FFT和DCT等部分,它們的耗時一般佔到整個程序運行的60%以上。若將這些環節加速成功,性能將有較大提升。 圖4中顯示了在SOPC Builder中向Avalon總線加載C2H加速器和片內RAM的情況。
  • PyTorch中的傅立葉卷積:通過FFT計算大核卷積的數學原理和代碼
    因為快速傅立葉變換的算法複雜度比卷積低。 直接卷積的複雜度為O(n),因為我們將g中的每個元素傳遞給f中的每個元素。 快速傅立葉變換可以在O(n log n)的時間內計算出來。 當輸入數組很大時,它們比卷積要快得多。 在這些情況下,我們可以使用卷積定理來計算頻率空間中的卷積,然後執行傅立葉逆變換以返回到位置空間。
  • 基於Nios的FFT算法軟硬體協同設計
    摘要:在深入研究Nios自定製指令的軟硬體接口的基礎上,利用Matlab/DSP Builder建立快速傅立葉變換FFT核心運算指令基本模型,然後用Altera公司提供的Singacompiler工具對其進行編譯,產生 QuartusⅡ能夠識別的VHDL