【问题标题】:How to find the instance before a peak forms in a signal?如何在信号中找到峰值之前的实例?
【发布时间】:2019-07-12 03:27:50
【问题描述】:

我正在处理信号数据,并试图在峰值开始形成之前找到实例(或接近它)。例如:

目前使用 scipy.signal.find_peaks 计算红色星形和橙色 x,以找到连续两个大于 50 的峰值之前的第一个最小峰值。我想要的理想位置是带有红色星星和第二个和第三个橙色 x 的区域。

我的问题是,有时在第一个驼峰形成之前没有最小值,这会导致左侧第一个橙色 x 出现问题。

什么是更好的方法或改进我当前的方法以在驼峰形式之前获得那个位置的方法(粗略的箭头位置):

我当前的代码看起来像这样,它分别为蓝色和绿色线运行:

    step_peak, _ = find_peaks(z, height=60, distance=40)
    step_min, _ = find_peaks(-1*z, height=-60)
    contact = []

    for i in range(len(step_peak)-1):
        if step_peak[i+1] - step_peak[i] < 100:
            for min in reversed(step_min):
                if min < step_peak[i]:
                    contact.append(min)
                    break

这种方法适用于整个数据集的大约 90%,只有少数最终会像我需要考虑的第一个橙色 x。

任何帮助将不胜感激。

【问题讨论】:

  • 也许你要找的点是二阶导数最大的地方?

标签: python matplotlib scipy


【解决方案1】:

首先,我们看一下函数scipy.signal.peak_widths。在无法访问您的数据的情况下,我使用了示例曲线:

from scipy.signal import chirp, find_peaks, peak_widths
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 6 * np.pi, 1000)
x = np.sin(x) + 0.6 * np.sin(2.6 * x)

peaks, _ = find_peaks(x)
results_full = peak_widths(x, peaks, rel_height=1)
results_full[0]  # widths
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.hlines(*results_full[1:], color="C3")
plt.show()

我们可以解析peak_widths 的结果以丢弃那些在另一个宽度内的值。

peak_begin = np.array(results_full)
peak_begin = peak_begin[:, np.argsort( peak_begin[2] ) ] 
_, b = peak_begin.shape
width_to_delete = []
i= 1
while i < b:
    if peak_begin[2][i] < peak_begin[3][i-1]:
        peak_begin = np.delete(peak_begin,i,1)
        b = b-1
    else:
        i = i+1

plt.plot(x)
plt.hlines(*results_full[1:], color="r")
plt.plot(peaks, x[peaks], "x")
plt.plot(peak_begin[2], peak_begin[1], "o", color="g")
plt.show()

我希望我得到了你想要达到的目标。

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2017-06-09
    相关资源
    最近更新 更多