1 function [per,num]=determin_periode(X,Z)
\r
2 % détermine la période d'un signal sinusoidal par calcul d'intégrale
\r
5 % X désigne le vecteur des dates régulièrement réparties du signal
\r
6 % Z désigne le vecteur des images du signal s : Z=s(X).
\r
7 % Il est essentiel que le signal issu de mesures a été toiletté
\r
8 % préalablement sinon les calculs d'intégrales menés par exemple
\r
11 % variable de sortie
\r
12 % per est la valeur approchée de la période obtenue
\r
13 % grace à la méthode retenue: voir sujet et fichier .doc.
\r
14 % num désigne l'indice du vecteur X tel que X(num)-X(1)=per.
\r
15 % On pourrait renvoyer comme paramètre de sortie aussi les deux
\r
16 % premiers indices en lesquels Z est nul.
\r
18 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
19 % Fonctions connexes appelées
\r
21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
24 error('Nombre de champs incorrect');
\r
26 % controle des données
\r
28 error('Champs incorrects. Voir controle des données');
\r
36 % paramètres indispensables
\r
40 % détermination du deuxième changement de signe de Z
\r
42 chgt=find(diff(positifs));
\r
44 % Initialisation du cacul de l'intégrale de z=f(x)
\r
45 % entre X0 et le deuxième changement de signe de Z.
\r
46 % ind_deb, choisi pour disposer d'un nombre de points impairs,
\r
47 % sera l'indice de début dans le calcul des intégrales suivantes.
\r
48 ind_deb=chgt(2)+mod(chgt(2)+1,2);
\r
49 integ0=simpson(pas_X,Z,1,ind_deb);
\r
50 ind_fin=lgr-mod(lgr-ind_deb,2);
\r
53 % recherche dichotomique de l'intégrale nulle
\r
55 % l'integrale entre 1 et ind_deb est d'un signe
\r
56 % l'integrale entre 1 et ind_fin est de l'autre
\r
57 % donc l'intégrale entre 1 et leur milieu est considérée nulle.
\r
59 while (ind_fin-ind_deb>2)
\r
60 mil=(ind_deb+ind_fin)/2;
\r
61 % vérification de la conformité des indices deb et fin
\r
62 % assurant un nombre impair de points pour intégrer.
\r
63 mil=mil-mod(mil-ind_deb,2);
\r
64 integ_ajout=simpson(pas_X,Z,ind_deb,mil);
\r
65 if (integ0*(integ+integ_ajout)>=0)
\r
67 integ=integ+integ_ajout;
\r
73 % sortie des paramètres attendus
\r
74 num=(ind_deb+ind_fin)/2;
\r
76 % on pourrait sortit un vecteur ind_zeros_Z qui contiendrait
\r
77 % [chgt(1) chgt(2)].
\r