Lissage d'une mesure par moyenne et médiane

La courbe verte simule la mesure d'un signal d'entrée quelconque.
Le curseur "agitation" permet d'en faire varier la stabilité. Totalement à gauche, le réglage donne une courbe plate.

Les trois boutons sur la gauche permettent de démarrer ou d'arrêter (bascules) un lissage par moyenne arithmétique, par moyenne géométrique ou par la médiane.

On peut afficher ces trois lissages en même temps, ou deux à deux.

Les curseurs figurant à coté de ces boutons permettent de faire varier le nombre de mesures passées prises en compte dans le lissage.
Si le curseur est règlé totalement à gauche, il n'y a qu'une valeur passée, et donc le lissage est égal à la courbe elle-même.

Cette simulation est destinée à mieux se figurer les effets des différents paramètres au moment de développements avec une source de mesure réelle.

Dans l'animation qui illustre cette page, on a simulé ce qu'on appelle le lissage d'une mesure.

Il arrive souvent, lorsqu'on fait la mesure en continu d'une valeur en provenance d'un capteur ou d'un appareil de mesure, que les valeurs lues soient soumises à des irrégularités, à des sauts.

Ceci peut-être dû à une multitude de causes : parasitage, action sur le capteur elle-même irrégulière, capteur ou appreil de mesure de mauvaise qualité...

Dans ce cas là, et surtout si on doit se servir du signal mesuré pour d'éventuelles actions dans une programmation intervenant ensuite (ce qui est quasiment toujours le cas), il faut stabiliser les mesures, éliminer éventuellement les valeurs aberrantes, et en tout cas éliminer tous les pics.

Pour ne pas faire hurler les puristes et les spécialistes, je précise qu'il n'est pas question dans cette simple fiche de faire un exposé exhaustif sur les méthodes de filtrage. Il en existe de très nombreuses et de très complexes, et la littérature sur le sujet est colossale. Nous ferons juste ici la description d'une technique simple par calcul, que l'on utilisera le plus souvent dans les installations que nous avons à réaliser.

Sans même aller jusqu'à éliminer les valeurs aberrantes (ce qui demande un peu plus de calcul, prenant en compte les caractéristiques de dispersion de la série de mesures réalisées), on peut simplement faire ce qu'on appelle un lissage.

Le principe en est très simple : le lissage se fait dans le temps, c'est à dire que l'on stocke les valeurs prises sur un certain nombre de valeurs successives, et qu'on fabrique une valeur calculée à partir de ces valeurs successives.
Deux méthodes parmi les plus simples et les plus faciles à mettre en oeuvre sont le lissage par médiane et le lissage par moyenne.
Dans le cas d'un lissage par moyenne, on fait une moyenne arthmétique des n valeurs passées et on prend cette moyenne comme valeur de la mesure. Dans le cas d'un lissage par médiane, on prend la médiane des n valeurs passées, et on prend cette médiane comme valeur de la mesure.

La médiane est une valeur statistique qui obéit à la définition suivante : en présence d'une série de valeurs (en statistique on parle alors de population), la médiane est la valeur telle que 50 % de l'effectif de la population sont inférieurs à la médiane, et que 50 % de l'effectif de la population sont supérieurs à la médiane.

Pour ce qui est de la moyenne, on peut prendre la moyenne arithmétique, la moyenne géométrique ou la moyenne harmonique (*), mais l'expérience montre (voir l'animation dans cette page) que le résultat est sensiblement le même, aux inégalités de moyennes près, et il est donc plus facile de calculer une moyenne arithmétique simple.

Après calcul, on a donc une courbe qui est beaucoup plus stable et en général plus exploitable.

Du point de vue de l'implémentation dans le code, le lissage ne pose pas de difficulté : on utilise une liste ou un tableau selon le langage choisi, dans lequel on ajoute, à la fin, une nouvelle mesure qui vient d'être faite, et dans lequel on détruit la mesure la plus ancienne. Puis on parcourt le tableau en faisant la somme des valeurs qu'il contient et on divise cette somme par le nombre de ses éléments.
Ce qui donne en lingo un code comme le suivant si la liste qui contient les mesures successives s'appelle lstValeurs :
on lisser(nouvelleValeur)
lstValeurs.add(nouvelleValeur)
lstValeurs.deleteAt(1)

leTotal = 0
repeat with i = 1 to lstValeurs.count()
leTotal = leTotal + lstValeurs[i]
end repeat
laMoyenne = float(leTotal) / lstValeurs.count()
return laMoyenne
end

Conséquence d'un lissage : puisque la valeur retenue, et considérée comme valeur de la mesure instantanée, est en fait le résultat d'un calcul portant sur des valeurs passées, il est clair que ce lissage introduit un retard (on pourrait aussi dire un déphasage pour un signal périodique) par rapport au signal réel. Ce retard peut-être intéressant si le résultat est utilisé graphiquement car on verra alors une inertie entre l'action qu'on fait pour modifier le signal et sa traduction sur un écran par exemple, ou dans un mouvement qui serait commandé par les mesures faites.
Plus le nombre de valeurs passées pris en compte est élevé, et bien sûr plus le retard est sensible. Parallèlement, plus le nombre de valeurs passées est important et plus la courbe sera écrétée.

Il n'existe pas de valeurs de réglage idéales et universelles. Lorsqu'on est amené à introduire un lissage dans l'utilisation d'une mesure, seuls des essais avec différentes valeurs sur le montage réel et définitif permettra de déterminer quelles sont les valeurs qui satisfont le mieux pour le résultat souhaité par le concepteur.

Enfin, on peut imaginer de nombreuses techniques de calcul pour assurer le lissage ou le filtrage d'un signal. On peut aussi, si on se sent l'âme d'un bricoleur, mettre en place des filtres matériels, c'est à dire des circuits électroniques qui se chargeront d'éliminer les variations brusques indésirables. Ces problématiques de lissage / filtrage sont particulièrement importantes dans une logique d'automatisme, où le signal sera souvent l'écart entre une consigne d'un coté, et l'état d'une grandeur à réguler de l'autre. On utilise alors d'autres techniques prenant notament en compte la vitesse de variation du signal (régulation proportionnelle, intégrale et dérivée - PID) et il faudra alors faire un compromis entre la précision et la stabilité du système (pour simplifier, plus un système est stable et moins il est précis, et inversement).

Retour au sommaire

 

* Définition des moyennes :
arithmétique : tout le monde la connaît : si on a m valeurs n1, n2, n3,....nm, alors la moyenne arithmétique vaut la somme des valeurs divisée par le nombre des valeurs. Soit (n1 + n2 + n3 + ......+ nm) / m

géométrique : c'est la racine nième du produit des m valeurs : si on a m valeurs n1, n2, n3,....nm, alors la moyenne géométrique vaut

harmonique : elle peut se définir comme ceci : l'inverse de la moyenne harmonique est la moyenne artihmétique des inverses des valeurs : toujours avec n1, n2, n3,....nm, et si H est la moyenne harmonique, on a 1/H = ((1/n1) + (1/n2) + (1/n3) + ....(1/nm)) / m

On a toujours : moyenne arithmétique > moyenne géométrique > moyenne harmonique.