Recherche de pics locaux entre les échantillons

10

J'ai échantillons discrets d'un signal sismique : y [ n ]ny[n]entrez la description de l'image ici

Je veux trouver des maxima locaux dans le signal.

Un test naïf pour savoir si est un maximum serait: y [ n ] : m a x i m a  si  y [ n ] > y [ n - 1 ]  et  y [ n ] > y [ n + 1 ]y[n]

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

Cependant, les maxima sont probablement situés entre les échantillons, par exemple il peut y avoir un maximum à .i=4.25

Afin de trouver des maxima entre les échantillons, je pense que je dois interpoler .y[n]

  • Comment trouver des maxima en utilisant l'interpolation?
  • Quelle forme d'interpolation dois-je utiliser?

Comme vous pouvez le voir, mon signal n'est pas très bruyant, mais ce serait bien si la méthode faisait aussi un peu de filtrage pour que les maxima dépassent un seuil et aient une certaine largeur (pas de pointes).

Cependant, mon plus gros problème est juste de trouver des pics entre les échantillons. Des suggestions pour une bonne façon de procéder?

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

Andy
la source
1
Regardez peut-être la question 1 et la question 2 .
Geerten
Plusieurs méthodes pour les spectres de fréquence: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith
Ce deuxième n'a pas de réponse @Geerten ;-)
Ivo Flipse
1
Oh..haha, bon point. Eh bien, je vais revenir à cette question sur cette question;)
Geerten

Réponses:

7

Obtention d'une résolution de sous-échantillon

Une solution très bon marché (en termes de taille de code) consiste simplement à suréchantillonner votre signal. Dans matlab, cela peut être fait avec interp(y ,ratio). Une solution un peu plus compliquée consiste à détecter naïvement des pics; et pour chaque pic, ajuster une parabole à travers y [pic - 1], y [pic], y [pic + 1]; puis en utilisant le point auquel cette parabole est maximale comme position de pic réelle.

Concernant la détection des pics

Un tas de techniques qui aident:

  • Comme suggéré par Hilmar, convolution du signal par une fenêtre gaussienne ou Hann, dont la largeur est à peu près égale à la moitié de l'intervalle minimum que vous souhaitez voir entre les pics détectés. Étant donné que la précision temporelle semble essentielle à votre application, assurez-vous de prendre en compte le délai introduit par le filtrage!
  • Soustrayez à votre signal une version filtrée médiane de lui-même (avec une fenêtre d'observation assez grande); et divisez le résultat par une version filtrée de l'écart-type de lui-même. Cela supprime les tendances et permet d'exprimer les seuils en unités d'écart type.
  • Pour le pic-picking, je formule cela en utilisant un filtre "top-hat". Définissez la version filtrée haut de gamme de votre signal comme yt [n] = max (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n + W]); et utiliser comme pics les points où y [n] == yt [n] et y [n]> seuil.

Tout cela peut être implémenté très efficacement dans Matlab avec quelques passes de nlfilter.

pichenettes
la source
La combinaison d'un suréchantillonnage et d'une interpolation parabolique peut mieux fonctionner que l'une ou l'autre seule.
hotpaw2
3

Essayez un détecteur de crête avec perte:

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

où "a" est un nombre inférieur à 1 qui contrôle la vitesse de décroissance du détecteur. Il détermine à quel point les pics voisins peuvent être proches sans se fondre en un seul. Effectuez ensuite une détection de seuil.

Hilmar
la source
Vous avez à la fois ax [n] et y [n] dans votre équation. Est-ce correct ou devrait-il être juste y [n]?
Andy
x [n] est l'entrée, y [n] est la sortie. Mauvaise réponse dans l'ensemble, il y a une faute de frappe (corrigée maintenant) et j'ai mal compris la question. Excuses
Hilmar