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

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

ウェーブレット変換(1)

ウェーブレット変換とは

ウェーブレット変換は信号をウェーブレット(小さな波)の組み合わせに変換する信号解析の手法の1つです。

信号解析手法には前回扱ったフーリエ変換がありますが、ウェーブレット変換はフーリエ変換ではサポート出来ない時間情報をうまく表現することが出来ます。

その為、時間によって周波数が不規則に変化する信号の解析に対し非常に強力です。



今回はこのウェーブレット変換に付いてざっくりと触って見たいと思います。


フーリエ変換との違い

フーリエ変換は信号を三角波の組み合わせに変換していました。

フーリエ変換(1) - 理系大学生がPythonで色々頑張るブログ

フーリエ変換のおさらい

フーリエ変換フーリエ級数展開を利用し非周期的な信号をスペクトル分析する手法でした。

フーリエ級数展開とは周期的な信号を三角波の合成によって表現する方法で、
フーリエ変換で非周期的な信号を周期的な信号であるとみなし適応しています。

スペクトル分析とは、信号を様々な周波数の三角波に分解した時にそれぞれの三角波の強さ(振幅)をプロットしたものでした。

フーリエ変換の実例

前回、擬似的に三角関数を合成し生成した複雑(?)な信号は、ぱっと見でわかる程周期的な関数でした。

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

最初に作った複雑な信号の成分と一致していますね。

フーリエ変換の苦手分野

では信号が次の様に周期的でない場合はどうなるでしょうか。

f:id:emoson:20141025210333p:plain

この複雑(??)な信号のスペクトルを離散フーリエ変換を行い算出すると次のようになります。
(※長いので適当な周波数で切ってます)

f:id:emoson:20141025210400j:plain

一見すると山が3つの単純な信号ですが、三角波の合成で表現すると非常に複雑なスペクトルですね。
(カクカクの信号をまろやかな三角波で表現すると複雑になるのは直感的に分かりますネ)


ここでポイントとなる部分は、スペクトル分析を行うと信号の時間変化に対する情報が見えなくなってしまう事です。

時間情報と周波数情報

信号は時間が進む毎に値が変化する波です。
グラフで表現すると横軸に時間を取り、縦軸にその時間に対する信号の強さを取ります。
f:id:emoson:20141025211659p:plain

それに対しスペクトル表現では周波数を変えた三角波の強さで信号を表現しています。
f:id:emoson:20141025211928p:plain


フーリエ変換とは同じ信号に対し、横軸を時間情報から周波数情報に変換しています。

この様に横軸を時間軸から周波数軸に変換すると当然、時間情報が見えなくなってしまいます。

時間情報が無くなると何が困るの?

スペクトル表現した時に時間軸が周波数軸に変換される事を確認しました。
では時間軸が見えなくなると何が困るのでしょうか。

先ほどの信号を観察してみましょう。
f:id:emoson:20141025210333p:plain

この信号はある時間になると山が3回ピョコンと跳ねており、それ以外の部分ではずーっとフラットな信号ですね。

この信号を解析する時は信号の成分もさることながら、「この時間の時にぴょこんと山が出来た!」という時間に対する情報も欲しいですね。

ですが、スペクトル表現を見てみると
f:id:emoson:20141025205051p:plain

この時間の時に信号がピョコンとはねた!という情報は見えてきませんね。

この様に信号処理を行う時は信号の周波数成分だけでなく、時間変化を見たい時があります。

しかし、時間変化を見たい時はフーリエ変換だけでは解析する事は困難です。

そこで考案された手法がウェーブレット変換です。

今回はフーリエ変換を中心にウェーブレット変換の強さに付いて触れたので、
次回からは実際にウェーブレット変換に入っていこうと思います。

まとめ

ウェーブレット変換は信号解析手法の1つ
フーリエ変換が苦手とする不規則な信号を解析する事が出来る