無論是學習信號處理,還是做圖像、音視頻處理方面的研究,你永遠避不開的一個內容,就是傅立葉變換和小波。但是這兩個東西其實並不容易弄懂,或者說其實是非常抽象和晦澀的!
本文引用地址:http://www.eepw.com.cn/article/201702/344594.htm完全搞懂傅立葉變換和小波,你至少需要知道哪些預備知識?主頁君從今天開始就將通過一些列文章告訴你他們之間的來龍去脈!本節是全部系列文章的第一節——總綱,日後我們也將按照這個思路一點一點講述所有的知識。需要說明的是,本文主要面向計算機專業或者電子信息專業的讀者,為此我們將儘量採取一些非常非常基礎的知識來幫助你理解。所以,題目裡面講的「完全搞懂」並非是從物理學或者純數學的角度去講的,因為傅立葉變換最初是法國科學家傅立葉在研究物理學(主要是熱力學)時創造出來的一套理論,如果要從這個角度去說「徹底搞懂」,肯定得需要很多物理知識、復變實變分析,之類的像天書一樣的東西。這樣牽扯下去,其實很多對於學計算機或者學電子信息的人來說,其實完全沒有必要。我們要做的,就是利用你已經掌握的知識來構建整個體系!
金庸在他的武俠小說《天龍八部》裡塑造了一個吐蕃國師的人物形象——「鳩摩智」。鳩摩智練武急功近利,為了在短期內多煉成幾門功夫,往往基礎不打牢,就強行修煉上乘武學。用道家的小無相功催動少林的七十二絕技,看似威力無比,其實後患無窮。其實日常學習也是這樣,如果上來就記住幾個公式,然後單刀直入地去啃傅立葉變換或者小波,其實也能做出點東西來,但是由於基礎都是空的,所以內化的過程幾乎是斷裂的,缺損的。無論是傅立葉變換還是小波,它們的最基本理論全部都是數學。只是大部分學生很難建立起它們之間的聯繫。我們今天就從數學開始說起。
圖中虛線框裡的內容,都應該是在高等數學裡必學的內容,這部分有啥不懂的,去問童校長應該最合適不過了。首先,你應該知道費馬定理(這個很簡單,說白了其實就是函數有極值的條件),通過費馬定理,你可以證明羅爾定理,然後通過羅爾定理,你又可以證明拉格朗日中值定理,通過拉格朗日中值定理,你又可以繼而證明柯西中值定理。證明柯西中值定理的意義在於,它可以被用來證明泰勒公式。泰勒公式當然是一個叫做泰勒的人提出來的,但是真正證明泰勒公式的人是柯西,因為柯西知道柯西中值定理,而要證明泰勒公式就需要用到柯西中值定理。泰勒公式在我們這裡有兩個用途,首先它可以用來證明歐拉公式,歐拉公式在傅立葉變換裡面也是必須要用到的。其次,通過泰勒公式可以得到冪級數的展開。這是一個先導,因為無論是小波展開,還是傅立葉展開,如果你理解泰勒展式或者冪級數展開式,那麼對應的就很容易解釋,人們設計傅立葉展式和小波展式的初衷和用意了。高數裡的級數主要學兩種,除了冪級數以外,另外一個就是傅立葉級數。到這裡你所需要的高數知識就已經足夠了。
圖中黃色框圖裡的內容都是你在數位訊號處理課程裡應該學的。我們在學傅立葉變換之前,肯定要在高數裡先學一個傅立葉級數,但是傅立葉級數和傅立葉變換有啥關係呢?說白了,他們的本質是一樣一樣的,儘管它們各自公式的表達式好像差別還很大。通過傅立葉級數公式,其實你做一些化簡和變量替換(關於這部分內容,如果讀者有興趣,主頁君後續可以給出詳細證明過程),傅立葉級數就變成傅立葉變換了,當然是連續的。然後你根據數位訊號處理裡面學的採樣定理,就能到處傅立葉變換了,這就是DFT!但是DFT有個問題,如果按公式計算,效率太低,實用價值不高,後來人們就發明了一個快速算法,FFT!這一路下來,如果每一步,你都非常清楚,那你就已經算是對傅立葉變換理解的很到位了。
然後說說小波,小波完全可以跟傅立葉變換對比著來理解,而且事實上,在小波出現之前,人們先創造出了一種叫短時傅立葉變換的東西,這可以被認為是二者之間的橋梁。當然,這部分內容,你不知道也沒關係,你甚至可以以泰勒公式和冪級數為起點來理解小波。小波級數展開對應的是傅立葉展開,連續小波對應連續傅立葉變換,DWT對應DFT。這些都非常容易理解。同樣,人們(其實主要是Mallat)也開發了一種小波的快速算法,FWT。FWT就像FFT在傅立葉變換中的地位。要理解FWT,你需要知道兩個基礎知識,一個叫做MRA,即多解析度分析,學習MRA對於理解小波也非常有意義。因為MRA是構建小波的一種方法。另外一個你必須要知道的東西叫做「子帶編碼」或者子帶分解。
要想理解子帶分解,你就必須知道QMF,即正交鏡像濾波器,而QMF是多採樣率信號處理裡面的重要內容。所以你必須有多採樣率信號處理知識的基礎,而多採樣率信號處理的基礎又是數位訊號處理!另外,子帶編碼還有一個理論基礎,或者說,子帶編碼為啥被證明有效,這就必須要知道率失真理論的有關結論。率失真理論又是資訊理論的重要組成部分。所以,最後這條線路上,你的學習脈絡應該是從資訊理論出發的(其實主要是互信息和率失真方面的內容),然後才是信號處理,然後是多抽樣率處理,然後是子帶編碼和QMF,這些你都懂了之後,FWT就太Easy了!當然,你直接就學FWT的算法,而不去管它到底是怎麼來的,也是可以的,只是就像我之前說的,你的基礎基本上都是空的,你學了也只是學個招式,內功心法幾乎不會,所以再往上走可能會遇到很多困難。
任何一門學科或者知識發展到現在少說都是幾十年了,讓我們在短短個把月之內就學完,其實很不容易。所以看起來自己要知道的東西實在太多了,而學習的時間又是這樣的有限。但是也沒辦法,樓宇要蓋的越高,地基就勢必要打得越深。
另外:補充一點,後續在具體代碼實現時,我們採用的語言C++,在Visual C++下完成。