Wie verwende ich einen Savitzky Golay-Filter, um lokale Maxima (zwischen den Abtastungen) in einem diskret abgetasteten 1D-Signal zu finden?


9

Ich habe ein seismisches Signal y (i): Geben Sie hier die Bildbeschreibung ein

Hier habe ich ein Maximum gefunden: i = 152,54, y = 222,29 manuell und rot dargestellt.

Ich möchte alle Maxima automatisch finden.

Ich habe gelesen, dass der Savitzky Golay Filter (SGF) verwendet werden kann, um geglättete Schätzungen sowohl eines Signals als auch seiner Ableitungen zu finden, und dass einer der Vorteile des SGF darin besteht, dass er Minima und Maxima viel besser bewahrt als andere Filter. Das klingt gut für meinen Gebrauch.

Ich habe ein Matlab-Skript gefunden, das SGF-Koeffizienten generiert. Und dies verwendet, um herauszufinden, dass die SGF-Koeffizienten 4. Ordnung für die Ableitung. Ich habe das mit einem kleinen Matlab-Skript codiert

  1. findet die Ableitung des Signals durch Falten des Signals mit den SGF-Koeffizienten 4. Ordnung für die Ableitung
  2. findet ein Stichprobenpaar (i, i + 1), bei dem die Ableitung das Vorzeichen ändert
  3. findet den Nulldurchgang der Ableitung durch lineare Interpolation zwischen i und i + 1

Skript:

function [maxX,maxY] = findLocalMax(y)
% Kernel for 4th order Savitzky-Golay filter for finding derivative:
d4 = [0.0724 -0.1195 -0.1625 -0.1061 0 0.1061 0.1625 0.1195 -0.0724];

dy = conv(y,d4,'same'); % derivative

[m n] = size(dy);
maxX = [];
maxY = [];
for i = 1 : n - 1
  if dy(i) < 0 && dy(i+1) > 0 % max somewhere between i and i+1
    a = dy(i)/(dy(i) - dy(i+1)); % linear interpolation
    mx = i + a;
    maxX = [maxX mx];
    my = y(i)*(1-a) + y(i+1)*a; % linear interpolation
    maxY = [maxY my];
  end
end

In meinem Skript musste ich testen, ob sich die Ableitung von negativ zu positiv ändert, um die Funktion zum gewünschten Ergebnis zu erhalten, was mich jedoch verwirrt. Sollte die Ableitung für ein Maximum nicht von positiv nach negativ gehen? Gibt es eine bessere Möglichkeit, zwischen Maxima und Minima zu unterscheiden?

Unten sehen Sie das Ergebnis der Verwendung dieser Funktion, um die Maxima in meinem Signal zu finden: Geben Sie hier die Bildbeschreibung ein

Die Ergebnisse sehen gut aus, aber ich stelle fest, dass einige Maxima nicht gefunden werden: i = 143,13, 190,88, 256,97.

Liegt das daran, dass sie anderen Maxima zu nahe kommen sollen?

Wie kann ich die nächsten zwei Maxima steuern?

Vielen Dank im Voraus für alle Antworten!


Können Sie die Filterausgabe zeichnen?
Jim Clay

Antworten:


5

Obwohl ich mit diesem speziellen Filtertyp nicht vertraut bin, basierend auf dem von Ihnen gezeigten Diagramm, würde ich vermuten, dass die Maxima, die von Ihrem Prozess nicht gefunden werden, nur gegen die dem Prozess inhärente Zeitauflösung stoßen. Jede Art von "Glättung" impliziert, dass das interessierende Signal zeitlich lokal verschmiert ist, so dass es möglich ist, dass zwei nahegelegene Peaks zu einem verschmelzen. Es ist möglich, dass ein Filter niedrigerer Ordnung weniger von diesem Verhalten zeigt, wahrscheinlich auf Kosten der Glättung, die Sie erhalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.