Tuesday, 24 January 2017

Moving Average Filter Using Vhdl

J'ai une question liée à la moyenne continue de la valeur ADCs. L'approche que j'ai utilisée est la moyenne continue d'exemples 256 échantillons. La valeur adcaout (indiquée dans le code ci-dessous) que je reçois sur mon GUI augmente lentement. Par exemple, si je m'attends à une valeur de 100mA, My GUI affiche 4mA, 8mA, 15mA. Et puis finalement après 2 minutes je reçois la valeur stable 100mA. Je veux voir le 100mA directement sur mon GUI d'adcaout au lieu des valeurs d'incrément et stabiliser après quelque temps. Une autre question est que, Puis-je d'une manière ou d'une autre rendre ce processus rapide afin que je n'ai pas à attendre 3 minutes pour recevoir stable 100 mA de adcaout. L'horloge clk dans la conception numérique ci-dessous est de 20 MHz. L'horloge pour recevoir des valeurs ADC sur la carte FPGA est de 15 KHz. - le fichier adc. vhd est ci-dessous: Votre code est modifié comme suit: La sortie finale que je vois sur mon GUI est slvvalue1 et slvvalue2 Que diriez-vous de ceci: à la réinitialisation (ou à tout autre moment si vous voulez), Valeur de données à tous les éléments de votre tableau de scène. Cela devrait instantanément définir votre moyenne à la valeur actuelle: L'exemple ci-dessous montre le code complet pour une calculatrice de moyenne mobile. Ma suggestion est que vous l'étudiez jusqu'à ce que vous le compreniez. Ensuite, essayez de l'utiliser dans votre conception. Enfin, et seulement après avoir un circuit de base de travail, vous pouvez le modifier pour satisfaire vos contraintes de conception (largeur des données, nombre d'échantillons, gamme d'entiers, l'utilisation de signé vs entier, etc.) Enfin, si vous voulez utiliser Le code ci-dessus pour garder deux moyennes distinctes pour deux signaux distincts, il suffit d'instancier l'entité moyennage deux fois: Edit: Comme je comprends de vos commentaires, vous mai besoin d'une entrée supplémentaire pour définir la moyenne instantanément à la valeur d'entrée actuelle. Dans ce cas, vous pouvez utiliser une entrée de charge comme indiqué ci-dessous: Répondue Nov 26 13 at 15: 45 Est-il possible d'implémenter une moyenne mobile en C sans la nécessité d'une fenêtre d'échantillons Ive trouvé que je peux optimiser un peu, en choisissant Une taille de fenêtre thats une puissance de deux pour permettre le décalage de bits au lieu de diviser, mais pas besoin d'un tampon serait agréable. Existe-t-il un moyen d'exprimer un nouveau résultat de la moyenne mobile uniquement en fonction de l'ancien résultat et du nouvel échantillon Définir un exemple de moyenne mobile, à travers une fenêtre de 4 échantillons pour être: Ajouter un nouvel échantillon e: Une moyenne mobile peut être implémentée récursivement , Mais pour un calcul exact de la moyenne mobile, vous devez vous souvenir de l'échantillon d'entrée le plus ancien dans la somme (c'est-à-dire l'a dans votre exemple). Pour une longueur N moyenne mobile que vous calculez: où yn est le signal de sortie et xn est le signal d'entrée. Eq. (1) peut être écrit récursivement comme So Il faut toujours se souvenir de l'échantillon xn-N pour calculer (2). Comme l'a souligné Conrad Turner, vous pouvez utiliser une fenêtre exponentielle (infiniment longue) qui permet de calculer la sortie uniquement à partir de la sortie passée et de l'entrée courante: mais ce n'est pas une moyenne mobile standard (non pondérée), mais une valeur exponentielle (Au moins en théorie) vous n'oubliez jamais rien (les poids sont de plus en plus petits pour les échantillons loin dans le passé). J'ai mis en œuvre une moyenne mobile sans mémoire élément individuel pour un programme de suivi GPS que j'ai écrit. Je commence par 1 échantillon et diviser par 1 pour obtenir le courant avg. J'ajoute ensuite un autre échantillon et divise par 2 la valeur actuelle. Cela continue jusqu'à ce que j'arrive à la longueur de la moyenne. Chaque fois par la suite, j'ajoute dans le nouvel échantillon, obtenez la moyenne et retirez cette moyenne du total. Je ne suis pas un mathématicien, mais cela semblait être une bonne façon de le faire. J'ai pensé que cela transformerait l'estomac d'un vrai mec de maths, mais il s'avère que c'est l'un des moyens acceptés de le faire. Et ça marche bien. Rappelez-vous juste que plus votre longueur est plus lente, il suit ce que vous voulez suivre. Cela peut ne pas importe la plupart du temps, mais en suivant les satellites, si vous êtes lent, le sentier pourrait être loin de la position réelle et il sera mauvais. Vous pourriez avoir un écart entre le sat et les points de fuite. J'ai choisi une longueur de 15 mise à jour 6 fois par minute pour obtenir un lissage adéquat et ne pas trop loin de la position réelle sat avec les points de sentier lissée. Réponse Nov 16 at 23h03 initialiser total 0, count0 (chaque fois que vous voyez une nouvelle valeur Puis une entrée (scanf), une additionnewValue, un incrément (count), une division moyenne (count total) Toutes les entrées Pour calculer la moyenne sur les seules 4 dernières entrées, il faudrait 4 variables d'entrée, peut-être copier chaque entrée à une variable d'entrée plus ancienne, puis calculer la nouvelle moyenne mobile comme somme des 4 variables d'entrée, divisée par 4 Bon si toutes les entrées étaient positives pour rendre le calcul moyen répondu Feb 3 15 à 4:06 Cela va effectivement calculer la moyenne totale et PAS la moyenne mobile. 3 15 at 13:53 Votre réponse 2016 Stack Exchange, Inc


No comments:

Post a Comment