使用Scipy.signal进行连续小波变换(Python):cwt()函数中的“widths”参数是什么?

4 投票
1 回答
9767 浏览
提问于 2025-04-18 01:01

我想用一个离散的时间信号(采样间隔为0.001秒)来绘制一个时频信号。我使用Python和Scipy.signal这个库。我用的函数是cwt(data, wavelet, widths),这个函数会返回一个矩阵,用于进行连续小波变换,使用的是复杂的Morlet小波(或者叫Gabor小波)。不过,这方面的文档资料不多。我找到的最好资料有: - 这个是关于Matlab的(我试图找到相同的尺度-时间结果),但我自然无法使用相同的函数, - 还有这个,它解释了什么是连续小波变换,但没有详细说明小波的参数。

第一步:获取一个尺度-平移信号。如果有疑问,我直接把“widths”数组和可能的不同尺度数组关联起来。因为我不明白参数width如果不是尺度的话是什么。也许你会告诉我“这是你当前小波的宽度”!但即使现在,我也不确定如何将宽度和尺度联系起来……在Scipy的Morlet文档中,似乎可以这样理解:“s:缩放因子,窗口范围从-s*2*pi到+s*2*pi”,所以我想宽度=4*pi*scale(宽度=窗口的宽度)。但是当我绘制小波时,尺度越大,小波的视觉宽度反而越小……

我的第二个问题是找到并绘制频率的对应关系。在文献中,我找到这个公式:Fa = Fc / (s*delta),其中Fa是最终频率,Fc是小波的中心频率(以Hz为单位),s是尺度,delta是采样周期。所以,尺度的部分我明白了(如果我能找到宽度的联系),而delta(=0.001秒)也没问题,但小波的中心频率就复杂了。在Scipy文档中,我发现:“这个小波[Morlet小波]的基本频率以Hz为单位由f = 2*s*w*r / M给出,其中r是采样率[s是缩放因子,窗口范围从-s*2*pi到+s*2*pi,默认值为1;w是宽度;M是小波的长度]。”我觉得这就是中心频率,是吗?

谢谢

这是我为cwt()准备的代码:

def MyCWT(data, wavelet, scales):

output = zeros([len(scales), len(data)], dtype=complex)

for ind, scale in enumerate(scales):

    window = scale*4*pi*10#Number of points to define correctly the wavelet
    waveletLength = min(window, len(data))#Number of points of the wavelet
    wavelet_data = wavelet(waveletLength, s=scale)#Need to precise w parameter???

    #To see the wavelets:
    plot(wavelet_data)
    xlabel('time (10^-3 sec)')
    ylabel('amplitude')
    title('Morlet Wavelet for scale='+str(scale)+'\nwidth='+str(window))
    show()

    #Concolution to calculate the current line for the current scale:
    z = convolve(data, wavelet_data, mode='same')

    i = 0
    for complexVal in z:
        output[ind][i] = complex(complexVal.real, complexVal.imag)         
        i+=1

return output

1 个回答

5

widths 参数是一个宽度大小的数组,用来在将小波与数据进行卷积之前,先把小波拉伸到这些宽度。

你应该选择一个范围,起始值稍微小于你预期的信号宽度,然后到稍微大一点的值。你提供的值越多,计算会越慢,但分辨率会更高。

想了解更多信息,可以查看 文档 或者参考的论文 Bioinformatics (2006) 22 (17): 2059-2065. doi: 10.1093/bioinformatics/btl355

撰写回答