Wednesday 15 February 2017

Déplacement Moyenne Filtre Implémentation

La moyenne mobile en tant que filtre La moyenne mobile est souvent utilisée 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 implémentation 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 maintenantLe scientifique et les ingénieurs Guide de traitement du signal numérique Par Steven W. Smith, Ph. D. Comme le nom l'indique, le filtre à moyenne mobile fonctionne en faisant la moyenne d'un nombre de points à partir du signal d'entrée pour produire chaque point dans le signal de sortie. Dans la forme d'équation, ceci est écrit: Où est le signal d'entrée, est le signal de sortie, et M est le nombre de points dans la moyenne. Par exemple, dans un filtre à moyenne mobile à 5 points, le point 80 du signal de sortie est donné par: En variante, le groupe de points du signal d'entrée peut être choisi symétriquement autour du point de sortie: ceci correspond à la modification de la somme dans Eq . 15-1 de: j 0 à M -1, à: j - (M -1) 2 à (M -1) 2. Par exemple, dans un filtre à moyenne mobile à 10 points, l'indice, j. Peut aller de 0 à 11 (moyenne d'un côté) ou de -5 à 5 (moyenne symétrique). La moyenne symétrique requiert que M soit un nombre impair. La programmation est légèrement plus facile avec les points sur un seul côté cependant, cela produit un décalage relatif entre les signaux d'entrée et de sortie. Vous devez reconnaître que le filtre de moyenne mobile est une convolution à l'aide d'un noyau de filtre très simple. Par exemple, un filtre à 5 points a le noyau de filtre: 82300, 0, 15, 15, 15, 15, 15, 0, 08230. C'est-à-dire que le filtre à moyenne mobile est une convolution du signal d'entrée avec une impulsion rectangulaire ayant une Zone de un. Le tableau 15-1 montre un programme pour mettre en œuvre le filtre de la moyenne mobile. Je sais que cela est réalisable avec boost selon: Mais je voudrais vraiment éviter d'utiliser boost. J'ai googlé et n'a pas trouvé d'exemples appropriés ou lisibles. Essentiellement, je veux suivre la moyenne mobile d'un flux continu d'un flux de nombres à virgule flottante en utilisant les plus récents numéros 1000 comme un échantillon de données. Quel est le moyen le plus simple pour atteindre ce que j'ai expérimenté avec l'aide d'un tableau circulaire, moyenne mobile exponentielle et une moyenne mobile plus simple et a constaté que les résultats de la matrice circulaire convenait mieux à mes besoins. Si vos besoins sont simples, vous pouvez simplement essayer d'utiliser une moyenne mobile exponentielle. Autrement dit, vous créez une variable d'accumulateur, et comme votre code regarde chaque échantillon, le code met à jour l'accumulateur avec la nouvelle valeur. Vous choisissez un alpha constant qui se situe entre 0 et 1, et calculez ceci: Il vous suffit de trouver une valeur de alpha où l'effet d'un échantillon donné ne dure que pour environ 1000 échantillons. Hmm, je ne suis pas sûr que ce soit approprié pour vous, maintenant que Ive mis ici. Le problème est que 1000 est une fenêtre assez longue pour une moyenne mobile exponentielle Im pas sûr il ya un alpha qui serait la propagation de la moyenne sur les 1000 derniers chiffres, sans underflow dans le calcul en virgule flottante. Mais si vous voulez une moyenne plus petite, comme 30 nombres ou ainsi, c'est une manière très facile et rapide de le faire. A répondu 12 juin à 4:44 1 sur votre poste. La moyenne mobile exponentielle peut permettre à l'alpha d'être variable. Ainsi, cela permet de calculer des moyennes de base de temps (par exemple, des octets par seconde). Si le temps écoulé depuis la dernière mise à jour de l'accumulateur est supérieur à 1 seconde, laissez alpha be 1.0. Sinon, vous pouvez laisser alpha be (usecs depuis la dernière mise à jour1000000). Ndash jxh 12 juin à 6:21 Je veux essentiellement suivre la moyenne mobile d'un flux continu d'un flux de nombres à virgule flottante en utilisant les plus récents numéros 1000 comme un échantillon de données. Notez que la mise à jour ci-dessous le total en tant qu'éléments comme addedreplaced, en évitant coûteux O (N) traversal pour calculer la somme - nécessaire pour la moyenne - sur demande. Le total est fait d'un paramètre différent de T par rapport au support, par ex. En utilisant un long long pour un total de 1000 s longs, un int pour char s, ou un flottant double au total. C'est un peu vicié en ce que les numsamples pourraient dépasser INTMAX - si vous vous inquiétez vous pourriez employer un unsigned long long. Ou utiliser un membre de données bool supplémentaire pour enregistrer quand le conteneur est rempli tout en cyclant numsamples autour du tableau (mieux renommé quelque chose d'inoffensif comme pos). Répondue 12 juin à 5:19 on suppose que l'opérateur quotvoid (échantillon T) est effectivement opérateur quotvoid (T échantillon) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bien repéré. En fait, je voulais qu'il soit vide opérateur () (T échantillon), mais bien sûr, vous pouvez utiliser n'importe quelle note que vous avez aimé. Correction, merci. Ndash Tony D Jun 8 14 à 14:27


No comments:

Post a Comment