scipy.signal.cwt() 函数的 "widths" 参数的单位

Units of "widths" argument to scipy.signal.cwt() function

我对传递给 scipy.signal.cwt() 并扩展到 scipy.signal.find_peaks_cwt()widths 参数感到困惑。 previous and very helpful Stack Overflow question(和其中的指针)解释了我的大部分困惑。 widths 是一个尺度数组,在与您的数据进行卷积之前,通过这些尺度来拉伸小波。

还有点让我困惑的是,widths的元素单位是什么?宽度为 1 是否意味着小波被拉伸为一个 "index" 宽,其中索引是 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 向量),所以我错过了什么?实际上,什么时候使用非整数宽度有意义?

我自己也有同样的问题。查看源代码,我最好的客人是单位在 "number of samples" 中。 scipy.signal.wavelets.cwt 中的关键代码行是:

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

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