IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

décorrélation de deux signaux


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 41
    Points : 20
    Points
    20
    Par défaut décorrélation de deux signaux
    Bonjour à tous,

    Je viens de débuter sur Matlab 7.5 (étudié en cours mais il y a quelques années) après une longue période sur Labview.

    Je veux dans un premier temps comparer deux signaux (décorrélation) dit de référence pour vérifier que le programme monté en Labview est correct. Pour cela, je fais une cartographie de ma cuve en faisant exactement la même manip deux fois.

    J'ai Xlign=16 et Ylign=16.

    Cependant, le fichier de sortie de base étant trop grand, j'ai fait un système pour me générer 1 fichier à chaque fin de ligne (en l'occurence ici X).

    Je me retrouve avec donc 16 fichiers pour la référence 1 et 16 fichiers pour la référence 2.

    Le début du programme que je dois modifier commence (on m'a passé un fichier utilisé pour un cas similaire sauf que dans celui-ci ne se pose pas la question des fichiers de sortie "découpés") comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PathName = 'D:\Philippe Di\test reference';
     
     
    [signalsReference, timebase] = ImportDataTxt_modifBenoit(...
        PathName,...
        'Correlations_9cmdeBilles_EmetteurFixe330mmBilles_Recept40positions_milieu2_REF1.txt');
    [signalsReference2, timebase] = ImportDataTxt_modifBenoit(...
        PathName,...
        'Correlations_9cmdeBilles_EmetteurFixe330mmBilles_Recept40positions_milieu2_REF2.txt');
    Ainsi, à la place de "Correlations_9cmdeBilles_EmetteurFixe330mmBilles_Recept40positions_milieu2_REF1" j'aimerai mettre "referencesignal1_0","referencesignal1_1"... jusqu'à 16.

    Faut-il faire une boucle ou juste les nommer à la suite? Comprendra-t-il que ces 16 fichiers doivent être lu à la suite?

    En vous remerciant par avance,

    Pilip

    PS : "ImportDataTxt_modifBenoit" est un fichier matlab permettant de relever ce que je souhaite dans mon fichier texte (enlever les entêtes par exemples lors des analyses...)

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Quelque chose comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PathName = 'D:\Philippe Di\test reference';
     
    for n=1:16
     
        f1 = sprintf('referencesignal1_%d',n);
        f2 = sprintf('referencesignal2_%d',n);
     
        [signalsReference, timebase] = ImportDataTxt_modifBenoit(PathName,f1);
        [signalsReference2, timebase] = ImportDataTxt_modifBenoit(PathName,f2);
     
    end
    ou si il s'agit de concaténer tous les morceaux des deux signaux :
    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
    PathName = 'D:\Philippe Di\test reference';
     
    s1 = [];
    s2 = [];
     
    for n=1:16
     
        f1 = sprintf('referencesignal1_%d',n);
        f2 = sprintf('referencesignal2_%d',n);
     
        [t1, timebase] = ImportDataTxt_modifBenoit(PathName,f1);
        [t2, timebase] = ImportDataTxt_modifBenoit(PathName,f2);
     
        s1 = [s1(:);t1(:)];
        s2 = [s2(:);t2(:)];
     
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Merci Dut d'avoir répondu si rapidement

    Je pense que je vais prendre la première méthode car en fait je dois comparer les fichiers références 1 & 2 un à un.

    A très bientôt (j'aurai sûrement d'autres questions) et merci encore,

    Pilip

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Je reviens vers vous car j'ai un soucis que je n'arrive pas à régler. Je réexplique en même temps ma manip.

    J'ai un programme "ImportDataTxt_modifBenoit" qui permet de lire et de relever les valeurs du signal obtenu et un autre programme "ComparaisonReference" qui fait appel au premier et comme son l'indique permet de faire la comparaison entre deux signaux.

    Cependant, afin d'alléger mes fichiers de sortie, j'obtiens à chaque fin de ligne 1 (x,y,z ou théta selon ce que l'on souhaite), un fichier, ce qui dans mon cas correspond à 16 fichiers (avec en-tête identique) dont chacun possèdent 16 signaux (256 signaux au total).

    A l'heure actuelle, je n'arrive à faire appel qu'un seul fichier à la fois (ce qui n'est pas un problème pour la comparaison des signaux) mais là ou le problème se pose c'est que j'aimerai pouvoir choisir directement parmis les 16 fichiers donc avoir un choix de signal=1:256 et non signal=1:16. Ceci me permettra de faire un graphe 3D avec X, Y et la valeur de la décorrélation (pour le moment in faisable car X ne varie avec un seul fichier à la fois).

    Serait-il possible de faire appel 16 fois d'affilé à ""ImportDataTxt_modifBenoit" en gardant les valeurs en mémoire pour pouvoir y faire appel en même temps lors du graphe 3D. j'ai pensé à un truc du genre : signal(fichier, numéro du signal, temps). Chaque signal correspond à 10000 points.

    Voici le programme :

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    PathName = 'D:\Benoit\tests acquisition signaux\second test';
     
    ifichier = 5;
     
    [signalReference, timebase] = ImportDataTxt_modifBenoit(PathName,['Reference1_' num2str(ifichier) '.txt']);
     
    [signalReference2, timebase] = ImportDataTxt_modifBenoit(PathName,['Reference2_' num2str(ifichier) '.txt']);
     
    [signal_2, timebase] = ImportDataTxt_modifBenoit(PathName,['Ajout 2 billes_' num2str(ifichier) '.txt']);
     
    [signal_4, timebase] = ImportDataTxt_modifBenoit(PathName,['Ajout 4 billes_' num2str(ifichier) '.txt']);
     
     
     
    %------------------------------------
    %-------------------------------------
     
     % ------------définitions Fonctions
        indexTime = @(t,timevector) find(timevector>=t,1);
        echelleMicrosec = @(timebase) timebase./1e-6;
        vecteurCoord = @ (CoordScan)(CoordScan(1).start:CoordScan(1).step:CoordScan(1).end);
        centrerSignal = @ (sRef) sRef - mean(sRef);
        %---------------------
     
    % calcule les coefficients de correlation 
    nsignaux = 16;
    coef = zeros(10 +1 ,nsignaux);
    NbSeg=12;  % nbombre de segments de signal pour le calcul du coeff 
    coefSeg=zeros(10 +1 ,nsignaux,NbSeg);
     
    for ibilles = 0:2:4;
     
        name_sigRef = 'signalReference';
        Sig_Ref = eval(name_sigRef);
     
        if ibilles == 0
            name_sigCompare = 'signalReference2';
            Sig_comparer = eval(name_sigCompare); 
     
            couleurplot = 'r';
     
        else
     
            name_sigCompare = ['signal_' num2str(ibilles)];
            Sig_comparer = eval(name_sigCompare);
            couleurplot = 'b';
        end;    
     
        nLignesY = 16;
        nLignesX = 1;
     
     
     
         t0= 0; %µs
         t1= 1500; %µs
     
         i0 = indexTime(t0, echelleMicrosec(timebase));
         i1 = indexTime(t1, echelleMicrosec(timebase));
         lsig=i1-i0+1;
         lseg=floor(lsig/NbSeg);
     
     
     
        for iSignal = 1:nsignaux;
            %iSignal = 1;
     
            %--------------------------
            s_Ref = Sig_Ref(iSignal,:);
            s_Ref = centrerSignal(s_Ref);
     
            s_comparer = Sig_comparer(iSignal,:);
            s_comparer = centrerSignal(s_comparer);
     
            s_Ref = s_Ref( i0 :i1  );
            s_comparer = s_comparer( i0 :i1  );
            %------------------------------------
     
            time = echelleMicrosec(timebase(i0:i1));
     
            coef_correl = corrcoef(s_Ref', s_comparer');
     
            coef(ibilles + 1, iSignal) = coef_correl(2,1);
            for ns=1:NbSeg
                coef_correl = corrcoef(s_Ref((ns-1)*lseg+1:ns*lseg)',...
                    s_comparer((ns-1)*lseg+1:ns*lseg)');
                coefSeg(ibilles + 1, iSignal,ns)=coef_correl(2,1);
            end
     
        end;
     
    end;
     
    decorel = (1-coef)*100;
     
    %---------Affichage-----------------------
     
    %------------ exemple de signaux
    iSignal = 3;
    ibilles = 4;
    numerosignal = 1*iSignal + (ifichier - 1)*16;
     
    h1=figure(1);
    set(h1,'name','Signal')
     
    name_sigRef = 'signalReference';
        Sig_Ref = eval(name_sigRef);
     
    s_Ref = Sig_Ref(iSignal,:);
    s_Ref = centrerSignal(s_Ref);
     
     
    name_sigCompare = ['signal_' num2str(ibilles)];
         Sig_comparer = eval(name_sigCompare);
     
     s_comparer = Sig_comparer(iSignal,:);
     s_comparer = centrerSignal(s_comparer);
     
            s_Ref = s_Ref( i0 :i1  );
            s_comparer = s_comparer( i0 :i1  );
     
    plot(time, s_Ref );
    hold on; 
    plot(time,s_comparer ,'g');
    title(['Ref et Ref + ' num2str(ibilles) ' billes ajoutées. Position du récepteur : ' num2str(numerosignal) '. coef correlation : ' num2str(coef(ibilles+1,iSignal ))]);
     
    axis([300 1500 -1 1]);
     
    xlabel('Time(\mus)');
    ylabel('Amplitude (V)');
     
    %-----------------------------------------------------------
    h2=figure(2); axes;
    set(h2,'name','Decorrelation fct(pos)')
    xlabel('Positions du récepteur');
        ylabel('Décorrelation (%)');
        title('Décorrelations - ajout progressif de 2 et 4 billes');      
        hold on;
     
    for ibilles = 0:2:4;
     
        if ibilles == 0 % milieu de référence        
            couleurplot = 'r';       
     
        else
            couleurplot = 'b';
        end;
        plot(decorel(ibilles +1,: ),couleurplot);axis([1 16 0 100]);
        hold on;
     
        pause(1);
     
    end;
     
    %----------------------------------------------------
    %h3=figure(3); axes;
    %set(h3,'name','decorrelation 3D')
    %for ibilles = 0:2:4;
        %xpositions = zeros(1,16);
        %ypositions = 0:2:30;
        %zdecorrel = reshape(decorel(ibilles +1,:),nLignesY, nLignesX);
        %surf(xpositions+8.5, ypositions+8.5, zdecorrel); set(gca,'ydir','normal');colorbar;
        %set(gca,'clim',[0 40],'zlim',[0 40],'xtick',[ 0:10: 50]);
        %set(gca,'xlim',[0 50],'ylim',[0 50]);
        %axis('square');
     
     
        %if ibilles == 0;
        % position du Capteur source   
     
        %xCaptSource = 33;
       % yCaptSource = 33;
        %hold on; stem3( xCaptSource , yCaptSource , 40,'o');
     
        % position des billes
       % xbilles =16.5;
       % ybilles = 50 - 12;
        %hold on; stem3( xCaptSource , yCaptSource , 40,'o');set(gco,'markersize',18);
     
        %hold on; stem3( xbilles , ybilles , 40 ,'*r');set(gco,'markersize',18);
     
        %xlabel('x (cm)');
        %  ylabel('y (cm)');
        %zlabel('Décorrelation (%)');
        %title('Décorrelations - ajout progressif de 2 et 4 billes');      
        %hold on;
     
       % end;
     
      %  pause(1);
    %end;
    J'ai essayé avec une boucle for en début mais au final, il ne fait appel qu'à un fichier à la fois donc un X(1x1).

    Le voici :
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    PathName = 'D:\Benoit\tests acquisition signaux\second test';
     
    %------------------------------------
    %-------------------------------------
    nligne=16;
    for lign=1:nligne
        fich=['Reference1_',num2str(lign-1),'.txt']
        [signalReference, timebase] = ImportDataTxt_modifBenoit(PathName,fich);
        fich2=['Reference2_',num2str(lign-1),'.txt']
        [signalReference2, timebase] = ImportDataTxt_modifBenoit(PathName,fich2);
        fich3=['Ajout 2 billes_',num2str(lign-1),'.txt']
        [signal_2, timebase] = ImportDataTxt_modifBenoit(PathName,fich3);
        fich4=['Ajout 4 billes_',num2str(lign-1),'.txt']
        [signal_4, timebase] = ImportDataTxt_modifBenoit(PathName,fich4);
    end;
     
     % ------------définitions Fonctions
        indexTime = @(t,timevector) find(timevector>=t,1);
        echelleMicrosec = @(timebase) timebase./1e-6;
        vecteurCoord = @ (CoordScan)(CoordScan(1).start:CoordScan(1).step:CoordScan(1).end);
        centrerSignal = @ (sRef) sRef - mean(sRef);
        %---------------------
     
    % calcule les coefficients de correlation 
    nsignaux = 16;
    coef = zeros(10 +1 ,nsignaux);
    NbSeg=12;  % nbombre de segments de signal pour le calcul du coeff 
    coefSeg=zeros(10 +1 ,nsignaux,NbSeg);
     
    for ibilles = 0:2:4;
     
        name_sigRef = 'signalReference';
        Sig_Ref = eval(name_sigRef);
     
        if ibilles == 0
            name_sigCompare = 'signalReference2';
            Sig_comparer = eval(name_sigCompare);       
            couleurplot = 'r';
     
        else
     
            name_sigCompare = ['signal_' num2str(ibilles)];
            Sig_comparer = eval(name_sigCompare);
            couleurplot = 'b';
        end;    
     
        nLignesX = 16;
        nLignesY = 16;
     
     
         t0= 400; %µs
         t1= 1500; %µs
     
         i0 = indexTime(t0, echelleMicrosec(timebase));
         i1 = indexTime(t1, echelleMicrosec(timebase));
         lsig=i1-i0+1;
         lseg=floor(lsig/NbSeg);
     
     
     
        for iSignal = 1:nsignaux;
            %iSignal = 1;
     
            %--------------------------
            s_Ref = Sig_Ref(iSignal,:);
            s_Ref = centrerSignal(s_Ref);
     
            s_comparer = Sig_comparer(iSignal,:);
            s_comparer = centrerSignal(s_comparer);
     
            s_Ref = s_Ref( i0 :i1  );
            s_comparer = s_comparer( i0 :i1  );
            %------------------------------------
     
            time = echelleMicrosec(timebase(i0:i1));
     
            coef_correl = corrcoef(s_Ref', s_comparer');
     
            coef(ibilles + 1, iSignal) = coef_correl(2,1);
            for ns=1:NbSeg
                coef_correl = corrcoef(s_Ref((ns-1)*lseg+1:ns*lseg)',...
                    s_comparer((ns-1)*lseg+1:ns*lseg)');
                coefSeg(ibilles + 1, iSignal,ns)=coef_correl(2,1);
     
            end
     
        end;
     
    end;
     
    decorel = (1-coef)*100;
     
    %---------Affichage-----------------------
     
    %------------ exemple de signaux
    iSignal = 8;
    ibilles = 2;
     
    h1=figure(1);
    set(h1,'name','Signal')
     
    name_sigRef = 'signalReference';
        Sig_Ref = eval(name_sigRef);
     
    s_Ref = Sig_Ref(iSignal,:);
    s_Ref = centrerSignal(s_Ref);
     
    name_sigCompare = ['signal_' num2str(ibilles)];
         Sig_comparer = eval(name_sigCompare);
     
     s_comparer = Sig_comparer(iSignal,:);
     s_comparer = centrerSignal(s_comparer);
     
            s_Ref = s_Ref( i0 :i1  );
            s_comparer = s_comparer( i0 :i1  );
     
    plot(time, s_Ref );
    hold on; 
    plot(time,s_comparer ,'r');
    title(['Ref et Ref + ' num2str(ibilles) ' billes ajoutées. Position ' num2str(iSignal) '. coef correlation : ' num2str(coef(ibilles+1,iSignal ))]);
     
    axis([600 1000 -0.5 0.5]);
     
    xlabel('Time(\mus)');
    ylabel('Amplitude (V)');
     
    %-----------------------------------------------------------
    h2=figure(2); axes;
    set(h2,'name','Decorrelation fct(pos)')
    xlabel('Positions du récepteur');
        ylabel('Décorrelation (%)');
        title('Décorrelations - ajout progressif de 2 et 4 billes');      
        hold on;
     
    for ibilles = 0:2:4;
     
        if ibilles == 0 % milieu de référence        
            couleurplot = 'r';       
     
        else
            couleurplot = 'b';
        end;
        plot(decorel(ibilles +1,: ),couleurplot);axis([1 16 0 160]);
        hold on;
     
        pause(1);
     
    end;
    Il est fort possible que tout ne soit pas très compréhensible, n'hésitez pas à me demander plus de détails.

    Je vous remercie par avance de votre aide,

    Cordialement,

    Pilip

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Commençons pas nettoyer le premier code.
    • Tu peux (et tu dois) te passer de EVAL en stockant les données dans des tableaux de cellules.
    • Il n'y a pas de point-virgule à la fin des instruction FOR et END
    • Evite d'écrire plusieurs instructions à la suite sur une même ligne. Cela nuit à la lisibilité du code


    Voici le code après un premier nettoyage :
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    PathName = 'D:\Benoit\tests acquisition signaux\second test';
     
    ifichier = 5;
     
    [signalReference{1}, timebase] = ImportDataTxt_modifBenoit(PathName,['Reference1_' num2str(ifichier) '.txt']);
     
    [signalReference{2}, timebase] = ImportDataTxt_modifBenoit(PathName,['Reference2_' num2str(ifichier) '.txt']);
     
    [signal{2}, timebase] = ImportDataTxt_modifBenoit(PathName,['Ajout 2 billes_' num2str(ifichier) '.txt']);
     
    [signal{4}, timebase] = ImportDataTxt_modifBenoit(PathName,['Ajout 4 billes_' num2str(ifichier) '.txt']);
     
     
    %------------------------------------
    %-------------------------------------
     
    % ------------définitions Fonctions
    indexTime = @(t,timevector) find(timevector>=t,1);
    echelleMicrosec = @(timebase) timebase./1e-6;
    vecteurCoord = @ (CoordScan)(CoordScan(1).start:CoordScan(1).step:CoordScan(1).end);
    centrerSignal = @ (sRef) sRef - mean(sRef);
    %---------------------
     
    % calcule les coefficients de correlation
    nsignaux = 16;
    coef = zeros(10 +1 ,nsignaux);
    NbSeg=12;  % nbombre de segments de signal pour le calcul du coeff
    coefSeg=zeros(10 +1 ,nsignaux,NbSeg);
     
    for ibilles = 0:2:4
     
        Sig_Ref = signalReference{1};
     
        if ibilles == 0
     
            Sig_comparer = signalReference{2};
            couleurplot = 'r';
     
        else
     
            Sig_comparer = signal{billes};
            couleurplot = 'b';
     
        end
     
        nLignesY = 16;
        nLignesX = 1;
     
        t0= 0; %µs
        t1= 1500; %µs
     
        i0 = indexTime(t0, echelleMicrosec(timebase));
        i1 = indexTime(t1, echelleMicrosec(timebase));
        lsig=i1-i0+1;
        lseg=floor(lsig/NbSeg);
     
        for iSignal = 1:nsignaux
     
            %--------------------------
            s_Ref = Sig_Ref(iSignal,:);
            s_Ref = centrerSignal(s_Ref);
     
            s_comparer = Sig_comparer(iSignal,:);
            s_comparer = centrerSignal(s_comparer);
     
            s_Ref = s_Ref( i0 :i1  );
            s_comparer = s_comparer( i0 :i1  );
            %------------------------------------
     
            time = echelleMicrosec(timebase(i0:i1));
     
            coef_correl = corrcoef(s_Ref', s_comparer');
     
            coef(ibilles + 1, iSignal) = coef_correl(2,1);
            for ns=1:NbSeg
                coef_correl = corrcoef(s_Ref((ns-1)*lseg+1:ns*lseg)',...
                    s_comparer((ns-1)*lseg+1:ns*lseg)');
                coefSeg(ibilles + 1, iSignal,ns)=coef_correl(2,1);
            end
     
        end
     
    end
     
    decorel = (1-coef)*100;
     
    %---------Affichage-----------------------
     
    %------------ exemple de signaux
    iSignal = 3;
    ibilles = 4;
    numerosignal = 1*iSignal + (ifichier - 1)*16;
     
    h1=figure(1);
    set(h1,'name','Signal')
     
    Sig_Ref = signalReference{1};
     
    s_Ref = Sig_Ref(iSignal,:);
    s_Ref = centrerSignal(s_Ref);
     
    Sig_comparer = signal{ibilles};
     
    s_comparer = Sig_comparer(iSignal,:);
    s_comparer = centrerSignal(s_comparer);
     
    s_Ref = s_Ref( i0 :i1  );
    s_comparer = s_comparer( i0 :i1  );
     
    plot(time, s_Ref );
    hold on;
    plot(time,s_comparer ,'g');
     
    title(['Ref et Ref + ' num2str(ibilles) ' billes ajoutées. Position du récepteur : ' num2str(numerosignal) '. coef correlation : ' num2str(coef(ibilles+1,iSignal ))]);
     
    axis([300 1500 -1 1]);
     
    xlabel('Time(\mus)');
    ylabel('Amplitude (V)');
     
    %-----------------------------------------------------------
    h2=figure(2); axes;
    set(h2,'name','Decorrelation fct(pos)')
    xlabel('Positions du récepteur');
    ylabel('Décorrelation (%)');
    title('Décorrelations - ajout progressif de 2 et 4 billes');
    hold on;
     
    for ibilles = 0:2:4
     
        if ibilles == 0 % milieu de référence
            couleurplot = 'r';
        else
            couleurplot = 'b';
        end
        plot(decorel(ibilles +1,: ),couleurplot);
        axis([1 16 0 100]);
     
        pause(1);
     
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Merci DUT pour ton aide.

    Je vais regarder ce que tu m'as indiqué et je reviendrai vers toi en cas de soucis.

    A très bientôt,

    Pilip

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Re,

    Je viens de regarder et d'analyser ce que tu m'as transmis.

    J'ai vu, comme tu l'a mentionné, que "eval" a été supprimé ce qui permet d'alléger le programme mais quelle en est la réelle utilité de s'en passer? Est-ce-que la manière dont tu as transformé l'écriture permet de stocker les données dans des tableaux de cellules?

    A partir de ce stockage de données crois-tu qu'il serait possible d'y stocker ceux des autres fichiers afin de faire un graph 3D (partie "h3" du programme).

    J'avais l'idée en fait de faire une variable du genre "S(X,Y,temps)" qui serait donc une matrice 3 colonne et non 2, est-ce faisable avec le stockage de donnés de tout mes fichiers?

    En te remerciant par avance,

    Pilip

    PS : je continue à chercher et si je trouve quelque chose je te tiens au courant

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Bonjour à tous,

    Désolé de revenir vers vous mais n'y aurait-il pas quelqu'un qui pourrait m'aider car je bloque sur mon problème.

    Je n'arrive pas à rassembler mes 16 fichiers en un seul lors de la lecture du programme et donc pouvoir choisir entre 256 signaux et non 16 seulement et ainsi dessiner mon graph de décorrélation en 3D avec les 256 signaux.

    Si quelqu'un à une idée, je suis preneur

    Cordialement,

    Pilip

Discussions similaires

  1. comparer deux signaux
    Par kadjuv dans le forum Signal
    Réponses: 7
    Dernier message: 15/12/2009, 16h50
  2. Corrélation de deux signaux sons
    Par paissad dans le forum LabVIEW
    Réponses: 0
    Dernier message: 01/12/2008, 16h29
  3. Réponses: 2
    Dernier message: 10/07/2008, 11h26
  4. Multiplication de deux signaux
    Par Neocid dans le forum Signal
    Réponses: 10
    Dernier message: 03/03/2008, 11h52
  5. Réponses: 10
    Dernier message: 19/06/2007, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo