Как найти только «острые пики» сигнала в python?

#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 , таков .