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