0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文快速教會你傅立葉算法

硬件攻城獅 ? 來源:嵌入式客棧 ? 2023-02-08 10:01 ? 次閱讀

[導(dǎo)讀]今天來聊聊如何實現(xiàn)快速傅立葉變換FFT及其應(yīng)用,希望大家喜歡。直接談FFT,可能沒這方面基礎(chǔ)的同學(xué),不太能明白,先看看它的相近較容易理解的幾個概念吧。

啥是傅立葉級數(shù)?

在數(shù)學(xué)中,傅里葉級數(shù)(Fourier series)是把類似波的函數(shù)表示成簡單正弦波的方式。更正式地說法是,它能將任何周期性函數(shù)或周期信號分解成一個(可能由無窮個元素組成的)簡單振蕩函數(shù)的集合,即正弦函數(shù)和余弦函數(shù)(或者,等價地使用復(fù)指數(shù)),從數(shù)學(xué)的定義來看,是這樣地:

設(shè)x(t)是一周期信號,其周期為T。若x(t)在一個周期的能量是有限的,有即

則,可以將x(t)展開為傅立葉級數(shù)。怎么展開呢?計算如下:

公式中的k表示第k次諧波,這是個什么概念呢?不容易理解,看下對于一個方波的前4次諧波合成動圖就比較好理解了。這里的合成的概念是時域上的疊加的概念,圖片來源wikipedia

c64c59a0-a6f8-11ed-bfe3-dac502259ad0.gif

c67a06ca-a6f8-11ed-bfe3-dac502259ad0.png

啥是傅里葉變換?

在數(shù)學(xué)中,傅里葉變換(Fourier transform FT)是一種數(shù)學(xué)變換,它將一個函數(shù)(通常是一個時間的函數(shù),或一個信號)分解成它的組成頻率,例如用組成音符的音量和頻率表示一個音樂和弦。傅里葉變換指的是頻域表示和將頻域表示與時間函數(shù)相關(guān)聯(lián)的數(shù)學(xué)運算。其本質(zhì)是一種線性積分變換,用于信號在時域(或空域)和頻域之間的變換,在物理學(xué)和工程學(xué)中有許多應(yīng)用。因其基本思想首先由法國學(xué)者約瑟夫·傅里葉系統(tǒng)地提出,所以以其名字來命名以示紀念。實際上傅里葉變換就像化學(xué)分析,確定物質(zhì)的基本成分;信號來自自然界,也可對其進行分析,確定其基本頻率成分。其數(shù)學(xué)定義為:

對于連續(xù)時間信號x(t),若x(t)在時間維度上可積分,(實際上并不一定是時間t維度,這里可以是任意維度,只需在對應(yīng)維度空間可積分即可),即:

那么,x(t)的傅立葉變換存在,且其計算式為:

c68d0f72-a6f8-11ed-bfe3-dac502259ad0.png

其反變換為:

c6a32ffa-a6f8-11ed-bfe3-dac502259ad0.png

上面這兩個公式是啥意思呢?在度量空間可積可以理解成其在度量空間能量有限,也即對其自變量積分(相當于求面積)是一個確定值,那么這樣的函數(shù)或者信號就可以進行傅立葉變換展開,展開得到的就變成是頻域的函數(shù)了,如果對頻率將函數(shù)值繪制出曲線就是我們所說的頻譜圖,而其反變換就比較好理解了,如果我們知道一個信號或者函數(shù)譜密度函數(shù),就可以對應(yīng)還原出其時域的函數(shù),也能繪制出時域的波形圖。

c6b0d6f0-a6f8-11ed-bfe3-dac502259ad0.gif

當然,本文限定討論時域信號是因為我們電子系統(tǒng)中的應(yīng)用最為普遍的就是一個時域信號,當然推而廣之,其他的多維度信號也能利用上面定義進行推廣,同樣在多維空間信號也非常有應(yīng)用價值,比如2維圖像處理等等。

上面兩個概念是一個東東么?

傅立葉級數(shù)對應(yīng)的是周期信號,而傅立葉變換則對應(yīng)的是一個時間連續(xù)可積信號(不一定是周期信號)

傅立葉級數(shù)要求信號在一個周期內(nèi)能量有限,而后者則要求在整個區(qū)間能量有限

傅立葉級數(shù)的對應(yīng)是離散的,而傅立葉變換則對應(yīng)是連續(xù)的。

故而,兩者的物理含義不同,且其量綱也是不同的,代表周期信號的第k次諧波幅度的大小,而則是頻譜密度的概念。所以答案是這兩者從本質(zhì)上不是一個概念,傅立葉級數(shù)是周期信號的另一種時域的表達方式,也就是正交級數(shù),它是不同的頻率的波形的時域疊加。而傅立葉變換則是完全的頻域分析,傅里葉級數(shù)適用于對周期性現(xiàn)象做數(shù)學(xué)上的分析,傅里葉變換可以看作傅里葉級數(shù)的極限形式,也可以看作是對周期現(xiàn)象進行數(shù)學(xué)上的分析,同時也適用于非周期性現(xiàn)象的分析。傅里葉級數(shù)適用于對周期性現(xiàn)象做數(shù)學(xué)上的分析,傅里葉變換可以看作傅里葉級數(shù)的極限形式,也可以看作是對周期現(xiàn)象進行數(shù)學(xué)上的分析,同時也適用于非周期性現(xiàn)象的分析。

啥是離散傅立葉變換?

離散傅里葉變換(Discrete Fourier Transform,縮寫為DFT),是傅里葉變換在時域和頻域上都呈離散的形式,將信號的時域采樣變換為其DTFT的頻域采樣。

在形式上,變換兩端(時域和頻域上)的序列是有限長的,而實際上這兩組序列都應(yīng)當被認為是離散周期信號的主值序列。即使對有限長的離散信號作DFT,也應(yīng)當將其看作其周期延拓的變換。在實際應(yīng)用中通常采用快速傅里葉變換計算DFT。

對于N點序列

c7181d88-a6f8-11ed-bfe3-dac502259ad0.png

它的離散傅立葉變換為(DFT)為:

c72f8522-a6f8-11ed-bfe3-dac502259ad0.png

其中k=0,1,....,N-1,上面的式子展開一下:

c7403016-a6f8-11ed-bfe3-dac502259ad0.png

c752d4fa-a6f8-11ed-bfe3-dac502259ad0.jpg

啥是快速傅立葉變換?

快速傅立葉變換(Fast Fourier Transform:FFT)是一種計算數(shù)字信號序列的離散傅立葉變換(Discrete Fourier Transform:DFT)或其逆變換(IDFT)的算法。傅里葉分析將信號從其原始域(通常是時間或空間)轉(zhuǎn)換為頻域的表示,反之亦然。DFT是通過將一系列值分解成不同頻率的分量來獲得的。這個操作在很多領(lǐng)域中都很有用,但是直接從定義中計算它通常太慢而不實際。FFT通過將DFT矩陣分解成稀疏(大部分為零)因子的乘積來快速計算這種轉(zhuǎn)換。所以其本質(zhì)是實現(xiàn)離散傅立葉變換的一種優(yōu)化算法,將時間復(fù)雜度從降低為,其中N為待計算序列的長度。當N非常大時,這種優(yōu)化在時間維度上提升是非常顯著的。尤其在嵌入式應(yīng)用領(lǐng)域,由于受限于采用的芯片算力往往不強,所以FFT算法較之于DFT的效果是非常有應(yīng)用價值的。

1994年,Gilbert Strang將FFT描述為“我們一生中最重要的數(shù)值算法”,并被IEEE雜志《計算科學(xué)與工程》列入20世紀十大算法之一,它深遠的影響了我們世界與日常生活。說這個算法改變了世界也不為過。在我們?nèi)粘I钪泻芏嘣O(shè)備里面都有它的影子,比如手機、比如photoshop,比如數(shù)字音響等等。

快速傅立葉算法的最核心思想就是計算機科學(xué)里面常見的分治思想,即把一個復(fù)雜的問題,分解為一個小的類似問題進行求解。

FFT基本上可分為兩類,時間抽取法和頻率抽取法,而一般的時間抽取法和頻率抽取法只能處理長度N=2M的情況,另外還有組合數(shù)基四FFT來處理一般長度的FFT。所謂抽取,就是把長序列分為短序列的過程,可在時域也可在頻域進行。最常用的時域抽選方法是按奇偶將長序列不斷地變?yōu)槎绦蛄?,結(jié)果使輸入序列為倒序,輸出序列為順序排列,這就是Coolly—Tukey算法。

假定待變換離散時間序列信號長度為,將x(n)按照奇偶分組:

c77d1792-a6f8-11ed-bfe3-dac502259ad0.png

上式可變換為:

c7993df0-a6f8-11ed-bfe3-dac502259ad0.png

c7aafe14-a6f8-11ed-bfe3-dac502259ad0.png

c7bc1ea6-a6f8-11ed-bfe3-dac502259ad0.png

其中,k取0,1,...,N/2-1

從而,

由于A(k),B(k)都是點的DFT,X(k)為N點的DFT。那么這一分治思想還可以進一步做下去,這里就不贅述了。

下圖就是一個時間抽取的基2FFT算法的示意圖:

c7cbe638-a6f8-11ed-bfe3-dac502259ad0.png

對于頻率抽取基2的示意圖其原理類似,這里放個圖:

c7e4cdc4-a6f8-11ed-bfe3-dac502259ad0.png

不同點:

DIT2 FFT是在時域先進行奇歐倒序,頻域輸出為正序

DIF2 FFT其輸入序列在時域是正序,而頻域輸出為奇偶分開的倒序。

代碼實踐

好了,前面碼了這么多字,還是不夠直觀,為了更好說明前面的分治思想,這里放了個遞歸實現(xiàn)代碼測一下看看療效:

#include
#include
#include
#include

#defineq8/*2^q點,256*/
#defineN(1<1){/*N如小于1,直接返回*/
intk,m;complexz,w,*vo,*ve;
ve=tmp;vo=tmp+n/2;
for(k=0;k1){
intk,m;complexz,w,*vo,*ve;
ve=tmp;vo=tmp+n/2;
for(k=0;k

代碼來源:https://www.math.wustl.edu/~victor/mfmm/fourier/fft.c

為華盛頓大學(xué)的教學(xué)代碼,上面代碼僅測試了正變換,對于逆變換有興趣的可以試試。

c7f95cb2-a6f8-11ed-bfe3-dac502259ad0.png

總結(jié)一下

本文目的為了方便理解快速傅立葉的算法思想,如果需要將算法實際應(yīng)用到單片機或者DSP中,還需要做進一步的優(yōu)化,實際使用時,一般會將蝶形算子做成一個表,另外也會做定點優(yōu)化。對于ARM芯片而言,其CMSIS庫有現(xiàn)成的實現(xiàn)例子可以直接使用,對于TI系列DSP而言,也內(nèi)置了FFT代碼庫,可直接使用。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4588

    瀏覽量

    92505
  • FFT
    FFT
    +關(guān)注

    關(guān)注

    15

    文章

    433

    瀏覽量

    59256
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4283

    瀏覽量

    62325
  • 傅立葉
    +關(guān)注

    關(guān)注

    0

    文章

    36

    瀏覽量

    12511
  • 傅立葉變換
    +關(guān)注

    關(guān)注

    3

    文章

    99

    瀏覽量

    32333

原文標題:快速教會你傅立葉算法

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    快速傅立葉變換(FFT)算法實驗

    本帖最后由 mr.pengyongche 于 2013-4-30 02:23 編輯 快速傅立葉變換(FFT)算法實驗、摘
    發(fā)表于 12-21 10:54

    如何實現(xiàn)傅立葉變換算法?

    計算量太大,直接用DFT算法進行譜分析和信號的實時處理是不切實際的。快速傅立葉變換(Fast FourierTransformation,簡稱FFT)使DFT運算效率提高1~2個數(shù)量級。其原因是當N較大時,對DFT進行了基4和基
    發(fā)表于 10-08 09:48

    淺懂示波器FFT快速傅立葉變換功能及運用

    氏變換,是離散傅氏變換的快速算法,它是根據(jù)離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。這看,頭都大了。今天我們就帶大家簡單的了解下什么是傅里葉變換以及它
    發(fā)表于 01-14 17:00

    教你招如何去實現(xiàn)傅立葉變換算法?

    教你招如何去實現(xiàn)傅立葉變換算法
    發(fā)表于 04-30 06:05

    示波器FFT快速傅立葉變換不會用?看完這篇帖子,我徹底悟了

    的直流成分,直流信號的頻率是0Hz。我們將通道的耦合方式改成交流,濾除直流信號,就會發(fā)現(xiàn)第條的直線消失了。FFT快速傅立葉變換的作用:FFT就是分析信號的頻譜,在物理學(xué)、電子類學(xué)科
    發(fā)表于 09-22 13:42

    基于FPGA的快速傅立葉變換

    摘要:在對FFT(快速傅立葉變換)算法進行研究的基礎(chǔ)上,描述了用FPGA實現(xiàn)FFT的方法,并對其中的整體結(jié)構(gòu)、蝶形單元及性能等進行了分析。
    發(fā)表于 06-20 14:13 ?1095次閱讀

    1024點FFT快速傅立葉變換

    Xilinx FPGA工程例子源碼:1024點FFT快速傅立葉變換
    發(fā)表于 06-07 14:13 ?33次下載

    26步教會入門freemaster (1)

    Freemaster 是freescale 個很不錯的工具,本文章主要是為了讓大家快速掌握Freemaster 的用法,使我們監(jiān)控變量,調(diào)試程序更方便!以下26 步教會使用free
    發(fā)表于 06-21 17:56 ?163次下載

    教會解決日常使用中電子地磅的小故障

    教會解決日常使用中電子地磅的小故障
    發(fā)表于 02-14 16:46 ?17次下載

    DSP進行浮點快速傅立葉變換剖析

    前言本文目的是演示如何使用STM32F30x 內(nèi)部的DSP 進行浮點快速傅立葉變換(FFT),為聯(lián)系實際應(yīng)用
    的頭像 發(fā)表于 09-18 06:44 ?9436次閱讀

    快速傅立葉變換的基本概念及加窗函數(shù)的介紹

    4.2 快速傅立葉變換及加窗函數(shù)
    的頭像 發(fā)表于 05-07 06:09 ?6445次閱讀
    <b class='flag-5'>快速</b><b class='flag-5'>傅立葉</b>變換的基本概念及加窗函數(shù)的介紹

    簡述FPGA的快速傅立葉變換

    摘要:在對FFT(快速傅立葉變換)算法進行研究的基礎(chǔ)上,描述了用FPGA實現(xiàn)FFT的方法,并對其中的整體結(jié)構(gòu)、蝶形單元及性能等進行了分析。 傅立葉變換是數(shù)字信號處理中的基本操作,廣泛應(yīng)
    的頭像 發(fā)表于 05-27 11:21 ?2206次閱讀
    簡述FPGA的<b class='flag-5'>快速</b><b class='flag-5'>傅立葉</b>變換

    基于FPGA的快速傅立葉變換算法研究

    傅立葉變換是數(shù)字信號處理中的基本操作,廣泛應(yīng)用于表述及分析離散時域信號領(lǐng)域。但由于其運算量與變換點數(shù)N的平方成正比關(guān)系,因此,在N較大時,直接應(yīng)用DFT算法進行譜變換是不切合實際的。
    發(fā)表于 02-22 09:38 ?257次閱讀

    讀懂FFT

    快速傅立葉變換(FFT)是離散傅立葉(DFT)的快速算法,它是根據(jù)離散傅立葉變換的奇、偶、虛、實等特性,對離散
    的頭像 發(fā)表于 05-05 09:51 ?1.2w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>讀懂FFT

    淺懂示波器FFT快速傅立葉變換功能及運用

    氏變換,是離散傅氏變換的快速算法,它是根據(jù)離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。這看,頭都大了。今天我們就帶大家簡單的了解下什么是傅里葉變換以及它
    的頭像 發(fā)表于 11-08 15:01 ?6462次閱讀
    淺懂示波器FFT<b class='flag-5'>快速</b><b class='flag-5'>傅立葉</b>變換功能及運用