辨識峰值的任務出現在各種應用中,從在傅裡葉中尋找峰值變換(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>
從結果中觀察到,使用突出度(第二個子圖中的藍線)有效地隔離了真實的峰值,而距離、寬度和閾值在存在噪音的情況下提供了低於標準的性能。
以上是如何在Python/SciPy中有效利用find_peaks函數進行準確的峰值辨識?的詳細內容。更多資訊請關注PHP中文網其他相關文章!