Moyenne mobile exponentielle échantillonnée à des moments variables
j'ai une valeur continue pour laquelle je voudrais calculer un moyenne mobile exponentielle. Normalement, je n'utiliserais que la formule standard pour ceci:
- S n = aY + (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.
<!-Malheureusement, en raison de divers problèmes, je n'ai pas de temps d'échantillonnage constant. Je peut je sais que je peux échantillonner tout au plus, disons, une fois par milliseconde, mais en raison de facteurs hors de mon contrôle, il se peut que je ne puisse pas prélever un échantillon pendant plusieurs millisecondes à la fois. Un cas probablement plus courant, cependant, est que j'échantillonne un peu tôt ou tard: au lieu d'échantillonner à 0, 1 et 2 ms. Échantillon à 0, 0,9 et 2,1 ms. Je prévois que, indépendamment des retards, ma fréquence d'échantillonnage sera bien au-dessus de la limite de Nyquist, et donc je n'ai pas à me soucier de l'alias.je pense que Je peux y faire face d'une manière plus ou moins raisonnable en modifiant l'alpha de façon appropriée, en fonction de la période écoulée depuis le dernier échantillon.
une Partie de mon raisonnement que cela fonctionne est que l'EMA "interpole linéairement entre l'ancien point de données et l'actuelle. Si nous considérons le calcul D'un EMA de la liste suivante d'échantillons à intervalles t: [0,1,2,3,4]. On devrait avoir le même résultat si on utilise l'intervalle 2t, où les entrées deviennent [0,2,4], Non? Si L'EMA avait supposé que, à t2 la valeur avait été depuis 2 t 0, qui serait le même que le calcul de l'intervalle t calculant sur [0.2,2,4,4,4], ce qu'il ne fait pas. Ou cela fait-il sens?
quelqu'un Peut-il me dire comment faire varier l'alpha de manière appropriée? "S'il vous plaît montrer votre travail."C'est-à-dire montrez-moi le calcul qui prouve que votre méthode fait vraiment la bonne chose.
8 réponses
cette réponse est basée sur ma bonne compréhension des filtres passe-bas ("exponential moving average" est vraiment juste un filtre passe-bas à un seul pôle), mais ma compréhension floue de ce que vous cherchez. Je pense que la suivante est ce que vous voulez:
tout d'abord, vous pouvez simplifier votre équation un peu (semble plus compliqué mais il est plus facile dans le 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 faire.)
O n = aX + (1-α)Y n-1 → y n = Y n-1 + α (X-Y n-1)
les codes:
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 "égal" entre guillemets parce que cela fonctionne bien quand Δt / τ est petit par rapport à 1, et α = 1-e- ∆ T/τ ≈ ∆ T/τ. (Mais pas trop petit: vous allez rencontrer des problèmes de quantification, et à moins que vous ne recouriez à des techniques exotiques, vous avez généralement besoin D'un n bits de résolution supplémentaire dans votre variable d'état S, Où N = - log2 (α). ) Pour des valeurs plus élevées de Δt / τ, l'effet de filtrage commence à disparaître, jusqu'à ce que vous arriviez au point où α est proche de 1 et que vous assigniez simplement 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 qu'alpha est petit, sinon vous allez rencontrer des problèmes de Nyquist assez bizarres / aliasing/etc.), et si vous travaillez sur un processeur où la multiplication est moins chère que la division, ou les questions à point fixe sont importantes, précalculez ω = 1/τ, et envisagez d'essayer d'approcher la formule pour α.
Si vous voulez vraiment savoir comment obtenir la formule
α = 1-e- ∆ T/τ
alors considérer son équation différentielle source:
Y + τ dY / dt = X
qui, quand X est une fonction de pas unitaire, a la solution Y = 1-e - t / τ. Pour de petites valeurs de Δt, la dérivée peut être approchée par ΔY / Δt, donnant
Y + τ ΔY / Δt = X
ΔY / Δt = (X-Y) / τ
ΔY = (X-Y) (Δt/τ) = α (X-Y)
et l '"extrapolation" de α = 1-e- ∆ T/τ vient d'essayer de faire correspondre le comportement avec la fonction échelon unité cas.
jetez un oeil ici: http://www.eckner.com/research.html
voir la deuxième lien: "les Algorithmes"pour Inégalement Espacées à l'Époque de la Série: les Moyennes mobiles et Autres Rolling Opérateurs"
le document décrit exactement les algorithmes de programmation dont vous avez besoin, je pense.
Ce n'est pas une réponse complète, mais peut être le début d'une. C'est tout ce que j'ai obtenu en une heure ou deux de jeu; je l'affiche comme un exemple de ce que je cherche, et peut-être une source d'inspiration pour les autres qui travaillent sur le problème.
je commence avec S 0, qui est la moyenne résultant de la moyenne S-1 et l'échantillon Y 0 prise à t 0. (t1 - t 0) c'est mon intervalle d'échantillonnage et α est réglé sur ce qui est approprié pour cet intervalle d'échantillonnage et la période sur laquelle je souhaite établir la moyenne.
j'ai considéré ce qui se passe si je manque l'échantillon à t1 et au lieu de cela doivent faire avec l'échantillon Y2 prise à t2
Si nous y ajoutons maintenant la longueur de l'intervalle de temps t et supposons que juste α dépend de ce t, cette formule ressemble à ceci: S(Y, t, S0) = Y + α t(S0
supposons Maintenant que t = t12. Si la moyenne est créée en ajoutant deux valeurs de Y pour les intervalles de temps t1 et t2
S(Y, t2, S(Y, t1S0))= Y + α t21S0
si cette moyenne doit être la même que si l'intervalle t entier aurait été ajouté immédiatement, il s'ensuit que α t = α t1α t2. Une définition de α qui répond à cette exigence serait: α x := x (pour certaines constantes A) parce que: α t = t =
t12 =
t1 t2 =
α t1α t2 il en résulte la fonction de moyenne suivante: S(Y, t, S0) = Y + A t (S0
Je n'ai pas vraiment testé cela, mais si les hypothèses que j'ai faites correspondent à votre scénario cela ressemble à une fonction de moyenne qui peut gérer les variations des intervalles d'échantillonnage sont assez bonnes.
disons que nous aimerions faire une exponentielle en décomposition moyenne sur une fonction continue. Cependant, nous n'avons pas toutes les valeurs de cette fonction, seulement quelques échantillons. Cette formule ferait une moyenne pondérée des échantillons que nous avons avec les poids qu'ils auraient dans la moyenne continue.
Multiplicateur n = Alpha n - n-1
Somme n = Val n + Somme n-1*Multiplicateur n
Count n = 1) + nombre d' n-1*Multiplicateur n
Moyenne n = Somme n/Compteur n
je laisse le alpha
valeur seule, et remplir les données manquantes.
puisque vous ne savez pas ce qui se passe pendant le temps où vous ne pouvez pas échantillonner, vous pouvez remplir ces échantillons avec 0s, ou maintenir la valeur précédente stable et utiliser ces valeurs pour L'EMA. Ou une interpolation en arrière une fois que vous avez un nouvel échantillon, remplissez les valeurs manquantes, et recalculez L'EMA.
Ce que je cherche à obtenir est que vous avez une entrée x[n]
qui a des trous. Il n'y a aucun moyen d'obtenir sur le fait que tu manques des données. Ainsi, vous pouvez utiliser un zéro maintien d'ordre, ou le mettre à zéro, ou une sorte d'interpolation entre x[n]
et x[n+M]
, où M
est le nombre d'échantillons manquants et n le début de l'écart. Peut-être même en utilisant des valeurs avant n
.
Ceci est similaire à un problème sur ma todo liste. J'ai un schéma élaboré dans une certaine mesure, mais je n'ai pas encore de travail mathématique à l'appui de cette suggestion.
mise à jour & résumé: nous aimerions que le facteur de lissage (alpha) demeure indépendant du facteur de compensation (que je nomme bêta ici). La réponse excellente de Jason déjà accepté ici fonctionne très bien pour moi.
Première étape.
- si vous pouvez également mesurer le temps depuis le dernier échantillon a été pris (en multiples arrondis de votre temps d'échantillonnage constant -- donc 7,8 ms puisque le dernier échantillon serait de 8 unités), qui pourrait être utilisé pour appliquer le lissage à plusieurs reprises. Appliquer la formule 8 fois dans ce cas. Vous avez effectivement fait un lissage biaisé plus vers la valeur actuelle.
Deuxième étape.
- pour obtenir un meilleur lissage, nous devons modifier l'alpha en appliquant la formule 8 fois dans le cas précédent.
Qu'est-ce qui cette approximation de lissage Mademoiselle?
- Il a déjà manqué 7 échantillons dans l'exemple ci-dessus
- cela a été approximé à l'étape 1 avec un plat ré-application de la valeur actuelle d'une augmentation de 7 fois
- si nous définissons un facteur d'approximation beta qui sera appliqué avec alpha (comme alpha * beta au lieu de seulement alpha), nous supposerons que les 7 échantillons manqués changeaient en douceur entre la précédente et actuelle de l'échantillon des valeurs.