關於傅立葉轉換,與影像的頻率處理息息相關,然而,數學公式往往令多數人難以理解,這時候,不妨從程式實作弦波疊加開始著手,進一步認識訊號在時域與頻域中各自要表達的意義。

從程式碼畫弦波開始

若是聲音之類的訊號,對許多人來說,應該很容易理解頻率的意義。

因為這類訊號是一種時間與振幅(例如音量大小)的關係,就人的耳朵來說,低頻聲音聽來沉悶,高頻聲音聽來刺耳,許多人都聽過行駛中車輛按著喇叭,由遠至近、又由近至遠的頻率變化(都普勒效應),構成的聽覺差異。

然而,我在先前專欄〈淺談圖片雜訊處理〉談過,對圖像而言,雜訊會有高頻與低頻之別,不過,初接觸影像處理的人往往難以意會上述的區分,因為他們可能覺得:單一圖像明明是靜止的,怎麼會有頻率的概念?

就灰階圖像而言,灰階值就好比訊號的振幅值,像素彼此之間的距離,就好比時間的間距,在不深入細究細節的情況下,大致上,我們可以認為,若鄰近像素間的灰階度變化小,就像是短時間內振幅變化週期長的低頻訊號,若鄰近像素之間的灰階度變化大,就像是短時間內振幅的變化週期短的高頻訊號。

然而,如果我們想進一步對圖像進行「濾波」處理,像是尋找圖像邊緣,就必須進一步認識傅立葉轉換(Fourier transform),以清楚認識圖像頻率的意義,而要認識傅立葉轉換,必須先認識博立葉級數(Fourier series)……呃!又要看複雜的數學公式了嗎?

這喚起了我求學時代工程數學、信號處理的惡夢,當然,有能力看懂公式意義甚至推導公式的話,必然對傅立葉轉換能有更深的認識,然而,就圖像處理而言,還有個更重要的任務,就是理解公式實際上對應於圖像的意義與應用。

而理解意義的第一步,就是請你先畫出一條正弦波,在〈NumPy與Matplotlib畫正弦波〉這個gist,提供簡單的程式實作可以參考。

弦波疊加與傅立葉級數

畫正弦波沒什麼困難,只不過我們要記得,sin(x)函式是個連續函式,而電腦的世界是離散的,實際上,只能每隔一段x來取樣;目前若在畫出來的正弦波上,疊加一個頻率稍高、振幅稍低的正弦波,會如何呢?

你會發現:畫出來的波變得複雜一些,然而,大致上,還是維持著正弦波的樣子,如果持續地疊加頻率更高、振幅更低,波的形狀就會持續變得複雜,變得更像是某種神祕的訊號。

其實,我們也可以隨意地疊加各種頻率、各種振幅的弦波,只不過生成的訊號較難看出有正弦波的規律,只會像雜訊。

既然我們要特意疊加頻率更高、振幅更低的弦波,就來疊加出一個更有趣的弦波訊號吧!試著執行〈弦波疊加〉這個gist看看吧!

執行結果可能會令你困惑,明明看來是個方波啊!哪來的弦波?

那是因為,我疊加了一千個特意安排的弦波,雖然看來像是方波,然而,若將圖形的顯示級數放大,還是可以看到波形起伏,只是起伏很微小,小到原尺寸下肉眼幾乎看出。

透過一大堆正弦波的疊加,竟然可以近似到方波,雖然方波是個極端的例子,只不過方波都能近似出來了,其他的週期波,是不是也有可能透過正弦波的疊加來構成?

事實上,傅立葉(Joseph Fourier)告訴我們,這種做法是可行的,在數學上,將這類函數,以簡單正弦波來表示的形式,稱為傅立葉級數(Fourier series)。

聲波之類的訊號就是類似的道理,如果你試著使用錄音程式錄下你說話的聲音,有些錄音程式會顯示你的聲音波形,基本上,這其實是代表著隨著時間記錄的音量,而這個波形可以分解為許多弦波的組合。

這代表著,我們可以將不同頻率的訊號混合在一起,而且,不同的頻率代表想要傳遞不同的意義,將這個波傳送出去後,接收端若能將之轉換為傅立葉級數,此時,就可以取得特定頻率,解讀其中的資訊。

從時域到頻域

若sin(x)中,x代表著時間t,一段時間內的sin(t)值,會不斷隨著時間而變化,sin(t)描述的是訊號隨著時間變化的關係,這關係稱為時域(Time domain),將時間t為橫軸,sin(t)為縱軸,畫出來的正弦波是時域的圖形化表示。

方才〈弦波疊加〉的繪圖結果,是一千個弦波疊加而成,如果現在不是將弦波疊加,而是在立體的笛卡兒座標系,將x軸作為時間值,y軸是每個弦波的頻率值,z軸作為振幅,將這些弦波個別畫出來,會是什麼圖案呢?

將一千個弦波畫出來,會過於混亂,〈時域與頻域〉是只畫出其中四個弦波的結果,可以使用滑鼠轉動繪出來的立體座標系,如果你轉動至只能看到xz平面,此時,就會發現像是由四根莖組成的莖葉圖(Stem plot),也就是說,這種做法給了我們從頻率的觀點來分析訊號的機會。

如果有個函式F(w),w為頻率,可以用來描述、繪製莖葉圖,這函式描述的是訊號與頻率的關係,這關係就稱為頻域(Frequency domain)。

綜合以上的描述方式,你將可以發現下面的狀況:從時域的觀點來看,f(t)代表某個訊號不斷地在變化,然而,從頻域F(w)的觀點來看,訊號的頻率始終不變。

我們可以想像:在風琴按下四個鍵,發出的聲音在波形上是四個頻率的波疊加而成,雖然隨著時間過去,波形會有變化,然而,我們聽到的,始終是四個鍵的音組而成,也就是始終是四個頻率的聲波組合而成。

傅立葉轉換針對的是函式

現在問題來了!方才是透過寫程式的方式,來進行弦波的疊加,或者是弦波的個別繪製,能繪製出莖葉圖,是因為事先知道弦波會有哪些頻率,那麼,如果現在是對真實的訊號取樣,在事先不知道頻率組成的情況下,我們還能畫出頻率組成的莖葉圖嗎?

而這就是傅立葉轉換存在的目的了,如果取樣的訊號可以用f(t)描述,套用至傅立葉轉換,就可以得到F(w)描述,所以,傅立葉轉換就是f(t)->F(w),不過,在電腦中是離散的,因此,實際上會用到的是離散傅立葉轉換,然而,基本上仍是個從時域至頻域的轉換。

如果你曾經對傅立葉轉換,所謂時域到頻域的意義並不夠清楚,此時,可以試著透過以上實際的程式繪圖,以及疊加來理解,這麼一來,就能進一步知道:在圖像上,傅立葉轉換會是空間域(Spatial domain)到頻域的轉換;而關於上述部份,我們也可以用程式實作的角度來觀察,而這也會是下篇專欄要分享的內容。

專欄作者

熱門新聞

Advertisement