Python中相当于Matlab的cwt()的是什么?(连续1-D小波变换)
我想要计算一个信号在不同尺度和时间偏移下的小波变换。
在Matlab中,我可以使用cwt()
这个函数(连续一维小波变换),它在小波工具箱里提供。我可以把想要的尺度作为参数传给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中我该怎么做呢?
到目前为止,我尝试了两种方法:
- 在PyWavelets(Python中的离散小波变换)里,我找不到怎么指定小波的尺度参数。
- 在
scipy.signal.cwt
中,我也找不到可以传给scipy.signal.cwt的内置小波函数的列表。我希望至少能有一些常用的小波函数,比如sym2和db1。(例如,可以参考Matlab的内置小波列表。)
2 个回答
3
你可能会想使用 scipy.signal.cwt
这个功能。scipy.signal
这个包里提供了一些小波函数:
- Daubechies 家族:
scipy.signal.daub(1)
- Morlet:
scipy.signal.morlet
- Ricker:
scipy.signal.ricker
Symlets 似乎没有直接提供,但你可以通过 daub
来获取它们。
4
看起来有一些Python库可以进行小波操作,除了scipy
以外:
Pywavelets
这是Pywavelets
的文档和GitHub链接,还有一个基本的使用示例。这个库使用起来相当直观,并且有很多已经实现的小波可供使用,详细信息可以查看这里。
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()
PyCWT
这是PyCWT
的文档和GitHub链接,还有一个基本的使用示例。这个库的学习曲线比较陡峭,使用起来不如前一个库那么友好,但它支持一些功能,比如影响锥
和显著性测试
。
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
来安装这些库。
最后,这里还有一些我没有尝试过的其他参考资料: