我在PyWavelets转换中有一些工件让我很困惑。我使用的是版本0.5.2。有人能解释一下这里发生了什么吗?
我首先创建1 kHz信号,然后尝试使用复Morlet连续小波变换分析此信号。我是这样做的,有3个八度音阶:0.5 kHz到1 kHz,1 kHz到2 kHz,2 kHz到4 kHz,每个都有40个对数刻度。我的直觉说,在y = 40(相当于1 kHz)时应该有一个峰值,并且任何时间差都应该是最小的。相反,我在y = 35到37(0.92到0.95 kHz)附近得到一个峰值,并且有某种周期性效应。 (奇怪的是,这种效果似乎只发生在变换的真实组成部分 - 虚构组件看起来更接近我想象它应该看起来的样子,虽然它仍然没有正确居中。我相信真正的组件和当观察纯正弦波时,虚构组件应该看起来像彼此的时移版本。)
我是否在滥用PyWavelets?这里可能有错误吗?欢迎任何帮助。
import numpy
import pywt
import matplotlib.pyplot as plt
# makes a 1-kHz signal
def make_data(length, quality):
tau = 2*numpy.pi
x = numpy.arange(length)
y = numpy.sin(tau * x/(quality/1000)) # the 1000 is for 1 kHz
return y
# does the continuous wavelet transform, outputting pic
def do_transform(data, base_freq, num_octaves, voices_per_octave, quality):
# calculate the scales, based on the desired frequencies
base_scale = quality / (2*base_freq)
far_scale = base_scale / 2**num_octaves
scales = numpy.geomspace(base_scale, far_scale, num=num_octaves*voices_per_octave+1, endpoint=True)
# actual calculation
coeffs, freqs = pywt.cwt(data, scales, "cmor", 1/quality)
print("freqs: " +str(freqs))
# output
truncated = coeffs[:, 100:200]
plt.imshow(abs(truncated), origin='lower', interpolation='none')
#plt.imshow(truncated.real, origin='lower', interpolation='none')
#plt.imshow(truncated.imag, origin='lower', interpolation='none')
plt.subplots_adjust(left=0.01, right=0.99, top=0.99, bottom=0.05)
plt.show()
data = make_data(1000, 44100)
do_transform(data, 500, 3, 40, 44100)
答案 0 :(得分:0)
事实证明这是一个已知问题。 (目前还不清楚这是一个错误还是只是意外行为,但讨论在这里:https://github.com/PyWavelets/pywt/issues/307。)
感谢所有看过它并考虑过它的人。