Monday, February 20, 2017

Déménagement Moyen Récursif Implémentation

Le principal défaut de votre programme est que le calcul récursif est incorrect. Pour calculer la moyenne, vous devez obtenir la somme de la valeur courante et des valeurs restantes. Puis divisez cette somme par le nombre de valeurs. Le nombre de valeurs est num. La valeur courante est tout calculatenumber () renvoie. La somme des valeurs restantes est num-1 multipliée par la moyenne des valeurs restantes. La moyenne des valeurs restantes est calculée en faisant un appel récursif à average (). Ainsi, nous écrivons ce qui suit: Un programme complet utilisant cette fonction pourrait ressembler à ceci: Notez que ce n'est pas un très bon moyen de calculer la moyenne parce que vous perdez la précision chaque fois que vous divisez la somme courante par num. Lorsque cette moyenne est multipliée à nouveau lorsque l'appel récursif revient, les chiffres significatifs que vous avez perdus dans la division ne sont pas restaurés. Vous détruisez l'information en divisant puis en multipliant la somme. Pour une plus grande précision, vous voulez garder la trace de la somme que vous passez par les éléments, puis diviser à la fin. Un autre point à considérer est ce que signifie une moyenne mobile. Ce que nous avons mis en œuvre ci-dessus n'est pas une moyenne mobile, mais une moyenne fixe. C'est la moyenne d'une fenêtre fixe d'éléments. Si vous déplacez la fenêtre d'une position, vous devez tout recommencer et calculer la somme à nouveau. La bonne façon de mettre en œuvre une fenêtre en mouvement est de garder une trace de tous les éléments de la fenêtre. Lorsque vous décalez la fenêtre d'une position vers la droite, vous retirez l'élément le plus à gauche de la fenêtre et soustrayez sa valeur de la somme, puis ajoutez le nouvel élément à droite à la fenêtre et ajoutez sa valeur à la somme. C'est ce qui en fait une somme mobile. Diviser la somme mobile par le nombre d'éléments vous donne la moyenne mobile. Le moyen naturel d'implémenter une fenêtre en mouvement est avec une file d'attente, car vous pouvez ajouter de nouveaux éléments à la tête et pop éléments anciens de la queue. Réponse Nov 22 14 at 17: 44La moyenne mobile comme un filtre La moyenne mobile est souvent utilisé pour lisser les données en présence de bruit. La moyenne mobile simple n'est pas toujours reconnue comme le filtre à réponse impulsionnelle finie (FIR) qu'il est, alors qu'il est effectivement l'un des filtres les plus courants dans le traitement du signal. Le traiter comme un filtre permet de le comparer avec, par exemple, des filtres de fenêtre-sinc (voir les articles sur les filtres passe-bas, passe-haut, bande passante et rejet de bande pour des exemples de ceux-ci). La différence majeure avec ces filtres est que la moyenne mobile convient pour des signaux pour lesquels les informations utiles sont contenues dans le domaine temporel. Dont les mesures de lissage par moyenne sont un excellent exemple. Par contre, les filtres Windowed-sinc sont performants dans le domaine fréquentiel. Avec une égalisation dans le traitement audio comme exemple typique. Il existe une comparaison plus détaillée des deux types de filtres dans le domaine temporel vs la performance de domaine de fréquence des filtres. Si vous disposez de données pour lesquelles le temps et le domaine fréquentiel sont importants, vous voudrez peut-être consulter les Variations sur la moyenne mobile. Qui présente un certain nombre de versions pondérées de la moyenne mobile qui sont mieux à cela. La moyenne mobile de la longueur (N) peut être définie comme écrite telle qu'elle est typiquement mise en œuvre, l'échantillon de sortie courant étant la moyenne des échantillons précédents (N). Vu sous forme de filtre, la moyenne mobile réalise une convolution de la séquence d'entrée (xn) avec une impulsion rectangulaire de longueur (N) et de hauteur (1N) (pour faire la zone de l'impulsion et donc le gain du filtre , un ). En pratique, il est préférable de prendre (N) impair. Bien qu'une moyenne mobile puisse également être calculée en utilisant un nombre pair d'échantillons, l'utilisation d'une valeur impaire pour (N) présente l'avantage que le retard du filtre sera un nombre entier d'échantillons, puisque le retard d'un filtre avec (N) Est exactement ((N-1) 2). La moyenne mobile peut alors être alignée exactement avec les données d'origine en la décalant d'un nombre entier d'échantillons. Domaine temporel Puisque la moyenne mobile est une convolution à impulsion rectangulaire, sa réponse en fréquence est une fonction sinc. Cela fait quelque chose comme le dual du filtre windowed-sinc, puisqu'il s'agit d'une convolution avec un impulsion sinc qui se traduit par une réponse en fréquence rectangulaire. C'est cette réponse en fréquence sinc qui fait de la moyenne mobile un mauvais interprète dans le domaine de la fréquence. Cependant, il fonctionne très bien dans le domaine temporel. Par conséquent, il est parfait pour lisser les données pour supprimer le bruit tout en conservant une réponse rapide (Figure 1). Pour le bruit typiquement blanc Gaussien (AWGN) qui est souvent supposé, la moyenne (N) des échantillons a pour effet d'augmenter le SNR par un facteur de (sqrt N). Comme le bruit pour les échantillons individuels n'est pas corrélé, il n'y a aucune raison de traiter chaque échantillon différemment. Par conséquent, la moyenne mobile, qui donne à chaque échantillon le même poids, se débarrasser de la quantité maximale de bruit pour une netteté donnée réponse étape. Implémentation Parce qu'il s'agit d'un filtre FIR, la moyenne mobile peut être mise en œuvre par convolution. Il aura alors la même efficacité (ou son absence) que tout autre filtre FIR. Cependant, il peut également être mis en œuvre de manière récursive, de manière très efficace. Il découle directement de la définition que cette formule est le résultat des expressions pour (yn) et (yn1), c'est-à-dire où l'on remarque que le changement entre (yn1) et (yn) est qu'un terme supplémentaire (xn1N) La fin, tandis que le terme (xn-N1N) est retiré du début. Dans les applications pratiques, il est souvent possible d'exclure la division par (N) pour chaque terme en compensant le gain résultant de (N) à un autre endroit. Cette mise en œuvre récursive sera beaucoup plus rapide que la convolution. Chaque nouvelle valeur de (y) peut être calculée avec seulement deux ajouts, au lieu des (N) ajouts qui seraient nécessaires pour une mise en œuvre simple de la définition. Une chose à surveiller avec une implémentation récursive est que les erreurs d'arrondi s'accumuleront. Cela peut ou non être un problème pour votre application, mais cela implique également que cette implémentation récursive fonctionnera mieux avec une implémentation entière qu'avec des nombres à virgule flottante. Ceci est assez inhabituel, car une mise en œuvre à virgule flottante est généralement plus simple. La conclusion de tout cela doit être que vous ne devriez jamais sous-estimer l'utilité du filtre simple moyenne mobile dans les applications de traitement du signal. Outil de conception de filtre Cet article est complété par un outil de conception de filtre. Expérimentez avec différentes valeurs pour (N) et visualisez les filtres résultants. Essayez-le maintenantIm implémentant un 80-72-64-48 multipasser le filtre de moyenne mobile pour un système embarqué dans C et dans le point fixe. La mise en oeuvre est un tampon circulaire où im conserve une somme courante et calcule yn yn-1 xn - xn-M où M est la longueur d'un filtre. Cela est fait pour chaque sous-filtre avec la sortie d'une portion comme entrée pour une autre. Im mise à l'échelle de mes coefficients par 2 qui me donne des coefficients de longueur 2 ou 2 selon la longueur du filtre. Ensuite, le résultat est de nouveau réduit de 2 pour obtenir la sortie correcte. Maintenant, tout semble bon sur les échelles de temps bref, mais sur de longues périodes, je obtenir une dérive. La raison de l'implémentation récursive est d'enregistrer des calculs sur un processeur embarqué. J'ai inclus l'image de certains des internes de mon filtre, c'est quand une réponse d'étape est appliquée et nous pouvons voir les fonctions de transfert des filtres prenant forme, carré, triangle, puis approximant un gaussien ainsi le filtre fonctionne comme attendu. Y at-il une façon de résoudre ce problème, et où est la source la plus probable de cela. Est cette dérive due à un peu se perdre dans le déplacement ou autre chose. La dérive n'est pas présente pour les entrées CC, mais pour les signaux AC, elle dérive lentement. SOLUTION: Le problème était dans l'accumulateur comme Robert suggéré dans les commentaires. La question était qu'un élément du calcul avait subi un déplacement supplémentaire de haut en bas par rapport au reste, ce qui a créé un décalage rond qui s'est accumulé. Demandé 27 avril à 21:12 est votre accumulateur yn étant arrondi ou quantifié de quelque manière que vous devez vous assurer que le xn-M qui est soustrait est exactement la même valeur que xn qui a été ajouté M échantillons il ya. Si vous voulez vraiment faire une somme mobile. Plutôt que d'une moyenne mobile et l'échelle de la sortie de votre somme mobile (avec 1M) pour vous obtenir la moyenne. C'est tout à fait faisable et encore mieux fait en point fixe plutôt qu'en virgule flottante. Ndash robert bristow-johnson Apr 27 15 at 22:52 quotScaling les coefficientsquot Je suppose que vous divisez par M après chaque étape et qui est le coefficient que vous échelle C'est probablement la cause du décalage. Mieux vaut alors diviser par prod Mi à la fin de tous les filtres. Vous devez garder une trace des amplitudes internes bien que vous finirez par déborder les accumulateurs. Cependant, ceci est facilement résolu par l'arithmétique modulo (dont le complément à deux est un cas spécial). Ndash Oscar Apr 28 15 at 7:00 Oscar, il s'agit d'un filtre à point fixe. Cela signifie que je ne fais que l'arithmétique entière. Pour une moyenne mobile de longueur gt 1 avec gain 1, les constantes de filtre seront une fraction qui n'est pas représentable en nombres entiers. Ainsi, les coefficients sont mis à l'échelle pour les rendre entiers en les déplaçant à gauche x de nombreux bits. Pour cette raison, la sortie finale doit être décalée vers la droite par autant de bits. Je ne peux pas garder une somme courante à travers tous les 4 filtres sans restaurer la sortie entre les deux, le signal d'entrée est de 16 bits et avec le coefficient de mise à l'échelle et les longueurs Un seul filtre utilise mon espace accumulateur entier de 32 bits ndash user70614 Apr 28 15 at 8:20


No comments:

Post a Comment