2009-11-11 55 views
93

最初の派生物または何かのゼロクロスを見つけることで自分自身で何かを書くことができますが、それは標準ライブラリに含めるのに十分な一般的な関数のようです。誰でも知っている?Python/SciPyのピーク検出アルゴリズム

私の特定のアプリケーションは、2次元アレイであるが、通常それはのFFTのピークを見つけるために使用される、等

具体的には、この種の問題では、小さいの多くは、「そこ複数の強いピークであり、そしてピークを無視しなければならないノイズによって引き起こされます。これらは単なる例です。ではない私の実際のデータ:

1次元のピーク:

FFT output with peaks

2次元のピーク:

Radon transform output with circled peak

ピーク発見アルゴリズムは、これらのピークの場所を見つけるだろう(それらの値だけでなく)理想的には、おそらくquadratic interpolationなどを使用して、最大値を持つインデックスだけでなく、実際のサンプル間ピークを見つけることができます。

通常、いくつかの強いピークのみを扱うので、特定のしきい値を超えているために選択されるか、または振幅でランク付けされた順序付きリストのピークが最初に表示されます。

私が言ったように、私はこのようなものを書く方法を知っています。私は、うまく機能することが分かっている既存の機能やパッケージがあるかどうかを尋ねています。

更新:

I translated a MATLAB script、それは1-Dのケースのためにきちんと動作しますが、良いかもしれません。

更新更新:1-Dの場合について

sixtenbe created a better version

+0

@endolithこのためにPythonに翻訳したオリジナルのMATLABファイルがありますか?ありがとう! – 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

データに異常値を見つけるための標準的な統計関数と方法があります。これはおそらく最初のケースで必要なものです。デリバティブを使用すると、2番目の問題を解決できますしかし、私は、連続関数とサンプリングされたデータの両方を解決する方法についてはわかりません。

6

信頼性の高い方法でスペクトルのピークを検出することは、例えば80年代の音楽/オーディオ信号の正弦モデリングに関するすべての作業をかなり研究しました。文献で「正弦曲線モデリング」を探します。

信号が例のようにきれいであれば、単純に「N近傍よりも振幅の大きいものを与えてください」というのは合理的にうまくいくはずです。ノイズの多い信号がある場合、単純ではありますが効果的な方法は、ピークを時間軸で見て追跡することです。スペクトルピークの代わりにスペクトル線を検出します。IOWでは、信号のスライディングウインドウでFFTを計算し、スペクトログラムとも呼ばれる時間軸のスペクトルを取得します。その後、スペクトルピークの時間的変化(すなわち、連続するウィンドウ)を見る。

+0

時間のピークを確認しますか?スペクトル線を検出しますか?私はこれが何を意味するのか分かりません。方形波のために働くでしょうか? – endolith

+0

私はいくつかの説明を追加しようとしましたが、これはまだ不明な場合は教えてください。 –

+0

ああ、あなたはFFTの代わりにSTFTを使うことを話している。この質問はFFTに関するものではありません。これは単なる例です。それは、一般的な1Dまたは2Dアレイのピークを見つけることです。 – endolith

38

私は同様の問題を抱えています。私は、化学物質から得られた最良の参考文献のいくつかが質量分析データで見つかるピークから見つかっています。ピーキングアルゴリズムの徹底的なレビューでは、thisと読んでください。これは、私が遭遇したピーク検出技術の最も明白なレビューの1つです。 (ウェーブレットはノイズの多いデータでこの種のピークを見つけるのに最適です)。

ピークは明確に定義されており、ノイズに隠されていないようです。その場合、ピークを見つけるためにスムーズなsavtizky-golay微分を使用することをお勧めします(上記のデータを差別化すれば、誤検出の混乱を招くでしょう)。これは非常に効果的なテクニックであり、実装が非常に簡単です(基本的な操作で行列クラスが必要です)。最初のS-G派生物のゼロ交差を見つけるだけであれば、あなたは幸せになると思います。あなたのニーズに適しているように聞こえるscipy.signal.find_peaks_cwtという名前のscipyのダウンロード中の関数があり

+2

私は汎用ソリューションを探していましたが、それらの特定の画像でしか動作しません。私はPythonにMATLABスクリプトを適合させました。 – endolith

+1

右に。 Matlabはアルゴリズムの良いソースです。スクリプトはどのようなテクニックを使用していますか? (BTW、SGは非常に汎用的な技術です)。 – Paul

+2

私はそれを上にリンクしました。これは、基本的には、その近傍の特定のしきい値よりも大きいローカル最大値を検索するだけです。確かに良い方法があります。 – endolith

14

、しかし、私はそれで経験を持っていないので、私は...わからない人のために

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

+8

これは私が尋ねたときには存在しませんでしたが、まだ使用方法がわかりません – endolith

+1

これをもう少し前に追加しましたが、これは素晴らしい機能でした。パイを使うのは簡単です。配列を渡し、必要なピークの幅をすべて列挙する別の配列(例:np.arange(1,10))を渡します。 1つの必要性がある場合、スキニーまたは広いピークをフィルタリングするための優れたメリット再度、感謝します! – Miles

10

をお勧めすることはできませんこれはピーク発見Pythonで使用するためのアルゴリズム、ここで代替案の迅速な概観:https://github.com/MonsieurV/py-findpeaks

自分自身にMatLabの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-2-1-1-5-4-5-1-1-5-1

、あなたには、少なくとも二つの閾値が必要になります:1)高極限値レジスタをピークとして超えることができる閾値のみ、 2)その下の小さな値によって分離された極値が2つのピークになるように低い閾値。

ピーク検出は、「極値のデクラスタリング」とも呼ばれる極値理論の文献でよく研究されているトピックです。その典型的な用途には、環境変数の連続読み取り値に基づいて危険事象を特定することが含まれる。風速を解析して嵐の事象を検出する。