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

Signal Discussion :

Intercorrelation. Zero padding. Obtenir une fenetre de plot plus grande.


Sujet :

Signal

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut Intercorrelation. Zero padding. Obtenir une fenetre de plot plus grande.
    Bonjour tout le monde,

    Comme decrit dans le titre je suis en train de faire de l'intercorrélation et tout marche plutot bien.

    J ai en réalité deux petits soucis :

    1. Je pense qu'il y a moyen de reduire le code mais je ne vois pas trop comment etant donné les 'if'.

    2. Lorsque je 'plot' mon intercorrélation finale ('Z' dans le code), il me met (logiquement) ma courbe sur 1024 points or je voudrais la voir sur 4096 points avec des zeros autour...
    Ce qui implique une intercorrelation par segments...('1-->1024' ; '1025 --> 2048' ; '2049 --> 3072' ; '3073 --> 4096').

    Voila, j aimerais savoir si quelqu'un a une idée pour avoir ma fenetre complete sur 1 plot avec mes 4096 points...et s'il y a chevauchement (exemple : de 1000 points à 1256 points) si cela pourrait se gerer facilement...

    Merci d avance pour vos reponses.

    J espere avoir ete assez clair

    Voici mon code :
    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
     
    function balayageIntercorrelation
     
    t = [0:4096]; % de 0 à 1000 points
    sig = sin(t/(2*pi)); % Original signal, a sine wave
     
    % Signal servant à l'intercorrelation (sur 1024 points obligatoirement)
    sig2 = zeros(1, 1024);
    sig2(1,1:256)= 0.000075*sig(1,1:256);
     
    % Signal à intercorreler (taille sans zero padding : 256 points obligatoirement)
    sig3 = zeros(1,4096);
    sig3(1,1100:1356)=sig(1,1100:1356);
     
    % Boucle pour le premier segment (1 --> 1024)
    % for N=1:1024:4096;
        for i=1:1024;
            if  sig3(1,i) ~= 0
                X = fft(sig2);% fft du signal de reference
                Y = fft(sig3(1:1024));% fft du signal à intercorreler
            end
        end
     
    % Boucle pour le deuxieme segment
        for i=1025:2048; 
            if  sig3(1,i) ~= 0
                X = fft(sig2);% fft du signal de reference
                Y = fft(sig3(1025:2048));% fft du signal à intercorreler
            end
        end
     
    % Boucle pour le 3e segment
        for i=2049:3072; 
            if  sig3(1,i) ~= 0
                X = fft(sig2);% fft du signal de reference
                Y = fft(sig3(2049:3072));% fft du signal à intercorreler
            end
        end
     
    % Boucle pour le 4e segment
        for i=3073:4096; 
            if  sig3(1,i) ~= 0
                X = fft(sig2); % fft du signal de reference
                Y = fft(sig3(3073:4096)); % fft du signal à intercorreler
            end
        end
     
    % Calcul de l'intercorrelation
        Z = real(ifft(conj(X).*Y));
     
     
    subplot(2,4,1), plot(sig), title('sig')
    subplot(2,4,2), plot(sig2), title('sig2')
    subplot(2,4,3), plot(sig3), title('sig3')
    subplot(2,4,7), plot(Z), title('fft')
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Pour répondre au point 1, il y a effectivement plus simple puisque tu ne dois faire ton calcul que si tu trouves au moins une valeur de sig3 différente de zéro sur le segment :
    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
    % Boucle pour le premier segment (1 --> 1024)
    if any(sig3(1:1024)~=0)
        X = fft(sig2);% fft du signal de reference
        Y = fft(sig3(1:1024));% fft du signal à intercorreler
    end
     
    % Boucle pour le deuxieme segment
    if any(sig3(1025:2048)~=0)
        X = fft(sig2);% fft du signal de reference
        Y = fft(sig3(1025:2048));% fft du signal à intercorreler
    end
     
    % Boucle pour le 3e segment
    if any(sig3(2049:3072)~=0)
        X = fft(sig2);% fft du signal de reference
        Y = fft(sig3(2049:3072));% fft du signal à intercorreler
    end
     
    % Boucle pour le 4e segment
    if any(sig3(3073:4096)~=0)
        X = fft(sig2); % fft du signal de reference
        Y = fft(sig3(3073:4096)); % fft du signal à intercorreler
    end
    Et même en fait, pour gagner encore du temps, puisque si une valeur est différente dans le dernier segment ce sont ces valeurs-là qui sont importantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if any(sig3(3073:4096)~=0)
        X = fft(sig2); % fft du signal de reference
        Y = fft(sig3(3073:4096)); % fft du signal à intercorreler
    elseif any(sig3(2049:3072)~=0)
        X = fft(sig2);% fft du signal de reference
        Y = fft(sig3(2049:3072));% fft du signal à intercorreler
    elseif any(sig3(1025:2048)~=0)
        X = fft(sig2);% fft du signal de reference
        Y = fft(sig3(1025:2048));% fft du signal à intercorreler
    elseif any(sig3(1:1024)~=0)
        X = fft(sig2);% fft du signal de reference
        Y = fft(sig3(1:1024));% fft du signal à intercorreler
    end
    En espérant avoir bien compris ton code.
    Pour le 2 aucune idée...
    Règles du Forum

    Adepte de la maïeutique

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Tres bien merci beaucoup pour cette simplification...

    Tu as bien compris ce que je voulais faire.

    Maintenant il ne me reste plus qu'à essayer de trouver le 2e point...
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Encore un petit pas en avant pour la rapidité d'exécution :
    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
    %Calcul de X
    X = fft(sig2);
    %plus grand indice pour lequel sig3 est différent de zéro
    index=max(find(sig3));
    if index>3072
        %on a un sig3 différent de zéro dans le segment 3073:4096
        Y = fft(sig3(3073:4096));
    elseif index>2048
        Y = fft(sig3(2049:3072));
    elseif index>1024
        Y = fft(sig3(1025:2048));
    else
        Y = fft(sig3(1:1024));
    end
    %Note : que se passe-t-il si sig3 est toujours égal à zéro ?
    Règles du Forum

    Adepte de la maïeutique

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    en fait sig3 ne sera jamais egal à '0'... donc pas de prise de tete...

    Merci encore pour ce gain de rapidité d'execution. Tout marche bien...
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Mouais... je verrais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [index,index]=max(sig3);
    Ou avec les dernières versions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    index=find(sig3,1,'last');
    A vérifier...
    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)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Oki merci beaucoup a vous deux...

    Mais Dut aurais tu une idée pour le 2e petit probleme??

    Merci d avance
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Comme ceci ?

    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
    function balayageIntercorrelation
     
    t = [0:4096]; % de 0 à 1000 points
    sig = sin(t/(2*pi)); % Original signal, a sine wave
     
    % Signal servant à l'intercorrelation (sur 1024 points obligatoirement)
    sig2 = zeros(1, 1024);
    sig2(1,1:256)= 0.000075*sig(1,1:256);
     
    % Signal à intercorreler (taille sans zero padding : 256 points obligatoirement)
    sig3 = zeros(1,4096);
    sig3(1,1100:1356)=sig(1,1100:1356);
     
    %Calcul de X
    X = fft(sig2);
    %plus grand indice pour lequel sig3 est différent de zéro
    index=max(find(sig3));
    % ou
    % [index]=find(sig3,1,'last');
     
    if index>3072
        idx = 3073:4096;
    elseif index>2048
        idx = 2049:3072;
    elseif index>1024
        idx = 1025:2048;
    else
        idx = 1:1024;
    end
     
    Y = fft(sig3(idx));
     
    % Calcul de l'intercorrelation
     
    Z=zeros(size(sig));
    Z(idx) = real(ifft(conj(X).*Y)); 
     
    subplot(2,4,1), plot(sig), title('sig')
    subplot(2,4,2), plot(sig2), title('sig2')
    subplot(2,4,3), plot(sig3), title('sig3')
    subplot(2,4,7), plot(Z), title('fft')
    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)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Ouiiiiiiiiiii....merci beaucoup à vous deux!!!

    Maintenant je saurai reduire mon code et en plus je gagne de la rapidité d execution !!!

    Merci encore...Ca gere!!
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Image dans une autre qui est plus grande
    Par programmeurdu37 dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 27/02/2014, 11h52
  2. Adresse d'une cellule contenant la plus grande valeur
    Par ouskel'n'or dans le forum Excel
    Réponses: 8
    Dernier message: 30/11/2012, 17h45
  3. Réponses: 4
    Dernier message: 05/11/2012, 15h09
  4. [WD14E] BUG : l'ensemble des codes d'une fenetre ne fonctionnent plus.
    Par Sergeras dans le forum WinDev
    Réponses: 3
    Dernier message: 22/08/2011, 02h49
  5. reporté une donnée dans un plus grand intervalle
    Par pesspess dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/06/2008, 17h03

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