#python #signal-processing
Вопрос:
Я пытаюсь автоматически обнаруживать сдвиги уровня сигналов, обнаруживая пики в разнице между двумя вращающимися окнами.
Я в основном хочу обнаружить пики, которые являются «острыми» и не имеют широкого плато.
Я хочу обнаружить пики в следующих сигналах
Но не «широкий» пик на следующем изображении
Я знаю о таких функциях, как find_peaks
scipy.signals, но без указания каких-либо параметров он также улавливает широкие пики в моих сигналах.
Итак, есть ли какие-либо из его параметров, которые следует настраивать, чтобы улавливать только «острые» пики? Или я мог бы сначала выполнить какой-то конкретный шаг предварительной обработки данных, чтобы упростить их выбор?
Ценю любой вклад!
Комментарии:
1. Я предлагаю вам включить некоторые примеры данных и отметить, что вы хотите, как пик, а что нет, на своей картинке.
2. Просто краткий комментарий: возможно, вам потребуется отфильтровать фиолетовую кривую на рисунке 1 перед использованием scipy.signal.find_peaks. Мне нравится использовать
scipy.signal.firwin
для разработки ПИХТОВОГО фильтра в области последовательности с 16 отводами и частотой среза от 0,15*Fs до 0,45*Fs. Предел найквиста составляет 0,5*Fs. Вам также может сойти с рук отсутствие фильтрации ваших данных, если выheight
правильно укажете параметрыprominence
и вscipy.signal.find_peaks
Ответ №1:
scipy.signal.find_peaks
Функция принимает width
параметр. Если параметр является кортежем, то первое значение в кортеже-минимальная ширина, а второе значение-максимальная ширина. (например width=(0,10)
). Спецификация ширины относится к оси «последовательность» (т. Е. list(range(len(data))
), а не к какой-либо другой оси (например, к оси даты во втором примере).
Другой вариант таков scipy.signal.argrelextrema
. Для компаратора вы можете использовать np.больше. Минимальная ширина пика будет контролироваться order
параметром, где min_width=order*2 1
. Вы можете рассчитать ширину каждого пика, спускаясь по склону с обеих сторон, пока данные снова не начнут расти. Затем вы можете просмотреть свои пики и отфильтровать их в соответствии с требованиями к ширине.
Ваш лучший выбор, вероятно scipy.signal.find_peaks
, таков .