scipy.signal.find_peaks_cwt返回非峰值的其他点

2024-10-03 09:15:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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()

用标记为点的峰值绘制:

enter image description here

(最后三个点不应该在那里)

我的真实数据也会发生同样的事情:

enter image description here

(这里最后一个点错了)

为什么会这样?在


Tags: 数据importsignal信号matplotlibasnpplt
1条回答
网友
1楼 · 发布于 2024-10-03 09:15:54

您在find_peaks_cwt中的widths参数就是问题所在。在

from scipy.signal import find_peaks_cwt
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 15, 0.1)
y = np.sin(x)
fig0 = plt.figure()
ax0 = fig0.add_subplot(111)
ax0.plot(y)

peakinds = find_peaks_cwt(y, np.arange(1, 10))  # Here changed 5 to 10
ax0.plot(peakinds, y[peakinds], 'o')
plt.axis([0, 160, -1.1, 1.1])

{a1}

documentation

宽度:序列 用于计算CWT矩阵的一维宽度数组。一般来说,这个范围应该包括预期的峰值宽度。在

编辑:

默认使用的小波是Ricker小波。基本上,在所有指定的widths(通过调用ricker(width[i]))在信号和小波之间执行卷积。因此,您给出的范围必须从小(精确定位峰值)到足够大(用于检测感兴趣的峰值),但不能太大(为了避免混叠,让我们记住小波在频域中工作)。在

文档摘要:算法如下:1-对给定的宽度对向量进行连续小波变换。这是每个宽度的向量与小波(宽度)的卷积。在

如果你用np.arange(10, 20)改变widths,你会注意到峰值被检测到,但它们的最大值没有很好地定域(我们缺少精细尺度)。如果您再次尝试使用np.arange(1, 20),则峰值会更好地本地化。在

另外,如果您想可视化ricker小波:

^{pr2}$

编辑2:

至于在信号末尾错误地检测到的额外峰值,这很可能是由于边界效应。基本上,卷积的窗口超出了信号的最后一个采样。通常情况下,对信号进行填充(零填充、信号包装等),但这取决于它的执行方式(或根本不执行),这种错误可能会发生。在处理这些类型的方法时,丢弃前几点和最后几点通常是合适的。在

相关问题 更多 >