Scipy signal find_peaks_cwt не находит пики точно?
У меня есть 1-D сигнал, в котором я пытаюсь найти пики. Я ищу их идеально.
Сейчас я делаю:
import scipy.signal as signal
peaks = signal.find_peaks_cwt(data, np.arange(100,200))
Ниже приведен график с красными пятнами, которые показывают местоположение пиков, найденных с помощью find_peaks_cwt()
.
![Signal + Peaks]()
Как вы можете видеть, рассчитанные пики недостаточно точны. Те, которые действительно важны, - это три с правой стороны.
Мой вопрос: Как сделать это более точным?
UPDATE: данные здесь: http://pastebin.com/KSBTRUmW
На каком-то фоне я пытаюсь найти место между пальцами в изображении. То, что нарисовано, это x-координата контура вокруг руки. Голубые пятна = пики. Если есть более надежный/надежный подход, пожалуйста, оставьте комментарий.
![enter image description here]()
Ответы
Ответ 1
Решение, решение:
Сначала отфильтруйте данные:
window = signal.general_gaussian(51, p=0.5, sig=20)
filtered = signal.fftconvolve(window, data)
filtered = (np.average(data) / np.average(filtered)) * filtered
filtered = np.roll(filtered, -25)
Затем используйте angrelextrema согласно ответу на пистолет.
Результат:
![enter image description here]()
Ответ 2
Существует гораздо более легкое решение, использующее эту функцию:
https://gist.github.com/endolith/250860
который является адаптацией http://billauer.co.il/peakdet.html
Я только что попробовал с данными, которые вы предоставили, и я получил результат ниже. Не требуется предварительная фильтрация...
Наслаждайтесь: -)
![peak detection]()
Ответ 3
Отредактировано после получения необработанных данных.
argelmax и arglextrma находятся вне гонки.
Кривая очень шумная, поэтому вам нужно играть с малой шириной пика (как указано выше) и шумом.
Лучшее, что я нашел, выглядит не очень хорошо.
import numpy as np
import scipy.signal as signal
peakidx = signal.find_peaks_cwt(y_array, np.arange(10,15), noise_perc=0.1)
print peakidx
[10, 100, 132, 187, 287, 351, 523, 597, 800, 1157, 1451, 1673, 1742, 1836]
![enter image description here]()