Comment utiliser un filtre Savitzky Golay pour trouver des maxima locaux (entre les échantillons) dans un signal 1D échantillonné discrètement?


9

J'ai un signal sismique y (i): entrez la description de l'image ici

Ici, j'ai trouvé un maximum: i = 152,54, y = 222,29 manuellement et tracé en rouge.

Je veux trouver tous les maxima automatiquement.

J'ai lu que le filtre Savitzky Golay (SGF) peut être utilisé pour trouver des estimations lissées à la fois d'un signal et de ses dérivés, et que l'un des avantages du SGF est qu'il préserve les minima et les maxima beaucoup mieux que les autres filtres. Cela sonne bien pour mon usage.

J'ai trouvé un script Matlab qui génère des coefficients SGF. Et utilisé cela pour trouver que les coefficients SGF du 4ème ordre pour la dérivée. J'ai codé un petit script Matlab qui

  1. trouve la dérivée du signal en convoluant le signal avec les coefficients SGF du 4ème ordre pour la dérivée
  2. trouve une paire d'échantillons (i, i + 1) où la dérivée change de signe
  3. trouve le passage par zéro de la dérivée par interpolation linéaire entre i et i + 1

Scénario:

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

Im mon script, j'ai dû tester si le dérivé passe de négatif à positif pour obtenir la fonction pour donner le résultat souhaité, mais cela me confond. La dérivée d'un maximum ne doit-elle pas passer du positif au négatif? Existe-t-il un meilleur moyen de distinguer les maxima des minima?

Voici le résultat de l'utilisation de cette fonction pour trouver les maxima sur mon signal: entrez la description de l'image ici

Les résultats semblent bons, mais je remarque que certains maxima ne sont pas trouvés: i = 143,13, 190,88, 256,97.

Est-ce parce qu'ils sont proches des autres maxima?

Comment contrôler les deux maxima les plus proches?

Merci d'avance pour n'importe quelle réponse!


Pouvez-vous tracer la sortie du filtre?
Jim Clay

Réponses:


5

Bien que je ne sois pas familier avec ce type de filtre spécifique, sur la base de l'intrigue que vous avez montrée, je suppose que les maxima qui ne sont pas trouvés par votre processus ne font que se heurter à la résolution temporelle inhérente au processus. Tout type de "lissage" implique qu'il y a un certain étalement local dans le temps du signal d'intérêt, de sorte que s'il y a deux pics proches, il est possible qu'ils soient fusionnés en un seul. Il est possible qu'un filtre d'ordre inférieur présente moins de ce comportement, probablement au détriment de la quantité de lissage que vous obtenez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.