Bonjour à tous,
Je continue avec mes questions autour de mon projet. J'ai besoin de réaliser une fonction qui simule des signaux que je crée artificiellement et qui présentent des pics introduit tout aussi artificiellement. Ce que je souhaite c'est déjà détecter les pics en question.
Voici d'abord le code :
Ce que je fais c'est que je crée deux signaux A50 et AL50 sur 5000 points ainsi que leur versions décimées d'un facteur 50 : A1 et AL1. Je pourrai détailler ce que j'ai écrit dans le code pour les obtenir mais le mieux est que vous exécutiez directement ce code avec les paramètres suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 function simulation(ampli_bruit,ampli_reflux,ampli_air,nbr_pic) %Cette simulation vise à simuler la détection d'un reflux dans un signal %crée artificiellement. On réalise le travail avec un signal artificiel %contenant le bruit+reflux, ainsi que bruit+reflux+sinus à 50 Hz. On les %décime ensuite pour avoir le résultat à 1Hz. A partir de là il faut %détecter le reflux et voir si on détecte le même à 1Hz ou 50Hz. %Contrôle des paramètres en entrée : ampli reflux (300),ampli air (5000) et %nbr pics (25=100/4 ie 4 sinusoides). %Contrôle de la cohérence des paramètres. if (ampli_bruit<=0) disp('entrez un ampli_bruit >0') end if (ampli_reflux<=0) disp('entrez un ampli_reflux>0)') end if(ampli_air<=0) disp('entrez un ampli_air>0') end if(nbr_pic<=0 | mod(nbr_pic,2)~=0) disp('entrez un nbr_pic>0 et qui soit modulo 2') end Bruit=ampli_bruit*rand(1,5000)'; Reflux(1:2000)=zeros(1,2000); Reflux(3001:5000)=zeros(1,2000); Sinus(1:2500)=zeros(1,2500); Sinus(2601:5000)=zeros(1,2400); for i=1:500 Reflux(2000+i)=-(ampli_reflux/500)*i; end for i=1:500 Reflux(2500+i)=Reflux(2500)+(ampli_reflux/500)*i; end for t=1:100 Sinus(2500+t)=ampli_air*sin(2*pi*(t/(100/nbr_pic))); end %Resultats à 50 Hz. A50=Bruit+Reflux'+Sinus'; AL50=Bruit+Reflux'; %Décimation : on obtient les résultats à 1Hz. A1=decimate(A50,50); AL1=decimate(AL50,50); %Visualisation des signaux créés artificiellement sur des figures figure(1) subplot(2,2,1) plot(A50) title('signal A50 : Bruit+Reflux+Sinus') xlabel('indices') ylabel('valeurs indices') hold on subplot(2,2,2) plot(A1) title('signal A1 : décimation de A50 du facteur 50') xlabel('indices') ylabel('valeurs indices') hold on subplot(2,2,3) plot(AL50) title('signal AL50 :Bruit+Reflux') xlabel('indices') ylabel('valeurs indices') hold on subplot(2,2,4) plot(AL1) title('signal AL1 :Bruit+Reflux') xlabel('indices') ylabel('valeurs indices') [ymax_A50,xmax_A50,ymin_A50,xmin_A50] = extrema(A50(2000:3000)); [ymax_A1,xmax_A1,ymin_A1,xmin_A1] = extrema(A1(40:60)); [ymax_AL50,xmax_AL50,ymin_AL50,xmin_AL50] = extrema(AL50(2000:3000)); [ymax_AL1,xmax_AL1,ymin_AL1,xmin_AL1] = extrema(AL1(40:60));
Pour ceux qui ne voudrais pas essayer, je vous donne ici la figure obtenue à partir du code en ayant exécuté cette ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part simulation(10,300,5000,4);
Voilà, donc comme vous le voyez les signaux comportent des pics : en bas il y en a deux, deux minima et en haut il y a plusieurs pics : respectivement 8 pics à gauche et 2 à droite. Bien sûr ce que j'appelle pic n'est pas forcément un pic pour matlab. Par exemple sur la figure AL50, en bas sur ce qui semble apparemment être des droites il y a des fluctuations (du bruitage). Bref, mon objectif est toutefois de détecter uniquement ce que je viens de définir comme pics. J'ai donc pensé recourir à la fonction extrema (cf mon code ci-dessus et voici le lien pour la télécharger : http://www.mathworks.com/matlabcentr...a-m-extrema2-m) appliquée aux signaux entre des bornes précises : 2000:3000 et 40:60 mais cela ne marche pas comme prévu : extrema renvoie des abscisses et ordonnées mais je ne comprends pas bien ce qu'il trouve. L'exemple le plus troublant : pour la courbe AL1 en bas à droite, il trouve xmin_AL1=11 et non pas 50 comme je m'y attendrai.
Est-ce que j'utilise donc mal cette fonction ? De plus peux-t-on faire autrement ?
Vous me direz peut-être que pour que les courbes autres que A50 en haut à gauche, je peux utiliser min et max pour obtenir les positions de ces pics. Mais comment faire pour la courbe restante qui a plusieurs minima et extrema ?
Si bien sûr j'applique extrema sur les signaux complets les pics que je recherche sont bien dans les ximin et ymin (ou xmax,ymax) relevés mais le problème reste entier car je ne vois pas comment récupérer les "vrai" pics qui m'intéressent dedans.
Partager