元理系院生の新入社員がPythonとJavaで色々頑張るブログ

プログラミングや機械学習について調べた事を書いていきます

フーリエ変換(1)

フーリエ変換とは

フーリエ変換とは「周期的ならどんなに複雑な波形でも三角波の足し合わせで表現できる」
という考えに基いて、信号をスペクトル成分に分解する変換方法です。

周波数スペクトルで表現できるのでノイズ検出や圧縮、信号解析等に利用出来ます。


パパっと雰囲気をつかむフーリエ変換

フーリエ変換の動きを掴む為、まず、sin波を合成して擬似的に複雑(?)な波形を作成してみます。

以下のf(x)の様に5つのsin波を合成します。

 f(x)= \alpha_{1}\sin x*1 + \alpha_{2}\sin x*2 + \alpha_{3}\sin x*3 + \alpha_{4}\sin x*4 + \alpha_{5}\sin x*5

周波数が1,2,3...nの三角波を合成していきます。
合成する時は、それぞれの周波数の三角波に対し強さを示す係数αを掛けあわせています。
このαは周波数のスペクトル成分ですが、詳しい意味合いについては後述します。

例として
 \alpha_{1} = 3.0,\ \ \ \ \alpha_{2} = 5.0,\ \ \ \ \alpha_{3} = 0.0,\ \ \ \ \alpha_{4} = 2.0,\ \ \ \ \alpha_{5} = 4.0
を係数とした合成波を作ってみます。

f = lambda x: sum([[3.0, 5.0, 0.0, 2.0, 4.0][d]*math.sin((d+1)*x) for d in range(5)])

グラフ化すると次の様になります。
f:id:emoson:20141023165720j:plain

複雑(?)な波形が出来ました。

フーリエ変換はこの複雑(?)な波形からαの値を求める事です。

上のグラフの波形をフーリエ変換(スペクトル成分を算出)すると、次の様になります。

f:id:emoson:20141023171427p:plain


この例では最初に設定したαに応じて複雑な波形を合成しましたが、基本的にはどの様な信号(適当にマイクから拾ってきた音声や画像)でも三角波の合成によって近似できます。