Lokale Peaks zwischen den Proben finden

9

Ich habe diskrete Abtastwerte eines seismischen Signals : ny[n]Geben Sie hier die Bildbeschreibung ein

Ich möchte lokale Maxima im Signal finden.

Ein naiver Test, ob ein Maximum ist, wäre: y[n]

y[n]:maxima if y[n]>y[n1] and y[n]>y[n+1]

Die Maxima befinden sich jedoch wahrscheinlich zwischen den Proben, z. B. kann es ein Maximum bei .i=4.25

Um Maxima zwischen den Stichproben zu finden, glaube ich, dass ich interpolieren muss .y[n]

  • Wie finde ich Maxima mithilfe der Interpolation?
  • Welche Form der Interpolation soll ich verwenden?

Wie Sie sehen können, ist mein Signal nicht sehr verrauscht. Es wäre jedoch gut, wenn die Methode auch ein wenig filtern würde, damit die Maxima einen Schwellenwert überschreiten und eine bestimmte Breite haben (keine Spitzen).

Mein größtes Problem ist jedoch, nur Peaks zwischen den Proben zu finden. Irgendwelche Vorschläge für einen guten Weg, dies zu tun?

Vielen Dank im Voraus für alle Antworten!

Andy
quelle
1
Vielleicht schauen Sie sich Frage 1 und Frage 2 an .
Geerten
Verschiedene Methoden für Frequenzspektren: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
Endolith
Dieser zweite hat keine Antwort @Geerten ;-)
Ivo Flipse
1
Oh ... haha, guter Punkt. Nun, ich werde auf diese Frage in dieser Frage zurückgreifen;)
Geerten

Antworten:

7

Erhalten einer Sub-Sample-Auflösung

Eine sehr billige (in Bezug auf die Codegröße) Lösung besteht darin, Ihr Signal zu übertasten. In matlab ist dies möglich interp(y ,ratio). Eine etwas kompliziertere Lösung besteht darin, Peaks naiv zu erfassen; und für jeden Peak eine Parabel durch y [Peak - 1], y [Peak], y [Peak + 1] passen; Verwenden Sie dann den Punkt, an dem diese Parabel maximal ist, als wahre Spitzenposition.

In Bezug auf die Peakerkennung

Eine Reihe von Techniken, die helfen:

  • Wie von Hilmar vorgeschlagen, faltet das Signal durch ein Gauß- oder Hann-Fenster, dessen Breite ungefähr der Hälfte des Mindestintervalls entspricht, das Sie zwischen erkannten Peaks sehen möchten. Da die zeitliche Genauigkeit für Ihre Anwendung von wesentlicher Bedeutung ist, sollten Sie jedoch die durch die Filterung verursachte Zeitverzögerung berücksichtigen!
  • Subtrahieren Sie zu Ihrem Signal eine median gefilterte Version von sich selbst (mit einem ziemlich großen Beobachtungsfenster); und dividieren Sie das Ergebnis durch eine nach Standardabweichung gefilterte Version von sich. Dadurch werden Trends beseitigt und die Schwellenwerte können in Einheiten von Standardabweichungen ausgedrückt werden.
  • Für das Peak-Picking formuliere ich das mit einem "Top-Hat" -Filter. Definieren Sie die Top-Hat-gefilterte Version Ihres Signals als yt [n] = max (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n + W]); und verwende als Spitzen die Punkte, an denen y [n] == yt [n] und y [n]> Schwelle sind.

All dies kann in Matlab mit wenigen Durchgängen von nlfilter sehr effizient implementiert werden.

Pichenettes
quelle
Die Kombination aus Upsampling und parabolischer Interpolation funktioniert möglicherweise besser als beide allein.
hotpaw2
3

Versuchen Sie es mit einem verlustbehafteten Spitzendetektor:

y[n] = max(abs(x[n]),a*y[n-1]);

Dabei ist "a" eine Zahl kleiner als 1, die steuert, wie schnell der Detektor abfällt. Es bestimmt, wie nahe benachbarte Gipfel sein können, ohne sich in einen einzigen zu verwandeln. Führen Sie dann eine Schwellenwerterkennung durch.

Hilmar
quelle
Sie haben sowohl ax [n] als auch y [n] in Ihrer Gleichung. Ist das richtig oder sollte es nur y [n] sein?
Andy
x [n] ist die Eingabe, y [n] ist die Ausgabe. Schlechte Antwort insgesamt, es gibt einen Tippfehler (jetzt behoben) und ich habe die Frage falsch verstanden. Entschuldigung
Hilmar