我想计算具有不同比例和时移的信号的小波。
在Matlab中使用cwt()
中提供的Wavelet Toolbox函数(连续1-D小波变换)我可以指定我想要的比例作为cwt()的参数,它将会返回所有可能的时移:
x = [1, 2, 3, 4];
scales = [1, 2, 3];
wavelet_name = 'db1';
coefs = cwt(x,scales, wavelet_name);
>> coefs =
-0.0000 -0.0000 -0.0000 0.0000
-0.7071 -0.7071 -0.7071 -0.7071
-1.1553 -1.1553 -1.1553 1.7371
我如何在Python中实现这一目标?
到目前为止,这是我的两次尝试:
scipy.signal.cwt
中,我找不到the list of the built-in wavelet functions that I can pass to scipy.signal.cwt:我想要至少拥有最常见的小波函数,例如sym2和db1。 (例如,请参阅Matlab's built-in wavelet list)。答案 0 :(得分:4)
您可能希望使用scipy.signal.cwt
。 scipy.signal
包中提供了一些小波函数:
scipy.signal.daub(1)
scipy.signal.morlet
scipy.signal.ricker
Symlet似乎没有像这样提供,但您可以从daub
获取它们。
答案 1 :(得分:2)
似乎除了scipy
以外,还有一些Python库可用于Wavelet操作:
这里是documentation,github的链接和使用的基本代码段。它使用起来非常直观,并且具有implemented wavelets的扩展库。
import pywt
import numpy as np
import matplotlib.pyplot as plt
num_steps = 512
x = np.arange(num_steps)
y = np.sin(2*np.pi*x/32)
delta_t = x[1] - x[0]
scales = np.arange(1,num_steps+1)
wavelet_type = 'morl'
coefs, freqs = pywt.cwt(y, scales, wavelet_type, delta_t)
plt.matshow(coefs)
plt.show()
这里是documentation,github的链接和使用的基本代码段。该库的学习曲线更陡峭,并且api不太好,但是支持诸如cone of influence
或significance testing
之类的功能。
import pycwt as wavelet
import numpy as np
import matplotlib.pyplot as plt
num_steps = 512
x = np.arange(num_steps)
y = np.sin(2*np.pi*x/32)
delta_t = x[1] - x[0]
scales = np.arange(1,num_steps+1)
freqs = 1/(wavelet.Morlet().flambda() * scales)
wavelet_type = 'morlet'
coefs, scales, freqs, coi, fft, fftfreqs = wavelet.cwt(y, delta_t, wavelet=wavelet_type, freqs=freqs)
plt.matshow(coefs.real)
plt.show()
您可以使用pip
或conda
轻松地安装它们。
最后,这是我没有尝试使用的其他参考: