傅立葉級數(Fourier Series)和周期現象
一、前言
如果你仔細觀察,工作和生活中充滿了周期現象:旁邊linux driver工程師在調試audio driver的時候播放的1kHz的正弦信號,周末去公園遊玩,遊船推開水面的波紋,硬件工程師調試硬件電路的時候,示波器顯示出來的晶振方波信號……
所謂周期現象具體包括時間上的周期現象和空間上的周期現象。1kHz的audio當然是時間上的周期信號,而水面的波形就是空間上的周期現象。對於空間上的周期現象,實際上就是一個pattern不斷的重復。
對於一個普通的人,我們可以感知時間的流逝,也可以感知空間的變化(我們可以通過眼睛、耳朵、觸覺等build in在身體上的sensor來感知時空中的周期現象),因此,周期現象對於我們來講就像呼吸一樣自然。然而,你是否願意從另外一個側面來感知世界?那個世界就是頻域(frequency domain)的世界。描述時間上的周期現象我們使用頻率(frequecy)這個詞,也就是一秒重復的次數。
Can you feel frequency of the world?
二、信號的分解
在進入傅立葉級數之前,我們首先理解下面兩個概念:
(1)分析(analysis)。也就是把一個復雜的信號(函數,後面的描述中我們不區分函數和信號這兩個術語)分解成較為簡單的成分(例如sin、cos函數等)。
(2)合成(synthesis)。通過簡單的成分重新構造復雜的信號(函數)
在本章,我們首先了解矢量的分解,這個概念比較簡單,比較好理解。之後進入函數的分解,也就是本文的核心了。
1、矢量的分解
一個二維矢量的分解我們參考下圖中左邊的那個圖:
矢量A可以通過向x和y軸投影,將A分解成兩個簡單的矢量Ax和Ay,A可以是二維空間中的任意矢量,但是總是能分解成沿著x軸和y軸的兩個簡單的矢量。這種分解是唯一的嗎?當然不是,上圖中右邊的矢量分解也是OK的,只不過坐標軸不是垂直的而已。
我們當然可以把事情變得更復雜,比如三維空間,當然,概念是一樣的,只不過我們的坐標軸是x、y、z三個軸。一般的分解都是把坐標軸設定為兩兩垂直的,如果你願意,不垂直也沒有問題。推廣到n維空間如何?當然可以,只不過n維空間沒有直觀的圖形表示,需要依靠你的想像。
2、函數的分解
我們來研究周期為1的信號,也就是說f(t+1)=f(t)。我們對該函數進行分析,並試圖將該信號分解成更簡單的信號,這裏我們sin和cos函數來進行分析。由於信號的周期是1,因此頻率也是1,所以用於建模的信號就是sin(2π t)和cos(2π t)。
首先考慮信號:sin(2π t) + sin(4π t) + sin(6π t)+......
對於sin(4π t)這個函數,雖然他的頻率是2,但是毫無疑問,每隔一秒,其pattern也是重復的(每隔0.5秒重復一次,實際上,每隔1秒其波形一定也是重復的)。我們將這些頻率為1、2、3......的函數加在一起,得到的是一個頻率為1的函數(每個函數有同樣的特性:每隔1秒重復其波形,講這些有同樣性質的函數相加,其結果應該也是具備同樣的特性)。
上面我們利用一個簡單的周期為1的sin函數以及其各次諧波函數相加,人為的構建了一個周期為1的函數。這些函數還不夠通用(例如t=0的時候,函數值都是0),能否創建更通用,但周期仍然是1的函數呢?調整各個諧波的幅度和相位,我們可以得到各種各樣的更通用的函數。
OK,現在我們考慮相反的問題,是否任意一個頻率為1(周期為1)的函數都可分解成各個頻率成分(1、2、3......)的線性組合呢?如果這個命題成立,那麽任意一個周期函數都可以分解成若幹個簡單的sin函數的和。這個概念和矢量分解沒有什麽不同,各個頻率的sin函數就是n維空間中的n個坐標軸,函數在坐標軸上的投影就是該sin函數的幅度值。
3、矢量分解和函數分解
我們先看看點積(dot product)的概念。向量A(a1,a2)和向量B(b1,b2)的點積是=a1b1+a2b2。類似向量,我們定義函數的點積。如果f、g都是[0,1]上的平方可積函數,那麽可以定義函數的點積:
= 計算[0,1]區間上的積分( f(t) g(t)的共軛 )
被積函數是f(t)乘以g(t)的共軛,之所以會出現共軛是因為f(t)和g(t)可能是復變函數。如果是實函數,那麽其共軛就是函數本身(本來是不想出現共軛這樣的概念,但是後面有復指函數,沒有辦法啊)。如果兩個向量的點積等於0,那麽我們就說這兩個向量是正交的(orthogonal ,類似幾何上的垂直),對於2維或者3維空間的向量,正交就是垂直。對於函數,如果f和g這兩個函數的點積滿足 = 0我們稱函數f和g是正交的。
我們再來看看2維空間的坐標系。兩個向量(1,0)和(0,1)可以表示兩個非常基礎的向量(也就是傳說中的標準正交基,standard orthogonal basis),這兩個向量就象坐標軸一樣,實際上任意的一個向量都可以分解成(1,0)和(0,1)的線性組合,或者反過來說,這兩個向量的線性組合可以充滿整個2維向量空間。對應函數空間,我們是否也能找到一組兩兩正交的函數呢?並且這組函數的線性組合可以充滿整個函數空間。如果能找到,那麽函數空間中的任意一個函數都可以分解成標準正交基的組合。其實這樣的函數集有非常多,傅立葉級數只是選取了sin,cos或者復指函數作為標準正交基而已。
對於矢量,我們可以定義其長度。矢量A和自己進行點積運算就可以得到矢量長度的平方。長度的概念也可以引申到函數領域。如果||f||表示函數的長度或者函數的模,那麽:
= ||f||的平方
4、軟件設計的分解
什麽是知識?所謂知識,就是必須能應用到你的生活行為中方為知識。你能夠背誦它,你能夠推導它,都不能說明什麽,只有理解之後並能夠用來指導自己的工作和生活的那些才是真正的知識。當然,這裏的生活當然說的不是去購物或者做飯,主要是應用到工程中。對於我們而言,就是分解的思想應用到軟件設計中或者issue的修復中。
軟件的設計過程就是把一個復雜的事情分解成一個一個簡單的事情,然後逐個擊破的過程。軟件架構師做庖丁解牛的工作,而普通的程序員做簡單的模塊的相關工作。
三、從時域到頻域
上面一段有點扯,我們先回到上文中的那個假設命題:任何復雜的頻率為1(周期為1)的函數都表示為:
f(t) = 對於k=1~N上求和( Ak sin(2πkt +pk ) )
pk是各次諧波的相位,Ak是各次諧波的幅度。
首先,先簡化問題,去掉相位,也就是說所有的諧波相位固定為0。這樣各個諧波不能單純的表示為sin函數,而是sin和cos的組合(也就是說相位 的信息體現在了sin和cos的幅度上)。這時候,我們有2N個坐標軸,N個是sin族函數,另外N個是cos族函數。函數投影到這些坐標軸上就可以知道函數在該坐標軸(諧波,sin或者cos函數)上的幅度(坐標值)。根據歐拉公式可以進一步簡化,諧波表示為exp(2π ikt),i是虛數單位,k是諧波次數。
exp(2π ikt)=cos(2πkt) + i sin(2πkt)
使用冪指數(exponential)雖然好,但是諧波的次數從原來的0~n變成 -n~n,也就是說引入了負頻率的概念。具體的公式是:
f(t) = 對於k=-N~N上求和( Ck exp(2π ikt) )
Ck就是傅立葉系數,表示各次諧波的幅度。
雖然表達式不一樣,但是其本質是一樣的,都是將周期為一的復雜的信號分解成各次諧波exp(2π ikt)的線性組合。
既然假設了上面的公式成立,那麽Ck如何求?過程比較簡單,對於m次諧波,利用代數的方法將其移到等式的左邊,其他項移到等式的右邊,同時乘 exp(-2π imt),然後對等式兩邊求一個周期上的積分。exp(2π ikt)這一組函數應該是函數空間(對應向量空間)的標準正交基(相互垂直的坐標軸),因此,當不同次諧波的積分應該等於0。這樣Ck可以按照下面的公式計算:
Ck = 在0~1上求積分( exp(-2π ikt) f(t) )
雖然我們求出了Ck,但是是否真的適用於所有的信號?答案是否定的。在微積分課程中,我們學習到下面的知識:連續函數的和也是連續函數。在這樣的背景下,一個周期為1,占空比為50%的開關信號是不可能用有限個連續的sin或者cos函數表示出來。我們可以追加一個問題:一個周期為1鋸齒信號是連續的,是否可以用有限個連續的sin或者cos函數表示出來?答案也是否定的。在微積分課程中,我們學習到下面的知識:可微函數的和也是可微函數。鋸齒信號雖然是連續的,但是不是可微的(一階就不可微了)。只有足夠平滑(任意階可微)的函數才可以用有限個sin或者cos函數表示出來。對於那些不夠平滑,甚至有不連續點的函數,需要引入無窮級數:
f(t) = 對於k=-∞~∞上求和( Ck exp(2π ikt) )
只要f(t)在一個周期內是一個有限能量信號,就可以保證上面的公式成立。當然,上面公式中的等號僅僅是意味在均方意義下,左右兩邊相等。由於引入了無窮項,因此需要考慮收斂性。關於收斂性,還是留給數學家吧。
最後再羅嗦一點關於投影的事情。矢量的分解需要計算其在坐標軸上的投影,矢量(a,b)在x軸(1,0)上的投影實際上就是計算他們的點積。我們可以來看傅立葉級數中的復指函數集合exp(2π ikt),這些函數集組成了函數空間中的一組標準正交基。而傅立葉系數Ck就是f(t)在標準正交基上的投影。因此Ck = <f(t), exp(2πikt)>。。
四、後記
我的有些博文中有大量的數學公式,這是我的一個業余愛好。但是我的一個朋友告訴我:你寫這些東西只能讓你自己爽,當文章中出現第一個數學公式的時候,一般的讀者已經放棄閱讀了。本來我想用更通俗的語言來描述線性代數和泛函分析的一些基礎概念:vector space、正交、function space、標準正交基什麽的,但是看起來功力還是不夠,特別是對於泛函分析,我基本上還是只理解皮毛。我想只有我深入理解這些東西的時候才能用大家都明白的語言描述出來,不過目前也只能這樣了。
傅立葉級數(Fourier Series)和周期現象