2019-09-26 14:36 來源:澎湃新聞·澎湃號·湃客
原創: 鄭越升 壞印表機
一般傅立葉變換的舉例圖都是無數枯燥的三角函數疊加成某個無規則的函數,但是最近看了一篇關於傅立葉變換的文章,裡面有張動圖如下圖,很有意思,通過很多相互疊加的圓周運動,可以畫出一個矢量的二維軌跡。
from Jez Swanson這個動圖戳中了我的興趣點,於是惡補了一下傅立葉變換相關的知識,總算在Processing裡面實現了這個動畫:
在Prcocessing裡實現這個動畫上面動圖的代碼開源在openprocessing上
>>詳情請戳 https://www.openprocessing.org/sketch/758144
在這裡我只簡單地闡述下一點傅立葉變換的知識和代碼的原理,如果有興趣深入研究的可以閱讀下後面列出的我認為有幫助的文章。
基本定義:對於任何非周期的連續函數,可以用正弦或餘弦乘一個加權函數的積分來表示,這個積分方程稱為傅立葉變換(Fourier Transform)。
這個基本定義看起來無聊極了,如果你想形象地知道傅立葉變換是什麼有什麼用,可以閱讀以下文末的《傅立葉變換交互式入門》一文以及《阿里巴巴公司根據截圖查到洩露信息的具體員工的技術是什麼?- fuqiang liu 的回答》
下面動圖是一個很好的例子,紅色函數是一個及其不規則的形態,但是我們可以通過N個不同頻率、幅度、相位的三角函數疊加來不斷收斂靠近。
from 維基百科實際上傅立葉變換就如上圖一樣用不同頻率的三角函數來描述一個原函數,我們習慣把它稱為將一個函數表示從時域轉到了頻域的角度。如果用 F 表示以 t 為連續變量的連續非周期函數 f 的傅立葉變換,我們有對應的傅立葉變換公式為:
其中 j 是複數,也就是 -1 的平方根。理解上面的傅立葉變換公式可以看3B1B關於《形象的比喻:什麼是傅立葉變換?》的視頻,參考文章列表裡給出了youtube的地址,不過B站上應該也有搬運和中文字幕。
同樣的,我們有了從時域到頻域的公式,同時也會有對應的從頻域轉換到時域的公式。這個公式會比上面的容易理解,因為它的物理意義很直觀,就是在當前時間點,對所有頻率的三角函數做一個積分計算。這就是傅立葉反變換公式:
有了這兩個公式之後,我們就可以開始寫代碼?在時域和頻域之間自由穿梭了嗎?不,用processing或者p5,自然數e的指數計算比較麻煩,我們可以使用用優雅得有些不可思議的歐拉公式,將指數部分轉換成三角函數計算。歐拉公式如下:
藉助歐拉公式把指數部分換掉,我們得到以下傅立葉變換的公式:
在敲代碼之前,我們回過頭再想想那個戳中興趣點的動圖,它和上面舉的例子不一樣,因為它隨著時間變化的軌跡在一個二維平面,所以它的原函數 f(t) 對應的值應該是一對pair (x, y),我們怎麼處理這兩個值呢?
好在我們傅立葉變換公式處理的信號本身就是複數,如下圖由時間線、實軸和虛軸構成的三維空間裡,我們使用的用於疊加的三角函數可以看做這個空間的一個螺旋波,而 cos 和 sin 分別是這個螺旋波在實數平面和虛數平面的投影函數。這樣一來,我們就可以自然地用 (x + jy) 的形式來表示離散的信號值。
from Richard Lyons完整的代碼開源在:
https://www.openprocessing.org/sketch/758144
參考文章(按照個人推薦閱讀順序):
關鍵詞 >> 可視化,傅立葉變換
特別聲明
本文為澎湃號作者或機構在澎湃新聞上傳並發布,僅代表該作者或機構觀點,不代表澎湃新聞的觀點或立場,澎湃新聞僅提供信息發布平臺。申請澎湃號請用電腦訪問http://renzheng.thepaper.cn。