從頭到尾徹底理解傅里葉變換算法、上經典算法研究系列:十、從頭到尾徹底理解傅里葉變換算法、上
推薦閱讀:The Scientist and Engineer's Guide to Digital Signal Processing,By Steven W. Smith, Ph.D。此書地址:http://www./pdfbook.htm。 博主說明:I、本文中闡述離散傅里葉變換方法,是根據此書:The Scientist and Engineer's Guide to Digital Signal Processing,By Steven W. Smith, Ph.D.而翻譯而成的,此書地址:http://www./pdfbook.htm。II、同時,有相當一部分內容編輯整理自dznlong的博客,也貼出其博客地址,向原創的作者表示致敬:http://blog.csdn.net/dznlong 。這年頭,真正靜下心寫來原創文章的人,很少了。 第三章、復數
前言: 那么,到底什么是傅里葉變換算法列?傅里葉變換所涉及到的公式具體有多復雜列? 哦,傅里葉變換原來就是一種變換而已,只是這種變換是從時間轉換為頻率的變化。這下,你就知道了,傅里葉就是一種變換,一種什么變換列?就是一種從時間到頻率的變化或其相互轉化。 ok,咱們再來總體了解下傅里葉變換,讓各位對其有個總體大概的印象,也順便看看傅里葉變換所涉及到的公式,究竟有多復雜: 這是將頻率域的函數F(ω)表示為時間域的函數f(t)的積分形式。 連續傅里葉變換的逆變換 (inverse Fourier transform)為: 即將時間域的函數f(t)表示為頻率域的函數F(ω)的積分。 一般可稱函數f(t)為原函數,而稱函數F(ω)為傅里葉變換的像函數,原函數和像函數構成一個傅里葉變換對(transform pair)。 除此之外,還有其它型式的變換對,以下兩種型式亦常被使用。在通信或是信號處理方面,常以 或者是因系數重分配而得到新的變換對: 一種對連續傅里葉變換的推廣稱為分數傅里葉變換(Fractional Fourier Transform)。分數傅里葉變換(fractional Fourier transform,FRFT)指的就是傅里葉變換(Fourier transform,FT)的廣義化。 當f(t)為偶函數(或奇函數)時,其正弦(或余弦)分量將消亡,而可以稱這時的變換為余弦變換(cosine transform)或正弦變換(sine transform). 另一個值得注意的性質是,當f(t)為純實函數時,F(?ω) = F*(ω)成立. 傅里葉級數 其中Fn為復幅度。對于實值函數,函數的傅里葉級數可以寫成:
離散時域傅里葉變換 離散傅里葉變換 為了在科學計算和數字信號處理等領域使用計算機進行傅里葉變換,必須將函數xn定義在離散點而非連續域內,且須滿足有限性或周期性條件。這種情況下,使用離散傅里葉變換(DFT),將函數xn表示為下面的求和形式: 其中Xk是傅里葉幅度。直接使用這個公式計算的計算復雜度為O(n*n),而快速傅里葉變換(FFT)可以將復雜度改進為O(n*lgn)。(后面會具體闡述FFT是如何將復雜度降為O(n*lgn)的。)計算復雜度的降低以及數字電路計算能力的發展使得DFT成為在信號處理領域十分實用且重要的方法。 下面,比較下上述傅立葉變換的4種變體, 如上,容易發現:函數在時(頻)域的離散對應于其像函數在頻(時)域的周期性。反之連續則意味著在對應域的信號的非周期性。也就是說,時間上的離散性對應著頻率上的周期性。同時,注意,離散時間傅里葉變換,時間離散,頻率不離散,它在頻域依然是連續的。 ok, 本文,接下來,由傅里葉變換入手,后重點闡述離散傅里葉變換、快速傅里葉算法,到最后徹底實現FFT算法,全篇力求通俗易懂、閱讀順暢,教你從頭到尾徹底理解傅里葉變換算法。由于傅里葉變換,也稱傅立葉變換,下文所稱為傅立葉變換,同一個變換,不同叫法,讀者不必感到奇怪。 第一部分、DFT 傅立葉是一位法國數學家和物理學家,原名是Jean Baptiste Joseph Fourier(1768-1830), Fourier于1807年在法國科學學會上發表了一篇論文,論文里描述運用正弦曲線來描述溫度分布,論文里有個在當時具有爭議性的決斷:任何連續周期信號都可以由一組適當的正弦曲線組合而成。 當時審查這個論文拉格朗日堅決反對此論文的發表,而后在近50年的時間里,拉格朗日堅持認為傅立葉的方法無法表示帶有棱角的信號,如在方波中出現非連續變化斜率。直到拉格朗日死后15年這個論文才被發表出來。 為什么我們要用正弦曲線來代替原來的曲線呢?如我們也還可以用方波或三角波來代替呀,分解信號的方法是無窮多的,但分解信號的目的是為了更加簡單地處理原來的信號。 二、傅立葉變換分類 這四種傅立葉變換都是針對正無窮大和負無窮大的信號,即信號的的長度是無窮大的,我們知道這對于計算機處理來說是不可能的,那么有沒有針對長度有限的傅立葉變換呢?沒有。因為正余弦波被定義成從負無窮小到正無窮大,我們無法把一個長度無限的信號組合成長度有限的信號。 先來看一個變換實例,下圖是一個原始信號圖像:
9個余弦信號: 9個正弦信號: 把以上所有信號相加即可得到原始信號,至于是怎么分別變換出9種不同頻率信號的,我們先不急,先看看對于以上的變換結果,在程序中又是該怎么表示的,我們可以看看下面這個示例圖:
第二章、實數形式離散傅立葉變換(Real DFT) 上圖中至于每個波的振幅(amplitude)值(Re X[k],Im X[k])是怎么算出來的,這個是DFT的核心,也是最難理解的部分,我們先來看看如何把分解出來的正余弦波合成原始信號(Inverse DFT)。 如果有學過傅立葉級數,對這個等式就會有似曾相識的感覺,不錯!這個等式跟傅立葉級數是非常相似的: 當然,差別是肯定是存在的,因為這兩個等式是在兩個不同條件下運用的,至于怎么證明DFT合成公式,這個我想需要非常強的高等數學理論知識了,這是研究數學的人的工作,對于普通應用者就不需要如此的追根究底了,但是傅立葉級數是好理解的,我們起碼可以從傅立葉級數公式中看出DFT合成公式的合理性。 上面a和 b兩個圖是待檢測信號波,圖a很明顯可以看出是個3個周期的正弦信號波,圖b的信號波則看不出是否含有正弦或余弦信號,圖c和d都是個3個周期的正弦信號波,圖e和f分別是a、b兩圖跟c、d兩圖相乘后的結果,圖e所有點的平均值是0.5,說明信號a含有振幅為1的正弦信號c,但圖f所有點的平均值是0,則說明信號b不含有信號d。這個就是通過信號相關性來檢測是否含有某個信號的方法。 第二個式子中加了個負號,是為了保持復數形式的一致,前面我們知道在計算 這里有一點必須明白一個正交的概念:兩個函數相乘,如果結果中的每個點的總和為0,則可認為這兩個函數為正交函數。要確保關聯性算法是正確的,則必須使得跟原始信號相乘的信號的函數形式是正交的,我們知道所有的正弦或余弦函數是正交的,這一點我們可以通過簡單的高數知識就可以證明它,所以我們可以通過關聯的方法把原始信號分離出正余弦信號。當然,其它的正交函數也是存在的,如:方波、三角波等形式的脈沖信號,所以原始信號也可被分解成這些信號,但這只是說可以這樣做,卻是沒有用的。
本人July對本博客所有任何文章、內容和資料享有版權。 從頭到尾徹底理解傅里葉變換算法、下經典算法研究系列:十、從頭到尾徹底理解傅里葉變換算法、下
推薦閱讀:The Scientist and Engineer's Guide to Digital Signal Processing,By Steven W. Smith, Ph.D。此書地址:http://www./pdfbook.htm。 從頭到尾徹底理解傅里葉變換算法、下
第三章、復數 復數擴展了我們一般所能理解的數的概念,復數包含了實數和虛數兩部分,利用復數的形式可以把由兩個變量表示的表達式變成由一個變量(復變量)來表達,使得處理起來更加自然和方便。 其中h表示高度,g表示重力加速度(9.8m/s2),v表示初速度,t表示時間。現在反過來,假如知道了高度,要求計算到這個高度所需要的時間,這時我們又可以通過下式來計算:
上面中右邊的兩個式子分別是cos(x)和sin(x)的泰勒(Taylor)級數。 這樣子我們又可以把復數的表達式表示成指數的形式了:
第四章、復數形式離散傅立葉變換 復數形式的離散傅立葉變換非常巧妙地運用了復數的方法,使得傅立葉變換變換更加自然和簡潔,它并不是只是簡單地運用替換的方法來運用復數,而是完全從復數的角度來分析問題,這一點跟實數DFT是完全不一樣的。 通過歐拉等式可以把正余弦函數表示成復數的形式: 從這個等式可以看出,如果把正余弦函數表示成復數后,它們變成了由正負頻率組成的正余弦波,相反地,一個由正負頻率組成的正余弦波,可以通過復數的形式來表示。 現在我們的原始信號變成了復數,我們要得到的當然是復數的信號分量,我們是不是可以把它乘以一個復數形式的正交函數呢?答案是肯定的,正余弦函數都是正交函數,變成如下形式的復數后,仍舊還是正交函數(這個從正交函數的定義可以很容易得到證明): cos x + j sin x, cos x – j sin x,……
N/2 ~ N-1(π~ 2π)是負頻部分,由于正余弦函數的對稱性,所以我們把 –π~ 0表示成π~ 2π,這是出于計算上方便的考慮。 現中我們一般是把它移到正的頻譜后面的。 從上圖可以看出,時域中的正余弦波(用來組成原始信號的正余弦波)在復數DFT的頻譜中被分成了正、負頻率的兩個組成部分,基于此等式中前面的比例系數是1/N(或1/2π),而不是2/N,這是因為現在把頻譜延伸到了2π,但把正負兩個頻率相加即又得到了2/N,又還原到了實數DFT的形式,這個在后面的描述中可以更清楚地看到。 由于復數DFT生成的是一個完整的頻譜,原始信號中的每一個點都是由正、負兩個頻率組合而成的,所以頻譜中每一個點的帶寬是一樣的,都是1/N,相對實數DFT,兩端帶寬比其它點的帶寬少了一半;復數DFT的頻譜特征具有周期性:-N/2 ~ 0與N/2 ~ N-1是一樣的,實域頻譜呈偶對稱性(表示余弦波頻譜),虛域頻譜呈奇對稱性(表示正弦波頻譜)。 四、 逆向傅立葉變換 cos(2πkn/N) – j si(2πkn/N), x[n] = X[k] (cos(2πkn/N) + j sin(2πkn/N)) 我們現在來分析這個式子,會發現這個式其實跟實數傅立葉變換是可以得到一樣結果的。我們先把X[k]變換一下: X[k] = Re X[k] + j Im X[k]
x[n] = (Re X[k] + j Im X[k]) (cos(2πkn/N) + j sin(2πkn/N)) = ( Re X[k] cos(2πkn/N) + j Im X[k] cos(2πkn/N) +j Re X[k] sin(2πkn/N) - Im X[k] sin(2πkn/N) ) = ( Re X[k] (cos(2πkn/N) + j sin(2πkn/N)) + ---------------------(1) Im X[k] ( - sin(2πkn/N) + j cos(2πkn/N))) ---------------(2)
這時我們就把原來的等式分成了兩個部分,第一個部分是跟實域中的頻譜相乘,第二個部分是跟虛域中的頻譜相乘,根據頻譜圖我們可以知道,Re X[k]是個偶對稱的變量,Im X[k]是個奇對稱的變量,即 Re X[k] = Re X[- k] 但k的范圍是0 ~ N-1,0~N/2表示正頻率,N/2~N-1表示負頻率,為了表達方便我們把N/2~N-1用-k來表示,這樣在從0到N-1的求和過程中對于(1)和(2)式分別有N/2對的k和-k的和,對于(1)式有: Re X[k] (cos(2πkn/N) + j sin(2πkn/N)) + Re X[- k] (cos( - 2πkn/N) + j sin( -2πkn/N)) 根據偶對稱性和三角函數的性質,把上式化簡得到: 這個式子最后的結果是: 2 Re X[ k] cos(2πkn/N)。 -2 Im X[k] sin(2πkn/N) 注意上式前面多了個負符號,這是由于虛數變換的特殊性造成的,當然我們肯定不能把負符號的正弦函數跟余弦來相加,還好,我們前面是用cos(2πkn/N) – j sin(2πkn/N)進行相關性計算,得到的Im X[k]中有個負的符號,這樣最后的結果中正弦函數就沒有負的符號了,這就是為什么在進行相關性計算時虛數部分要用到負符號的原因(我覺得這也許是復數形式DFT美中不足的地方,讓人有一種拼湊的感覺)。
本人July對本博客所有任何文章、內容和資料享有版權。 |
|