」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在Python/SciPy中有效利用find_peaks函數進行準確的峰值辨識?

如何在Python/SciPy中有效利用find_peaks函數進行準確的峰值辨識?

發佈於2024-11-09
瀏覽:702

How to Effectively Utilize the find_peaks Function for Accurate Peak Identification in Python/SciPy?

Python/SciPy 的尋峰演算法

問題陳述

識別峰值的任務出現在各種應用中,從在傅立葉中尋找峰值變換(FFT)以從2D 陣列中提取峰值。一個常見的挑戰是區分真正的峰值和雜訊引起的波動。

Python/SciPy 中現有的峰值查找函數

與其從頭開始實現峰值查找演算法,不如考慮利用 scipy .signal.find_peaks 函數。此函數提供了根據特定條件過濾和識別峰值的選項。

了解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()

從結果中觀察到,使用突出度(第二個子圖中的藍線)有效地隔離了真正的峰值,而距離、寬度和閾值在存在噪聲的情況下提供了低於標準的性能。

版本聲明 本文轉載於:1729588640如有侵犯,請洽[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3