python中的尺度图

信息处理 频率 小波 转换 scipy 英担
2022-01-29 13:11:24

我正在阅读这篇论文来学习 dsp 的基本概念,并且我想重现以下测试信号的尺度图(论文的图 4.2):

在此处输入图像描述

它是由公式的离散化产生的:

1s0Ωf(t)g(tτs)¯dt

其中是小波:g(t)

g(t)=w1eπ(t/w)2ei2πηt/w

是函数: \f(t)

sin(2πν1t)eπ[(t0.2)/0.1]10+[sin(2πν1t)+2cos(2πν2t)]eπ[(t0.5)/0.1]10+[2sin(2πν2t)cos(2πν3t)]eπ[(t0.8)/0.1]10

我尝试使用该功能重现它们scipy.signal.ctw()我已将编码为 t 和的函数。尽管如此,我只得到了波浪最后一部分的非零系数,我想我可能有问题。如何使用 计算尺度图g(t)ωscipy.signal.ctw()

1个回答

scipy'scwt是原始且容易出错的;下面是通过ssqueezepy.cwt


代码

请注意,如果您寻求自己对小波进行编码,则需要先将其带到频域(最好通过傅里叶变换进行分析,然后对其进行采样,而不是通过 FFT),然后像wavelet = Wavelet(my_func); cwt(x, wavelet).

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

#%%# Helper fn + params #####################################################
def exp_am(t, offset):
    return np.exp(-pi*((t - offset) / .1)**10)

pi = np.pi
v1, v2, v3 = 64, 128, 32

#%%# Make `x` & plot #########################################################
t = np.linspace(0, 1, 2048, 1)
x = (np.sin(2*pi * v1 * t) * exp_am(t, .2) +
     (np.sin(2*pi * v1 * t) + 2*np.cos(2*pi * v2 * t)) * exp_am(t, .5)  + 
     (2*np.sin(2*pi * v2 * t) - np.cos(2*pi * v3 * t)) * exp_am(t, .8))
plot(x, title="x(t) | t=[0, ..., 1], %s samples" % len(x), show=1)

#%%# Take CWT & plot #########################################################
Wx, scales = cwt(x, 'morlet')
imshow(Wx, yticks=scales, abs=1,
       title="abs(CWT) | Morlet wavelet",
       ylabel="scales", xlabel="samples")