需要
曲線(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]