Calcul précis de la dérivée d'une fonction pour trouver des pics
Bonjour,
J'ouvre ce sujet qui est en fait un complément de mon autre sujet : lien où j'essaye de détecter les extremums d'une fonction entre deux bornes. Le problème qui se pose est le calcul de la dérivée de la fonction ou tout au moins d'une différence. Voici d'abord un code à copier/coller pour obtenir le graph :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| function test
A1=[23.588
29.936
27.605
26.785
24.608
27.746
25.733
26.833
28.643
28.529
26.804
26.709
24.703
24.939
32.869
28.473
28.091
27.063
26.669
32.049
28.024
28.912
30.956
24.751
26.907
29.645
27.981
32.656
30.61
25.18
29.272
25.97
28.047
27.803
24.802
25.902
29.432
26.64
28.933
20.475
-44.146
-112.87
-183.31
-253.61
-319.41
-394.98
-460.09
-528.45
-601.48
-505.61
-605.73
-683.95
-463.52
-388.24
-325.31
-250.72
-181.37
-111.72
-45.026
20.974
30.05
28.257
27.35
25.883
26.945
23.549
26.536
28.269
25.945
23.717
32.259
30.745
26.194
26.054
27.38
31.165
29.668
26.674
27.556
24.05
25.536
28.851
26.579
30.121
28.352
30.414
29.367
25.492
25.602
26.171
26.842
25.852
27.751
29.553
31.293
25.307
30.274
27.687
24.156
24.295];
figure(1)
plot(A1)
title('signal A50 : Bruit+Reflux+Sinus')
xlabel('indices')
ylabel('valeurs indices') |
Comme vous allez le voir ce qui m'intéresse c'est uniquement les pics entre les indices 40 et 60 et plus précisément le maximum (qui est atteint en l'indice 50) et le minimum (en l'indice 52). Enfin si j'arrive déjà à détecter les pics il me suffira de conserver le plus grand maximum et le plus petit minimum.
En parcourant le forum j'ai essayé la solution de Dut (ici), récapitulée dans cette seconde fonction :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| function test2
y=[23.588
29.936
27.605
26.785
24.608
27.746
25.733
26.833
28.643
28.529
26.804
26.709
24.703
24.939
32.869
28.473
28.091
27.063
26.669
32.049
28.024
28.912
30.956
24.751
26.907
29.645
27.981
32.656
30.61
25.18
29.272
25.97
28.047
27.803
24.802
25.902
29.432
26.64
28.933
20.475
-44.146
-112.87
-183.31
-253.61
-319.41
-394.98
-460.09
-528.45
-601.48
-505.61
-605.73
-683.95
-463.52
-388.24
-325.31
-250.72
-181.37
-111.72
-45.026
20.974
30.05
28.257
27.35
25.883
26.945
23.549
26.536
28.269
25.945
23.717
32.259
30.745
26.194
26.054
27.38
31.165
29.668
26.674
27.556
24.05
25.536
28.851
26.579
30.121
28.352
30.414
29.367
25.492
25.602
26.171
26.842
25.852
27.751
29.553
31.293
25.307
30.274
27.687
24.156
24.295];
x=1:size(y,1);
sa=sign(diff([-inf y']));
sb=sign(diff([-inf y(end:-1:1)']));
sb=sb(end:-1:1);
idx=(sa==1 & sb==1);
figure
plot(x,y,'b-',x(idx),y(idx),'r*') |
Vous pouvez tester mais sinon voici le résultat :
http://i1240.photobucket.com/albums/...ps63353d42.png
Malheureusement entre 40 et 60 les deux minimum ne sont pas détectés, seulement le maximum ! Comment faire pour avoir tous les extremas entre ces deux bornes seulement ?
EDIT
Cette autre variante, toujours de Dut semble en fait fonctionner miraculeusement :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| function test2
y=[23.588
29.936
27.605
26.785
24.608
27.746
25.733
26.833
28.643
28.529
26.804
26.709
24.703
24.939
32.869
28.473
28.091
27.063
26.669
32.049
28.024
28.912
30.956
24.751
26.907
29.645
27.981
32.656
30.61
25.18
29.272
25.97
28.047
27.803
24.802
25.902
29.432
26.64
28.933
20.475
-44.146
-112.87
-183.31
-253.61
-319.41
-394.98
-460.09
-528.45
-601.48
-505.61
-605.73
-683.95
-463.52
-388.24
-325.31
-250.72
-181.37
-111.72
-45.026
20.974
30.05
28.257
27.35
25.883
26.945
23.549
26.536
28.269
25.945
23.717
32.259
30.745
26.194
26.054
27.38
31.165
29.668
26.674
27.556
24.05
25.536
28.851
26.579
30.121
28.352
30.414
29.367
25.492
25.602
26.171
26.842
25.852
27.751
29.553
31.293
25.307
30.274
27.687
24.156
24.295];
figure
plot(y)
s=sign(diff([+inf y' +inf]));
idx=(s(2:end).*s(1:end-1))==-1;
hold on
plot(find(idx),y(idx),'ro') |
http://i1240.photobucket.com/albums/...ps4be2f501.jpg
Cependant je voudrais faire fonctionner ceci seulement entre les bornes 40 et 60.