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

Patricia Arquette
發布: 2024-10-22 19:26:34
原創
159 人瀏覽過

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 函數:

<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中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!