9

我对widths传递给scipy.signal.cwt()和扩展的参数感到困惑scipy.signal.find_peaks_cwt()。以前的一个非常有用的 Stack Overflow 问题(以及其中的指针)解释了我的大部分困惑。这widths是一个尺度数组,用于在与数据卷积之前拉伸小波。

让我困惑的一点仍然是,元素的单位是什么widths?宽度为 1 是否意味着小波被拉伸为一个“索引”宽,其中索引是元素之间的距离data?起初我认为是这种情况,但是 (a) 宽度可以采用非整数值,并且 (b) cwt() 结果可能因宽度而异。

这是一些说明我的困惑的代码。为什么最后两行给出不同的结果?

#generating an arbitrary signal with overlapping gaussian peaks with various 
npeaks = 6
support = np.arange(0,1.01,0.01)
pkx = np.array([0.2, 0.3, 0.38, 0.55, 0.65]) #peak locations
pkfun = sum(stats.norm.pdf(support, loc=pkx[i], scale=0.03) for i in range(0,npeaks-1))

#finding peaks for two different setting of widths
pkindsOne = sig.find_peaks_cwt(pkfun, widths = np.arange(4,6), wavelet = sig.ricker)
pkindsTwo = sig.find_peaks_cwt(pkfun, widths = np.arange(4,6.4), wavelet = sig.ricker)

#printing to show difference between calls
for ind, el in enumerate(pkindsTwo):
    print el, pkindsOne[ind]
20 20
36 36
38 38
55 55
63 66
66 91
91

结果很接近,但第二次调用在输入数据的元素 63 处发现了一个虚假峰值。因此,我不相信宽度单位是数据向量的索引。但他们还能是什么?如果不是,单位是widths什么? cwt()并且find_peaks_cwt()永远不知道或看到任何 x 轴单位(例如support我在代码中定义的向量),那么我错过了什么?实际上,什么时候使用非整数宽度有意义?

4

1 回答 1

8

我自己也有同样的问题。查看源代码,我最好的客人是单位是“样本数”。scipy.signal.wavelets.cwt 中的关键代码行是:

wavelet_data = wavelet(min(10 * width, len(data)), width)

这里,“小波”是接收样本数参数“length_of_wavelet”和“width_of_wavelet”的函数(母小波的构建器)。宽度仍然可以是非整数值的原因是(如果我没记错的话)它代表缩放因子,它可以取任何实数,因为它只是影响形状的公式的一个因子小波。

于 2015-04-14T10:23:19.003 回答