The task of identifying peaks arises in various applications, ranging from finding peaks in Fourier transforms (FFTs) to extracting peaks from 2D arrays. A common challenge is to distinguish true peaks from noise-induced fluctuations.
Instead of implementing a peak-finding algorithm from scratch, consider utilizing the scipy.signal.find_peaks function. This function provides options to filter and identify peaks based on specific criteria.
To harness the power of find_peaks effectively, it's crucial to understand its parameters:
Of all the parameters, prominence stands out as the most effective in distinguishing true peaks from noise. Its definition involves the minimum vertical descent required to reach a higher peak.
To illustrate its utility, consider a frequency-varying sinusoid contaminated with noise. The ideal solution would identify the peaks accurately without succumbing to spurious noise peaks.
The following code demonstrates how to use the find_peaks function with various parameter combinations:
<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>
As observed from the results, using prominence (the blue line in the second subplot) effectively isolates the true peaks, while distance, width, and threshold offer subpar performance in the presence of noise.
The above is the detailed content of How to Effectively Utilize the find_peaks Function for Accurate Peak Identification in Python/SciPy?. For more information, please follow other related articles on the PHP Chinese website!