Lissage de valeurs mesurées

PieM

Senior Member
Il arrive que l'on ait besoin de mesurer en continu une grandeur (lumière, température, distance, bruit), mais que l'on souhaite s'affranchir de brusque variations perturbatrice.
L'utilisation de temporisation ne résout pas le problème car cela ne fait que retarder le la décision liée à la mesure. En outre ceci se fait aux dépend du temps de scrutation du programme, donc apporter un manque de réactivité.

Il est possible dans ce cas d'utiliser un filtre passe bas analogique mais cette méthode manque de souplesse dans son adaptation, et engendre la perte de la valeur instantanée mesurée.

L'autre méthode est purement numérique, et ne nécessite donc aucun composant électronique.
Elle consiste à utiliser un lissage via la méthode de la moyenne glissante. Ceci nécessite toutefois un algorithme gourmand en mémoire.

Sans avoir une consommation excessive de mémoire, une autre méthode, paramétrable, peut être réalisée de la façon suivante:

Définir une variable b0 (ou w0) comme étant la valeur instantanée lue
Définir une variable w1 comme étant la moyenne en cours
Définir une variable b4 comme étant le coefficient de pondération.

la formule générale est la suivante:

valeur actuelle = (w1*b4 + b0) / (b4+1)
cette valeur actuelle devenant ensuite w1

en pratique le programme se présente de la façon suivante :

à l'initialisation:

lire b0
écrire que w1 = b0 ' initialise la moyenne avec la 1ere valeur lue.

Dans le programme principal:

dans une boucle d'échantillonnage, de fréquence à définir:

lire b0

calculer w1 = w1* b4 + b0 / (b4+1) si les parenthèses sont autorisées

sinon,calculer en trois temps

w1 = w1* b4 + b0
b0 = b4+1 (la réutilisation de b0 économisant une variable)
w1=w1/b0

Nota: en choisissant le coef = coef+1, la formule devient:

w1= b4-1*w1+b0/b4

Dans ce principe w1 contient donc la moyenne de la valeur en cours et des valeurs précédentes pondérées par un coefficient.

Selon le choix du coefficient, on voit sur le graphique que le lissage est plus ou moins importante.

la comparaison avec une vraie moyenne glissante sur 8 valeurs est visible également.

En fonction de l'utilisation, on peut comparer la valeur mesurée instantanée (b0) à la valeur W1 devenant une référence de seuil variable dans le temps.
Par exemple, détecter, malgrè les variations de luminosité lentes ( jour > nuit), le passage d'un objet devant une LDR le jour, aussi bien que l'apparition d'une lumière vive dans l'obscurité.
 

Attachments

Last edited:

bibi_49

Member
boucle d'échantillonnage, de fréquence à définir:

bonjour,

j'ai tester ce que je crois comprendre, mais quand je lance la simulation les variable n'arrettent pas de changer !
Je ne vois pas comment on peux utiliser la variable w1 qui n'arrete pas de changer ?

Qu'est ce qu'une "boucle d'échantillonnage, de fréquence à définir" ??

do
w1 = b0
readadc 0,b0
w1 = w1 * b4 + b0
b0 = b4 + 1 '(la réutilisation de b0 économisant une variable)
w1 = w1 / b0
loop
 

PieM

Senior Member
Bien relire ce que j'ai écrit:

en début de programme, dans une phase d'initialisation, il faut faire:

b4 = valeur à définir en fonction du taux de lissage souhaité.
readadc 0,b0
w1 = b0
'il faut lire la mesure b0 avant de l'affecter à w1 ! :)

ensuite dans le programme principal, il y a une boucle qui va lire les variations de b0.
C'est elle que j'appelle la boucle d'échantillonnage qui va lire la valeur de b0 a une certaine fréquence que vous choisissez. Tout dépend de ce que vous mesurez et de ce que vous voulez en faire.
(Si vous mesurez la lumière ambiante, pas besoin de lire toutes les 10 ms!)

ProgPrincipal :
do
..........
..........
gosub Lecture
if w1 ....... 'suite des instructions avec éventuellement une pause
....... car je pense que le programme consiste à faire ........ autre chose que de lire b0 !
........
........
........
loop

Lecture:
readadc 0,b0
w1 = w1 * b4 + b0
b0 = b4 + 1
w1 = w1 / b0

return
 

fuse

Senior Member
Bonjour,
L'idée vient de PieM, voici un tutoriel permettant de donner des explications sur le lissage des valeurs mesurées. J'en profite pour donner des explications sur l'utilisation du mode "Débuggage". Dossier
N'hésitez pas à faire des commentaires/remarques pour améliorer le dossier.:p

Cordialement
 
Last edited:
Top