我想用离散时间信号(采样间隔为0.001秒)绘制时频信号。我使用Python和Scipy.signal库中的函数cwt(data, wavelet, widths)进行连续小波变换,使用复杂Morlet小波(或Gabor小波)。不幸的是,这种用法的文档很少。我找到的最好的文档是:
- this针对Matlab(我试图找到相同的比例-时间结果),但我自然无法访问相同的函数,
- 以及this解释了什么是连续小波变换,但没有给出小波参数的详细说明。
第一步:获取一个比例-转换信号。如果有疑问,我会直接将“widths”数组与可能不同比例的数组相关联。因为,如果宽度不是比例参数,我就不明白它是什么了。也许,你会告诉我“它是当前小波的宽度”!但是,即使现在,我也不确定如何将宽度与比例联系起来...在Scipy的Morlet文档中,似乎链接可以是:“s:缩放因子,从-s*2*pi到+s*2*pi进行窗口化”,所以,我认为宽度=4*pi*scale(窗口的宽度)。但是当我绘制小波时,比例越大,小波的视觉宽度就越小...
我的第二个问题是找到并绘制相应的频率。在文献中,我发现了这个公式:Fa = Fc / (s*delta),其中Fa是最终频率,Fc是Hz中小波中心频率,s是比例尺,delta是采样周期。所以,如果我能找到与宽度链接的比例尺(ok),和采样周期(=0.001秒),那么小波中心频率就更加复杂了。在scipy文档中,我发现:“该小波[莫尔小波]的基本频率以Hz为单位,由f = 2*s*w*r / M给出,其中r是采样率[s是缩放因子,在-s*2*pi到+s*2*pi之间进行窗口处理。默认值为1;w是宽度;M是小波的长度]。”我认为这就是中心频率,对吗?
谢谢
这是我的cwt()代码:
第一步:获取一个比例-转换信号。如果有疑问,我会直接将“widths”数组与可能不同比例的数组相关联。因为,如果宽度不是比例参数,我就不明白它是什么了。也许,你会告诉我“它是当前小波的宽度”!但是,即使现在,我也不确定如何将宽度与比例联系起来...在Scipy的Morlet文档中,似乎链接可以是:“s:缩放因子,从-s*2*pi到+s*2*pi进行窗口化”,所以,我认为宽度=4*pi*scale(窗口的宽度)。但是当我绘制小波时,比例越大,小波的视觉宽度就越小...
我的第二个问题是找到并绘制相应的频率。在文献中,我发现了这个公式:Fa = Fc / (s*delta),其中Fa是最终频率,Fc是Hz中小波中心频率,s是比例尺,delta是采样周期。所以,如果我能找到与宽度链接的比例尺(ok),和采样周期(=0.001秒),那么小波中心频率就更加复杂了。在scipy文档中,我发现:“该小波[莫尔小波]的基本频率以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