J'ai un signal sismique y (i):
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
- trouve la dérivée du signal en convoluant le signal avec les coefficients SGF du 4ème ordre pour la dérivée
- trouve une paire d'échantillons (i, i + 1) où la dérivée change de signe
- 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:
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!