Misakichi’s ログblog

好きなものを紹介したり備忘録のため

フーリエ級数展開の直感的意味(Pythonプログラミングを使って)

フーリエ変換

大学に進むと、数学の授業でフーリエ変換級数展開を教わると思います。(2,3年次かな?)
フーリエ変換はあらゆる分野で応用されているので、
いざ研究を始めてみると、具体例を身近に感じることができ、
理解が進むと思います。
例えば音声をフリーリエ変換するとどの波長の音が多く含まれているかがわかるし、高周波領域に現れるノイズの除去もできちゃいます。
画像処理でも同様、また私のやってる材料工学では結晶構造を解明するための強力なツールです。


しかし大学の授業では数式が大量に出現するためいまいちわからなかった!という方もいるのではないでしょうか(というか私が最初分からなかっただけですがw)
概念自体は「あらゆる関数をsin,cosだけで表してみよう!」というラジカル?で明快なものですが、、、


ここではpythonを使ったプログラムを通して、フーリエ変換級数展開のざっくりとした意味を考えていきます。
すごいざっくりしてるし初歩的なのでレベルは大学2,3年生くらいですw

フーリエ級数展開python

例えば次のような周期関数f(x)の場合
f:id:Misaki_yuyyuyu:20160621164343j:plain:w500
周期Lの関数f(x)に対して、
{\displaystyle
A_0=\frac{2}{L}\int_{0}^{L}f(x)xdx\\
A_k=\frac{2}{L}\int_{0}^{L}f(x)\cos kxdx\\
B_k=\frac{2}{L}\int_{0}^{L}f(x)\sin kxdx
}
とすると、
{\displaystyle
f(x)=A_0+\Sigma_k (A_k \cos kx+B_k\sin kx) \ \ (ただしk=\frac{2\pi}{L}n, n=1,2,...)\ \ 
}
フーリエ級数展開できる。(*)
代入すると
{\displaystyle
A_0=0.5 \\
A_k=2\frac{\sin\frac{k}{2}}{k}\\
B_k=0
}
を得ます。だから求める関数は
{\displaystyle
f(x)=A_0+\Sigma_k A_k \cos kx=0.5+\Sigma_k 2\frac{\sin\frac{k}{2}}{k} \cos kx\ \ (ただしk=\frac{2\pi}{L}n, n=1,2,...)
}
と書ける。

確かに元の周期関数f(x)は偶関数だし、cosだけで展開できるってのは納得できるけど、うーん・・・
しっくりこないのでプロットしてみます。
ここでプログラムが大活躍
言語はpythonで、numpyという計算用パッケージとmatplotlibという描画用パッケージを使います。

近似の次数を入れたら対応する近似曲線を出力するプログラムです。
forループをkで回して、順次代入していってます。
例えば9次まで近似すると
f:id:Misaki_yuyyuyu:20160621222424j:plain:w500
で、なんとなく最初の画像に近い関数が出力されます。
gif動画にすると
f:id:Misaki_yuyyuyu:20160621224737g:plain
こんなかんじ
コマごとに近似の次数n=1,3,5,7,9,11,13,15,17,100,1000となっていて、
次数を上げるごとに元の関数に近づいてく様子が直感的にわかります。


僕がフーリエ級数展開習ったとき、プログラムかけなかったんで今更やってみましたw


(*):フーリエ級数の式は、たとえばf(x)=cosx+sinx+cos2x+sin2x+.....と表されると仮定すると、
    (*)の式はf(x)とcoskxの内積をとっていると解釈もできます。
    たとえばk=1だとf(x)とcosxの内積で、sinxとかcos2xとかsin2xとかの内積は0なので、
    結局cosxとの内積のみが値1をもって、これがA1である・・・というイメージで私はいつも考えてます(数学強い人に怒られそうw)