Python中相当于Matlab的cwt()的是什么?(连续1-D小波变换)

8 投票
2 回答
8162 浏览
提问于 2025-04-18 07:00

我想要计算一个信号在不同尺度和时间偏移下的小波变换。

在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中我该怎么做呢?

到目前为止,我尝试了两种方法:

  1. PyWavelets(Python中的离散小波变换)里,我找不到怎么指定小波的尺度参数。
  2. scipy.signal.cwt中,我也找不到可以传给scipy.signal.cwt的内置小波函数的列表。我希望至少能有一些常用的小波函数,比如sym2和db1。(例如,可以参考Matlab的内置小波列表。)

2 个回答

3

你可能会想使用 scipy.signal.cwt 这个功能。scipy.signal 这个包里提供了一些小波函数:

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()

你可以很方便地通过pipconda来安装这些库。

最后,这里还有一些我没有尝试过的其他参考资料:

  1. 一个
  2. 两个
  3. 三个

撰写回答