Функция scipy.signal.find_peaks
, как следует из названия, полезна для этого. Но важно хорошо понимать его параметры width
, threshold
, distance
и прежде всего prominence
, чтобы получить хороший пик извлечения.
Согласно моим тестам и документации, концепция проточности является «полезной концепцией» для сохранения хороших пиков и устранения шумовых пиков.
Что такое (топографическая) заметность ? Это «минимальная высота, необходимая для спуска, чтобы добраться от вершины к любой более высокой местности» , как это можно увидеть здесь:
Идея такова:
Чем выше выпуклость, тем «важнее» пик.
Тест:
Я специально использовал (шумную) изменяющую частоту синусоиду, потому что это показывает много трудностей. Мы можем видеть, что параметр width
здесь не очень полезен, потому что, если вы установите минимальный width
слишком высокий, он не сможет отслеживать очень близкие пики в высокочастотной части. Если вы установите width
слишком низко, у вас будет много нежелательных пиков в левой части сигнала. Та же проблема с distance
. threshold
сравнивается только с прямыми соседями, что здесь бесполезно. prominence
- это то, что дает лучшее решение. Обратите внимание, что вы можете комбинировать многие из этих параметров!
Код:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1) # BEST!
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4) # Required vertical distance to its direct neighbouring samples, pretty useless
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()