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

Simulink Discussion :

echantillon d'un signal


Sujet :

Simulink

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut echantillon d'un signal
    Bonjours a tous,

    Mon problème :

    Je cherche a échantillonner le signal d'entrée (par exemple tous les 10ms avoir une matrice 1 colonne et 100 lignes) pour pouvoir par la suite lui appliquer différentes méthodes de filtrage que j'ai déjà mis au point (méthode qui marche très bien en séquencielle).

    merci d'avance,

    MarZz

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Pourrais-tu préciser ton problème? Comment souhaites-tu faire celà? Directement avec Simulink? Avec MATLAB avant de passer les données à Simulink?
    As-tu commencer à faire quelquechose, si oui quoi et quel est (sont) le(s) problème(s) que tu rencontres?

    Sinon en MATLAB regarde la fonction INTERP et pour Simulink le bloc Zero-Order Hold (dans la librairie Discrete)

    Bonne journée,
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    en fait le but final de mon projet et de faire du temps reel.

    Avec:

    En entrée : Un signal inconnu, bruité et de temps infini (temps réel)
    En sortie : Le même signal mais filtré
    Traitement : Je possède différentes méthodes de filtrages qui fonctionnent seulement sur des matrice une colonne et 300 lignes. Je ne peut donc pas faire de continue avec mes méthodes.
    Il faut donc que j'arrive à échantillonner mon signal d'entrée pour le traiter toutes les 10 ms avec mes méthodes.

    Jais déjà fait mes méthodes de filtrages en simulink (mais je en peut rien vous montrer du fait d'un problème de confidentialité)

    De plus, jais déjà vu le bloc bloqueur d'ordre zéros mais je n'obtient pas en sortie ma matrice une colonne et 300 lignes.

    Ma question est donc comment obtenir de mon signal d'entrée bruité quelconque, une matrice de une colonne et 300 lignes à traiter avec le bloqueur d'ordre zéros si vous penser que c'est la meilleur solution.

    Conclusion:
    Signal d'entrée ==> Échantillonnage ==> Matrice 1 colonne, 300 lignes.

    Merci d'avance pour votre aide

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Ma question est donc comment obtenir de mon signal d'entrée bruité quelconque, une matrice de une colonne et 300 lignes à traiter avec le bloqueur d'ordre zéros si vous penser que c'est la meilleur solution.
    Tu peux faire cela en deux temps :

    Puis:

    avec dans Command Window :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x(:,1)=tout(1:300);
    x(:,2)=simout(1:300);

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Merci de ta réponse je vais essayer cela, sachant que ton filtre discret n'est pas du tous ce que je souhaite faire. En effet a la place de celui ci je v mettre une embaded function.

    JE me met de suite au travail et je vous tien au courant de mon avancement

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    une erreur s'affiche quand que je veut rentrer la ligne suivante dans ma command window,

    x(:,1) = tout(1:300);
    Erreur :

    ??? Index exeeds matrix dimensions
    Pourtant j'ai suivit à la lettre ton shéma. De plus par la suite j'aimerais que cette opération (traiter une matrice par une matrice mon signal) se face automatiquement, que je n'est pas à passer par la command window.

    Merci d'avance

    MarZz

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    ??? Index exeeds matrix dimensions
    La dimension de tout est < 300
    Voir le temps d'exécution dans Simulation parameters

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Merci de ton aide, cela fonctionne.

    Cependant, je voudrait pour une optimisation ne pas à avoir faire la manipulation sous la comman window. Pour ainsi rendre cette opération automatique pour mon simulink.

    Es ce que celà semble réalisable ou non ?

    Merci d'avance

    MarZz

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Normalement le test d'un filtre se fait comme cela directement, et tu joues sur les paramètres pour avoir 300 échantillons :

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Merci phryte pour ton aide. Mais me voila face à mon dernier gros problème.
    En effet, à la place du filtre discret que tu a placé, je voudrait mettre mon filtre que j'ai crée avec une fonction matlab.
    Pour ce faire je me suis dis qu'avec une "Embedded MATLAB Function" je pourrait réussir.

    Voici donc mon schéma simulink :




    Et voici le code à l'intérieur de la fonction :


    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
    function signal_filtre  = Methode( signal)
    %**************************************************************************
    %                   METHODE DES MOINDRES CARRES RECURSIVE
    %
    %                                METHODE N°1
    %**************************************************************************
    X = zeros(300,3);
     
     
     
    %Définition du vecteur d'observation
    %**************************************************************************
    t    = 1:1:300;
    nb_t = length(t);
     
    %Calcul de la matrice d'observation X
    %**************************************************************************
    u  = 1:1:300;
    u  = u';
    x0 = ones(300,1);
    x1 = u;
    x2 = u.*x1;
     
    X    = [x0 x1 x2];
    teta = [0;0;0];
    P    = [1000 0 0;0 1000 0;0 0 1000];
     
    i = 1;
    while(i<301)
        x    = [x0(i);x1(i);x2(i)];
        K    = P*x*inv(1+x'*P*x);
        teta = teta+K*(signal(i)-x'*teta);
        P    = P-K*x'*P;
        i    = i+1;
    end
     
    %Calcul des valeurs du modèle
    %**************************************************************************
    signal_filtre = X*teta;
    Malheuresement une fois lancé j'ais plusieurs erreur qui s'affichent :

    Coder Error EmbeddedMATLAB Function Embedded MATLAB
    Size mismatch (size [1 x 300] ~= size [300 x 1]).Function 'Embedded MATLAB Function' (#31.597.604), line 19, column 1:"u = u'"

    Coder Error EmbeddedMATLAB Function Embedded MATLAB
    Concatenation with mismatched height or width.Function 'Embedded MATLAB Function' (#31.652.662), line 24, column 8:"[x0 x1 x2]"

    Coder Error EmbeddedMATLAB Function Embedded MATLAB
    Errors occurred during parsing of Embedded MATLAB function 'EmbeddedMATLAB Function'(#31)

    Interface Error EmbeddedMATLAB Function Embedded MATLAB
    Port width mismatch. Input port "signal"(#35) expects a scalar. The signal is a one dimensional vector with 1 elements.
    Je pense avoir compris que ce type de fonction ne me permet pas de faire toutes les opérations mathématiques que je désire. De plus l'entrée de ma fonction semble poser problème

    Ma question est donc de savoir si vous pouvais m'aider a résoudre ce problème, ou bien me conseiller une autre façon d'implémenter mon code ( méthode de filtrage) pour réussir mon simulink.

    Merci d'avance

    MarZz

  11. #11
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Ton programme est-il OK sous matlab ?
    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
    clear
    X = zeros(300,3);
    T=0.01;
    t    = 0:T:3-T;
    nb_t = length(t);
    signal=sin(2*pi*0.1.*t)+0.1*rand(1,length(t));
    u  = 1:1:300;
    u  = u';
    x0 = ones(300,1);
    x1 = u;
    x2 = u.*x1;
    X    = [x0 x1 x2];
    teta = [0;0;0];
    P    = [1000 0 0;0 1000 0;0 0 1000];
     
    i = 1;
    while(i<301)
        x    = [x0(i);x1(i);x2(i)];
        K    = P*x*inv(1+x'*P*x);
        teta = teta+K*(signal(i)-x'*teta);
        P    = P-K*x'*P;
        i    = i+1;
    end
    signal_filtre = (X*teta)';
    plot(t,signal)
    hold on
    plot(t,signal_filtre,'r')
    grid
    Puis comptes-tu passer sous simulink ?
    Filtres-tu à partir de 300 échantillons de1 à 300 puis de 2 à 301 ... ?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Mon programme marche très bien sous matlab et filtre mes signals comme je le désire.

    Pour simulink j'ai trouvé un début de réponse en n'utilisant plus "d'embeded function" mais en passant avec tous les bloc simulink ( bloc if, bloc abs, bloc max, bloc while, ...)

    Maintenant un nouveau probleme se pose a moi ( oui je c encore un ). En effet, je vient de commencer l'utilisation du bloc "While iterator subsystem".
    Seulement l'aide au niveau de ce bloc est assez difficile a comprendre. En effet, elle nous montre le simulink et la meme chose en code mais sans vrai lien pour comprendre.

    Ma nouvelle question est donc comment utiliser le bloc "While iterator subsystem" comme dans l'exemple pour faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while k < 301
         somme = somme + "l'entrée du bloc while(k)";
         k = k+1;
    end
    Mais aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while k < 301
         if "l'entrée du bloc while(k)" ~= 12;
              "La sortie du bloc while(k)" = 0;
         end
         if "l'entrée du bloc while(k)" == 12;
              "La sortie du bloc while(k)" = 12;
         end
         k = k + 1;
    end
    Merci encore de votre aide.

    PS : mon signal est traiter de 1 à 300 puis de 301 à 600 etc... pour faire du temps réel.

    Merci d'avance

    MarZz

  13. #13
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Une autre idée (à améliorer)

    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
    function signal_out  = Methode1(signal)
    global compteur compteurabs
    persistent sign signal_filtre
    if compteurabs<2
        signal_filtre=zeros(1,300);
    end
    compteurabs=compteurabs+1;
    compteur=compteur+1;
    sign(compteur)=signal;
    if compteur > 300
    X = zeros(300,3);
    t    = 1:1:300;
    nb_t = length(t);
    u  = 1:1:300;
    u  = u';
    x0 = ones(300,1);
    x1 = u;
    x2 = u.*x1;
    X    = [x0 x1 x2];
    teta = [0;0;0];
    P    = [1000 0 0;0 1000 0;0 0 1000];
    i = 1;
    while(i<301)
        x    = [x0(i);x1(i);x2(i)];
        K    = P*x*inv(1+x'*P*x);
        teta = teta+K*(sign(i)-x'*teta);
        P    = P-K*x'*P;
        i    = i+1;
    end
    compteur=0;compteurabs=compteurabs-1;
    signal_filtre = X*teta;
    dt=compteurabs-300+1:compteurabs;
    plot(dt,signal_filtre(1:300),'r','Linewidth',4)
    hold on
    plot(dt,sign(1:300),'b','Linewidth',1)
    axis([0 1800 -1.5 1.5])
    %signal_filtre=signal;
    signal_out=signal_filtre(compteur+1);
    sign=zeros(1,300);
    else
      signal_out=signal_filtre(compteur);
    end;
    en mettant à zéro "compteur" et "compteurabs" avant le run dans command window.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    je suis assez partisan de ton idée, elle a l'air pas mal sur le papier. En effet en essayent de l'implémenter sur matlab, une erreur se produit quand je lance la simu.

    erreur :

    Block error MATLAB Fcn Simulink
    Error in 'test/MATLAB Fcn'. Evaluation of expression resulted in an invalid output. Only finite double vector or matrix outputs are supported

    elle est situé au niveau du bloc "matlab function", il ne comprend pas la taille de sortie du signal. Pourtant je pense avoir tous bien réglé. Si vous avez une solution ?

    De plus continuant en parallèle avec tous les bloc simulink au lieu de programme à implémenter, je constate que les boucle while pose de réel problèmes. Donc si en plus vous auriez une idée pour répondre au post précédent que j'ais pu faire, je vous en serais très reconnaissant.

    Je continu donc sur les deux solutions pour essayer de continuer mon projet.

    Merci encore phryte pour tes idées

    Merci d'avance pour vos réponse

    MarZz

  15. #15
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    la taille de sortie du signal
    Output dimensions : 1
    Clock decimation : 1

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    ouai je me doutais que c'était ça le problème. J'ais déjà changer ces paramètre la mais cela n'a pas résolu le problème je suis toujours face à la même erreur.

    J'ais essayer d'utiliser des "embeded function", "S function", etc mais celà ne fonctionne toujours pas.

    De plus je croit qu'il y a une erreur dans ton code ( une petite ) je croit que ligne 26 c'est signal(i) à la place de sign(i). ( mais ca ne marche toujours pas :s:s

    Merci d'avance

    MarZz

  17. #17
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    ligne 26 c'est signal(i)
    Non il faut sign(i)

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    C vrai que je n'avais pas tous compris sur le code avec ce sign(i).
    Malheureusement cela ne change pas l'erreur qui c'est produite. C'est toujours la même erreur que précédemment.

    J'espère que je vais réussir à faire marcher ce petit programme un jours

    Mais bon je continu

    Merci d'avance

    MarZz

  19. #19
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    'J'espère que je vais réussir à faire marcher ce petit programme un jours
    N'oublie pas d'exécuter l'instruction "global compteur compteurabs" dans command window.

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    C'est vraie que maintenant cela fonctionne correctement. >.<

    C'est en plus une bonne technique à développer car en fait pour les 300 premier échantillons ça marche, mais une fois arrivé à 600 ça fonctionne plus. En effet on à des valeurs aberrantes au signal filtré pour un signal sur 3000 échantillons :



    J'ai cependant une petite idée mais je ne sais pas si elle me parait fonctionnelle. Il s'agirait de mettre un bloc "Tapped Delay" avec comme paramètre 300. Mais je ne sais pas si cela fonctionne( j'ai déjà quelques erreurs !!!! >.<)

    SI tu pense que c'est une bonne idée, je reste dispo jusqu'à la fin de semaine

    Mais je ne perd pas espoir

    Merci d'avance

    MarZz

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. debutante:echantilloner un signal temporel
    Par dorine.seudi dans le forum LabVIEW
    Réponses: 3
    Dernier message: 03/11/2010, 00h30
  2. Echantilloner un signal
    Par bi_turbo dans le forum MATLAB
    Réponses: 7
    Dernier message: 16/04/2008, 14h20
  3. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57
  4. Dxdiag me signale que j'ai 510M de ram
    Par Goetz dans le forum DirectX
    Réponses: 1
    Dernier message: 29/09/2003, 14h33
  5. Interception du signal SIGINT
    Par macleod dans le forum MFC
    Réponses: 2
    Dernier message: 01/07/2003, 18h39

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