function [per,num]=determin_periode(X,Z)
% détermine la période d'un signal sinusoidal par calcul d'intégrale
%
% variables d'entrée
% X désigne le vecteur des dates régulièrement réparties du signal
% Z désigne le vecteur des images du signal s : Z=s(X).
% Il est essentiel que le signal issu de mesures a été toiletté
% préalablement sinon les calculs d'intégrales menés par exemple
% n'ont pas de sens.
%
% variable de sortie
% per est la valeur approchée de la période obtenue
% grace à la méthode retenue: voir sujet et fichier .doc.
% num désigne l'indice du vecteur X tel que X(num)-X(1)=per.
% On pourrait renvoyer comme paramètre de sortie aussi les deux
% premiers indices en lesquels Z est nul.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                     Fonctions connexes appelées
% simpson,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tests d'entrée
if nargin~=2
    error('Nombre de champs incorrect');
end
% controle des données
if size(X)~=size(Z)
    error('Champs incorrects. Voir controle des données');
end


format long e;
%


% paramètres indispensables
pas_X=X(2)-X(1);
lgr=size(X,2);

% détermination du deuxième changement de signe de Z
positifs=(Z>=0);
chgt=find(diff(positifs));

% Initialisation du cacul de l'intégrale de z=f(x)
% entre X0 et le deuxième changement de signe de Z.
% ind_deb, choisi pour disposer d'un nombre de points impairs,
% sera l'indice de début dans le calcul des intégrales suivantes.
ind_deb=chgt(2)+mod(chgt(2)+1,2);
integ0=simpson(pas_X,Z,1,ind_deb);
ind_fin=lgr-mod(lgr-ind_deb,2);
integ=integ0;

% recherche dichotomique de l'intégrale nulle
% en fin de boucle
% l'integrale entre 1 et ind_deb est d'un signe
% l'integrale entre 1 et ind_fin est de l'autre
% donc l'intégrale entre 1 et leur milieu est considérée nulle.

while (ind_fin-ind_deb>2)
    mil=(ind_deb+ind_fin)/2;
    % vérification de la conformité des indices deb et fin
    % assurant un nombre impair de points pour intégrer.
    mil=mil-mod(mil-ind_deb,2);
    integ_ajout=simpson(pas_X,Z,ind_deb,mil);
    if (integ0*(integ+integ_ajout)>=0)
        ind_deb=mil;
        integ=integ+integ_ajout;
    else
        ind_fin=mil;
    end
end

% sortie des paramètres attendus
num=(ind_deb+ind_fin)/2;
per=(num-1)*pas_X;
% on pourrait sortit un vecteur ind_zeros_Z qui contiendrait
% [chgt(1) chgt(2)].



    




        




