Thursday 5 January 2017

Déplacement Moyenne Circulaire Tampon

Le guide des scientifiques et ingénieurs sur le traitement du signal numérique Par Steven W. Smith, Ph. D. Chapitre 28: Processeurs de signaux numériques Les processeurs de signaux numériques sont conçus pour effectuer rapidement des filtres FIR et des techniques similaires. Comprendre le matériel. Nous devons d'abord comprendre les algorithmes. Dans cette section, nous ferons une liste détaillée des étapes nécessaires à la mise en œuvre d'un filtre FIR. Dans la section suivante, nous verrons comment les DSP sont conçus pour effectuer ces étapes aussi efficacement que possible. Pour commencer, nous devons distinguer entre le traitement hors ligne et le traitement en temps réel. Dans le traitement hors ligne, le signal d'entrée entier réside dans l'ordinateur en même temps. Par exemple, un géophysicien peut utiliser un sismomètre pour enregistrer le mouvement du sol pendant un tremblement de terre. Une fois l'agitation terminée, l'information peut être lue dans un ordinateur et analysée d'une certaine manière. Un autre exemple de traitement hors ligne est l'imagerie médicale, comme la tomodensitométrie et l'IRM. L'ensemble de données est acquis pendant que le patient est à l'intérieur de la machine, mais la reconstruction de l'image peut être retardée jusqu'à un moment ultérieur. Le point clé est que toutes les informations sont simultanément disponibles pour le programme de traitement. C'est courant dans la recherche scientifique et l'ingénierie, mais pas dans les produits de consommation. Le traitement hors ligne est le domaine des ordinateurs personnels et des ordinateurs centraux. En traitement en temps réel, le signal de sortie est produit en même temps que le signal d'entrée est acquis. Par exemple, cela est nécessaire dans les communications téléphoniques, les aides auditives et le radar. Ces demandes doivent avoir les informations immédiatement disponibles, même si elle peut être retardée d'un court montant. Par exemple, un retard de 10 millisecondes dans un appel téléphonique ne peut pas être détecté par le locuteur ou l'auditeur. De même, il ne fait aucune différence si un signal radar est retardé de quelques secondes avant d'être affiché à l'opérateur. Les applications en temps réel saisissent un échantillon, exécutent l'algorithme et produisent un échantillon, over-and-over. En variante, ils peuvent saisir un groupe d'échantillons, effectuer l'algorithme et produire un groupe d'échantillons. C'est le monde des processeurs de signaux numériques. Reprenez la Fig. 28-2 et imaginez qu'il s'agit d'un filtre FIR qui est implémenté en temps réel. Pour calculer l'échantillon de sortie, nous devons avoir accès à un certain nombre des échantillons les plus récents de l'entrée. Par exemple, supposons que nous utilisons huit coefficients dans ce filtre, un 0. A 1. Hellip a 7 Cela signifie que nous devons connaître la valeur des huit échantillons les plus récents du signal d'entrée, x n, x n -1, hellip x n -7. Ces huit échantillons doivent être stockés en mémoire et continuellement mis à jour à mesure que de nouveaux échantillons sont acquis. Quelle est la meilleure façon de gérer ces échantillons stockés La réponse est la mise en mémoire tampon circulaire. La figure 28-3 illustre un tampon circulaire à huit échantillons. La figure (a) montre comment les huit échantillons de l'entrée peuvent être stockés à un moment donné dans le temps, tandis que (b) montre les changements après que l'échantillon suivant est acquis. L'idée de la mise en mémoire tampon circulaire est que la fin de cette matrice linéaire est connectée à son emplacement mémoire début 20041 est considéré comme étant à côté de 20048, tout comme 20044 est à côté de 20045. Vous suivez le tableau par un pointeur (une variable dont Valeur est une adresse) qui indique où réside l'échantillon le plus récent. Par exemple, dans (a), le pointeur contient l'adresse 20044, tandis que dans (b) il contient 20045. Lorsqu'un nouvel échantillon est acquis, il remplace le plus ancien échantillon dans le tableau et le pointeur est déplacé une adresse à venir. Les tampons circulaires sont efficaces car une seule valeur doit être modifiée lorsqu'un nouvel échantillon est acquis. Quatre paramètres sont nécessaires pour gérer un tampon circulaire. Tout d'abord, il doit y avoir un pointeur qui indique le début du buffer circulaire en mémoire (dans cet exemple, 20041). Deuxièmement, il doit y avoir un pointeur indiquant la fin du tableau (par exemple, 20048), ou une variable qui retient sa longueur (par exemple 8). Troisièmement, la taille de pas de l'adressage mémoire doit être spécifiée. Dans la Fig. 28-3 la taille de pas est un. Par exemple: l'adresse 20043 contient un échantillon, l'adresse 20044 contient l'exemple suivant, et ainsi de suite. Ce n'est souvent pas le cas. Par exemple, l'adressage peut se référer à des octets, et chaque échantillon peut nécessiter deux ou quatre octets pour conserver sa valeur. Dans ces cas, la taille du pas devrait être de deux ou quatre, respectivement. Ces trois valeurs définissent la taille et la configuration du tampon circulaire et ne changent pas pendant l'opération de programme. La quatrième valeur, le pointeur vers l'échantillon le plus récent, doit être modifiée à mesure que chaque nouvel échantillon est acquis. En d'autres termes, il doit y avoir une logique de programme qui contrôle comment cette quatrième valeur est mise à jour en fonction de la valeur des trois premières valeurs. Bien que cette logique soit assez simple, elle doit être très rapide. C'est la raison d'être de cette discussion. Les DSP doivent être optimisés pour gérer les buffers circulaires afin d'atteindre la vitesse d'exécution la plus élevée possible. En outre, le tamponnement circulaire est également utile dans le traitement hors ligne. Considérons un programme où les signaux d'entrée et de sortie sont complètement contenus dans la mémoire. La mise en mémoire tampon circulaire n'est pas nécessaire pour un calcul de convolution, car chaque échantillon peut être immédiatement accédé. Cependant, de nombreux algorithmes sont mis en œuvre par étapes. Un signal intermédiaire étant créé entre chaque étage. Par exemple, un filtre récursif réalisé sous la forme d'une série de biquades fonctionne de cette manière. La méthode de la force brute consiste à stocker en mémoire la longueur entière de chaque signal intermédiaire. La mise en mémoire tampon circulaire fournit une autre option: ne stockez que les échantillons intermédiaires nécessaires pour le calcul à portée de main. Cela réduit la quantité requise de mémoire, au détriment d'un algorithme plus compliqué. L'idée importante est que les tampons circulaires sont utiles pour le traitement hors ligne, mais essentiels pour les applications en temps réel. Maintenant, nous pouvons examiner les étapes nécessaires pour implémenter un filtre FIR à l'aide de tampons circulaires pour le signal d'entrée et les coefficients. Cette liste peut sembler banale et surexamenée - non pas Le traitement efficace de ces tâches individuelles est ce qui sépare un DSP d'un microprocesseur traditionnel. Pour chaque nouvel échantillon, toutes les étapes suivantes doivent être prises: Le but est de faire exécuter ces étapes rapidement. Puisque les étapes 6 à 12 seront répétées plusieurs fois (une fois pour chaque coefficient dans le filtre), une attention particulière doit être accordée à ces opérations. Les microprocesseurs traditionnels doivent généralement effectuer ces 14 étapes en série (l'une après l'autre), alors que les DSP sont conçus pour les exécuter en parallèle. Dans certains cas, toutes les opérations dans la boucle (étapes 6 à 12) peuvent être complétées dans un cycle d'horloge unique. Permet de regarder l'architecture interne qui permet cette magnifique performance. Je sais que cela est réalisable avec boost par rapport à: 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