Python / SciPyのピーク検出アルゴリズム

エンドリス:

一次導関数などのゼロクロッシングを見つけることで自分で何かを書くことができますが、標準ライブラリに含まれるのに十分に一般的な関数のようです。誰か知ってる?

私の特定のアプリケーションは2Dアレイですが、通常はFFTのピークを見つけるためなどに使用されます。

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

1次元ピーク:

ピークのあるFFT出力

2次元ピーク:

丸で囲まれたピークを持つラドン変換出力

ピーク検出アルゴリズムは、これらのピークの位置(それらの値だけではなく)を見つけ、理想的には、おそらく2次補間などを使用して、最大値のインデックスだけでなく、真のサンプル間ピークを見つけます

通常、気になるのは数個の強いピークだけなので、特定のしきい値を超えているため、または振幅でランク付けされた順序付きリストの最初のn個のピークであるために選択されます

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

更新:

は、MATLABスクリプト翻訳しましたが、それは1次元の場合にはちゃんと機能しますが、もっと良いかもしれません。

更新された更新:

sixtenbe は1-Dケースのより良いバージョン作成しました

Basj:

scipy.signal.find_peaksその名前が示すように、関数はこれに役立ちます。しかし、それはよくそのパラメータを理解することが重要だwidththresholddistance そして何よりもprominence良好なピーク抽出を取得します。

私のテストとドキュメントによると、卓越性の概念は、良好なピークを維持し、ノイズの多いピークを破棄するための「有用な概念」です。

(地形)突出とは何ですか?それは、「任意の高い地形に頂上から取得するために下降するために必要な最小の高さ」、それはここで見られるように、:

ここに画像の説明を入力してください

アイデアは:

顕著性が高いほど、ピークは「重要」になります。

テスト:

ここに画像の説明を入力してください

周波数が変化する正弦波を意図的に使用しました。これは、多くの困難を示すためです。width最小値をwidth高く設定しすぎると、高周波数部分の非常に近いピークを追跡できなくなるため、このパラメーターはあまり役に立たないことがわかりますwidth低く設定しすぎると、信号の左側に多くの不要なピークが生じます。と同じ問題distancethresholdここでは役に立ちませんが、直接隣人と比較するだけです。prominence最高のソリューションを提供するものです。これらのパラメータの多くを組み合わせることができることに注意してください!

コード:

import numpy as np
import matplotlib.pyplot as plt 
from scipy.signal import find_peaks

x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1)      # BEST!
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4)     # Required vertical distance to its direct neighbouring samples, pretty useless
plt.subplot(2, 2, 1)
plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
plt.subplot(2, 2, 2)
plt.plot(peaks2, x[peaks2], "ob"); plt.plot(x); plt.legend(['prominence'])
plt.subplot(2, 2, 3)
plt.plot(peaks3, x[peaks3], "vg"); plt.plot(x); plt.legend(['width'])
plt.subplot(2, 2, 4)
plt.plot(peaks4, x[peaks4], "xk"); plt.plot(x); plt.legend(['threshold'])
plt.show()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    どのように関係なく、それがどのように「悪い」、すべてのSSL証明書でのHttpClientを使用しないように

  3. 3

    Modbus Python Schneider PM5300

  4. 4

    Ansibleで複数行のシェルスクリプトを実行する方法

  5. 5

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  6. 6

    System.Data.OracleClient.OracleException:ORA-06550:行1、列7:

  7. 7

    インデックス作成時のドキュメントの順序は、Elasticsearchの検索パフォーマンスを向上させますか?

  8. 8

    scala.xmlノードを正しく比較する方法は?

  9. 9

    NGX-ブートストラップ:ドロップダウンに選択したアイテムが表示されない

  10. 10

    Elasticsearch - あいまい検索は、提案を与えていません

  11. 11

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  12. 12

    Elasticsearchの場合、間隔を空けた単語を使用したワイルドカード検索

  13. 13

    Elasticsearchでサーバー操作を最適化:低いディスク透かしに対処する

  14. 14

    ラベルとエントリがpythontkinterに表示されないのはなぜですか?

  15. 15

    変数値を含むElasticSearch検索結果

  16. 16

    グラフ(.PNG)ファイルをエクスポートするZabbix

  17. 17

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  18. 18

    Audacity:プロジェクトではなく、サウンドファイルのみを保存します

  19. 19

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  20. 20

    Excelは、メモ帳データの複数の列を1つの列として解釈します

  21. 21

    ブラウザがHTMLテンプレートを解釈しない

ホットタグ

アーカイブ