문제

1차 도함수 등의 제로 크로싱을 찾아서 직접 작성할 수도 있지만 표준 라이브러리에 포함될 만큼 충분히 공통적인 함수인 것 같습니다.혹시 아는 사람 있나요?

내 특정 응용 프로그램은 2D 배열이지만 일반적으로 FFT 등에서 피크를 찾는 데 사용됩니다.

특히 이러한 종류의 문제에는 여러 개의 강한 피크가 있고 무시해야 하는 노이즈로 인해 발생한 작은 "피크"가 많이 있습니다.이는 단지 예일 뿐입니다.내 실제 데이터가 아닙니다.

1차원 피크:

FFT output with peaks

2차원 피크:

Radon transform output with circled peak

피크 찾기 알고리즘은 이러한 피크의 위치(해당 값뿐만 아니라)를 찾고 이상적으로는 다음을 사용하여 최대값이 있는 인덱스뿐만 아니라 실제 샘플 간 피크를 찾습니다. 2차 보간 또는 뭔가.

일반적으로 몇 가지 강력한 피크에만 관심이 있으므로 해당 피크가 특정 임계값을 초과하거나 첫 번째 피크이기 때문에 선택됩니다. N 진폭에 따라 순위가 매겨진 정렬된 목록의 피크입니다.

말했듯이 나도 이런 글을 쓸 줄 안다.잘 작동하는 것으로 알려진 기존 기능이나 패키지가 있는지 묻고 싶습니다.

업데이트:

MATLAB 스크립트 번역 1D 사례에서는 제대로 작동하지만 더 좋을 수도 있습니다.

업데이트된 업데이트:

식스틴베 더 나은 버전을 만들었습니다 1D 사례의 경우.

도움이 되었습니까?

해결책

나는 당신이 찾고 있는 것이 SciPy에서 제공된다고 생각하지 않습니다.이 상황에서는 코드를 직접 작성하겠습니다.

scipy.interpolate의 스플라인 보간 및 스무딩은 매우 훌륭하며 피크를 맞추고 최대 위치를 찾는 데 매우 도움이 될 수 있습니다.

다른 팁

저는 비슷한 문제를 보고 있는데, 최고의 참고 자료 중 일부가 화학(질량 사양 데이터에서 피크를 찾는 것)에서 나온 것을 발견했습니다.피킹 찾기 알고리즘을 철저하게 검토하려면 다음을 읽어보세요. 이것.이것은 내가 경험한 피크 찾기 기술에 대한 가장 명확한 리뷰 중 하나입니다.(웨이블릿은 시끄러운 데이터에서 이러한 종류의 피크를 찾는 데 가장 적합합니다.)

피크가 명확하게 정의되어 있고 노이즈 속에 숨겨져 있지 않은 것 같습니다.그런 경우에는 부드러운 savtizky-golay 파생 상품을 사용하여 피크를 찾는 것이 좋습니다(위의 데이터를 미분하면 잘못된 긍정이 발생하게 됩니다.).이는 매우 효과적인 기술이며 구현하기가 매우 쉽습니다(기본 작업이 포함된 행렬 클래스가 필요함).단순히 첫 번째 S-G 파생물의 영점 교차점을 찾으면 행복할 것이라고 생각합니다.

함수 scipy.signal.find_peaks, 는 이름에서 알 수 있듯이 이에 유용합니다.하지만 그 매개변수를 잘 이해하는 것이 중요합니다. width, threshold, distance 그리고 무엇보다도 prominence 좋은 피크 추출을 얻으려면.

내 테스트와 문서에 따르면 돌기 좋은 피크를 유지하고 노이즈가 있는 피크를 폐기하는 "유용한 개념"입니다.

무엇인가요 (지형학적) 두드러짐?그것은 "정상에서 더 높은 지형으로 이동하기 위해 하강하는 데 필요한 최소 높이", 여기서 볼 수 있듯이:

enter image description here

아이디어는 다음과 같습니다.

중요도가 높을수록 피크가 더 "중요"합니다.

시험:

enter image description here

(시끄러운) 주파수 변화 정현파는 많은 어려움을 보이기 때문에 의도적으로 사용했습니다.우리는 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()

scipy에는 다음과 같은 기능이 있습니다. scipy.signal.find_peaks_cwt 귀하의 요구에 적합한 것 같지만 경험이 없으므로 추천할 수 없습니다..

http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html

Python에서 어떤 피크 찾기 알고리즘을 사용해야 할지 잘 모르는 사람들을 위해 다음 대안에 대한 간략한 개요를 제공합니다. https://github.com/MonsieurV/py-findpeaks

MatLab과 동등한 것을 원함 findpeaks 함수에서 나는 다음을 발견했습니다. detector_peaks 함수 Marcos Duarte의 말은 좋은 캐치입니다.

사용하기 매우 쉽습니다:

import numpy as np
from vector import vector, plot_peaks
from libs import detect_peaks
print('Detect peaks with minimum height and distance filters.')
indexes = detect_peaks.detect_peaks(vector, mph=7, mpd=2)
print('Peaks are: %s' % (indexes))

그러면 다음이 제공됩니다.

detect_peaks results

신뢰할 수 있는 방식으로 스펙트럼의 피크를 감지하는 방법은 꽤 많이 연구되었습니다. 예를 들어 80년대 음악/오디오 신호에 대한 정현파 모델링에 대한 모든 작업이 있었습니다.문헌에서 "정현파 모델링"을 찾아보십시오.

신호가 예제만큼 깨끗하다면 간단한 "이웃 N개보다 진폭이 높은 것을 제공하십시오"가 합리적으로 잘 작동할 것입니다.시끄러운 신호가 있는 경우 간단하지만 효과적인 방법은 시간에 맞춰 최고점을 확인하고 추적하는 것입니다.그런 다음 스펙트럼 피크 대신 스펙트럼 선을 감지합니다.IOW, 신호의 슬라이딩 윈도우에서 FFT를 계산하여 시간에 따른 스펙트럼 세트(스펙트로그램이라고도 함)를 얻습니다.그런 다음 시간에 따른 스펙트럼 피크의 진화를 살펴봅니다(예:연속된 창에서).

데이터의 이상값을 찾는 표준 통계 함수와 방법이 있는데, 이는 아마도 첫 번째 경우에 필요할 것입니다.파생 상품을 사용하면 두 번째 문제가 해결됩니다.그러나 연속 함수와 샘플링된 데이터를 모두 해결하는 방법이 확실하지 않습니다.

먼저, 추가 사양이 없으면 "피크"의 정의가 모호해집니다.예를 들어, 다음 시리즈의 경우 5-4-5를 하나의 피크라고 부르겠습니까, 아니면 두 개라고 부르겠습니까?

1-2-1-2-1-1-5-4-5-1-1-5-1

이 경우 최소 두 개의 임계값이 필요합니다.1) 극단값이 최고치로 기록될 수 있는 높은 임계값2) 낮은 임계값으로 인해 그 아래의 작은 값으로 분리된 극단값이 두 개의 피크가 됩니다.

피크 감지는 "극단값의 클러스터링"이라고도 알려진 극단값 이론 문헌에서 잘 연구된 주제입니다.일반적인 응용 분야에는 환경 변수(예: 환경 변수)의 지속적인 판독을 기반으로 위험 이벤트를 식별하는 것이 포함됩니다.폭풍 사건을 감지하기 위해 풍속을 분석합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top