我正在使用scipy peakfinderscipy.signal.find_peaks_cwt来查找信号中的峰值。所有的峰值都是可靠的,但是我总是得到一些额外的结果(到目前为止,所有的结果都是在信号的末尾),这些结果都不是峰值。我想知道为什么会这样。。。在
下面是一个综合数据的完整示例:
from scipy.signal import find_peaks_cwt
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline # for jupyter notebooks
x = np.arange(0, 15, 0.1)
y = np.sin(x)
plt.plot(y)
peakinds = find_peaks_cwt(y, np.arange(1, 5))
plt.plot(peakinds, y[peakinds], 'o')
(要在普通pythonshell中运行,umcomment %matplotlib inline
,并在末尾添加plt.show()
)
用标记为点的峰值绘制:
(最后三个点不应该在那里)
我的真实数据也会发生同样的事情:
(这里最后一个点错了)
为什么会这样?在
您在
find_peaks_cwt
中的widths
参数就是问题所在。在{a1}
从documentation:
宽度:序列 用于计算CWT矩阵的一维宽度数组。一般来说,这个范围应该包括预期的峰值宽度。在
编辑:
默认使用的小波是Ricker小波。基本上,在所有指定的
widths
(通过调用ricker(width[i])
)在信号和小波之间执行卷积。因此,您给出的范围必须从小(精确定位峰值)到足够大(用于检测感兴趣的峰值),但不能太大(为了避免混叠,让我们记住小波在频域中工作)。在文档摘要:算法如下:1-对给定的宽度对向量进行连续小波变换。这是每个宽度的向量与小波(宽度)的卷积。在
如果你用
np.arange(10, 20)
改变widths
,你会注意到峰值被检测到,但它们的最大值没有很好地定域(我们缺少精细尺度)。如果您再次尝试使用np.arange(1, 20)
,则峰值会更好地本地化。在另外,如果您想可视化ricker小波:
^{pr2}$编辑2:
至于在信号末尾错误地检测到的额外峰值,这很可能是由于边界效应。基本上,卷积的窗口超出了信号的最后一个采样。通常情况下,对信号进行填充(零填充、信号包装等),但这取决于它的执行方式(或根本不执行),这种错误可能会发生。在处理这些类型的方法时,丢弃前几点和最后几点通常是合适的。在
相关问题 更多 >
编程相关推荐