日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式微處理器
[導讀][導讀] 今天來聊聊如何實現(xiàn)快速傅立葉變換FFT及其應用,希望大家喜歡。 直接談FFT,可能沒這方面基礎(chǔ)的同學,不太能明白,先看看它的相近較容易理解的幾個概念吧。 啥是傅立葉級數(shù)? 在數(shù)學中,傅里葉級數(shù)(Fourier series)是把類似波的函數(shù)表示成簡單正弦波

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

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

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

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

則,可以將x(t)展開為傅立葉級數(shù)。公式中的k表示第k次諧波,這是個什么概念呢?不容易理解,看下對于一個方波的前4次諧波合成動圖就比較好理解了。這里的合成的概念是時域上的疊加的概念,圖片來源wikipedia

啥是傅里葉變換?

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

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

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

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

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

  • 傅立葉級數(shù)對應的是周期信號,而傅立葉變換則對應的是一個時間連續(xù)可積信號(不一定是周期信號)
  • 傅立葉級數(shù)要求信號在一個周期內(nèi)能量有限,而后者則要求在整個區(qū)間能量有限
  • 傅立葉級數(shù)的對應 是離散的,而傅立葉變換則對應 是連續(xù)的。

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

啥是離散傅立葉變換?

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

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


啥是快速傅立葉變換?

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

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

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

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

假定待變換離散時間序列信號長度為 ,將x(n)按照奇偶分組。其中,k取0,1,...,N/2-1。

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

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

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

不同點:

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

代碼實踐

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

#include  #include  #include  #include  #define q 8 /* 2^q 點,256 */ #define N (1</* N點 FFT, iFFT */ typedef float real; typedef struct{ real Re; 
  real Im;
} complex; #ifndef PI # define PI 3.14159265358979323846264338327950288 #endif /*為了更好說明分治思想,這里采用遞歸實現(xiàn),結(jié)束條件為N<=1*/ void fft( complex *v, int n, complex *tmp ) { if(n>1) { /* N如小于1,直接返回*/ int k,m; complex z, w, *vo, *ve;
    ve = tmp; vo = tmp+n/2; for(k=0; k2; k++) {
      ve[k] = v[2*k];
      vo[k] = v[2*k+1];
    }
    fft( ve, n/2, v ); /* FFT 偶數(shù)序列 v[] */ fft( vo, n/2, v ); /* FFT 偶數(shù)序列 v[] */ for(m=0; m2; m++) {
      w.Re = cos(2*PI*m/(double)n);
      w.Im = -sin(2*PI*m/(double)n);
      z.Re = w.Re*vo[m].Re - w.Im*vo[m].Im; /* Re(w*vo[m]) */ z.Im = w.Re*vo[m].Im + w.Im*vo[m].Re; /* Im(w*vo[m]) */ v[  m  ].Re = ve[m].Re + z.Re;
      v[  m  ].Im = ve[m].Im + z.Im;
      v[m+n/2].Re = ve[m].Re - z.Re;
      v[m+n/2].Im = ve[m].Im - z.Im;
    }
  } return;
} /*為了更好說明分治思想,這里采用遞歸實現(xiàn),結(jié)束條件為N<=1*/ void ifft( complex *v, int n, complex *tmp ) { if(n>1) { int k,m; complex z, w, *vo, *ve;
    ve = tmp; vo = tmp+n/2; for(k=0; k2; k++) {
      ve[k] = v[2*k];
      vo[k] = v[2*k+1];
    }
    ifft( ve, n/2, v ); /* FFT 偶數(shù)序列 v[] */ ifft( vo, n/2, v ); /* FFT 奇數(shù)序列 v[] */ for(m=0; m2; m++) {
      w.Re = cos(2*PI*m/(double)n);
      w.Im = sin(2*PI*m/(double)n);
      z.Re = w.Re*vo[m].Re - w.Im*vo[m].Im; /* Re(w*vo[m]) */ z.Im = w.Re*vo[m].Im + w.Im*vo[m].Re; /* Im(w*vo[m]) */ v[  m  ].Re = ve[m].Re + z.Re;
      v[  m  ].Im = ve[m].Im + z.Im;
      v[m+n/2].Re = ve[m].Re - z.Re;
      v[m+n/2].Im = ve[m].Im - z.Im;
    }
  } return;
} #define SAMPLE_RATE (10000.0f) int main(void) { complex v[N], scratch[N]; float amp[N]; int k; /*模擬一個采樣系統(tǒng),采樣率為10KHz,有兩個信號:500Hz/2kHz*/ for(k=0; k1*sin(2*PI*500*k/SAMPLE_RATE)+0.5*sin(2*PI*2000*k/SAMPLE_RATE);
    v[k].Im = 0;//實際信號處理時,虛部常為0 } /*輸出模擬信號*/ for(int i=0;iprintf("%f,",v[i].Re);      
  } printf("\n");  
  fft( v, N, scratch ); for( int i=0;iprintf("%f,",sqrt(v[i].Re*v[i].Re+v[i].Im*v[i].Im));
  } printf("\n"); while(1);
}

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

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

總結(jié)一下

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

本文辛苦原創(chuàng)分享,如果覺得有價值也請幫忙點贊轉(zhuǎn)發(fā)支持,不勝感激!


本文授權(quán)轉(zhuǎn)載自公眾號“嵌入式客?!?/span>,作者逸珺


-END-




推薦閱讀



【01】圖文并茂,一次搞定C語言結(jié)構(gòu)體內(nèi)存對齊?。ò暾创a) 【02】程序又被人白嫖了!你的MCU加密了嗎? 【03】一個動畫讓你看懂戴森里面的直流無刷電機! 【04】呵呵,一個Bug你改了兩天,真有這么難嗎? 【05】后MATLAB時代的七種開源替代,一種堪稱完美!


免責聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉