Как найти экземпляр до того, как в сигнале формируется пик? - PullRequest
1 голос
/ 11 июля 2019

Я работаю с данными сигнала и пытаюсь найти экземпляр (или близкий к нему) до того, как пик начинает формироваться. Например:

Peak examples

Красные звезды и оранжевые x в настоящее время рассчитываются с использованием scipy.signal.find_peaks, чтобы найти первый минимальный пик перед двумя пиками, превышающими 50 подряд. Идеальное место, которое я хочу, это район с красными звездами, вторым и третьим оранжевым x.

Моя проблема в том, что иногда не существует минимального значения прямо перед тем, как формируется первый горб, и это вызывает проблему, как с первым оранжевым x слева.

Что может быть лучшим методом или способом улучшить мой текущий метод, чтобы получить это место прямо перед тем, как образуется горб (грубое расположение стрелки):

enter image description here

Мой текущий код выглядит примерно так и работает отдельно для синей и зеленой линий:

    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, который мне нужно учитывать.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 июля 2019

Сначала давайте посмотрим на функцию 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()

enter image description here

Мы можем проанализировать результаты 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()

enter image description here

Я надеюсь, что получил то, что вы хотите достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...