Пиковый алгоритм для Python/SciPy

Я сам что-то могу написать, найдя нулевые пересечения первой производной или что-то в этом роде, но она кажется, что функция обычного достаточно для включения в стандартные библиотеки. Кто-нибудь знает об одном?

Мое конкретное приложение представляет собой 2D-массив, но обычно он будет использоваться для нахождения пиков в БПФ и т.д.

В частности, в этих проблемах есть несколько сильных пиков, а затем множество небольших "пиков", которые просто вызваны шумом, который следует игнорировать. Это всего лишь примеры; не мои фактические данные:

1-мерные пики:

Выход FFT с пиками

Двумерные пики:

Radon transform output with circled peak

Алгоритм поиска пика найдет расположение этих пиков (а не только их значения) и идеально найдет истинный пик между образцами, а не только индекс с максимальным значением, возможно, используя квадратичная интерполяция или что-то в этом роде.

Обычно вам нужно только немного сильных пиков, поэтому они либо будут выбраны, потому что они превышают определенный порог, либо потому, что они являются первыми n пиками упорядоченного списка, оцененных по амплитуде.

Как я уже сказал, я знаю, как писать что-то подобное сам. Я просто спрашиваю, существует ли уже существовавшая функция или пакет, который хорошо работает.

Update:

I перевел MATLAB script и работает прилично для 1-D случая, но может быть лучше.

Обновлено обновление:

sixtenbe создал лучшую версию для 1-D случая.

Ответ 1

Я не думаю, что то, что вы ищете, предоставляется SciPy. Я бы сам написал код в этой ситуации.

Сплановая интерполяция и сглаживание из scipy.interpolate довольно приятны и могут быть весьма полезны при подгонке пиков, а затем в поиске местоположения их максимума.

Ответ 2

Я смотрю на аналогичную проблему, и я нашел, что некоторые из лучших ссылок исходят из химии (от пиков, найденных в массивах данных). Для хорошего тщательного анализа пиковых алгоритмов поиска читайте this. Это один из лучших ясных обзоров методов поиска пика, которые я использовал. (Вейвлеты лучше всего подходят для поиска пиков такого рода по шумным данным.).

Похоже, ваши пики четко определены и не скрыты в шуме. В этом случае я бы рекомендовал использовать гладкие производные саттицки-голея, чтобы найти пики (если вы просто различаете данные выше, у вас будет беспорядок ложных срабатываний). Это очень эффективный метод и довольно прост в реализации (вам нужен матричный класс с базовыми операциями). Если вы просто найдете нулевое пересечение первой производной S-G, я думаю, вы будете счастливы.

Ответ 4

Для тех, кто не уверен в том, какие алгоритмы поиска пиков для использования в Python, здесь быстрый обзор альтернатив: https://github.com/MonsieurV/py-findpeaks p >

Желая, чтобы я был эквивалентен функции MatLab findpeaks, я обнаружил, что функция detect_peaks от Маркоса Дуарте - хороший улов.

Довольно проста в использовании:

import numpy as np
from vector import vector, plot_peaks
from libs import detect_peaks
print('Detect peaks with minimum height and distance filters.')
indexes = detect_peaks.detect_peaks(vector, mph=7, mpd=2)
print('Peaks are: %s' % (indexes))

Что вам даст:

detect_peaks results

Ответ 5

Обнаружение пиков в спектре надежным способом изучено совсем немного, например, все работы по синусоидальному моделированию музыкальных/звуковых сигналов в 80-х годах. Ищите "синусоидальное моделирование" в литературе.

Если ваши сигналы чисты, как пример, простое "дать мне что-то с амплитудой выше N соседей" должно работать достаточно хорошо. Если у вас шумные сигналы, простой, но эффективный способ - вовремя посмотреть на ваши пики, отслеживать их: затем вы обнаруживаете спектральные линии вместо спектральных пиков. IOW, вы вычисляете FFT на скользящем окне вашего сигнала, чтобы получить набор спектров во времени (также называемый спектрограммой). Затем вы смотрите на эволюцию спектрального пика во времени (т.е. В последовательных окнах).

Ответ 6

Существуют стандартные статистические функции и методы для обнаружения выбросов данных, что, вероятно, является тем, что вам нужно в первом случае. Использование производных будет решать вашу вторую. Однако я не уверен в методе, который решает как непрерывные функции, так и дискретизированные данные.

Ответ 7

Прежде всего, определение "пик" является неопределенным, если без дополнительных спецификаций. Например, для следующих серий вы бы назвали 5-4-5 одного пика или двух?

1-2-1-2-1-1-5-4-5-1-1-5-1

В этом случае вам понадобятся по крайней мере два порога: 1) высокий порог, только выше которого может быть регистр экстремальных значений как пик; и 2) низкий порог, так что экстремальные значения, разделенные небольшими значениями ниже него, станут двумя пиками.

Обнаружение пиков - это хорошо изученная тема в литературе по теории экстремальной ценности, также известная как "раздувание экстремальных ценностей". Его типичные применения включают определение опасных событий на основе непрерывных показаний переменных среды, например. анализируя скорость ветра для обнаружения событий шторма.