python:find_peaks

需要

曲線(x、y)がわかっているので、各ピークまたはディップ、および対応するx値を見つけたいと思います。

アプリケーション:スペクトログラムを考えると、各ピークと対応する周波数を見つける必要があります

解決策

1.既存のメソッドを直接使用する
scipy.signal.find_peaks

2.メソッドを自分で
記述します。アイデア:1. sort(list(zip(y、x)))を使用してすべてをソートします; 2.次に、y値、隣接するピーク間の距離などのさまざまな条件に従って結果をフィルターで除外します。この方法では、方法1のアイデアと同じになる場合があります。したがって、既存の方法1が直接使用されます。

スキーム1

直接使用方法:scipy.signal.find_peaks。

メソッドの説明:

 scipy.signal.find_peaks(x, height=None, 
threshold=None, distance=None, prominence=None, width=None, wlen=None, 
rel_height=0.5, plateau_size=None)

入力

  • x:データ
  • その他のパラメーター:さまざまなスクリーニング条件。メソッドは、これらのフィルター条件に基づいてピークをフィルターします。各入力パラメーターの意味については、公式ドキュメントを参照してください

出力:

  • peaks:ndarray、見つかったピークのインデックスID
  • プロパティ:dict、プロパティ['peak_heights']など、検出されたピークのさまざまな情報が含まれます

from scipy.signal import find_peaks
# 已导入需要处理的数据(x,y)
plt.plot(x,y)
plt.xlabel('freq/Hz')
plt.ylabel('amp')

peak_id,peak_property = find_peaks(y, height=2000, distance=20)
peak_freq = x[peak_id]
peak_height = peak_property['peak_heights']
print('peak_freq',peak_freq)
print('peak_height',peak_height)

出力結果:正しい。

peak_freq [1.2125e+08 3.0000e+08 4.2125e+08]
peak_height [9277.83035228 4566.30860382 4744.32457053]

ここに画像の説明を挿入

元の記事47件を公開 いいね33 310,000以上

おすすめ

転載: blog.csdn.net/kaever/article/details/105359958