Saturday 28 October 2017

Moving Average Vhdl Code


Ich habe eine Frage im Zusammenhang mit kontinuierlichen Mittelung von ADCs Wert. Der Ansatz, den ich verwendete, ist die kontinuierliche Mittelung von Beispiel 256 Proben. Der Adcaout-Wert (angezeigt im Code unten), den ich auf meiner GUI empfange, schritt langsam. Als Beispiel, wenn ich erwarte Wert 100mA, Meine GUI zeigt 4mA, 8mA, 15mA. Und dann endlich nach 2 Minuten bekomme ich einen stabilen 100mA Wert. Ich möchte sehen, die 100mA direkt auf meiner GUI von adcaout statt Inkrement Werte und Stabilisierung nach einiger Zeit. Eine andere Frage ist, dass, kann ich irgendwie machen diesen Prozess schnell, so dass ich nicht für 3 Minuten für den Empfang stabil 100 mA von adcaout warten müssen. Die Clock im digitalen Design unten ist 20 MHz. Die Uhr zum Empfangen der ADC-Werte auf der FPGA-Platine beträgt 15 KHz. - die adc. vhd-Datei ist unten: Ihr Code wird wie folgt geändert: Die endgültige Ausgabe, die ich auf meiner GUI sehe, ist slvvalue1 und slvvalue2 Wie über dieses: am Rücksetzen (oder zu jeder anderen Zeit, wenn Sie wollen), weisen Sie die Datain-Wert für alle Elemente in Ihrem Array. Dies sollte sofort den Durchschnitt auf den aktuellen Wert einstellen: Das folgende Beispiel zeigt den kompletten Code für einen gleitenden Durchschnittsrechner. Mein Vorschlag ist, dass Sie es studieren, bis Sie es verstehen. Dann versuchen Sie es in Ihrem Design verwenden. Schließlich, und nur nachdem Sie eine grundlegende Schaltung arbeiten, können Sie es ändern, um Ihre Design-Einschränkungen (Datenbreite, Anzahl der Proben, Bereich der Ganzzahlen, die Verwendung von signierten vs Integer etc.) Endlich, wenn Sie verwenden möchten Den obigen Code, um zwei separate Mittelwerte für zwei verschiedene Signale zu halten, einfach Instanziieren der Mittelung Einheit zweimal: Edit: Wie ich aus Ihren Kommentaren zu verstehen, müssen Sie möglicherweise eine zusätzliche Eingabe, um den Durchschnitt sofort auf den aktuellen Eingangswert. In diesem Fall können Sie eine Lasteingabe wie unten gezeigt: beantwortet November 26 13 um 15: 45Thread: kontinuierliche Mittelung mit VHDL Ich habe eine Frage im Zusammenhang mit VHDL-Programmierung. Ich möchte den kontinuierlichen Durchschnitt berechnen. Mein Beispielcode lautet: Bei jeder positiven Flanke der Uhr ändert sich der Wert von quotout-valquot. Ich möchte kontinuierlich den Durchschnitt von quotout-valquot. Ich möchte durchschnittlich 32 Werte kontinuierlich zu nehmen. Gibt es eine Möglichkeit, wo kann ich durchschnittlich 32 Werte kontinuierlich bis die Uhr läuft. Bitte lassen Sie mich wissen, wie kann ich das tun. Sie können den obigen Code auch ändern. Vielen Dank, November 19th, 2013, 06:01 AM Ich habe eine Frage im Zusammenhang mit VHDL Programmierung. Ich möchte den kontinuierlichen Durchschnitt berechnen. Mein Beispielcode lautet: Bei jeder positiven Flanke der Uhr ändert sich der Wert von quotout-valquot. Ich möchte kontinuierlich den Durchschnitt von quotout-valquot. Ich möchte durchschnittlich 32 Werte kontinuierlich zu nehmen. Gibt es eine Möglichkeit, wo kann ich durchschnittlich 32 Werte kontinuierlich bis die Uhr läuft. Bitte lassen Sie mich wissen, wie kann ich das tun. Sie können den obigen Code auch ändern. Vielen Dank, zuerst müssen Sie nee, um Ihre Syntax zu korrigieren (verwenden Sie nicht dash aber Unterstrich) Für den laufenden durchschnittlichen Filter, ist der einfachste Weg Verzögerung Eingang durch 32 Stufen. Subtrahieren Sie die letzte Stufe von der Eingabe und akkumulieren Ergebnis. November 19th, 2013, 06:03 AM 3 Registriert seit Sep 2012 Beiträge 41 Rep Power 1 Re: Kontinuierliche Averaging mit VHDL Eigentlich habe ich Unterstrich in meinem ursprünglichen Code. Ich weiß nicht, warum habe ich schreiben out-1 hier. Seine out1 Sorry für die Verwirrung. Können Sie mit einem Beispiel beschreiben, wie kontinuierliche Mittelung zu tun. November 19th, 2012, 06:22 AM 4 Registriert seit: Oct 2008 Ort: London Beiträge: 3.365 Reply: 1 Re: kontinuierliche averaging mit VHDL Eigentlich habe ich Unterstrich in meinem ursprünglichen Code. Ich weiß nicht, warum habe ich schreiben out-1 hier. Seine out1 Sorry für die Verwirrung. Können Sie mit einem Beispiel beschreiben, wie kontinuierliche Mittelung zu tun. Eingang gtgtgt. 32 Stufen ----------------- gt subtrahieren Sie die Stufe 32 vom Stromeingang, setzen Sie den Subtrahierer am Ende der Verzögerungsleitung, um die letzte Stufe von der Stromeingabe zu subtrahieren, nehmen Sie dann das Ergebnis der Subtraktion in einen Akkumulator (Rückkopplungsaddierer mit einem Register). Schneiden Sie die Akkumulatorsumme als geeignet ab. November 2009, 07:08 AM Registriert seit: Oct 2008 Ort: Nürnberg Beiträge: 1.896 Standard AW: Re: Continuous Averaging mit VHDL dann nehmen Sie das Ergebnis der Subtraktion in einen Akkumulator (Feedback-Addierer mit einem Register). Schneiden Sie die Akkumulatorsumme als geeignet ab. Verwerfen Sie 5 LSBs vom Akkumulatorergebnis. Die ersten 31 Proben sind nicht korrekt, aber der Stream wird dann rechts. Kaz Nur als Beispiel, ich mache kontinuierliche Mittelung für 4 Werte. Können Sie überprüfen, ob mein Ansatz richtig ist. Summe ist der ausgegebene Mittelwert. Der obige Code funktioniert, wenn ich unsigned Zahlen haben. Aber ich möchte den Stdlogicvektor durchschnittlich. Die datain ist definiert als: datain: in stdlogicvector (11 downto 0) Bitte helfen Sie mir bei der Lösung dieses Problems. Bitte ändern Sie den obigen Code, so dass ich kontinuierliche Mittelung Werte für Vektor outval erhalten können. November 20th, 2013, 11:09 PM 9 Registriert seit: Oct 2008 Ort: Luzern Beiträge: 3.312 Registriert seit: Oct 2008 Ort: NRW Beiträge: Können Sie überprüfen, ob mein Ansatz richtig ist. Summe ist der ausgegebene Mittelwert. Der obige Code funktioniert, wenn ich unsigned Zahlen haben. Aber ich möchte den Stdlogicvektor durchschnittlich. Die datain ist definiert als: datain: in stdlogicvector (11 downto 0) Bitte helfen Sie mir bei der Lösung dieses Problems. Bitte ändern Sie den obigen Code, so dass ich kontinuierliche Mittelung Werte für Vektor outval erhalten können. Ich sehe nicht, wie Ihr Ansatz funktioniert. Wenn es mir ist, folge ich einfach dem Diagramm, das ich früher gepostet habe. Zum Beispiel Re: kontinuierliche Mittelung mit VHDL Ihr Ansatz didnt Arbeit für mich. Ich überprüfte die Ausgabe auf dem FPGA aber es didnt Arbeit für mich. Grundsätzlich versuche ich, die ADC Ausgangswerte zu stabilisieren. Das ist, warum ich die eingehenden Daten oder erfasste Daten mit ADC mitteln. Outval und outval2 sind die 12-Bit-ADC-Ausgänge. Ill zeigen, wie ich Ihren Ansatz unten verwendet. Bitte korrigieren Sie mich, wenn ich falsch bin: Ich messen die Adc-Werte (Strom und Spannung) quotadcaout und adcboutquot nach der Verwendung der oben genannten Ansatz und ich erhalten falsche Werte. Bitte lassen Sie mich wissen, wo ich falsch mache. Ich bin nicht sicher der richtigen Lösung aber seit dem Summieren der Durchschnitt jeder Probe würde eine angemessene Menge von Rundungsfehler einzuführen. Hmm Ich frage mich, wenn die Trennung der gebrochenen Teil aus dem ganzen Teil helfen würde. Teilen Sie den ganzen Teil jeder Zahl durch den Zähler. Halten Sie drei laufende Summen: 1) der Durchschnitt der ganzen Teile, 2) der Rest von jeder Division und 3) der Bruchteil einer jeden Zahl. Jedes Mal, wenn der ganze Teil einer Zahl geteilt wird, wird das gesamte Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der verbleibenden laufenden Summe addiert. Wenn die verbleibende laufende Summe einen Wert erhält, der größer oder gleich dem Zählwert ist, wird sein dividiert durch die Zählung mit dem gesamten Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der restlichen laufenden Summe addiert. Auch wird bei jeder Berechnung der Bruchteil zur Bruchlaufsumme addiert. Wenn die Mittelung beendet ist, wird die verbleibende laufende Summe durch die Zählung geteilt, und das Ergebnis wird der durchschnittlichen laufenden Summe als eine fließende Zahl hinzugefügt. Zum Beispiel: Nun, was mit der fraktionalen laufenden Summe zu tun. Die Gefahr des Überlaufs ist hier viel weniger wahrscheinlich, obwohl es immer noch möglich ist, so dass man damit umgehen würde, wäre es, die gebrochene laufende Summe durch den Zähler am Ende zu teilen und es zu unserem Ergebnis hinzuzufügen: Eine Alternative wäre, den fraktionalen Betrieb zu überprüfen Summe bei jeder Berechnung, um zu sehen, ob sie größer oder gleich count ist. Wenn das passiert, tun Sie einfach das Gleiche, was wir mit der restlichen Summe machen. Ausgezeichnet Jomit Vaghela 6-Mar-07 20:00 Ich mochte, was Sie sagten, dass kleine Jobs schnell zu großen Jobs werden. Denken an Optimierung während Codierung ist eine gute Praxis. Vielen Dank Mike DiRenzo 5-Mar-07 15:26 Dies ist das erste Mal, dass ich auf einen Ihrer Artikel geantwortet haben. Ich bin aber ein sehr begeisterter Leser. Während des Studiums musste ich gewichtete gleitende Durchschnitte und einfache auch berechnen. Heck, hatte ich sogar einige meiner eigenen gleitenden durchschnittlichen Algorithmen in einer benutzerdefinierten ERP-Implementierung vor einiger Zeit auf der Grundlage einiger der gleichen Formeln, die ich in Operations 101 gelernt zu schaffen. Aber diese Umsetzung, mit Generika, weit überwiegt alles in Bezug auf die Optimierung, Einfachheit und verdammt richtige Coolness. Vielen Dank dafür. Einer Ihrer vielen Fans, In Ruhe und Stille, die Wahrheit wird klar. Ewma gobgob 5-Mar-07 4:30 Wenn Ihr versuchen, einen einfachen gleitenden Durchschnitt zu berechnen, müssen Sie eine Sammlung, die sehr komplex ist für eine solche einfache Aufgabe zu halten. Wie wäre es mit einem ewma Seine 2 Zeilen Code, viel einfacher. (1-alpha) newValue Re: ewma Marc Clifton 5-Mar-07 4:47 Wie wäre es mit einem ewma Interessante Idee. Für Leser, die nicht wissen, was ein ewma ist, ist es ein exponentiell gewichtet Moving Average. Die Leute sind nur notorisch unmöglich. --DavidCrow Theres Keine Entschuldigung für nicht kommentieren Ihren Code. - John Simmons / outlaw Programmierer Leute, die sagen, dass sie ihren Code später umgestalten, um es gut zu machen nicht verstehen Refactoring, noch die Kunst und Handwerk der Programmierung. - Josh Smith Re: ewma pwasser 5-Mar-07 12:21 Eine Schätzung des gleitenden Mittelwertes, wenn die Behältergröße für den gleitenden Durchschnitt n ist, kann erhalten werden durch: NewAverage (((n-1) OldAverage) newValue) / n Dies funktioniert, sobald der Behälter voll ist (Probennummer n). Der Behälter, der teilweise voll ist, wird häufig behandelt, indem ein Samenwert für den anfänglichen gleitenden Durchschnitt (OldAverage) verwendet wird und dann diese Berechnung verwendet wird. Dies nimmt eine normale Verteilung der Werte etc. Sie waren beschäftigt Colin Angus Mackay 4-Mar-07 11:37 Posting zwei Artikel heute Abend. Große Arbeit Ich weiß nicht, wie Sie es tun. Ive erhielt ungefähr 4 oder 5 Artikel halb fertig und ich scheine nie, die Zeit zu finden, sie zu vollenden. Gut. Vielleicht, wenn ich aus der Lounge Id verwalten. Re: Sie waren beschäftigt Marc Clifton 4-Mar-07 13:25 Colin Angus Mackay hat geschrieben: Posting zwei Artikel heute Abend. Große Arbeit Dank schrieb ich eigentlich den Artikel auf den laufenden Durchschnitt und erkannte, dass die kreisförmige Liste tatsächlich ein wirklich guter Stand-alone-Artikel wäre. Plus, sie sind leichte Artikel. Ich kann sie ziemlich schnell wegdrehen. Sein gerade hartes, an nützliches aber einfaches Material zu denken. Stellt sich heraus, ich brauchte diese beiden Klassen sowieso. Die Leute sind nur notorisch unmöglich. --DavidCrow Theres Keine Entschuldigung für nicht kommentieren Ihren Code. - John Simmons / outlaw Programmierer Leute, die sagen, dass sie ihren Code später umgestalten, um es gut zu machen nicht verstehen Refactoring, noch die Kunst und Handwerk der Programmierung. - Josh Smith Re: Sie waren beschäftigt JeffPClark 8-Mar-07 0:07 Von dem, was Ive von Marc gelesen, hat er wahrscheinlich ein Programm, das ein Stück Code untersuchen und erklären kann, die komplizierten Details, dann veröffentlichen sie direkt zu Code Project . Jeff Clark Systems Architect JP Clark, INC. Columbus, Ohio Letzter Besuch: 31-Dec-99 18:00 Letzte Aktualisierung: 7-Oct-16 2:49 Allgemeine Nachrichten Vorschlag Frage Bug Antwort Joke Lob Rant Admin Verwenden Sie CtrlLeft / Right zu wechseln CtrlUp / Down, um die Threads zu wechseln, CtrlShiftLeft / Rechts, um Seiten zu wechseln. Durchschnittswerte / Einfacher gleitender Durchschnitt Durchschnittswerte / Einfacher gleitender Durchschnitt Sie werden aufgefordert, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, indem Sie eine beliebige Sprache verwenden. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktion / Klasse / Instanz, die einen Punkt dauert und gibt eine Routine zurück, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zurückgibt. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160-Nummern aus dem Strom 160, wobei 160 P 160 als Periode bekannt ist. Sie kann implementiert werden, indem eine Initialisierungsroutine mit 160 P 160 als Argument 160 I (P) 160 aufgerufen wird, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen aufeinanderfolgenden Elementen eines Stroms von Zahlen aufgerufen wird, den Mittelwert von (up To), die letzten 160 P 160 von ihnen, rufen Sie diese 160 SMA (). Das Wort 160 stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit für 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Der Zeitraum 160 P 160 Ein geordneter Container von mindestens den letzten 160 P 160 Nummern von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe von 160 I (), 160 der Initialisierer, 160 separate Routinen zurückgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die letzten p Werte zu halten. Jede vom init-moving-average zurückgegebene Funktion hat ihren Zustand in einem Atom, das einen Queue-Wert enthält. Diese Implementierung verwendet eine zirkuläre Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der sich gerade aus dem Fenster bewegt und durch den gerade addierten Wert ersetzt wird. Verwenden eines Closure-Edit derzeit Diese sma kann nicht nogc, weil es eine Schließung auf dem Heap zugeordnet. Einige Escape-Analyse konnte die Heap-Zuweisung entfernen. Verwenden einer Strukturbearbeitung Diese Version vermeidet die Heapzuweisung des Verschlusses, der die Daten im Stapelrahmen der Hauptfunktion hält. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Näherungen aufeinandertreiben und wachsen, kann der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Zustand teilen. Es ist idiomatisch in E, die Eingabe von der Ausgabe (Lesen von Schreiben) zu trennen, anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixierprogramm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die run-Funktion liest die numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Verschlüsse, aber unveränderliche Variablen. Eine Lösung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte für eine gegebene Reihenfolge von Elementen zu berechnen. Es ist weniger effizient Schleife wie in den folgenden Befehlen. Fordert kontinuierlich einen Eingang I auf. Die dem Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS gefunden werden. Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisieren der gleitenden Durchschnittsberechnung und Definieren des Zeitraums von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3), und das Ergebnis wird auf der Variablen x gespeichert und movinav2 (4, : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) / 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Index-Variable, und es zeigt auf das Ende der Unterliste die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste bei der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen p Elemente berücksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewöhnlich negativ sein, so daß die folgende Gleichung negative Indexe vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen ist ebenfalls kleiner, der korrekte Wert (Endindex - Anfangsindex 1) oder die Anordnung der Gleichung (i - (max (ip, 0) 1) 1) , (I-max (ip, 0)). Die Variable z enthält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) .) Wird sie addieren Summe (.) / (Iz) ri wird sie mitteln und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern Verwenden eines Verschlusses und Erstellen eines funktionsfähigen Durchschnitts Mittel der Zeitreihendaten (Beobachtungen gleich zeitlich beabstandet) Mehrere aufeinanderfolgende Zeiträume. Wird bewegt, weil es kontinuierlich neu berechnet wird, sobald neue Daten verfügbar sind, schreitet es fort, indem es den frühesten Wert fällt und den letzten Wert addiert. Beispielsweise kann der gleitende Durchschnitt der sechsmonatigen Verkäufe berechnet werden, indem man den Durchschnitt der Verkäufe von Januar bis Juni, dann den Durchschnitt der Verkäufe von Februar bis Juli, dann von März bis August und so weiter berechnet. (1) reduzieren die Wirkung von temporären Variationen in den Daten, (2) verbessern die Anpassung von Daten an eine Zeile (ein Prozess namens Glättung), um die Daten Trend deutlicher zu zeigen, und (3) markieren Sie einen beliebigen Wert über oder unter der Trend. Wenn Sie etwas mit sehr hoher Varianz sind das Beste, was Sie möglicherweise tun können, ist herauszufinden, den gleitenden Durchschnitt. Ich wollte wissen, was der gleitende Durchschnitt der Daten war, so hätte ich ein besseres Verständnis davon, wie wir taten. Wenn Sie versuchen, herauszufinden, einige Zahlen, die oft das Beste, was Sie tun können, ist die Berechnung der gleitenden Durchschnitt zu ändern. Das beste von BusinessDictionary, geliefert täglich

No comments:

Post a Comment