55 votes

Moyenne mobile exponentielle échantillonnée à des temps variables

J'ai une valeur continue pour laquelle je voudrais calculer un moyenne mobile exponentielle . Normalement, j'utiliserais simplement la formule standard pour cela :

  • S n \= αY + (1-α)S n-1

où S n est la nouvelle moyenne, α est l'alpha, Y est l'échantillon, et S n-1 est la moyenne précédente.

Malheureusement, en raison de divers problèmes, je ne dispose pas d'un temps d'échantillonnage constant. Je peux savoir que je peux échantillonner au maximum, disons, une fois par milliseconde, mais en raison de facteurs hors de mon contrôle, je peux ne pas être en mesure de prendre un échantillon pendant plusieurs millisecondes à la fois. Un cas probablement plus courant, cependant, est que j'échantillonne simplement un peu en avance ou en retard : au lieu d'échantillonner à 0, 1 et 2 ms. J'échantillonne à 0, 0,9 et 2,1 ms. Je prévois que, quels que soient les retards, ma fréquence d'échantillonnage sera très, très supérieure à la limite de Nyquist, et que je n'ai donc pas à me soucier du crénelage.

Je pense que je peux traiter ce problème de manière plus ou moins raisonnable en faisant varier l'alpha de manière appropriée, en fonction du temps écoulé depuis le dernier échantillon.

Une partie de mon raisonnement pour que cela fonctionne est que l'EMA "interpole linéairement" entre le point de données précédent et le point actuel. Si nous considérons le calcul d'une EMA de la liste suivante d'échantillons à des intervalles t : [0,1,2,3,4]. Nous devrions obtenir le même résultat si nous utilisons l'intervalle 2t, où les entrées deviennent [0,2,4], n'est-ce pas ? Si l'EMA avait supposé que, à t 2 la valeur était de 2 depuis t 0 cela reviendrait à dire que le calcul de l'intervalle t calcule sur [0,2,2,4,4], ce qu'il ne fait pas. Ou est-ce que cela a un sens ?

Quelqu'un peut-il me dire comment faire varier l'alpha de manière appropriée ? "S'il vous plaît, montrez votre travail." C'est-à-dire, montrez-moi les maths qui prouvent que votre méthode fait vraiment ce qu'il faut.

55voto

Jason S Points 58434

Cette réponse est basée sur ma bonne compréhension des filtres passe-bas ("moyenne mobile exponentielle" n'est en fait qu'un filtre passe-bas unipolaire), mais ma compréhension floue de ce que vous recherchez. Je pense que ce qui suit est ce que vous voulez :

Tout d'abord, vous pouvez simplifier un peu votre équation (cela semble plus compliqué mais c'est plus facile en code). Je vais utiliser "Y" pour la sortie et "X" pour l'entrée (au lieu de S pour la sortie et Y pour l'entrée, comme vous l'avez fait).

Y n \= αX + (1-α)Y n-1 → Y n \= Y n-1 + α(X - Y n-1 )

quels codes pour :

 Y += alpha * (X-Y);

Deuxièmement, la valeur de α est ici "égale" à 1-e. -Δt/τ où Δt est le temps entre les échantillons, et τ est la constante de temps du filtre passe-bas. Je dis "égale" entre guillemets car cela fonctionne bien lorsque Δt/τ est petit par rapport à 1, et α = 1-e. -Δt/τ ≈ Δt/τ. (Mais pas trop petit : vous rencontrerez des problèmes de quantification, et à moins de recourir à des techniques exotiques, vous avez généralement besoin de N bits de résolution supplémentaires dans votre variable d'état S, où N = -log. 2 (α). ) Pour des valeurs plus grandes de Δt/τ, l'effet de filtrage commence à disparaître, jusqu'à ce que vous arriviez au point où α est proche de 1 et où vous vous contentez essentiellement d'affecter l'entrée à la sortie.

Cela devrait fonctionner correctement avec des valeurs variables de Δt (la variation de Δt n'est pas très importante tant que alpha est petit, sinon vous vous heurterez à des problèmes de Nyquist / aliasing / etc.), et si vous travaillez sur un processeur où la multiplication est moins chère que la division, ou si les problèmes de point fixe sont importants, précalculez ω = 1/τ, et envisagez d'essayer d'approcher la formule pour α.

Si vous voulez vraiment savoir comment dériver la formule

α = 1-e -Δt/τ

puis considérer son équation différentielle source :

Y + τ dY/dt = X

qui, lorsque X est une fonction à pas unitaire, a pour solution Y = 1 - e -t/τ . Pour de petites valeurs de Δt, la dérivée peut être approximée par ΔY/Δt, ce qui donne

Y + τ ΔY/Δt = X

ΔY/Δt = (X-Y)/τ

ΔY = (X-Y)(Δt/τ) = α(X-Y)

et l'"extrapolation" de α = 1-e -Δt/τ vient du fait que l'on essaie de faire correspondre le comportement avec le cas de la fonction de l'étape unitaire.

8voto

Bent Tranberg Points 121

Jetez un coup d'œil ici : http://www.eckner.com/research.html

Regardez le deuxième lien : ""Algorithmes pour les séries temporelles à espacement irrégulier : Moyennes mobiles et autres opérateurs de roulement"

Le document décrit exactement les algorithmes de programmation dont vous avez besoin, je pense.

2voto

Curt Sampson Points 10866

Ce n'est pas une réponse complète, mais c'est peut-être le début d'une réponse. Je ne suis pas allé plus loin que ça en une heure de jeu ; je le poste comme un exemple de ce que je cherche, et peut-être comme une inspiration pour d'autres personnes travaillant sur ce problème.

Je commence par S 0 qui est la moyenne résultant de la moyenne précédente S -1 et l'échantillon Y 0 prise à t 0 . (t 1 - t 0 ) est mon intervalle d'échantillonnage et α est fixé à ce qui est approprié pour cet intervalle d'échantillonnage et la période sur laquelle je souhaite faire la moyenne.

J'ai considéré ce qui se passe si je manque l'échantillon à t 1 et doivent à la place se contenter de l'échantillon Y 2 prise à t 2 ? Eh bien, nous pouvons commencer par développer l'équation pour voir ce qui se serait passé si nous avions eu Y 1 :

  • S 2 \= αY 2 + (1-α)S 1 où S 1 \= αY 1 + (1-α)S 0

Substitution :

  • S 2 \= αY 2 + (1-α)(αY 1 + (1-α)S 0 )
  • S 2 \= αY 2 + (1-α)αY 1 + (1-α)(1-α)S 0
  • S 2 \= αY 2 + (1-α)αY 1 + (1-α) 2 S 0

Je remarque que la série semble s'étendre à l'infini de cette façon, parce que nous pouvons substituer le S n dans le côté droit indéfiniment :

  • S 2 \= αY 2 + (1-α)αY 1 + (1-α) 2 (αY 0 + (1-α)S -1 )
  • S 2 \= αY 2 + (1-α)αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1
  • etc.

D'accord, ce n'est pas vraiment un polynôme (je suis bête), mais si nous multiplions le terme initial par un, nous voyons alors un modèle :

  • S 2 \= (1-α) 0 αY 2 + (1-α)αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1

Hm : c'est une série exponentielle. Quelle surprise ! Imaginez que cela sorte de l'équation d'une moyenne mobile exponentielle !

Bref, j'ai ce x 0 + x 1 + x 2 + x 3 + ... chose en cours, et je suis sûr que je suis l'odeur e ou un logarithme naturel, mais je n'arrive pas à me rappeler où je voulais en venir avant de manquer de temps.

1voto

balpha Points 18387

Toute réponse à cette question, ou toute preuve de l'exactitude d'une telle réponse, dépend fortement des données que vous mesurez.

Si vos échantillons ont été prélevés à t 0 \=0ms , t 1 \=0,9ms et t 2 \=2,1 ms, mais votre choix de α est basé sur des intervalles de 1 ms, et vous voulez donc un α ajusté localement. n la preuve de l'exactitude du choix impliquerait de connaître les valeurs de l'échantillon à t=1ms et t=2ms .

Cela conduit à la question suivante : Pouvez-vous interpoler vos données de manière raisonnable pour avoir une idée de ce que les valeurs intermédiaires auraient pu être ? Ou pouvez-vous même interpoler la moyenne elle-même ?

Si aucune de ces possibilités n'est envisageable, le choix logique d'une valeur intermédiaire Y(t) est, à mon avis, le suivant la moyenne la plus récemment calculée c'est-à-dire que Y(t) ≈ S n où n est le maximum tel que t n <t.

Ce choix a une conséquence simple : Laisser α tranquille, quel que soit le décalage horaire.

Si, en revanche, il est possible d'interpoler vos valeurs, vous obtiendrez des échantillons à intervalle constant d'une valeur moyenne. Enfin, s'il est possible d'interpoler la moyenne elle-même, cela rendrait la question sans intérêt.

1voto

yairchu Points 9694

Supposons que l'on veuille faire une moyenne exponentielle décroissante sur une fonction continue. Cependant, nous ne disposons pas de toutes les valeurs de cette fonction, seulement de quelques échantillons. Cette formule permet de faire une moyenne pondérée des échantillons dont nous disposons avec les poids qu'ils auraient dans la moyenne continue.

Multiplicateur n \= Alpha Temps n -Time n-1

Somme n \= Val n + Somme n-1 *Multiplicateur n

Comte n \= 1 + Compte n-1 *Multiplicateur n

Moy. n \= Somme n /Count n

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X