【python】連続ウェーブレット変換の実装【自作関数】

python

はじめに

連続ウェーブレット変換(continuous wavelet transform : CWT)とは、時間周波数解析の一つであり、信号の時間ごとの周波数特性を見ることが出来ます

今回はpythonでscipyやPyWaveletsといったライブラリではなく自作の連続ウェーブレット変換の関数を紹介します。また、実際にCWTを信号に対して行い、信号の特徴を抽出してみます。

連続ウェーブレット変換の概要、scipyやPyWaveletsライブラリを使用する方法については別途記事を書く予定です。

【世界で5万人が受講】実践 Python データサイエンス・オンライン講座

信号生成

次のようなsignal01とsignal02を作成し、連続ウェーブレット変換を行うための信号として用意しました。

signal01

この信号は周波数2[Hz]、7[Hz]、13[Hz]の3つのsin波を合成したものになります。また、2[Hz]の信号の振幅が一番大きく、13[Hz]の信号の振幅が一番小さくなるようにしています。

合成前の3つの波形を見ると次のようになっています。

signal01は以下のプログラムで作成することができます。

signal02

この信号は先ほどの信号と同じように周波数2[Hz]、7[Hz]、13[Hz]の3つのsin波を合成したものですが周波数2[Hz]の信号は時間ごとに減衰、13[Hz]の信号は時間ごとに増幅しています。

合成前の3つの波形を見ると次のようになっています。

signal02は以下のプログラムで作成することができます。

プログラム例

連続ウェーブレット変換を行うプログラムは以下の様になります。

マザーウェーブレットにはモルレーウェーブレットを採用しています。また、連続ウェーブレット変換によって、信号のパワースペクトル密度の時間、周波数ごとの変化を算出しています。今回は最大20[Hz]までのパワースペクトル密度を計算しました。

実行結果

以下にsignal01とsignal02を連続ウェーブレット変換した結果を示します。

ここで縦軸の目盛が0[Hz]から始まっていますが表記上の問題であり、本来の値は縦軸の目盛に1を足したものです。注意してください。また、図の色は信号のパワースペクトル密度を表しています。

signal01の結果

結果の図より、2[Hz]、7[Hz]、13[Hz]付近のパワースペクトル密度が大きくなっているのが分かります。またそのパワースペクトル密度は2[Hz]が最も大きく、13[Hz]が最も小さくなっています。

また連続ウェーブレット変換の特徴から、「周波数が低いほど周波数分解能が高いが時間分解能は低い」ということと、「周波数が高いほど周波数分解能は低いが、時間分解能は高い」ということが分かります。

signal02の結果

結果の図より、2[Hz]、7[Hz]、13[Hz]付近のパワースペクトル密度が大きくなっているのが分かります。

さらにsignal02の特徴の通り、2[Hz]の信号は前半のパワースペクトル密度が大きく、後半は小さい、13[Hz]はその逆で7[Hz]は一定になっています。

時間ごとの変化が非常に分かりやすくなっています。

最後に

以上が、pythonで連続ウェーブレット変換を自作する方法と、2つの信号を例に実際に解析を行った結果になっています。

時間周波数解析を行うことで、信号の時間ごとの周波数特性を視覚的に分かりやすくできるので是非、利用してみてください。

おすすめの本

コメント

  1. 森本 亮 より:

    pythonを勉強中の大学生です。
    現在ウェーブレット変換を使いたいと思っているのですが、
    「縦軸の目盛が0[Hz]から始まっていますが表記上の問題であり、本来の値は縦軸の目盛に1を足したものです。」
    という点で、これは現在サイトに載っているコードを改正することで解決可能でしょうか?

    • camedphone camedphone より:

      > これは現在サイトに載っているコードを改正することで解決可能でしょうか?
      はい、軸の表示を変更していただければ解決可能です。

タイトルとURLをコピーしました