此篇文章是對 ministm32f103實現家庭普通電路中的電流諧波檢測 一文的補充
本文參考:快速傅利葉變換學習及c語言實現
形象的介紹:什麼是傅利葉變換?
手把手教你理解(fft)
fft是最重要,也是最難懂的。簡單說下原理:
fft(快速傅利葉變換)是dft(離散傅利葉變換)的改進演算法,其將dft的n^2 步運算減少至 ( n/2 )log2(n)步。
先來講講dft的原理
離散傅利葉變換(dft)是傅利葉變換在離散系統中的表示形式,
k是頻率,n是第n個點,n是採集點數,w是旋轉因子
這個公式是什麼意思呢?來看看這個
下面可以理解為乙個旋轉的向量,在某一時刻,它的長度等於上面時域訊號的高度,時域訊號中波峰對應離圓心較遠的點,波谷對應離圓心較近的點
3 beats/second的意思是訊號的頻率,0.20 cycles/second是纏繞圓影象的頻率,即是每秒0.2圈
傅利葉變換可以理解為:把上面時域訊號波形纏繞在複數域內的單位圓上,巧合的是,當纏繞頻率等於訊號頻率時,纏繞影象會很整齊,而在其他時候,纏繞影象會顯得很混亂,例如:
纏繞頻率k=0.79hz時
纏繞頻率k=3hz時
那和dft的式子有什麼關係呢?看圖
上面纏繞影象上的點就是採集的離散點,即是x(n)
根據採集點數等分這個單位圓,得到的點也就是旋轉因子w,用對應的w去乘以x(n),因為是單位圓(也就是1),所以得到的纏繞影象就是原來訊號波形纏繞在圓上,可以理解對單位圓根據x(n)的值進行放縮。在實際處理過程,我們是要把所有採集的點剛好圍繞一周,然後從k=1開始,不斷增加纏繞影象的纏繞頻率,直至得到乙個有規律的纏繞影象。
那麼問題來了,人可以通過眼睛判斷,計算機或者微控制器晶元可不認識這樣的乙個影象,那麼如何找出整齊的纏繞影象呢?
當出現這樣乙個整齊的纏繞影象時,其影象質心點對應的模值也是最大的。
可通過計算其質心來找,也就是最初的公式
例如k=1時,把所有複數域上的點(原始點乘w)都加起來,因為質心的計算公式為
dft公式計算的其實就是該纏繞頻率(k)下纏繞圖形的質心的n倍。(這裡就不往下展開了,博主也在想這個問題:fft後點的模值和訊號幅值的關係為啥是n/2,這和dft計算的是纏繞影象質心的n倍有什麼關係?)
說完對dft的理解,現在來說下fft是如何改進dft演算法的。
因為一些數學符號難以表達,所有這裡手寫
以下參考 快速傅利葉變換學習及c語言實現
例如n=8時的蝶形圖為
該演算法的特徵是:
1)輸入序列順序位反轉,輸出所有頻率值都是按順序出現的。
2)計算可以「就地」完成,也就是蝶形所使用的儲存位置可以被重寫。
3)從圖中我們可以看到對於點數為n = 2^l的fft運算,可以分解為l階蝶形圖級聯,每一階蝶形圖內又分為m個蝶形組,每個蝶形組內包含k個蝶形。(迭代演算法實現:根據這一點我們就可以構造三階迴圈來實現蝶形運算。程式設計過程需要注意旋轉因子與蝶形階數和蝶形分組內的蝶形個數存在關聯。)
ok,後續再補充思考的問題
DFT插零FFT演算法理解
圖1 為什麼fft時域補0後,經fft變換就是頻域進行內插?應該這樣來理解這個問題 補0後的dft fft是dft的快速演算法 實際上公式並沒變,變化的只是頻域項 如 補0前fft計算得到的是m 2 pi m處的頻域值,而補0後得到的是n 2 pi n處的頻域值 m為原dft長度,n變成了補0後的長...
DFT和FFT的一點思考
很多文章都側重於從理論理解傅利葉變換,從公式理解的比較少,我們都知道傅利葉變換的思想 於所有訊號都可以由整數倍的基頻正弦訊號組合而成 ofdm調製的原理 那麼其公式和實現是不是也要重點理解一下呢?dft 其中為什麼不同時刻的幅度值與某一頻率對應時刻的對數值卷積就是頻域資訊?卷積就到了頻域?對於每乙個...
關於DFT與FFT的細節備忘
備忘內容 dft是將離散非週期訊號,如 做週期延拓之後,認為它是週期訊號,再做傅利葉變換的乙個過程。做完傅利葉變換之後,得到的仍然是乙個週期離散訊號,取其主值序列即可 所以,之前部落格裡的內容實際上有一點問題,因為做週期延拓的時候,如果原訊號是乙個週期訊號,但是截斷的位置並不是完整的週期,那麼實際上...