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:
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()
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.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3