Как уменьшить ошибку при обнаружении пиков? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь определить пик R ЭКГ. Для этого я использовал следующую строку кода:

peaks=signal.find_peaks_cwt(signal_slice, widths=np.arange(1,80))
fig, ax = plt.subplots()
ax.set_title('Detect R peak')
ax.plot(signal_slice)
for peak in peaks:
ax.axvline(x=peak, color='r')

И я получаю следующий вывод: enter image description here

Однако при следующем сигнале он также неточно обнаруживает меньший пик.

enter image description here

Есть ли дополнительный параметр, который я мог бы добавить к scipy.signal.find_peaks_cwt, чтобы сделать это более точным? Или какой-нибудь способ использовать peakutils для этого?

Теперь он перестал ошибочно обнаруживать маленькие пики, но все еще, кажется, случайно пропускает большой пик, кто-нибудь знает почему? enter image description here

1 Ответ

0 голосов
/ 30 апреля 2019

Вы должны указать ширину ожидаемой ширины пика.Из документации Scipy :

1-D массив ширины для использования при расчете матрицы CWT.В общем, этот диапазон должен охватывать ожидаемую ширину интересующих пиков.

Вот пример, иллюстрирующий влияние ширины.

from scipy import signal
xs = np.arange(0, 20*np.pi, 0.05)
xs2 = np.arange(0, 20*np.pi, 0.025)
data = np.sin(xs)
data2 = np.sin(xs2)
data= data + data2[:1257]
peakind = signal.find_peaks_cwt(data, np.arange(1,200))
peakind, xs[peakind], data[peakind]
fig, ax = plt.subplots()
ax.set_title('Detect R peak')
ax.plot(data)
for peak in peakind:
    ax.axvline(x=peak, color='r')

Это приводит только к глобальным пикам.One peak

Но если вы измените ширину на np.arange (1100), вы также увидите другой локальный пик.

peakind = signal.find_peaks_cwt(data, np.arange(1,100))

Здесь методы обнаруживают больше пиков из-за разницы в ширине.Two peaks in the same data

...