Wednesday 8 February 2017

Déménagement Moyen C Code Avr

J'ai essayé quelques techniques de moyennage courantes pour lisser la modification des données ADC dans AtMega48 pour contrôler des lumières (PWM) lors de la rotation d'un pot (ADC). Les filtres (pseudo codes): J'ai remarqué que les filtres sont très agréables. Mais lent dans la réponse qui est attendue. Je recherche des techniques comme la moyenne mobile exponentielle. Dit être plus réactif. Existe-t-il un autre comme celui-ci Comme il est dit: où est entre 0 et 1. Comment coder et optimiser les codes sages (sans utiliser des flotteurs) Ou Comment convertir les flotteurs en nombres entiers correspondants pour faire le code petit, rapide et réactif. Et j'ai gardé1 Autre alors que ça ne fonctionnera pas comme prévu. Parce que Idve modifie toutes les variables à flotter. S'il vous plaît ne pas se concentrer sur la déclaration suivante pour le moment mais note. Maintenir les flotteurs dans ma base de code est de remplir la mémoire programme de 45 à 137, dans le cas de Vous pouvez mettre en œuvre avec un minimum de frais généraux en limitant les fractions binaires. J'ai utilisé cela avec de bons résultats. Prenez le résultat existant, Shift it N place droit à diviser par 2N Soustrayez-le du résultat existant. Ajouter de nouvelles données Ce n'est pas aussi rapide à changer avec un changement de pas dans les données d'entrée que vous le souhaitez, mais est facile à mettre en œuvre et assez efficace comme un filtre dans de nombreux cas. Vous pouvez accélérer sa réponse en prenant des décisions informelles quant à son comportement dans des cas trop différents. Par exemple, maintenir un nombre d'entrées séquentielles qui sont plus que certaines limites différentes du résultat existant. Si ce nombre dépasse un certain seuil, changez le taux de division N par un facteur. Par exemple N est généralement 4-résultats sont décalés à droite 4 fois 16 diviser. Si l'entrée est plus de xxx loin de la réponse ne faites que deux changements à droite et multiplier l'échantillon par 4 avant d'ajouter. Si vous avez la moyenne de N échantillons, il suffit de multiplier la moyenne par N, ajouter le nouvel échantillon, et diviser par N1. Cela ne vous obtient pas une moyenne mobile. Vous devez être prêt à stocker 150 échantillons. Ensuite, lorsque vous obtenez un nouvel échantillon, multipliez la moyenne par 150, soustrayez le plus ancien, ajoutez le plus récent et divisez par 150. Mettez le plus récent dans le tampon de 150 et supprimez le plus ancien. Il existe d'autres régimes qui maintiennent NAverage qui réduit les multiplications un peu. Jim Wagner Oregon Recherche Électronique, Consulting Div. Tangent, OR, USA orlélectronique Kleinstein Niveau: Posting Freak Inscrit le: sam. Sep 22, 2007 Publié par Kleinstein. Soleil. Il n'y a aucun moyen de sauver les derniers échantillons de N (environ 150) si besoin la vraie moyenne mobile pour chaque position. 150 Samles doivent toujours entrer dans la RAM. Vous pouvez enregistrer les multiplications cependant. Ajouter le nouvel échantillon et soustraire le dernier à tomber. Ensuite, divisez la somme par N pour le résultat et conservez la somme pour l'étape suivante. Devision devient beaucoup plus facile si vous pouvez utiliser 128 échantillons. Niveau: 10k Postman Inscrit le: sam. Feb 12, 2005 Emplacement: Wormshill, England Publié par david. prentice. Soleil. Jan 18, 2009 - 04:51 PM total des échantillons moyens. Newaverage (total new) (échantillons 1) Si vous êtes inquiet de signaler une moyenne valide jusqu'à ce que le nombre d'échantillons soit de 150, vous retarder votre rapport jusqu'à sa validité. 16000 échantillons d'ints réguliers s'ajusteront facilement dans un long total. Vous divisez lorsque vous êtes invité à déclarer la valeur moyenne. Alternativement, vous calculez la moyenne et réinitialisez votre total tous les 150 échantillons. Vous déclarez cette moyenne jusqu'au prochain calcul. Un peu comme la vitesse sur mon ordinateur de cycle. La roue avant doit faire plus d'une révolution avant de pouvoir calculer la vitesse. Curtvm Niveau: Raving Lunatic Inscrit le: mer. 21 sept. 2005 Publié par curtvm. Lun. Jan 19, 2009 - 04:40 AM (c'est semblable à l'idée de Kleinsteins). Niveau: 10k Postman Inscrit le: Lun. 19 février 2001 Lieu: Wisconsin USA Publié par theusch. Lun. Par la nature de la description, moyenne mobile sur un grand nombre d'échantillons, le signal est lent. Si je devais généraliser mes applications, typique est de fermer la boucle tous les 500 ms. J'ai l'ADC prenant l'échantillonnage continu (interrupt-driven) de tous les échantillons AD utilisés stockant la lecture brute dans un tableau. Chaque 10 ms une ou plusieurs conversions ont été effectuées sur chaque canal. (À une horloge ADC 57600 qui est 226usconversion avec ISR overhead peut-être 250us donc environ 40 conversions tous les 10ms.) Au point 10ms j'ajoute la valeur brute représentant le dernier résultat de conversion à un total pour chaque canal. Chaque 500 ms la moyenne est utilisée pour fermer la boucle d'application. Cela fonctionne très bien pour les signaux à faible vitesse comme les thermistances, les lectures de courant et les tensions de commande. La somme moyenne prend beaucoup de bruit et les lectures sont généralement rock-steady. Notez que l'utilisation de la somme plutôt que la moyenne conserve quelques bits plus bas, mais heck - même un signal lent peut commencer à changer dans un segment de Que 500ms alors quel est le point Maintenant, les signaux plus rapides ou ceux qui nécessitent une réponse plus rapide ont besoin d'une approche différente. Une situation commune pour moi est de surveiller le courant continu brut pour la perte de puissance entrante. Ce signal peut bien être rectifié AC brut et ont beaucoup d'ondulation. Ou il peut avoir d'autres facteurs qui pourraient faire gyrate. Dans ces cas, je fais un simple calcul de moyenne comme Kleinstein, avec le nouvel échantillon ayant un poids pour changer la valeur précédente. Non, pas une vraie moyenne mobile puisque tous les échantillons ne sont pas maintenus. Pour la surveillance de la puissance, le nouvel échantillon peut être de 12 ou 14 ou 18 poids, déterminé empiriquement sur ce qui fonctionne le mieux dans un cas particulier. Ci-dessous le code d'une application où 12 était trop grossier, et la finale utilisée 116: Vous pouvez mettre du rouge à lèvres sur un cochon, mais il est toujours un cochon. Ive jamais rencontré un porc que je n'ai pas aimé, tant que vous avez un peu de sel et de poivre. Moyennes Moyenne mobile Moyennes Moyenne mobile simple Vous êtes encouragé à résoudre cette tâche selon la description de tâche, en utilisant n'importe quelle langue que vous savez peut-être. Calcul de la moyenne mobile simple d'une série de nombres. Créez une fonction stateclassstance qui prend une période et renvoie une routine qui prend un nombre comme argument et renvoie une moyenne mobile simple de ses arguments jusqu'à présent. Une moyenne mobile simple est une méthode pour calculer une moyenne d'un flux de nombres en faisant la moyenne seulement des derniers 160 P 160 numéros du flux 160, où 160 P 160 est connu comme la période. Il peut être implémenté en appelant une routine d'initialisation avec 160 P 160 comme argument, 160 I (P), 160 qui doit alors retourner une routine qui, lorsqu'elle est appelée avec des membres individuels, successifs d'un flux de nombres, calcule la moyenne de À), les derniers 160 P 160 d'entre eux, appelle ce 160 SMA (). Le mot 160 état 160 dans la description de la tâche fait référence à la nécessité pour 160 SMA () 160 de se souvenir de certaines informations entre les appels: 160 La période, 160 P 160 Un conteneur commandé d'au moins les derniers 160 P 160 numéros de chacun des Ses appels individuels. L'état 160 signifie également que les appels successifs à 160 I (), 160 l'initialiseur, 160 doivent renvoyer des routines distinctes qui ne 160 ne 160 part épargné état de sorte qu'ils pourraient être utilisés sur deux flux de données indépendantes. Le pseudo-code pour une implémentation de 160 SMA 160 est: Cette version utilise une file d'attente persistante pour contenir les valeurs p les plus récentes. Chaque fonction renvoyée par init-moving-average a son état dans un atome contenant une valeur de file d'attente. Cette implémentation utilise une liste circulaire pour stocker les nombres dans la fenêtre au début de chaque pointeur d'itération se rapporte à la cellule de liste qui retient la valeur qui vient de sortir de la fenêtre et d'être remplacée par la valeur juste ajoutée. Utiliser une fermeture edit Actuellement, ce sma cant être nogc parce qu'il alloue une fermeture sur le tas. Une analyse d'échappement pourrait supprimer l'allocation de tas. Utilisation d'un éditeur de structure Cette version évite l'allocation de mémoire de la mémoire de fermeture en gardant les données dans le cadre de pile de la fonction principale. Même sortie: pour éviter que les approximations en virgule flottante ne s'accumulent et ne se multiplient, le code peut effectuer une somme périodique sur l'ensemble du réseau circulaire de files d'attente. Cette implémentation produit deux objets (fonction) partageant l'état. Il est idiomatique dans E de séparer l'entrée de la sortie (lire à partir de l'écriture) plutôt que de les combiner en un seul objet. La structure est la même que la mise en œuvre de la norme DeviationE. Le programme d'élixir ci-dessous génère une fonction anonyme avec une période intégrée p, qui est utilisée comme la période de la moyenne mobile simple. La fonction d'exécution lit l'entrée numérique et la transmet à la fonction anonyme nouvellement créée, puis inspecte le résultat à STDOUT. La sortie est montrée ci-dessous, avec la moyenne, suivie de l'entrée groupée, constituant la base de chaque moyenne mobile. Erlang a des fermetures, mais des variables immuables. Une solution consiste alors à utiliser des processus et un simple message passant API basée. Les langages matriciels ont des routines pour calculer les avarages de glisse pour une séquence donnée d'items. Il est moins efficace de boucler comme dans les commandes suivantes. Demande continuellement une entrée I. Qui est ajouté à la fin d'une liste L1. L1 peut être trouvé en appuyant sur 2ND1, et la moyenne peut être trouvée dans ListOPS Appuyez sur ON pour terminer le programme. Fonction qui retourne une liste contenant les données moyennées de l'argument fourni. Programme qui retourne une valeur simple à chaque invocation: list est la moyenne de la liste: p est la période: 5 renvoie la liste moyenne: Exemple 2: Utilisation du programme movinav2 , 5) - Initialisation du calcul de la moyenne mobile, et définition de la période de 5 movinav2 (3, x): x - nouvelles données dans la liste (valeur 3), et le résultat sera stocké sur la variable x et affiché movinav2 (4, : X - nouvelles données (valeur 4), et le nouveau résultat sera stocké sur la variable x, et affiché (43) 2. Description de la fonction movinavg: variable r - est le résultat (la liste moyenne) qui sera retournée variable i - est la variable d'index, et il pointe vers la fin de la sous-liste de la liste en cours de moyenne. Variable z - une variable helper La fonction utilise la variable i pour déterminer quelles valeurs de la liste seront prises en compte dans le calcul suivant. A chaque itération, la variable i pointe vers la dernière valeur de la liste qui sera utilisée dans le calcul moyen. Donc nous avons seulement besoin de déterminer quelle sera la première valeur dans la liste. Habituellement, il faut considérer p éléments, donc le premier élément sera celui indexé par (i-p1). Cependant, lors des premières itérations, le calcul sera généralement négatif, de sorte que l'équation suivante évitera les indices négatifs: max (i-p1,1) ou, en organisant l'équation, max (i-p, 0) 1. Mais le nombre d'éléments sur les premières itérations sera également plus petit, la valeur correcte sera (index fin - début indice 1) ou, en organisant l'équation, (i - (max (ip, 0) 1), puis , (I-max (ip, 0)). La variable z détient la valeur commune (max (ip), 0) de sorte que le débutindex sera (z1) et les numberofelements seront (iz) mid (list, z1, iz) renverra la liste de valeur qui sera moyennée sum ( .) Les somme somme (.) (Iz) ri les calcule et mémorise le résultat à l'endroit approprié dans la liste des résultats En utilisant une fermeture et en créant une fonction


No comments:

Post a Comment