• Une moyenne mobile exponentielle se calcule de la façon suivante :


    L'avantage de cette procédure est lié au fait que le calcul de la moyenne n'interrompt pas la boucle loop, le calcul se fait en continu après chaque mesure. Lorsque le terme alpha diminue, plus de points de mesure sont pris en compte dans la moyenne, mais plus on prend de points, plus grand sera le retard entre l'évolution de \scriptstyle {\bar  {x}}_{{t}} et l'évolution des données \scriptstyle x_{{t}},

    La constante de temps du système de traitement de données (le temps nécessaire pour passer de 10% à 90% du signal lors d'une variation brusque de celui-ci) est égale à la période entre les mesures divisée par alpha :

        Constante de Temps =  période échantillonnage / alpha

    Dans cet exemple, le microcontrôleur lit environ 8000 points par seconde. La période d'échantillonnage est donc de 0,125 ms et la constante de temps générée par le calcul de 125 ms.

    signal instantané en bleu et moyenne exponentielle en rouge (mesures effectuées sur une photodiode)

    int PinMesure = A0;
    float Signal;
    int DureeEntreAffichage = 500;
    long TempsAffichage;
    float alpha = 0.001;
    //-----------------------------------------------------------------------------

    void setup() {
       pinMode(PinMesure, INPUT);
       Signal = 1.0 * analogRead(PinMesure);
       Serial.begin(9600);
       TempsAffichage = millis() + DureeEntreAffichage;
    }
    //-----------------------------------------------------------------------------
    void loop() {
       Signal = alpha * analogRead(PinMesure) + (1 - alpha) * Signal;

       if (millis() > TempsAffichage) {
          Serial.print(millis() / 1000.0);
          Serial.print(" ");
          Serial.println(Signal);
          TempsAffichage = millis() + DureeEntreAffichage;
       }
    }