Friday, 6 January 2017

Moving Average Implementation Matlab

J'ai essentiellement un tableau de valeurs comme ceci: Le tableau ci-dessus est simplifié, Im collectionner 1 valeur par milliseconde dans mon code réel et j'ai besoin de traiter la sortie sur un algorithme que j'ai écrit pour trouver le pic le plus proche avant un point dans le temps. Ma logique échoue parce que dans mon exemple ci-dessus, 0.36 est le vrai pic, mais mon algorithme regarderait en arrière et verrait le tout dernier nombre 0.25 comme le pic, car il y a une diminution à 0.24 avant lui. L'objectif est de prendre ces valeurs et de leur appliquer un algorithme qui les lisse un peu pour que je possède des valeurs plus linéaires. (C.-à-d.: Id comme mes résultats à curvy, pas jaggedy) On m'a dit d'appliquer un filtre exponentiel de moyenne mobile à mes valeurs. Comment puis-je le faire C'est vraiment difficile pour moi de lire les équations mathématiques, je traite beaucoup mieux avec le code. Comment puis-je traiter les valeurs dans mon tableau, en appliquant un calcul de moyenne exponentielle de la mobilité pour les égaliser demandée Feb 8 12 at 20h27 Pour calculer une moyenne mobile exponentielle. Vous devez garder un certain état autour et vous avez besoin d'un paramètre de réglage. Cela nécessite une petite classe (en supposant que vous utilisiez Java 5 ou plus tard): Instantiate avec le paramètre de décroissance que vous voulez (peut prendre l'accord doit être entre 0 et 1), puis utilisez la moyenne () pour filtrer. Lors de la lecture d'une page sur une récurrence mathématique, tout ce que vous avez vraiment besoin de savoir lorsque vous le transformer en code est que les mathématiciens aiment écrire des index dans des tableaux et des séquences avec des indices. (Theyve quelques autres notations ainsi, ce qui ne l'aide pas.) Cependant, l'EMA est assez simple car vous devez seulement se souvenir d'une vieille valeur aucune arrays compliqués d'état requis. Répondre févr. 8 12 at 20h42 TKKocheran: Pretty much. Notez que les premiers termes de la séquence moyenne sauteront un peu en raison des effets de frontière, mais vous obtenez ceux avec d'autres moyennes mobiles aussi. Cependant, un bon avantage est que vous pouvez envelopper la logique de la moyenne mobile dans le moyager et expérimenter sans déranger le reste de votre programme trop. Ndash Donal Fellows Feb 9 12 at 0:06 J'ai du mal à comprendre vos questions, mais je vais essayer de répondre de toute façon. 1) Si votre algorithme a trouvé 0,25 au lieu de 0,36, alors il est faux. C'est faux parce qu'il suppose une augmentation ou une diminution monotone (qui monte ou monte toujours). Sauf si vous moyenne toutes vos données, vos points de données --- comme vous les présenter --- sont non linéaires. Si vous voulez vraiment trouver la valeur maximale entre deux points dans le temps, découpez votre tableau de tmin à tmax et trouvez le maximum de ce sous-tableau. 2) Maintenant, le concept de moyennes mobiles est très simple: imaginez que j'ai la liste suivante: 1.4, 1.5, 1.4, 1.5, 1.5. Je peux le lisser en prenant la moyenne de deux nombres: 1.45, 1.45, 1.45, 1.5. Notez que le premier nombre est la moyenne de 1,5 et 1,4 (deuxième et premier numéros) la deuxième (nouvelle liste) est la moyenne de 1,4 et 1,5 (troisième et deuxième liste ancienne) la troisième (nouvelle liste) la moyenne de 1,5 et 1,4 (Quatrième et troisième), et ainsi de suite. J'aurais pu faire la période trois ou quatre, ou n. Remarquez comment les données sont beaucoup plus lisses. Une bonne façon de voir les moyennes mobiles au travail est d'aller à Google Finance, sélectionnez un stock (essayez Tesla Motors assez volatile (TSLA)) et cliquez sur technicals au bas du graphique. Sélectionnez Moyenne mobile avec une période donnée, et Moyenne mobile exponentielle pour comparer leurs différences. Moyenne mobile exponentielle est juste une autre élaboration de cela, mais pondère les données plus anciennes moins que les nouvelles données, c'est une façon de biais le lissage vers l'arrière. Veuillez lire l'entrée de Wikipedia. Donc, c'est plus un commentaire qu'une réponse, mais la petite boîte de commentaire était juste à minuscule. Bonne chance. Si vous avez des problèmes avec les mathématiques, vous pourriez aller avec une moyenne mobile simple au lieu d'exponentielle. Donc, la sortie que vous obtenez serait les derniers termes x divisé par x. Pseudocode non testé: Notez que vous devrez manipuler les parties de début et de fin des données car clairement vous ne pouvez pas moyenne les 5 derniers termes lorsque vous êtes sur votre 2e point de données. En outre, il existe des moyens plus efficaces de calculer cette moyenne mobile (somme somme - la plus récente la plus récente), mais c'est pour obtenir le concept de ce qui se passe à travers. Matlab comprend des fonctions appelées movavg et tsmovavg (moyenne mobile de la série chronologique) dans la boîte à outils financière, movAv Est conçu pour reproduire la fonctionnalité de base de ceux-ci. Le code ici fournit un bel exemple de gestion des index dans les boucles, ce qui peut être source de confusion pour commencer. Ive délibérément gardé le code court et simple pour garder ce processus clair. MovAv effectue une moyenne mobile simple qui peut être utilisée pour récupérer des données bruyantes dans certaines situations. Il fonctionne en prenant la moyenne de l'entrée (y) sur une fenêtre temporelle glissante, dont la taille est spécifiée par n. Plus grand est n, plus la quantité de lissage de l'effet de n est relative à la longueur du vecteur d'entrée y. Et effectivement (ainsi, sorte de) crée un filtre de fréquence passe-bas - voir la section exemples et considérations. Comme la quantité de lissage fournie par chaque valeur de n est relative à la longueur du vecteur d'entrée, il vaut toujours la peine de tester différentes valeurs pour voir ce qui convient. Rappelez-vous aussi que n points sont perdus sur chaque moyenne si n est 100, les 99 premiers points du vecteur d'entrée ne contiennent pas assez de données pour une moyenne de 100 p. Ceci peut être évité quelque peu en empilant des moyennes, par exemple, le code et le graphique ci-dessous comparent un certain nombre de moyennes de fenêtre de longueur différentes. Notez comment lisse 1010pt est comparé à une seule moyenne 20pt. Dans les deux cas, 20 points de données sont perdus au total. Créer xaxis x1: 0.01: 5 Générer du bruit noiseReps 4 bruit repmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) remodeler le bruit (noise, 1, X) 10noise (1: length (x)) Moyennes de Perfrom: y2 movAv (y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 pt (X, y, y2, y3, y4, y5, y6) légende (données brutes, moyenne mobile 10pt, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel Y) title (Comparaison des moyennes mobiles) movAv. m fonction de la fonction run-through movAv (y, n) La première ligne définit le nom des fonctions, les entrées et les sorties. L'entrée x doit être un vecteur de données pour effectuer la moyenne sur, n doit être le nombre de points pour effectuer la moyenne sur la sortie contiendra les données moyennes renvoyées par la fonction. Pré-affecter la sortie outputNaN (1, numel (y)) Trouver le point milieu de n midPoint round (n 2) Le travail principal de la fonction se fait dans la boucle for, mais avant de démarrer deux choses sont préparées. Tout d'abord la sortie est pré-allouée comme NaNs, cela a servi à deux fins. Tout d'abord, la préallocation est généralement une bonne pratique car elle réduit la mémoire de jonglage Matlab a à faire, d'autre part, il est très facile de placer les données moyennées dans une sortie de la même taille que le vecteur d'entrée. Cela signifie que le même xaxis peut être utilisé ultérieurement pour les deux, ce qui est pratique pour le tracé, sinon les NaN peuvent être enlevés plus tard dans une ligne de code (sortie de sortie) (La variable midPoint sera utilisée pour aligner les données dans le vecteur de sortie. N 10, 10 points seront perdus car, pour les 9 premiers points du vecteur d'entrée, il n'y a pas assez de données pour prendre une moyenne de 10. La sortie sera plus courte que l'entrée, elle doit être correctement alignée. Être utilisée pour qu'une quantité égale de données soit perdue au début et à la fin et que l'entrée soit maintenue alignée sur la sortie par les tampons NaN créés lors de la préallocation de la sortie. (A: b) ban Calculer la moyenne de sortie (amidPoint) moyenne (y (a: b)) end Dans la boucle for elle-même, une moyenne est prise sur chaque segment consécutif de l'entrée. Définie comme 1 jusqu'à la longueur de l'entrée (y), moins les données qui seront perdues (n). Si l'entrée a 100 points de long et n est 10, la boucle va de (a) 1 à 90. Signifie a fournit le premier indice du segment à évaluer. Le deuxième indice (b) est simplement an-1. Donc sur la première itération, a1. N10. Donc b 11-1 10. La première moyenne est prise sur y (a: b). Ou x (1:10). La moyenne de ce segment, qui est une valeur unique, est stockée dans la sortie à l'index amidPoint. Ou 156. Sur la deuxième itération, a2. B 210-1 11. De sorte que la moyenne est prise sur x (2:11) et stockée dans la sortie (7). Sur la dernière itération de la boucle pour une entrée de longueur 100, a91. B 9010-1 100 de sorte que la moyenne est prise en compte sur x (91: 100) et mémorisée dans la sortie (95). Ceci laisse la sortie avec un total de n (10) valeurs de NaN à l'indice (1: 5) et (96: 100). Exemples et considérations Les moyennes mobiles sont utiles dans certaines situations, mais elles ne sont pas toujours le meilleur choix. Voici deux exemples où ils ne sont pas nécessairement optimale. Étalonnage du microphone Ce jeu de données représente les niveaux de chaque fréquence produite par un haut-parleur et enregistrée par un microphone avec une réponse linéaire connue. La sortie du haut-parleur varie avec la fréquence, mais nous pouvons corriger cette variation avec les données d'étalonnage - la sortie peut être ajustée au niveau pour tenir compte des fluctuations de l'étalonnage. Notez que les données brutes sont bruyantes - cela signifie qu'un petit changement de fréquence semble nécessiter un changement de niveau important et irrégulier. Est-ce réaliste ou est-ce un produit de l'environnement d'enregistrement Il est raisonnable dans ce cas d'appliquer une moyenne mobile qui lisse la courbe de fréquence de niveau pour fournir une courbe d'étalonnage qui est légèrement moins erratique. Mais pourquoi est-ce pas optimal dans cet exemple Plus de données serait mieux - plusieurs étalonnages en moyenne ensemble détruirait le bruit dans le système (aussi longtemps que son aléatoire) et de fournir une courbe avec moins de détail subtile perdu. La moyenne mobile ne peut que l'approximer, et peut supprimer certains plongeons et pics de fréquence plus élevés de la courbe qui existent réellement. Les ondes sinusoïdales L'utilisation d'une moyenne mobile sur les ondes sinusoïdales souligne deux points: La question générale du choix d'un nombre raisonnable de points pour effectuer la moyenne sur. Son simple, mais il existe des méthodes plus efficaces d'analyse du signal que la moyenne des signaux oscillants dans le domaine du temps. Dans ce graphique, l'onde sinusoïdale originale est tracée en bleu. Le bruit est ajouté et tracé comme la courbe orange. Une moyenne mobile est effectuée à différents nombres de points pour voir si l'onde originale peut être récupérée. 5 et 10 points fournissent des résultats raisonnables, mais ne supprimez pas le bruit entièrement, où comme un plus grand nombre de points commencent à perdre détails d'amplitude que la moyenne s'étend sur différentes phases (rappelez-vous la vague oscille autour de zéro, et la moyenne (-1 1) . Une autre approche consisterait à construire un filtre passe-bas que celui qui peut être appliqué au signal dans le domaine de la fréquence. Im pas entrer dans le détail car il va au-delà de la portée de cet article, mais comme le bruit est beaucoup plus élevé que la fréquence fondamentale des ondes, il serait assez facile dans ce cas de construire un filtre passe-bas que supprimera la haute fréquence bruit.


No comments:

Post a Comment