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


Ridene

Vous avez dit que c'est un filtre passe-bas. Donc quelle est sa fréquence de coupure????

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy