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 :

Filtrage et boucles


Sujet :

Signal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Filtrage et boucles
    Bonjour à tous,

    J'ai un soucis dans l'écriture de boucles concernant un filtre de Butterworth.

    Ce filtre s'écrit mathématiquement :

    y[n] = k ( e[0]*x[0] +...+ e[N]*x(n-N) ) - ( s[1]*y[1] +...+ s[N]*y[n-N] )
    On note qu'avec Matlab on va décaller de 1 chaque coefficient puisque les tableaux commencent à 1 dans ce logiciel.

    Je possède stockés dans des tableaux le signal non filtré x, et les coefficients e et s. N est l'ordre du filtre, et je note nb le nombre de composantes de x (et donc de y).

    Pour écrire ce calcul, j'ai traité ce sujet comme une récurrence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Initialisation
     
    for i=1:nb+1 
    y(i)=x(i)*k*e(1);
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Hérédité
    for i=1:nb+1
         for j=2:N+1
                 y(i)=y(i) + k*e(j)*x(i-j) - s(j)*y(i-j) ;
         end
    end
    Le problème c'est que dans ces boucles, en plus du fait que je ne suis pas sûr de leur validité, c'est que je ne traite pas les effets de "bords" où l'indice i-j=<0 ...

    Pourriez-vous m'aider ?

    Merci d'avance !

    Apeth

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    j'ai un doute sur ta formule, ce ne serait pas plutôt :
    y[n] = k ( e[0]*x[n] +...+ e[N]*x(n-N) ) - ( s[1]*y[n] +...+ s[N]*y[n-N] )
    Tu ne fais pas vraiment de la récurrence, je ne pense pas que tu ais besoin de l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:nb+1
         for j=2:min(N+1,i)
                 y(i)=x(i)*k*e(1) + k*e(j)*x(i-j+1) - s(j)*y(i-j+1) ;
         end
    end

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Tout à fait tu as raison sur la formule.

    Je vais regarder ce que tu me proposes de ce pas, je te remercie de ta réponse en tous cas

  4. #4
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    J'ai écrit un peu vite...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i=1:nb+1
         y(i)=x(i)*k*e(1) 
         for j=2:min(N+1,i)
                y(i)= y(i) + k*e(j)*x(i-j+1) - s(j)*y(i-j+1) ;
         end
    end
    Voilà qui est mieux!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Oui c'est une forme d'initialisation en fait ^_^

    En fait pour des besoins personnels je transcris ce code en C et ce langage ne connaît pas le "min", d'où l'utilisation d'une boucle if pour contrer les effets de bords, qu'en penses-tu ?

  6. #6
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Le min entre 2 valeurs, ça se code bien avec un if entre l'initialisation et la seconde boucle.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Et si j'écris ça comme ça, penses-tu que c'est juste ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i=1:nb+1
         y(i)=x(i)*k*e(1) 
         for j=2:min(N+1,i)
              if i>=j
                   y(i)= y(i) + k*e(j)*x(i-j+1) - s(j)*y(i-j+1) ;
             end
         end
    end

  8. #8
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Ca devrait être bon, voici une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i=1:nb+1
         y(i)=x(i)*k*e(1);
         if i>N+1
             jmax = N+1;
         else 
             jmax = i;
         end
         for j=2:jmax
                y(i)= y(i) + k*e(j)*x(i-j+1) - s(j-1)*y(i-j+1) ;%seconde coquille : il me semble qu'il y a un -1 ici
         end
    end

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

Discussions similaires

  1. [XL-2013] Boucle de filtrage sur TCD via un tableau de valeurs
    Par TheChovix dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 31/10/2014, 16h45
  2. Filtrage sur une boucle ng-repeat
    Par Daviloppeur dans le forum AngularJS
    Réponses: 2
    Dernier message: 23/10/2014, 13h00
  3. Transformer code en boucle après filtrage
    Par clickandgo dans le forum VBA Access
    Réponses: 8
    Dernier message: 26/06/2013, 00h00
  4. Probléme de filtrage dans une boucle
    Par Gad29 dans le forum Langage
    Réponses: 5
    Dernier message: 04/05/2007, 09h16
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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