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 :

Daq toolbox : Analyse temps réel avec recouvrement.


Sujet :

Signal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Daq toolbox : Analyse temps réel avec recouvrement.
    Bonjour à tous,

    J'ai créé un model simulink qui permet l'acquisition de ma carte son en temps réel avec un recouvrement important et une analyse -également en temps réel- est effectuer et tout ça marche parfaitement bien !

    Je cherche de l'aide car je tente d'appliquer ce fonctionnement sous matlab et me retrouve bloqué à cause de l'analyse temps réel ! Quel est le moyen de créer un recouvrement ('buffer') et d'analyser chaque trame alors que l'acquisition continue...?!

    Voici mon code jusqu'à présent :

    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
    AI = analoginput('winsound');
    chan = addchannel(AI,1);
    chans = addchannel(AI,2);
     
     
    Fech = 8000;	% frequence d'echantillonnage
    d = 20;		% paramètre pour le fenêtrage
    l = 1.5;	% paramètre pour le fenêtrage
    set(AI,'SampleRate',Fech);
    Fe = get(AI,'SampleRate');
    set(AI,'TriggerRepeat',inf);
     
    start(AI);
     
    AI1=getdata(AI,l*Fe*(d-1),'double');
    AI2=AI1(:,2);	%Seule la channel 2 m'intéresse
     
    %--------------------
    % buffering          |
    AIbuff = buffer(AI2,l*d*Fe,l*Fe*(d-1));
    S'en suit plusieurs analyses...

    J'espère avoir été assez clair et reste disponible pour toute question supplémentaire.

    Aurèle.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je reviens sur ce post espérant pouvoir trouver une réponse de votre part...ou quelque chose pour m'orienter dans ma recherche...

    Merci d'avance...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Essai 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
     
    AI.SamplesPerTrigger = l*Fe*(d-1);   
    set(AI,'TriggerRepeat',inf);
     
    start(AI);
    tic
    while(1)
        while(toc<l*(d-1))   % Attente afin d'avoir une trame
        end     
        tic
     
        AI1=getdata(AI,l*Fe*(d-1),'double');
        AI2=AI1(:,2);	%Seule la channel 2 m'intéresse
        % buffering          
        AIbuff = buffer(AI2,l*d*Fe,l*Fe*(d-1));
    end
    Dernière modification par Invité ; 14/07/2010 à 13h58.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Merci pour cette proposition, créer une boucle est la solution...cependant, je n'arrive pas à obtenir ce que je souhaite, problème de calcul à priori...

    Petite question car je n'ai pas parfaitement assimilé un point de la daq : différence entre peekdata et getdata ... le premier semble être plus approprié vu que je tiens à faire mes calculs sur la dernière portion enregistrer alors que getdata récupère toujours la portion la plus ancienne enregistrer, ai-je bien compris...??!

    Merci bien...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je n'arrive pas à obtenir ce que je souhaite, problème de calcul à priori...
    Pourrai-tu préciser ce que tu obtiens dans ce cas?

    Tu as bien compris la différence entre peekdata et getdata, mais je dirai que dans ton cas, il vaut mieux utiliser getdata, car tu risques d'obtenir des discontinuités sinon.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Pourrai-tu préciser ce que tu obtiens dans ce cas?
    Je cherche à obtenir une variation de fréquence ; je l'obtiens mais que par morceaux discontinus et que ce soit avec getdata ou bien peekdata...!

    J'imaginais que la solution puisse se trouver dans mes calculs (que je ne peux afficher) mais
    ton cas, il vaut mieux utiliser getdata, car tu risques d'obtenir des discontinuités sinon.
    du coup je me pose des questions...!!

    Merci encore...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Si tu fais:
    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
    i = 0;Y = zeros(l*Fe*(d-1)*10,1);
    start(AI);
    pause(l*(d-1))
    tic
    while(i<10)
        while(toc<l*(d-1))
        end
        tic
        disp(i)
        AI1 = getdata(AI,l*Fe*(d-1),'double');
        Y(l*Fe*(d-1)*i+1:l*Fe*(d-1)*(i+1),1:2) = AI1;
        AI2=AI1(:,2);	%Seule la channel 2 m'intéresse
        % buffering
        AIbuff = buffer(AI2,l*d*Fe,l*Fe*(d-1));
        i=i+1;
    end
    stop(AI)
    sound(Y,Fech)
    Est-ce que tu obtiens quelque chose de bien?

    Je cherche à obtenir une variation de fréquence
    Je n'ai pas trop compris

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Normal que tu ne comprenne pas trop mais pour confidentialité je ne peux vraiment pas rentrer dans les détails du calcul...

    Pour en revenir à ce que tu viens de me proposer, je n'obtiens pas quelque chose de bien ... je n'ai aucun son en retour...!

    Quoiqu'il en soit mon problème ne m'a pas l'air de se trouver ici mais plutot lors de la "bufferisation"... je continu à étudier le soucis et je te tiens au courant...!

    Merci...

  9. #9
    Invité
    Invité(e)
    Par défaut
    je n'ai aucun son en retour...!
    As-tu bien fait la configuration de ta carte son?
    Que retourne

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Alors alors...petit récapitulatif :

    - Déjà au niveau de la config. de ma carte son, cela me semble correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out = daqhwinfo('winsound')
    me retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    out = 
     
               AdaptorDllName: [1x69 char]
            AdaptorDllVersion: '2.14 (R2009a)'
                  AdaptorName: 'winsound'
                   BoardNames: {'Microphone (High Definition Aud'  [1x31 char]}
            InstalledBoardIds: {'0'  '1'}
        ObjectConstructorName: {2x3 cell}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    out.ObjectConstructorName(:)
     
    ans = 
     
        'analoginput('winsound',0)'
        'analoginput('winsound',1)'
        'analogoutput('winsound',0)'
        'analogoutput('winsound',1)'
        ''
        ''
    - Au niveau de code :

    J'essai de m'inspirer de l'exemple 3 de (Example 3: Continuous buffering) mais je n'y arrive pas...

    j'obtiens quelque chose qui ressemble à ce que j'attend mais j'ai toujours des discontinuités aberrantes que je ne peux expliquer...!

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    J'ai fait une gourde que je ne faisais pas au début : je suis contrains de "addchannel(1:2);" et puis de supprimer la channel numéro 1...!

    Je vais donc reprendre ce que tu m'avais proposé...

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Conclusion : fonctionnement impec' !
    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
    ai = analoginput('winsound');
        addchannel(ai,1:2);
     
        % TEST 3
        Fe = 8000;
        d = 20;
        l = 1.5;
        set(ai,'samplespertrigger',inf);
        set(ai,'samplerate',Fe); Fe = get(ai,'samplerate');
     
        i = 0;Y = zeros(l*Fe*(d-1)*10,1);
        start(ai);
        pause(l*(d-1))
        tic
        while(i<10)
            while(toc<l*(d-1))
            end
            tic
            disp(i)
            ai1 = getdata(ai,l*Fe*(d-1),'double');
            Y(l*Fe*(d-1)*i+1:l*Fe*(d-1)*(i+1),1:2) = ai1;
    %         AI2=AI1(:,2);	%Seule la channel 2 m'intéresse
            i=i+1;
        end
        stop(ai)
        sound(Y,Fe)

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bon, je te remercie d'avoir insisté sur la partie configuration, j'aurai pu chercher longtemps !!

    je récupère donc correctement ce que j'attend et effectue mes calculs selon mes besoins...MAIS :

    je souhaite créer un buffer pour avoir un recouvrement et donc une meilleure précision ... saurais-tu m'indiquer car pour l'instant ce n'est pas concluant !

    -> En reprenant ton exemple :
    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
    i = 0;Y = zeros(l*Fe*(d-1)*10,1);
    start(AI);
    pause(l*(d-1))
    tic
    while(i<10)
        while(toc<l*(d-1))
        end
        tic
        disp(i)
        AI1 = getdata(AI,l*Fe*(d-1),'double');
        Y(l*Fe*(d-1)*i+1:l*Fe*(d-1)*(i+1),1:2) = AI1;
        AI2=AI1(:,2);	%Seule la channel 2 m'intéresse
        % buffering
        AIbuff = buffer(AI2,l*d*Fe,l*Fe*(d-1));
        i=i+1;
    end
    stop(AI)
    sound(Y,Fech)
    Saurais-tu le bufferiser puis le restituer...?

    Merci graaaannnnndeeeemmmeennntt...!!

  14. #14
    Invité
    Invité(e)
    Par défaut
    Quel pourcentage de recouvrement souhaites-tu avoir?

    Je ne pense pas que la fonction buffer soit adaptée dans ton cas, elle nécessite que tu aies déjà le signal entier, or tu fais l'acquisition trame par trame.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    C'est là que mon "l" et "d" rentres vraiment en jeu... :

    Mon l correspond à mon décalage entre deux tranches (1,5 sec) et mon d à un coefficient de recouvrement (20)...

    Ce qui nous donne un recouvrement très important !!

    Une tranche correspond à : l*d*Fe = 1.5*20*Fe;

    Le décalage entre deux tranches à : l*Fe = 1.5*Fe;

    Le recouvrement est donc de : l*Fe*(d-1) = 1.5*Fe*(19);

    Merci encore et toujours...!!

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Sans doute à tu supprimé ton dernier message étant donné que je ne le vois pas affiché sur le forum ! Quoiqu'il en soit je le repost car c'est tout à fait la bonne solution... J'obtiens exactement ce que je veux et t'en suis très reconnaissant...!!

    Merci encore...

    ________________________________________________________________

    Bonjour,

    Je pense dans ce cas qu'à chaque itération, tu devrais recueillir le décalage entre deux tranches l*Fe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AI1 = getdata(AI,l*Fe,'double');
    Tu ajouteras alors ce nouveau segment à l'ancien en enlevant le plus ancien segment de même taille.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 55
    Points : 44
    Points
    44
    Par défaut
    salut
    je voudrais savoir si tu as résolu ton problème pour le recouvrement parce que je suis dans le meme cas que toi ...
    sur ce poste : http://www.developpez.net/forums/d99...l/#post5592580

    merci par avance

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

Discussions similaires

  1. Tracer Temps Réel avec la Data Acquisition Toolbox
    Par Dizayeure dans le forum MATLAB
    Réponses: 0
    Dernier message: 26/04/2008, 14h50
  2. Réponses: 2
    Dernier message: 26/08/2007, 12h22
  3. Déplacer des objets en temps réel avec la souris.
    Par johnnyjohnny dans le forum MATLAB
    Réponses: 4
    Dernier message: 03/07/2007, 14h54
  4. [Temps Réel] avec du C++ ?
    Par poukill dans le forum C++
    Réponses: 35
    Dernier message: 26/02/2007, 08h22
  5. Informatique temps réel avec VxWorks
    Par Mastero dans le forum C++
    Réponses: 3
    Dernier message: 02/09/2005, 22h08

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