識別峰值的任務出現在各種應用中,從在傅立葉中尋找峰值變換(FFT)以從2D 陣列中提取峰值。一個常見的挑戰是區分真正的峰值和雜訊引起的波動。
與其從頭開始實現峰值查找演算法,不如考慮利用 scipy .signal.find_peaks 函數。此函數提供了根據特定條件過濾和識別峰值的選項。
要有效利用find_peaks 的強大功能,了解其參數至關重要:
在所有參數中,突出度在區分真實峰值和噪音方面最為有效。它的定義涉及達到更高峰值所需的最小垂直下降。
為了說明其實用性,請考慮受雜訊污染的變頻正弦曲線。理想的解決方案是準確識別峰值,而不會屈服於虛假噪音峰值。
以下程式碼示範如何使用具有各種參數組合的 find_peaks 函數:
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()
從結果中觀察到,使用突出度(第二個子圖中的藍線)有效地隔離了真正的峰值,而距離、寬度和閾值在存在噪聲的情況下提供了低於標準的性能。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3