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

时间:2014-04-02 13:47:14

标签: python scipy time-frequency wavelet-transform

我搜索绘制具有离散时间信号的时频信号(采样步长= 0.001秒)。我使用Python和Scipy.signal库。我使用函数cwt(data,wavelet,widths)返回一个矩阵,用复杂的morlet小波(或gabor小波)进行连续小波变换。不幸的是,没有很多关于这种用途的文件。我找到的最好的是:   - this用于Matlab(我试图找到相同的缩放时间结果)但我自然无法访问相同的功能,   - 和this解释什么是连续小波变换,没有小波参数的细节。

第一步:获取比例转换信号。有疑问,我直接将数组“widths”与可能不同比例的数组相关联。因为,如果它不是比例,我不明白什么是参数宽度。也许,你会告诉我“这是你当前小波的宽度”!但是,即使是现在,我也不确定链接宽度与规模之间的关系......在Scipy的Morlet文档中,似乎链接可能是:" s:缩放因子,窗口自-s * 2 * pi to + s * 2 * pi",所以,我认为width = 4 * pi * scale(width =窗口的宽度)。但是当我绘制小波时,更多的尺度增加,小波的视觉宽度减少了......

我的第二个问题是找到并绘制具有频率的等效物。在文献中,我找到了这个公式:Fa = Fc /(s * delta),其中Fa是最终频率,Fc是小波的中心频率,单位是Hz,s是采样周期的比例和delta。因此,对于比例(如果我找到宽度的链接)和delta(= 0.001sec),则可以,但是它对于小波的中心频率更复杂。在scipy文档中,我发现:“这个小波[morlet小波]的基频在Hz中由f = 2 * s * w * r / M给出,其中r是采样率[s在这里缩放因子,窗口化从-s * 2 * pi到+ s * 2 * pi。默认值为1;宽度;和小波的长度]。“我认为这是中心频率,是吗?

谢谢

这里是我重写的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 个答案:

答案 0 :(得分:3)

widths参数是一个宽度大小的数组,小波在将小波与数据卷积之前将其拉伸到该数组。

您应该选择一个以略小于预期信号宽度的值开始的范围,最大值略大。您提供的值越多,计算越慢,但分辨率越高。

查看documentation或参考文件Bioinformatics (2006) 22 (17): 2059-2065. doi: 10.1093/bioinformatics/btl355以获取更多信息。