https://qiita.com/yukiB/items/59f8484e72bb0471ad47
このサイトを参考に線形チャ-プ信号を対象にswanを用いてwavelet変換を行ったのですが、結果が図のようになりました。実行結果を見たところ5s付近になっても低い周波数の波形が少し含まれているように表現されているのですがなぜでしょうか。
試しにpywaveletsでwavelet変換をしてみたところ、そのようなことは起きませんでした。pywaveletsとswanにはどのような違いがあるかなども教えていただけたら幸いです。
python
1コード 2import numpy as np 3import matplotlib.pyplot as plt 4from swan import pycwt 5 6dt = 0.01 7t = np.arange(0, 5, dt) 8y = np.sin(2 * np.pi *(1 / 2 * t**2 + t)) 9plt.plot(t, y) 10plt.show() 11 12Fs = 1/0.01 13omega0 = 8 14# (1) Freqを指定してcwt 15freqs=np.arange(0.1,20,0.050) 16r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) 17rr=np.abs(r) 18 19plt.rcParams['figure.figsize'] = (20, 6) 20fig = plt.figure() 21ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) 22ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1) 23ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6]) 24 25ax1.plot(t, y, 'k') 26 27img = ax2.imshow(np.flipud(rr), extent=[0, 5, freqs[0], freqs[-1]], 28 aspect='auto', interpolation='nearest') 29 30fig.colorbar(img, cax=ax3) 31 32plt.show()
> 5s付近になっても低い周波数の波形が少し含まれているように表現されているのですがなぜでしょうか。
https://www.ms.u-tokyo.ac.jp/lmsr/pdf/2019-11.pdf
の5ページの最後の行から6ページにかけての「cone of influence (COI)」の説明に書かれてるように、左右の端に近いところは不正確になります
https://jp.mathworks.com/help/wavelet/ug/boundary-effects-and-the-cone-of-influence.html
の最初の図では、色を変えて表示してるので分かりやすいと思います
周波数が低いと、不正確な範囲が広くなります
その不正確になる範囲内なのではないですかね
> pywaveletsでwavelet変換をしてみたところ、そのようなことは起きませんでした。
詳細確認してませんが、左右の端(入力データの始点と終点)よりも外のデータの扱いが違うのかも
不正確になる範囲内なのかを確認したければ、
https://jp.mathworks.com/help/wavelet/ug/boundary-effects-and-the-cone-of-influence.html
のページの真ん中あたりの「predtimes」の計算式と、そのちょっと下の「predtimes」をプロットしてるところを参考にしてみてください
pythonではなくてmatlabのコードですが、簡単なことしかやってないので、よく見たらやってることは分かると思います
【追記】
不正確になる範囲は、使ってるウェーブレットの長さで変わります
上記で紹介した「predtimes」の計算式は、上記Webページで使ってるウェーブレットの条件に合わせてあるので、自分が使ってるウェーブレットの条件に合わせて「cf = 6/(2*pi)」のところを変える必要があります
> pywaveletsでwavelet変換をしてみたところ、そのようなことは起きませんでした。
omega0 = 8
↓ 変更
omega0 = 0.75
くらいにしたら、質問に掲載されてるpywaveletsでの結果の画像の見た目に近くなりました
(見た目の比較だけで、数値での比較はしてませんけど)
いろいろご丁寧にありがとうございます。
omega0に関してなのですが、これは使用するマザーウェーブレットを指定している変数という認識でよろしいでしょうか。代入する値を変えることでマザーウェーブレットにどのような変化が起こるのでしょうか。
解析してる波長に対するマザーウェーブレットの長さを決めてます
「omega0」をいろいろ変えながら、下記を実行してみてください
xx = np.arange(-10.0, 10.0, 0.001)
yy = pycwt.Morlet(omega0).psi(xx)
plt.plot(xx, yy.real, xx, yy.imag)
plt.show()
上記を実行して表示されるグラフから、「omega0 = 8」の場合のマザーウェーブレットの長さは、振幅がある程度小さくなってるところまで含めたら波長の40倍くらいあることが分かります
たとえば2Hzの波長は0.5秒なので、その場合のマザーウェーブレットの長さは 0.5*40=20秒(±10秒) くらいになり、入力データの長さ5秒の全体に影響が広がってしまいます
下記を実行して、「pywavelets」のマザーウェーブレットの長さも確認してみてください
ただし、「wavelet_type = 'cmor1.5-1.0'」は、質問者さんが実行した条件に合わせて変えてください
wavelet_type = 'cmor1.5-1.0'
yyy, xxx = pywt.integrate_wavelet(pywt.ContinuousWavelet(wavelet_type), precision=10)
plt.plot(xxx, yyy.real, xxx, yyy.imag)
plt.show()
マザーウェーブレットがどうなっているかの描画まで詳しく教えていただき、本当にありがとうございます。
回答1件
あなたの回答
tips
プレビュー