Frage

Ich kann etwas schreiben, mich von der Suche nach Nulldurchgängen der ersten Ableitung oder so etwas, aber es scheint wie eine Gleich genug Funktion in Standardbibliotheken enthalten sein. Jeder weiß von einem?

Meine spezielle Anwendung ist ein 2D-Array, aber in der Regel würde es für die Suche nach Spitzen in FFTs, usw. verwendet werden.

Insbesondere bei diesen Arten von Problemen, gibt es mehrere starke Spitzen, und dann viele kleinere „Spitzen“, die durch Lärm nur verursacht werden, die ignoriert werden sollen. Dies sind nur Beispiele; nicht meine aktuellen Daten:

1-dimensionale Spitzen:

 FFT-Ausgabe mit Spitzen

2-dimensionale Spitzen:

Radon-Transformation-Ausgabe mit eingekreisten peak

Der Peak-Suchalgorithmus würde die Position dieser Peaks (nicht nur ihre Werte), finden und finden würde idealerweise die wahre Inter Probe Spitze, nicht nur den Index mit Maximalwert, wahrscheinlich mit quadratische Interpolation oder so etwas.

Normalerweise interessieren Sie sich nur über ein paar starke Spitzen, so sie würden entweder ausgewählt werden, da sie über einer bestimmten Schwelle sind, oder weil sie die ersten n Spitzen einer geordneten Liste, Platz durch Amplitude.

Wie gesagt, ich weiß, wie so etwas selbst zu schreiben. Ich frage nur, wenn es eine bereits vorhandene Funktion oder Paket, das gut zu funktionieren ist bekannt.

Update:

ein MATLAB-Skript übersetzt und es funktioniert anständig für die 1-D Fall, könnte aber besser sein .

Aktualisiert Update:

erstellt eine bessere Version für den 1-D Fall.

War es hilfreich?

Lösung

Ich glaube nicht, dass das, was Sie suchen, von SciPy vorgesehen ist. Ich würde den Code selbst, in dieser Situation schreiben.

Die Spline-Interpolation und Glättung von scipy.interpolate ist recht nett und könnte in Beschlag Spitzen sehr hilfreich sein und dann den Ort ihrer maximalen finden.

Andere Tipps

Ich bin auf einem ähnlichen Problem suchen, und ich habe einige der besten Referenzen kommen aus der Chemie (von Spitzen zu finden, in Massen spec Daten) gefunden. Für eine gute gründliche Überprüfung der Spitzenfindungsalgorithmen lesen dieser . Dies ist eines der besten klarste Bewertungen von Spitzen Erkenntnis Techniken, die ich über den Weg gelaufen habe. (Wavelets sind die besten für Spitzen dieser Art in verrauschten Daten zu finden.).

Es sieht aus wie Ihre Spitzen sind klar definiert und sind in den Lärm nicht verborgen. Wenn das der Fall empfehle ich glatt savtizky-Golay-Derivaten würde die Spitzen zu finden (Wenn Sie nur die Daten unterscheiden oben Sie ein Durcheinander von Fehlalarmen haben werden.). Dies ist eine sehr effektive Technik und ist recht einfach zu implementiert (Sie tun w / Grundoperationen eine Matrix-Klasse benötigen). Wenn Sie einfach den Nulldurchgang des ersten S-G-Derivat finden Ich denke, du wirst glücklich sein.

Die Funktion scipy.signal.find_peaks , als Name schon sagt, ist nützlich für diese. Aber es ist wichtig, gut seine Parameter width zu verstehen, threshold, distance und vor allem prominence eine gute Spitzen Extraktion erhalten.

Nach meinen Tests und die Dokumentation, das Konzept der Bedeutung ist die „sinnvolles Konzept“ die guten Spitzen zu halten, und verwerfen die lauten Spitzen.

Was ist (topographische) Prominenz ? Es ist „die Mindesthöhe notwendig abzusteigen vom Gipfel zu einem höheren Gelände zu bekommen“ , da es hier zu sehen ist:

 image description hier

Die Idee ist:

  

Je höher die Prominenz, desto mehr „wichtig“ ist die Spitze.

Test:

 image description hier

Ich habe eine (laut) frequenz unterschiedliche Sinuskurve absichtlich, weil es viele Schwierigkeiten zeigt. Wir können sehen, dass der width Parameter, weil nicht sehr nützlich ist hier, wenn Sie ein Minimum width zu hoch eingestellt, dann wird es nicht in der Lage sein, sehr nahe Spitzen im Hochfrequenzteil zu verfolgen. Wenn Sie zu niedrig eingestellt width, würden Sie viele unerwünschte Spitzen im linken Teil des Signals haben. Das gleiche Problem mit distance. threshold vergleicht nur mit den direkten Nachbarn, die hier nicht sinnvoll ist. prominence ist derjenige, der die beste Lösung gibt. Beachten Sie, dass viele dieser Parameter kombinieren können!

Code:

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

Es gibt eine Funktion in scipy namens scipy.signal.find_peaks_cwt die wie klingt für Ihre Bedürfnisse geeignet ist, aber ich habe keine Erfahrung damit, so kann ich nicht empfehlen ..

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

Für diejenigen, die nicht sicher, über die Spitzenfindungsalgorithmen in Python zu verwenden, hier einen schnellen Überblick über die Alternativen: https://github.com/MonsieurV/py-findpeaks

selbst ein Äquivalent zu der MatLab findpeaks Funktion Wanting, ich habe festgestellt, dass die detect_peaks Funktion von Marcos Duarte ist ein guter Fang.

Pretty einfach zu bedienen:

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

Welche gibt Ihnen:

 detect_peaks Ergebnisse

Erkennung von Peaks in einem Spektrum in zuverlässiger Art und Weise wurde ziemlich viel studiert, zum Beispiel der ganze Arbeit auf Sinus Modellierung für Musik / Audio-Signale in den 80ern. Suchen Sie nach „Sinusförmige Modellierung“ in der Literatur.

Wenn Sie Ihre Signale so sauber wie das Beispiel sind, ein einfacher „gib mir etwas mit einer Amplitude höher als N Nachbarn“ sollte recht gut funktionieren. Wenn Sie verrauschte Signale haben, eine einfache, aber effektive Art und Weise ist Ihre Spitzen in der Zeit zu suchen, sie zu verfolgen: Sie dann Spektrallinien statt spektraler Peaks erkennen. IOW, berechnen Sie die FFT auf einem Schiebefenster des Signals, eine Reihe von Spektrum in der Zeit zu erhalten (auch als Spektrogramm). Sie sehen dann die Entwicklung der spektralen Spitze in der Zeit (das heißt in aufeinanderfolgenden Fenstern).

Es gibt Standard-Statistik-Funktionen und Methoden für Ausreißer Daten zu finden, was wahrscheinlich ist, was Sie im ersten Fall brauchen. Einsatz von Derivaten würde Ihren zweiter lösen. Ich bin für ein Verfahren nicht sicher, die sowohl kontinuierliche Funktionen und abgetasteten Daten lösen aber nicht.

Das Wichtigste zuerst, ist die Definition von „peak“ vage, wenn sie ohne weitere Angaben. Zum Beispiel für die folgende Reihe, würden Sie 5-4-5 ein Peak oder zwei nennen?

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

In diesem Fall müssen Sie mindestens zwei Schwellen benötigen: 1) eine hohe Schwelle nur über den ein Extremwert-Register als Peak; und 2) eine niedrige Schwelle, so daß extreme Werte durch kleine Werte unterhalb davon getrennt werden werden zwei Peaks.

Peak-Erkennung ist ein gut untersuchtes Thema in Extremwerttheorie Literatur, die auch als „Declustering von Extremwert“ bekannt. Seine typischen Anwendungen gehören die Identifizierung Ereignisse, die auf kontinuierlichen Messungen von Umgebungsvariablen z.B. Windgeschwindigkeit Analyse Sturmereignisse zu erfassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top