1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur de recherche

    Informations forums :
    Inscription : octobre 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Filtre adaptatif : Algorithme LMS

    Bonjour

    j'ai un signal à filtrer que je souhaite filtrer avec un filtre adaptatif pour retirer le bruit. Mais dans un premier temps je voulais tester l’algorithme LMS avec des signaux simple, j'ai fait deux essais :

    => une constante bruité : la encore deux variante
    - une constante d'amplitude 2 volts bruité (le bruit avec un offset de 2)
    - Une constante d'amplitude 0 volt bruité (le bruit seul)
    => une sinusoïde bruité : la encore deux variante
    - une sinusoïde avec un offset de 2 volt
    - une sinusoïde centré en 0

    Dans mes essais plusieurs choses m'intrigue :
    - Quelque soit la courbe, lorsque j'ajoute un offset, j'observe une dégradation des performances. C'est à dire que le filtre n'est jamais vraiment stable et le signal utile est parfois dégradé.
    - lorsque je modifie mu, le pas d'adaptation, ceci est vraiment significatif sur les courbe qui n'ont pas d'offset. Sur les autres, ça ne le rend pas plus stable
    - Si j'augmente le nombre de coefficient du filtre, mon signal utile (ie : l'erreur, puisqu'on est dans le cas "suppression de bruit" de l'utilisation du filtre adaptatif), se dégrade.

    Et je ne comprend pas pourquoi le filtre agit de la sorte. le filtrage adaptatif de Wiener (ie l'aglo LMS entre autre), est supposé bien marcher pour des signaux stationnaire. Mais il semblerait que l'amplitude joue aussi. J'aimerais donc être sûr qu'il ne s'agit pas d'une erreur dans mon code et si ce n'est pas le cas, comprendre pourquoi l'aglo agit de la sorte ?? je vous le met à la suite :

    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
     
    N = 11;
    mu = 0.01;
    LMSFilter = dsp.LMSFilter('Method','LMS','Length',N,'StepSize',mu,'WeightsOutput','All');
     
     
    sinewave = dsp.SineWave('Frequency',1,'SampleRate',400,'SamplesPerFrame',10000);
    d = 0.4*sinewave();
    x = 0.4*randn(length(d),1);
    d = d + x;
     
    % d = zeros(1,30000);
    % d = d  + 2;
    % x = 0.1*randn(length(d),1);
    % d = d + x';
     
    % Use LMS Filter => return filtered signal, error and weights vector.
    [y,e,w] = LMSFilter(x,d);
     
    figure
    subplot(4,1,1)
    plot(d);ylabel('Noisy signal')
    subplot(4,1,2);
    plot(y);ylabel('y')
    subplot(4,1,3);
    plot(e);ylabel('e')
    subplot(4,1,4);
    plot(w(:,1));ylabel('w(:,1)')

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

    Informations forums :
    Inscription : mai 2008
    Messages : 1 723
    Points : 2 322
    Points
    2 322

    Par défaut Algorithme LMS

    Bonjour,

    Je trouve cela (as-tu essayé Kalman ?) :
    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
    N = 11;
    mu = 0.01;
    Fs=400;
    LMSFilter = dsp.LMSFilter('Length',11,'Method','Normalized LMS',...
        'AdaptInputPort', true,'StepSizeSource','Input port','WeightsOutputPort',false);
    sinewave = dsp.SineWave('Frequency',1,'SampleRate',Fs,'SamplesPerFrame',10000);
    d = 0.4*step(sinewave)
    x = 0.4*randn(length(d),1);
    d = d + x;
    % Use LMS Filter => return filtered signal, error and weights vector.
     [y,e] =step(LMSFilter, x, d, mu, N);
    figure
    subplot(4,1,1)
    plot(d);ylabel('Noisy signal')
    subplot(4,1,2);
    plot(y);ylabel('y')
    subplot(4,1,3);
    plot(e);ylabel('e')
    %subplot(4,1,4);
    %plot(w(:,1));ylabel('w(:,1)')

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur de recherche

    Informations forums :
    Inscription : octobre 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Algorithme LMS

    C'est pour ainsi c'est pareil. les "step" sont utile pour les ancienne version de Matlab. Je suis sur la 2017 donc pas de soucie. Mais merci quand même pour ta réponse

    Je pense que le filtre de Kalman sera nécessaire pour traiter le signal qui m’intéresse. Mais je voulais dans un premier temps utiliser des algo simple pour en comprendre les subtilité de fonctionnement.
    Et je pense avoir compris des choses.

    - L'amplitude va jouer sur la stabilité puisque qu'elle va tirer l'erreur vers le haut. e(k) = d(k) - x(k)*w(k). Dans l'agorithme LMS on a w(k+1) = w(k) + mu.e(k).x(k) . Donc mu*e(k) est tiré vers le haut si l'amplitude de d augmente.
    - pour la variation de mu : je prenais tout simplement un mu trop élevé. Je ne pensais pas que je devais descendre autour de 0.001 pour les signaux considérés. Du coup je n'observait pas le signal assez longtemps.
    - Pour les nombre de coefficient du filtre : dans mon exemple, qui est volontairement simple. le bruit contenue dans d et le même que celui qui entre dans le filtre. Ainsi le filtre doit s'adapter de sorte à ne rien filtrer pour directement soustraire x à d + x. Ici j'ai 11 coefficient tous à 0 au départ. Pour fonctionner, le coefficient w(1) doit tendre vers 1 et les autres vers zeros, mais ils ne valent jamais vraiment zéros et viennent donc perturber le signal idéal en sortie de filtre.

    Bref, j'y ais passé un bon moment hier et je pense avoir compris ceci correctement. Quelqu'un peu me confirmer ?

Discussions similaires

  1. [Débutant] implementer un filtre adaptatif (algorith DPCM)
    Par AM15530 dans le forum Signal
    Réponses: 1
    Dernier message: 19/10/2013, 12h56
  2. Réponses: 0
    Dernier message: 16/12/2009, 13h12
  3. algorithme d'un filtre median sous matlab
    Par salmatr dans le forum Simulink
    Réponses: 1
    Dernier message: 03/08/2009, 12h38
  4. Algorithme pour filtre
    Par dani_dan dans le forum Général Algorithmique
    Réponses: 4
    Dernier message: 29/05/2009, 19h45
  5. Algorithme d'un filtre ?
    Par Vince78 dans le forum Général Algorithmique
    Réponses: 17
    Dernier message: 04/09/2002, 16h54

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