2009-11-11 115 views
93

첫 번째 미분 또는 제로의 제로 크로싱을 찾아서 직접 작성할 수 있지만 표준 라이브러리에 포함될 수있는 일반적인 기능처럼 보입니다. 누구 하나 알고 있니?Python/SciPy의 피크 찾기 알고리즘

내 특정 응용 프로그램은 "

특히, 이러한 종류의 문제에서, 다수의 강력한 봉우리, 작은의 다음 많다는 등이 있으며, 2 차원 배열이지만, 보통은의 FFT에 피크를 검색에 사용하는 것 봉우리 "는 무시해야 할 잡음에 의한 것입니다. 이것들은 단지 예일뿐입니다. 나의 실제 데이터 :

1 차원 피크 :

FFT output with peaks

2 차원 피크 :

Radon transform output with circled peak

피크-찾는 이들 피크의 위치를 ​​찾을 것이라고 알고리즘을 (그들의 값뿐만 아니라) 이상적으로는 아마도 최대 값을 가진 인덱스가 아니라 quadratic interpolation 또는 뭔가를 사용하여 진정한 샘플 간 피크를 찾을 수 있습니다.

일반적으로 몇 가지 강한 피크에만 관심이 있으므로 특정 임계 값을 초과했기 때문에 선택되거나 진폭에 따라 순위가 정해진 목록의 첫 번째 n 피크이기 때문에 선택됩니다.

내가 말했던 것처럼, 나는 나 같은 것을 쓰는 법을 안다. 나는 잘 작동하는 것으로 알려진 기존 기능이나 패키지가 있는지 묻는 것입니다.

업데이트 :

I translated a MATLAB script하고 1-D의 경우에 친절하게 작동하지만, 더 좋을 수 있습니다.

업데이트 업데이트 : 1-D 케이스

sixtenbe created a better version.

+0

@endolith 파이썬으로 변환 한 원본 MATLAB 파일을 가지고 있습니까? 감사! – Spacey

+0

@ 모함마드 : 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 년대의 음악/오디오 신호에 대한 사인파 모델링에 대한 모든 작업이 연구되었습니다. 문헌에서 "Sinusoidal Modeling"을 찾으십시오.

신호가 예제처럼 깨끗하면 간단히 "N 개의 이웃 신호보다 진폭이 큰 신호를 보내십시오"라는 것이 합리적으로 잘 작동해야합니다. 시끄러운 신호가있는 경우 간단하지만 효과적인 방법은 피크를 추적하여 피크를 추적하는 것입니다. 스펙트럼 피크 대신 스펙트럼 라인을 감지합니다.IOW, 신호의 슬라이딩 윈도우에서 FFT를 계산하여 시간의 스펙트럼 세트 (스펙트로 그램이라고도 함)를 얻습니다. 그런 다음 시간의 스펙트럼 피크 (즉, 연속적인 윈도우)의 진화를 봅니다.

+0

정점을 살펴 봅니다. 스펙트럼 선을 탐지합니까? 나는 이것이 무엇을 의미하는지 모른다. 사각 파에 효과가 있습니까? – endolith

+0

나는 약간의 설명을 추가하려고했는데, 이것이 아직도 불분명한지 알려주려고한다. –

+0

오, 당신은 FFT 대신에 STFT를 사용하는 것에 대해 이야기하고 있습니다. 이 질문은 특별히 FFT에 관한 것이 아닙니다. 그것은 단지 하나의 예입니다. 일반적인 1D 또는 2D 배열에서 피크를 찾는 것입니다. – endolith

38

나는 비슷한 문제를보고 있으며, 화학 물질로부터 나온 최고의 참고 문헌 (질량 - 스펙 데이터를 찾는 봉우리로부터)을 발견했다. 피킹 알고리즘을 자세히 조사하려면 this을 읽으십시오. 이것은 내가 밟은 피크 찾기 기술에 대한 가장 분명한 리뷰 중 하나입니다. (웨이블릿은 잡음이 많은 데이터에서 이러한 종류의 피크를 찾는 데 가장 좋습니다.)

피크가 명확하게 정의되어 있고 노이즈에 숨겨져 있지 않은 것처럼 보입니다. 그렇다면 필자는 부드러운 savtizky-golay 파생물을 사용하여 최고점을 찾는 것이 좋습니다. 위의 데이터를 차별화하면 오탐 (false positive)이 뒤죽박죽입니다.) 이것은 매우 효과적인 기술이며 매우 구현하기 쉽습니다 (기본 작업이있는 행렬 클래스가 필요함). 첫 번째 S-G 파생물의 제로 크로싱을 발견하면 행복 할거야. 확실하지 사람들을 위해

같은 소리 scipy.signal.find_peaks_cwt라는 이름의 scipy에서 함수 그러나 나는 그래서 권장하지 않습니다 그것을 경험이없는, 사용자의 요구에 적합한 있습니다
+2

제가 범용 솔루션을 찾고 있었는데, 특정 이미지에서만 작동하는 솔루션이 아니 었습니다. 필자는 Python에 MATLAB 스크립트를 적용했으며 제대로 작동합니다. – endolith

+1

오른쪽 위에 있습니다. Matlab은 알고리즘의 좋은 소스입니다. 스크립트에서 사용하는 기술은 무엇입니까? (BTW, SG는 매우 일반적인 목적 기술입니다.) – Paul

+2

나는 그것을 위에 연결했다. 기본적으로 이웃 위의 특정 임계 값보다 큰 로컬 최대 값을 검색합니다. 확실히 더 나은 방법이 있습니다. – endolith

14
+8

그래, 내가 이것을 물었을 때 존재하지 않았고, 아직도 사용법을 모르겠다. – endolith

+1

오래 전에 이것을 추가했는데, 정말 멋졌다. 그것을 사용하는 것은 파이처럼 간단합니다. 그냥 배열을 전달하고 원하는 배열의 모든 너비를 나열하는 다른 배열 (즉, np.arange (1,10))을 전달합니다. 하나가 필요하면 마른 또는 넓은 봉우리를 걸러 낼 수있는 좋은 이점이 있습니다. 다시 한 번 감사드립니다! – Miles

10

이는 피크 발견 여기에, 파이썬에서 대안의 빠른 개요를 사용하는 알고리즘 : https://github.com/MonsieurV/py-findpeaks

자신에게 매트랩 findpeaks 함수에 해당하는 원하기를, 내가 마르코스 아르테에서 detect_peaks function 좋은 캐치 것으로 나타났습니다. 사용하기

아주 쉽게 :

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) 낮은 임계 값으로 인해 극히 낮은 값으로 분리 된 값이 두 개의 피크가됩니다.

피크 검출은 "극한 값의 디 클러스터링 (declustering of extreme value)"이라고하는 극한치 이론 문헌에서 잘 연구 된 주제입니다. 그 전형적인 응용 예는 환경 변수의 연속적인 판독에 기초하여 유해 이벤트를 식별하는 것을 포함한다. 폭풍 사건을 감지하기 위해 풍속을 분석합니다.