Go Down

Topic: code lissage (Read 1 time) previous topic - next topic

lcd1602

Nov 16, 2012, 08:00 am Last Edit: Nov 16, 2012, 08:01 am by lcd1602 Reason: 1
bonjour.
je voudrais savoir comment ce code de lissage fonctionne,
j'ai une lecture de capteur infrarouge qui est trop fluctuante,
j'aimerai la stabilisé.

Code:
[font=Verdana]void loop()
{FilteredSpeed= lpfilter(Speed*.9+(FilteredSpeed*.1), filterVal , FilteredSpeed); }

float lpfilter(float data, float filterVal, float filteredVal){

 if (filterVal > 1){
   filterVal = .99;
 }
 else if (filterVal <= 0){
   filterVal = 0;
 }

 filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);

 return filteredVal;
}
[/font]


merci de votre lecture.

al1fch

#1
Nov 16, 2012, 09:47 am Last Edit: Nov 16, 2012, 07:06 pm by al1fch Reason: 1
Bonjour
C'est un filtre passe-bas numérique du premier ordre.

La fonction lpfilter() reçoit :
data = donnée brute a filtrer
filterVal : coefficient du filtre compris entre 0 et 0.99 (peut etre vu come un %)
filterdedVAL : valeur filtrée précédente

Code: [Select]
filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);
Le calcul consiste à combiner un % de la valeur brute actuelle (instant n) avec un % de la valeur filtrée antérieure (instant n-1)
On actualise enfin la 'dernière valeur filtrée'

Avec filterVal=0,5 le filtre revient à une moyenne simple entre valeur brute actuelle et valeur filtrée précédente, c'est du 50/50


lcd1602

#3
Nov 17, 2012, 06:55 pm Last Edit: Nov 17, 2012, 06:57 pm by lcd1602 Reason: 1
bonjour.
j'ai des soucis avec la fonction  :smiley-red:
voioà coment j'ai tra
voici le bout de code:

valeur_brute = Lect_Capt_1;
}
void filtre_pass_bas(int valeur_brute){
 resultat_filtre_Prec= Lpfilter(resultat*.9+(resultat_filtre_Prec*.1),Coef_filtre ,resultat_filtre_Prec); }  je pense que c'est ici que cela ne va pas je n'ai pas vraiment de relation avec le reste

float Lpfilter(float valeur_brute, float Coef_filtre, float Valeur_Filtre_Prec){

 if (Coef_filtre > 1){
   Coef_filtre = .99;
 }
 else if (Coef_filtre <= 0){
   Coef_filtre = 0;
 }

 Valeur_Filtre_Prec = (valeur_brute * (1 - Coef_filtre)) + (Valeur_Filtre_Prec * Coef_filtre);


merci de votre aide.*

fdufnews

#4
Nov 17, 2012, 07:13 pm Last Edit: Nov 17, 2012, 09:17 pm by fdufnews Reason: 1
Code: [Select]
valeur_brute = Lect_Capt_1;
}

void filtre_pass_bas(int valeur_brute){
     resultat_filtre_Prec= Lpfilter(valeur_brute, Coef_filtre , resultat_filtre_Prec);
}

float Lpfilter(float valeur_brute, float Coef_filtre, float Valeur_Filtre_Prec){

    if (Coef_filtre > 1){
      Coef_filtre = .99;
   }
    else if (Coef_filtre <= 0){
      Coef_filtre = 0;
   }
   return (valeur_brute * (1 - Coef_filtre)) + (Valeur_Filtre_Prec * Coef_filtre);
}

lcd1602

merci pour cette correction fdufnews  :D

JD8801

Bonjour,

J'ai lu attentivement toutes ces infos;
Malgrés cela, je ne parviens pas à utgiliser le filtre passe-bas lpfilter dans mon code.

Si je lis les données X de mon entrée A0 et veut les lisser en Fx.
Que dois-je mettre dans le setup et dans le Void...




lpfilter est-il bien intégré à Arduino ou faut-il installer une librairie...

Merci d'avance pour les infos supplémentaires que vous pourriez me donner.

J


Go Up