使用 Scipy.signal 进行连续小波变换:cwt() 函数中的参数“宽度”是什么?时频怎么做?

信息处理 小波 Python 转变 时频
2021-12-20 08:20:54

我搜索以显示具有原始离散时间信号的时频信号(采样步长 = 0.001 秒)。我使用 Python 和库Scipy.signal我使用该函数使用morlet 小波(或 gabor 小波)cwt(data, wavelet, widths)进行连续小波变换。

第一步:获取比例转换信号。有疑问,我直接将数组“宽度”与可能不同比例的数组联系起来。因为,如果不是比例,我不明白什么是参数宽度。也许,你会告诉我“这是你当前小波的宽度”!但是,即使是这样,我也不知道宽度与比例是如何联系起来的……

我的第二个问题是找到并显示等价的频率。在文献中,我找到了这个公式:Fa = Fc / (s*delta),其中 Fa 是最终频率,Fc 是小波的中心频率,以 Hz 为单位,s 是尺度,delta 是采样周期。因此,对于比例(如果我找到与宽度的链接)和增量(= 0.001 秒)来说没问题,但是小波的中心频率更复杂。在 scipy 文档中,我发现:“这个小波 [morlet 小波] 的基频 (Hz) 由 f = 2*s*w*r / M 给出,其中 r 是采样率 [s 在这里是缩放因子,窗口化从 -s*2*pi 到 +s*2*pi。默认为 1;w 宽度;和 M 小波的长度]。我认为是中心频率,是吗?也许我的第一个问题的解决方案也在这里(比例因子和比例..?)..?

谢谢

3个回答

没有迹象表明它cwtmorlet. 正如cwt文档字符串所说:

小波函数,它应该有 2 个参数。... second 是一个宽度参数,定义了小波的大小(例如,高斯的标准偏差)。

morlet函数有 4 个参数,其中第二个不是宽度参数,而是频率参数,所以我认为它不应该与cwt. 使用ricker作为模板,您应该定义自己的函数以与cwt. 此外,cwt不能处理复杂的小波(从 v0.18 开始)。

我建议您尝试为您完成此操作的不同实现:

  • Pyscellania有一个小波模块(现在镜像在 github 上),它实现了实数/复数 Morlet、MexicanHat、Paul 阶 2、Paul 阶 4、高斯的 1 阶导数、高斯的 4 阶导数、连续 Haar 变换的非标准化版本、标准化 Haar
  • aaren/wavelets支持 Morlet、Paul、DOG、Ricker
  • 机器学习 PYthon (mlpy)mlpy.wavelet.cwt支持 Morlet、Paul 和高斯小波导数
  • Dapid/fast-pycwt支持 Morlet 和 Ricker
  • ObsPy(地震观测站)有一个cwt模块,“现在只实现了'morlet'”
  • pyCWT有 Morlet 小波

请参考此视频链接。

在我看来,widthscwt 中的参数表示scale小波方程。

在测试宽度和比例参数的不同值时,我尝试直接研究morlet 小波函数。结果是它不是(对我来说)直觉:

  • 宽度对应于小波的峰值数量
  • scale 改变小波形式的“宽度”(价值:更多的 s 增加,更多的这个宽度减少......它与这种方法相反)

事实上,这个方法说:

缩放作为一种数学运算,可以扩展或压缩信号。较大的尺度对应于扩张(或拉伸)的信号,小尺度对应于压缩的信号。

我将搜索另一种方法以尝试查看问题出在哪里。除非有人已经知道响应。谢谢。


事实上,问题似乎出在小波的周期数上:频率增加得越多,必须遵循的周期数就越多。并且周期数实际上与 morlet 小波中的参数“w”相关。如果您在大频段上进行研究,这一点非常重要。希望它会帮助别人。