2009-11-11 3 views
93

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

Моего конкретное приложение представляет собой 2D массив, но, как правило, он будет использоваться для обнаружения пиков в FFTs и т.д.

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

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

FFT output with peaks

2-мерных пиков:

Radon transform output with circled peak

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

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

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

Update:

Я translated a MATLAB script и она работает прилично для случая 1-D, но могло быть лучше.

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

sixtenbe created a better version для случая 1-D.

+0

@endolith У вас есть оригинальный файл MATLAB, который вы перевели на python для этого? Благодаря! – Spacey

+0

@Mohammad: http://billauer.co.il/peakdet.html https://gist.github.com/250860#file_peakdet.m – endolith

+2

Как насчет этого: http://docs.scipy.org/doc/scipy /reference/generated/scipy.signal.find_peaks_cwt.html – dashesy

ответ

10

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

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

2

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

6

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

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

+0

Посмотрите на вершины во времени? Обнаружение спектральных линий? Я не уверен, что это значит. Будет ли это работать на квадратные волны? – endolith

+0

Я попытался добавить какое-то объяснение, дайте мне знать, если это еще неясно. –

+0

О, вы говорите об использовании STFT вместо FFT. Этот вопрос касается не только БПФ; это всего лишь пример. Речь идет о поиске пиков в любой общей 1D или 2D-массиве. – endolith

38

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

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

+2

Я искал решение общего назначения, а не тот, который работает только на этих изображениях. Я адаптировал сценарий MATLAB для Python и работает прилично. – endolith

+1

Право на. Matlab - хороший источник для алгоритмов. Какую технику использует сценарий? (BTW, SG - очень универсальная техника). – Paul

+2

Я связал его выше. В основном он ищет только локальные максимумы, превышающие определенный порог над соседями. Есть, конечно, лучшие методы. – endolith

14

Существует функция в SciPy имени scipy.signal.find_peaks_cwt, которая звучит как подходит для ваших нужд, однако у меня нет опыта работы с ним, поэтому я не могу рекомендовать ..

http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html

+8

Да, этого не было, когда я спросил об этом, и я все еще не уверен, как его использовать. – endolith

+1

Вы добавили это некоторое время назад, но это работало потрясающе. Использование его просто как пирог. Просто перейдите в массив и еще один массив (например, np.arange (1,10)), в котором перечислены все ширины пиков, которые вы хотите; Хорошая польза для фильтрации для тощих или широких пиков, если нужно. Еще раз спасибо! – Miles

10

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

Хотеть себе эквивалент к findpeaks функции MatLab, я обнаружил, что detect_peaks function от Marcos Дуарте хороший улов.

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

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

1

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

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

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

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