CWT 令人失望的频率分离

信息处理 信号分析 小波 stft 英担
2022-02-23 02:45:27

我正在尝试使用 Pywavelets 通过连续小波变换 (CWT) 执行多分辨率分析。我听说 CWT 应该优于 STFT,因为频率内容随时间窗口的变化而变化。

我的测试信号是两个 1Hz 和 5Hz 的正弦波,每个持续 10 秒(见图)f=np.sin(2.*np.pi*t)*((t>=10)&(t<=20))+np.sin(2*np.pi*5*t)*((t>=30)&(t<=40)):. 采样周期为 20Hz。

时域

使用 Pywavelets,我使用生成的频谱图按如下方式执行 CWT:

scales = np.arange(0.6,65,step=0.2)
coef, freqs=pywt.cwt(f,scales,'cgau1', sampling_period=dT)

CWT

如您所见,频率分辨率非常糟糕,第二段的峰值(复数幅度)似乎甚至没有在 5Hz 处对齐。

相比之下,使用标准偏差为 5 的高斯窗口的 STFT 会产生更清晰的频率分辨率(以时间锐度为代价):

STFT

我在这里做什么?我愿意牺牲时间分辨率,但我确实需要提高频率。

2个回答

连续小波变换 (CWT) 系列本身并不优于 STFT。由于规模的变化,CWT 可能会更好,例如,在以下情况下:

  • 您处理瞬态比更静止的部分更短的自然信号,
  • 你不知道合适的观察尺度,
  • 确定性或随机过程遵循比例定律(如布朗运动)。

从您的信号来看,情况并非如此:在同一支架上的精确频率。

一方面,您可以使用具有更多振荡的连续小波,并更好地细化音阶和声音。

另一方面,有所谓的 STFT,其窗口的宽度随频率而变化。

可以使用混合时间尺度/时间频率转换、重新分配等附加组件,但选择适当的工具需要细化您的目标。

小波太时间局部化。pywt 和 scipy implems 也有缺陷在带有ssqueezepy的信号上:

在此处输入图像描述

Laurent 是正确的,CWT 并不总是优越的。

import numpy as np
from ssqueezepy import cwt
from ssqueezepy.visuals import imshow

t = np.linspace(0, 50, 50*20, 0)
f = np.sin(2.*np.pi*t)*((t>=10)&(t<=20))+np.sin(2*np.pi*5*t)*((t>=30)&(t<=40))

Wx0, _ = cwt(f, ('gmw', {'beta': 10}))
Wx1, _ = cwt(f, ('gmw', {'beta': 90}))

tint = np.round(t).astype(int)
imshow(Wx0, xticks=tint, abs=1, title="abs(CWT) | time-localized")
imshow(Wx1, xticks=tint, abs=1, title="abs(CWT) | freq-localized")