如何理解离散傅里叶变换(一)实数形式傅里叶变换
如何理解離散傅里葉變換(一)
——實數形式傅里葉變換
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本文作者:隨煜而安 ?二零一五年五月二十三日
原創作者:July、dznlong ?
推薦閱讀:
1.The Scientist and Engineer's Guide to Digital Signal Processing,By Steven W. Smith, Ph.D。http://www.dspguide.com/pdfbook.htm。
2.July大神博客??點擊打開鏈接
3.dznlong大神博客? ?點擊打開鏈接
4.高等數學/數學分析中關于傅里葉級數,三角函數正交系的部分內容
5.深入淺出的講解傅里葉變換(個人感覺講的一般,但是配圖很形象幫助理解) ?點擊打開鏈接
說明:
I、本文中闡述的離散傅里葉變換方法是July、dznlong 兩位根據此書:The Scientist and Engineer's Guide to Digital Signal Processing,By Steven W. Smith, Ph.D.而翻譯而成的,此書地址:http://www.dspguide.com/pdfbook.htm。
II、同時,有相當一部分內容編輯整理自dznlong、July兩位的博客,本文是根據兩人文章的思路添加上一些個人的想法以及補充一些細節的成果。上面也貼出了其博客地址,向原創的作者表示致敬。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
談談傅里葉變換
開始進入正題:
“關于傅立葉變換,無論是書本還是在網上可以很容易找到關于傅立葉變換的描述,但是大都是些故弄玄虛的文章,太過抽象,盡是一些讓人看了就望而生畏的公式的羅列,讓人很難能夠從感性上得到理解”---dznlong,
那么,到底什么是傅里葉變換算法?傅里葉變換所涉及到的公式具體有多復雜列?這篇文章我借鑒兩位大神的思路,并且先不列出一些復雜的公式,一步一步的引出我們要研究的東西,盡量做到通俗易懂。
傅里葉變換(Fourier transform)是一種線性的積分變換。因其基本思想首先由法國學者傅里葉系統地提出,所以以其名字來命名以示紀念。傅里葉變換就是一種變換而已,只是這種變換是從時間轉換為頻率的變化。
傅里葉變換的提出:
傅立葉是一位法國數學家和物理學家,原名是Jean Baptiste Joseph Fourier(1768-1830), Fourier于1807年在法國科學學會上發表了一篇論文,論文里描述運用正弦曲線來描述溫度分布,論文里有個在當時具有爭議性的決斷:任何連續周期信號都可以由一組適當的正弦曲線組合而成。 當時審查這個論文拉格朗日堅決反對此論文的發表,而后在近50年的時間里,拉格朗日堅持認為傅立葉的方法無法表示帶有棱角的信號,如在方波中出現非連續變化斜率。直到拉格朗日死后15年這個論文才被發表出來。
誰是對的呢?拉格朗日是對的:正弦曲線無法組合成一個帶有棱角的信號。但是,我們可以用正弦曲線來非常逼近地表示它,逼近到兩種表示方法不存在能量差別,基于此,傅立葉是對的。
我們觀察下圖,直觀的感受一下這個決斷和傅里葉變換究竟在做怎樣的一件事情。(圖片來自:點擊打開鏈接)
? ? 在這兩幾幅圖中,分別代表了兩個傅里葉變換。最前面黑色的線代表的就是要進行變換的時域上的函數f(t),它可以表示成后面所有彩色表示的正弦波疊加而成的總和。而后面依不同顏色排列而成的正弦波就是組合為f(t)的各個分量。這些正弦波按照頻率從低到高從前向后排列開來,而每一個波的振幅都是不同的。一定有細心的讀者發現了,在兩個正弦波之間可能還有一條直線,那并不是分割線,而是振幅為0的正弦波!也就是說,為了組成特殊的曲線,有些正弦波成分是不需要的,或者說時域上的函數f(t)中不含有這種對應頻率的分量。來看一個更為詳細一些的圖:
? ? 對于每個正弦波分量,如果我們只看它的頻率和幅值。那么對于所有分量,就形成了一個以頻率為自變量,幅值為因變量的頻率域上的函數F(w),也就是頻域圖像。這時,一個時域——頻域的映射就形成了。這個例子中我們可以看出,一個時域上的近似矩形波被分解成了不同頻率分量的正弦波,反過來看,一些不同頻率的正弦波疊加成了一個矩形波。要注意的是,在實際中通常是將時域的函數變換為不同頻率的正弦波和余弦波的疊加,而不僅僅是一些正弦波的疊加,盡管這并沒有什么不同,因為我們知道正余弦是可以互相表示的。
? ? 到此,在沒有任何公式的情況下,我們也大概知曉了傅里葉變換在做怎樣的一件事情。
傅立葉變換分類
???根據原信號的不同類型,我們可以把傅立葉變換分為四種類別:
1、非周期性連續信號??????? 傅立葉變換(Fourier Transform)?
2、周期性連續信號?????????? 傅立葉級數(Fourier Series)?
3、非周期性離散信號???????離散時域傅立葉變換(Discrete Time Fourier Transform)?
4、周期性離散信號?????????? 離散傅立葉變換(Discrete Fourier Transform)?
現在我們要列出一些公式了,先觀察即可,后面會做出詳細的解釋。
? ? ?1.連續傅里葉變換
? ? ?一般情況下,若“傅里葉變換”一詞不加任何限定語,則指的是“連續傅里葉變換”。連續傅里葉變換將平方可積的函數f(t)表示成復指數函數的積分或級數形式。
這是將頻率域的函數F(ω)表示為時間域的函數f(t)的積分形式。
連續傅里葉變換的逆變換 (inverse Fourier transform)為:
即將時間域的函數f(t)表示為頻率域的函數F(ω)的積分。
2.傅里葉級數
連續形式的傅里葉變換其實是傅里葉級數 (Fourier series)的推廣,因為積分其實是一種極限形式的求和算子而已。
對于周期函數,其傅里葉級數是存在的:
其中Fn為復幅度。對于實值函數,函數的傅里葉級數可以寫成:
其中an和bn是實頻率分量的幅度。
3.離散時域傅里葉變換
???離散傅里葉變換是離散時間傅里葉變換(DTFT)的特例(有時作為后者的近似)。DTFT在時域上離散,在頻域上則是周期的。DTFT可以被看作是傅里葉級數的逆變換。
4.離散傅里葉變換
?? 離散傅里葉變換(DFT),是連續傅里葉變換在時域和頻域上都離散的形式,將時域信號的采樣變換為在離散時間傅里葉變換(DTFT)頻域的采樣。在形式上,變換兩端(時域和頻域上)的序列是有限長的,而實際上這兩組序列都應當被認為是離散周期信號的主值序列。即使對有限長的離散信號作DFT,也應當將其看作經過周期延拓成為周期信號再作變換。在實際應用中通常采用快速傅里葉變換以高效計算DFT。
?? 為了在科學計算和數字信號處理等領域使用計算機進行傅里葉變換,必須將函數xn定義在離散點而非連續域內,且須滿足有限性或周期性條件。這種情況下,使用離散傅里葉變換(DFT),將函數xn表示為下面的求和形式:
其中Xk是傅里葉幅度。
現在我們已經把四種類型的傅里葉變換的公式給出了,直接看這些公式,就像很多教科書那樣,我想大家跟我一樣都是一頭霧水。?下面是July、dznlong兩位大神給出的一些更為直觀的東西。
我們可以觀察思考下上述傅立葉變換的4種變體的特點
???????下圖是四種原信號圖例(從上到下,依次是FT,FS,DTFT,DFT):
對于計算機來說只有離散的和有限長度的數據才能被處理。所以首先可以肯定的是,對于計算機中的研究,我們的時域信號需要是離散的。對于我們要處理的輸入信號,考慮如果是非周期性信號的普遍情況。我們需要用無窮多不同頻率的正弦曲線來表示,這對于計算機來說也是不可能實現的。所以頻率域上也要是離散的。所以基于上面的分析,我們下面重點討論和理解的是離散傅立葉變換(DFT),因為只有它才能被計算機適用。
?另外,每種傅立葉變換都分成實數和復數兩種方法,對于實數方法是最好理解的,但是復數方法就相對復雜許多了,需要懂得有關復數的理論知識,不過,如果理解了實數離散傅立葉變換(real DFT),再去理解復數傅立葉變換就更容易了,所以我們先把復數的傅立葉變換放到一邊去,先來理解實數傅立葉變換,在后面我們會先講講關于復數的基本理論,然后在理解了實數傅立葉變換的基礎上再來理解復數傅立葉變換。所以本文后面的重點是理解實數離散傅立葉變換(real DFT)。
截止到這里,我們簡單闡述了傅里葉變換的一些基礎知識和思想。后面,我們將從相對簡單的實數傅里葉變換出發,試著去理解它。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
實數離散傅立葉變換(real DFT)
首先,先來看一個關于實數離散傅立葉變換(Real DFT)的例子?????
通過這個例子,是想引出實數離散傅里葉變換在數學或者說程序中的表達方法,并且如果能理解實數離散傅里葉變換的原理就更好了
下圖是一個實數原始離散信號圖像:
?????? 這個信號的長度是16,于是可以把這個信號分解9個余弦波和9個正弦波(一個長度為N的信號可以分解成N/2+1個正余弦信號,這是為什么呢?我們稍后再討論,也許結合下圖你就能已經看出其中的原因。參看最后面的證明1)
結合下面的18個正余弦圖,我想從計算機處理精度上就不難理解,一個長度為N的信號,最多只能有N/2+1個不同頻率,再多的頻率就超過了計算機所能所處理的精度范圍),如下圖:
??????? 9個余弦信號:
從左至右,從上到下,分別對應著頻率k=0~8;
頻率k=i就代表在長度為N的區間上存在著i個周期。k越大,周期越小。
????????9個正弦信號:
同樣的,從左至右,從上到下,分別對應著頻率k=0~8;
?????? 把以上所有信號相加即可得到原始信號,至于是怎么分別變換出9種不同頻率信號的,我們也先不急,后面會說到,先看看對于以上的變換結果,在程序中又是該怎么表示的,我們可以看看下面這個示例圖:
? 上圖中左邊表示時域中的信號,右邊是頻域信號表示方法,
從左向右,-->,表示正向轉換(Forward DFT),從右向左,<--,表示逆向轉換(Inverse DFT),
用小寫x[]表示信號在每個時間點上的幅度值數組, 用大寫X[]表示每種頻率的幅度值數組(即時間x-->頻率X),?
因為變換到頻率域后有N/2+1種頻率,需要記錄N/2+1個幅值,所以該數組長度為N/2+1
X[]數組又分兩種,一種是表示余弦波的不同頻率幅度值:Re X[],另一種是表示正弦波的不同頻率幅度值:Im X[]。
其中,Re是實數(Real)的意思,Im是虛數(Imagine)的意思,采用復數的表示方法把正余弦波組合起來進行表示,但這里我們不考慮復數的其它作用,只記住是一種組合方法而已,目的是為了便于表達(個人感覺這樣表示是因為更為普遍和常用的復數形式傅里葉變換的存在,為了在形式上契合它)。還有,在后面我們會知道,復數形式的傅立葉變換頻率域數組長度是N,而不是N/2+1。
到此,實數形式的離散傅里葉變換的表示方法及符號約定我們已經說清楚了,并且變換所做的實際工作我們也心里有數了。現在,補充上面欠著的關于“一個長度為N的信號可以分解成N/2+1個正余弦信號”的證明1。
這個問題解決了,不過到這里不知道有沒有人和我有同樣的疑問。為什么變換后的正弦余弦分量的頻率取值都正好是整數?這個問題將在下面的學習中自然而然的明白。
實數形式離散傅里葉正變換(DFT)
? ??由上面的討論我們知道DFT是要將時域長度為N的離散序列x(n)變換為不同頻率取值的正余弦分量,且頻率K取值為0~N/2+1。其實我們正變換要做的是已知時域序列x(n),求頻率域上的幅度值數組,也就是ReX[] 和ImX[]。
有三種完全不同的方法進行DFT:一種方法是通過聯立方程進行求解, 從代數的角度看,要從N個已知值求N個未知值,需要N個聯立方程,且N個聯立方程必須是線性獨立的,但這是這種方法計算量非常的大且極其復雜,所以很少被采用;第二種方法是利用信號的相關性(correlation)進行計算,這個是我們后面將要介紹的方法;第三種方法是快速傅立葉變換(FFT),這是一個非常具有創造性和革命性的的方法,因為它大大提高了運算速度,使得傅立葉變換能夠在計算機中被廣泛應用,但這種算法是根據復數形式的傅立葉變換來實現的,它把N個點的信號分解成長度為N的頻域,這個跟我們現在所進行的實域DFT變換不一樣,而且這種方法也較難理解,這里我們先不去理解,等先理解了復數DFT后,再來看一下FFT。有一點很重要,那就是這三種方法所得的變換結果是一樣的,經過實踐證明,當頻域長度為32時,利用相關性方法進行計算效率最好,否則FFT算法效率較高。現在就讓我們來看一下相關性算法。--July
?
利用第一種方法、信號的相關性(correlation)可以從噪聲背景中檢測出已知的信號,我們也可以利用這個方法檢測信號波中是否含有某個頻率的信號波:把一個待檢測信號波乘以另一個信號波,得到一個新的信號波,再把這個新的信號波所有的點進行相加,從相加的結果就可以判斷出這兩個信號的相似程度。如下圖:
??????? 上面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,則可認為這兩個函數為正交函數。要確保關聯性算法是正確的,則必須使得跟原始信號相乘的信號的函數形式是正交的,我們知道所有的正弦或余弦函數是正交的,這一點我們可以通過簡單的高數知識就可以證明它,所以我們可以通過關聯的方法把原始信號分離出正余弦信號。也就是說,一個帶有多個頻率分量的時域函數f(t)乘以某個頻率的正交基的積分,其實就等于函數中對應這個頻率的分量與這個頻率正交基的積分,也就求出了函數與這個頻率的“關聯度”。當然,其它的正交函數也是存在的,如:方波、三角波等形式的脈沖信號,所以原始信號也可被分解成這些信號,但這只是說可以這樣做,卻是沒有用的。
實數形式離散傅里葉逆變換——合成運算方法(Real Inverse DFT)?
DFT合成等式(合成原始時間信號,頻率-->時間,逆向變換):
如果有學過傅立葉級數,對這個等式就會有似曾相識的感覺,不錯!這個等式跟傅立葉級數是非常相似的:
? ? ? ? 當然,差別是肯定是存在的,因為這兩個等式是在兩個不同條件下運用的,至于怎么證明DFT合成公式,這個我想需要非常強的高等數學理論知識了,這是研究數學的人的工作,對于普通應用者就不需要如此的追根究底了,但是傅立葉級數是好理解的,我們起碼可以從傅立葉級數公式中看出DFT合成公式的合理性。? ? ? ? ? ? ? ? ? ? ? ? ??
?????? DFT合成等式中的Im?X[k]和Re X[k]跟之前提到的Im X[k]和Re X[k]是不一樣的,下面是轉換方法(關于此公式的解釋,見下文):
???????
?????? 但k等于0和N/2時,實數部分的計算要用下面的等式:
??????????????
?????? 上面四個式中的N是時域中點的總數,k是從0到N/2的序號。
?????? 為什么要這樣進行轉換呢?這個可以從頻譜密度(spectral density)得到理解,如下圖就是個頻譜圖:
???????
?????? 這是一個頻譜圖,橫坐標表示頻率大小,縱坐標表示振幅大小,原始信號長度為N(這里是32),經DFT轉換后得到的17個頻率的頻譜,頻譜密度表示每單位帶寬中為多大的振幅,那么帶寬是怎么計算出來的呢?看上圖,除了頭尾兩個,其余點的所占的寬度是2/N,這個寬度便是每個點的帶寬,頭尾兩個點的帶寬是1/N,而Im X[k]和Re X[k]表示的是頻譜密度,即每一個單位帶寬的振幅大小,但表示2/N(或1/N)帶寬的振幅大小,所以分別應當是Im X[k]和Re X[k]的2/N(或1/N)。
?
頻譜密度就象物理中物質密度,原始信號中的每一個點就象是一個混合物,這個混合物是由不同密度的物質組成的,混合物中含有的每種物質的質量是一樣的,除了最大和最小兩個密度的物質外,這樣我們只要把每種物質的密度加起來就可以得到該混合物的密度了,又該混合物的質量是單位質量,所以得到的密度值跟該混合物的質量值是一樣的。--dznlong
?
?????? 至于為什么虛數部分是負數,這是為了跟復數DFT保持一致,這個我們將在后面會知道這是數學計算上的需要(Im X[k]在計算時就已經加上了一個負號(稍后,由下文,便可知),再加上負號,結果便是正的,等于沒有變化)。
?
?????? 如果已經得到了DFT結果,這時要進行逆轉換,即合成原始信號,則可按如下步驟進行轉換:
1、先根據上面四個式子計算得出的值;
2、再根據DFT合成等式得到原始信號數據。
?到此為止,我們對傅立葉變換便有了感性的認識了。但是,這只是在實域上的離散傅立葉變換,其中雖然也用到了復數的形式,但那只是個替代的形式,并無實際意義,現實中一般使用的是復數形式的離散傅立葉變換,且快速傅立葉變換是根據復數離散傅立葉變換來設計算法的。隨著作者之后的學習,再總結出后面的博文。
總結
以上是生活随笔為你收集整理的如何理解离散傅里叶变换(一)实数形式傅里叶变换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分数的乘法逆元和负数的取模运算
- 下一篇: 外设驱动库开发笔记20:BME280压力