ピークを識別するタスクは、フーリエでのピークの検出に至るまで、さまざまなアプリケーションで発生します。変換 (FFT) を使用して 2D 配列からピークを抽出します。一般的な課題は、真のピークとノイズによる変動を区別することです。
ピーク検出アルゴリズムを最初から実装する代わりに、scipy の利用を検討してください。 .signal.find_peaks 関数。この関数には、特定の基準に基づいてピークをフィルタリングして識別するためのオプションが用意されています。
find_peaks の力を効果的に利用するには、そのパラメータを理解することが重要です。
すべてのパラメータの中で、プロミネンス は、真のピークとノイズを区別するのに最も効果的です。その定義には、より高いピークに到達するために必要な最小の垂直降下が含まれます。
その有用性を説明するために、ノイズが混入した周波数変化正弦波を考えてみましょう。理想的なソリューションは、スプリアス ノイズ ピークに屈することなくピークを正確に識別することです。
次のコードは、さまざまなパラメーターの組み合わせで find_peaks 関数を使用する方法を示しています。
<code class="python">import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks # Generate signal x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15 # Find peaks using different parameters peaks, _ = find_peaks(x, distance=20) peaks2, _ = find_peaks(x, prominence=1) peaks3, _ = find_peaks(x, width=20) peaks4, _ = find_peaks(x, threshold=0.4) # Plot results 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()</code>
結果からわかるように、プロミネンス (2 番目のサブプロットの青い線) を使用すると、真のピークが効果的に分離されますが、距離、幅、およびしきい値では、ノイズが存在する場合のパフォーマンスが標準以下になります。
以上がPython/SciPy で正確なピークを特定するために find_peaks 関数を効果的に利用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。