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 :

[while] traitement signal par comparaison


Sujet :

Signal

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut [while] traitement signal par comparaison
    Bonjour ,

    Problème : J'ai un signal accoustique de 4999 éléments (dans exemple : voie1, 25 éléments). J'aimerais pouvoir identifier une typologie spécifique dans ce signal, une typologie longue de 600 éléments (dans l'exemple : voie_echantillon, 5 éléments). Pour ce faire je lis mon signal, dès qu'il a une valeur importante je commence la comparaison avec CORR2. Puis je continu jusqu'à la fin.
    Dans l'exemple ci dessous les valeurs inférieur à 10 sont du "bruit", je cherche donc le 1er max (88) puis je compare donc la partie de voie1 = [88 5 4 5 6] (dans exemple : voie1_calcul) avec voie_echantillon, ce qui donne une corrélation parfaite (1). Je continu ensuite à partir du 4 (index=9), et refais la même chose : trouver la 1ere valeur importante (>10) et comparer (ici je compare donc [99 5 8 5 44] avec voie_echantillon >> corrélation pas bonne). Puis je continu, etc.. sans oublier qu'il faudra arreter avant que le signal restant soit < 5 éléments (sinon pas de comparaison possible avec voie_echantillon).

    Voici le code mais il foire pas mal (ne s'arrete pas) et j'ai un peu de mal à voir l'erreur

    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
    voie_echantillon = [88 5 4 5 6] ;
    voie1 = [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 4 85 5 4 5 6]
     
    idx_1er_max = min(find(voie1>10))
     
     
    i=0;
    while idx_1er_max <= 25-5
       i = i+1 ;
        voie_calcul =  voie1(idx_1er_max:idx_1er_max+4) ;
         numel(voie_calcul);
         correl(i) = abs(corr2(voie_echantillon,voie_calcul)) 
         voie_restante = voie1(idx_1er_max+5:end) ;
         idx_1er_max = min(find(voie_restante>10))
     
     
    end
    En somme, voici le schéma que devrait faire le 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
    1-
    ------[88 5 4 5 6] -------------------------------------
    [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 4 85 5 4 5 6]
    >> ressort correl(1) = 1
     
    2-
    ---------------------[88 5 4 5 6] -----------------------
    [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 4 85 5 4 5 6]
    >> ressort correl(2) = 0.2
     
    3-
    ---------------------------------[88 5 4 5 6] -----------
    [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 4 85 5 4 5 6]
    >> ressort correl(3) = 0.09
     
    4-
    -----------------------------------------------[88 5 4 5 6] 
    [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 4 85 5 4 5 6]
    >> ressort correl(4) = 0.9
    Merci !

    EDIT : je vois un peu l'erreur car idx_1er_max n'est pas l'indice dans voie1 mais dans voie_restante... mais comment corrigé?
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Ca a l'air de marcher comme ça :

    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
    voie_echantillon = [88 5 4 5 5] ;
    voie1 = [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 45 85 5 4 5 6 54 45 58];
     
    idx_deb= min(find(voie1>10));
    idx_fin = idx_deb + 4 ;
     
    i=0 ;
    while idx_deb <= 25-5
        i=i+1;
        correl(i) = abs(corr2(voie_echantillon,voie1(idx_deb:idx_fin))) 
        idx_deb = min(find(voie1(idx_fin+1:end)>10))+idx_fin
        idx_fin = idx_deb + 4 ;
    end
     
    %vérification :
    correl
    corel1 = abs(corr2([88 5 4 5 5],[88 5 4 5 6]))
    corel2 = abs(corr2([88 5 4 5 5],[99 5 8 5 44]))
    corel3 = abs(corr2([88 5 4 5 5],[54 78 52 56 45]))
    corel4 = abs(corr2([88 5 4 5 5],[85 5 4 5 6]))
    ma retourne :

    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
    correl =
    
        0.9999
    
    
    idx_deb =
    
        11
    
    
    correl =
    
        0.9999    0.9159
    
    
    idx_deb =
    
        16
    
    
    correl =
    
        0.9999    0.9159    0.1316
    
    
    idx_deb =
    
        21
    
    
    correl =
    
        0.9999    0.9159    0.1316
    
    
    corel1 =
    
        0.9999
    
    
    corel2 =
    
        0.9159
    
    
    corel3 =
    
        0.1316
    
    
    corel4 =
    
        0.9999
    Seulement quand index_deb = 21 (en gras) , il ne me retourne pas de correl et je vois pas pourquoi?

    Merci

    EDIT :

    en et voilà
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  3. #3
    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
    Pourquoi utilises-tu min(find()) finalement (ici)

    Vu que idx_deb = 21, 21<=20 est faux donc il sort du WHILE avec le calcul.
    Il faut donc revoir ta condition.
    Règles du Forum

    Adepte de la maïeutique

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Oui j'ai changé la condition du WHILE

    Ca marche j'ai l'impression...

    merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/04/2015, 19h22
  2. Traitement fichier par while read
    Par ybebert dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 26/05/2014, 12h09
  3. Traitement fréquentiel d'un signal par intervalle
    Par bromatofiel dans le forum Signal
    Réponses: 0
    Dernier message: 11/06/2010, 20h37
  4. [Oracle 9i] Traitement SQL et comparaison de dates
    Par Requin15 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 20h38
  5. Traitement ligne par ligne sans curseur
    Par AbyssoS dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/02/2006, 17h46

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