Saturday 20 May 2017

Moving Average Labview Fpga

Berechnen des gleitenden Durchschnitts Dieses VI berechnet und zeigt den gleitenden Durchschnitt mit einer vorgewählten Zahl an. Zunächst initialisiert das VI zwei Schieberegister. Das obere Schieberegister wird mit einem Element initialisiert und fügt dann kontinuierlich den vorherigen Wert mit dem neuen Wert hinzu. Dieses Schieberegister hält die Summe der letzten x Messungen. Nach dem Teilen der Ergebnisse der Add-Funktion mit dem vorgewählten Wert berechnet das VI den gleitenden Mittelwert. Das untere Schieberegister enthält ein Array mit der Dimension Average. Dieses Schieberegister hält alle Werte der Messung. Die Ersatzfunktion ersetzt nach jeder Schleife den neuen Wert. Dieses VI ist sehr effizient und schnell, weil es die replace-Element-Funktion innerhalb der while-Schleife verwendet, und es initialisiert das Array, bevor es die Schleife eintritt. Dieses VI wurde in LabVIEW 6.1 erstellt. Ich habe ein Problem mit meinem Filter, dem exponentiell gewichteten gleitenden Durchschnittsfilter (IIR 1. Ordnung). Aus dem Buch: Verständnis der digitalen Signalverarbeitung (Lyons Richard) Ich habe die folgende Formel Berechnung der 3dB-Frequenz (fc) aus alpha. Alpha ist der Parameter zur Steuerung des Filters. Differentialgleichung des Filters: ynxnalpha (1 - alpha) yn-1 Beziehung zwischen fc und alpha: alpha cos (2fc / fs) - 1 sqrtcos (2fc / fs) - 4cos (2fc / fs) 3 Wenn ich nun eine 3dB-Frequenz wähle Von 0,0794 Hz (Zeitkonstante (TC) 2s) alpha 0,00169621. (fs94Hz) Bei einem IIR Filter 1. Ordnung ist die Anstiegszeit (ta) der Stepresponse (von 10 bis 90): ta2,2TC, Ta 4,4s. Aber wenn ich die Schrittantwort zu simulieren, ist meine Anstiegszeit etwa 3 mal von diesem Wert bei 14s. Ich kann nicht erklären, warum die Sprungantwort meines Filters sich so sehr unterscheidet. Für mein Moving Average Filter ist die berechnete und simulierte Anstiegszeit gleich. Ich habe die vi, die auf dem angeschlossenen FPGA durchgeführt wird. Vielleicht kann jemand einen Fehler finden. (Siehe auch Alpha-Filter oder RC-Filter) Ist Ihre Sampling-Frequenz (fs) richtig Wenn die Loop-Timing nicht übereinstimmt, würde das erklären. Ihre Datentypen sehen gut aus (um Alpha innerhalb von 1 zu erhalten). Aber ich würde vorschlagen, eine kleine Änderung in der Umsetzung. Wie es aussieht, ist es ein wenig anfällig für abgerundetes Treiben, weil (1-alpha) wiederholt mit dem yn-1 multipliziert wird. Eine etwas zuverlässigere Methode heißt yn yn-1 (alpha (xn - yn-1)). Der Unterschied ist subtil, aber gibt mir bessere Ergebnisse oft. Und es eliminiert eine Multiplikation. By the way, reinterpret Zahl tut das Gleiche wie Ihre Konvertierung von FXP zu bool und dann zurück. Es ist ein wenig weniger verwirrend, though. Im ein wenig verwirrt durch die zeitgesteuerte Schleife, die nie Schleifen. Tut es inforce Timing so (ich davon ausgegangen, es wäre nicht, so dass nie verwendet es ich den Loop Timer statt.) CLD User seit rev 8.6. Nachricht 2 von 13 (889 Ansichten) Re: Exponentia l Moving Average Schritt Antwort fpga 10-01-2015 02:05 AM - editiert 10-01-2015 02:17 AM Danke für deine Antwort. 1, ich beweisen meine Sampling-Frequenz mit dem Loop-Timer. Meine Eingabe sind 425.532 Ticks, die gleich 94 Hz ist. Diese Tickrate wird durch Ticks EWMA bestätigt. --gt Vielleicht kann jemand den Code testen und mir sagen, 2, fand ich Ihren Ansatz in den Tricks und Tipps Abschnitt von Lyon Buch. Ich werde einen Versuch machen, aber könnten Sie erklären, die runden abtreiben ein wenig bin ich ganz neu in diesem Bereich. Gibt es einen weiteren Vorteil aus der Beseitigung eines Multiplikators außer ressources Sind der Frequenzgang, Impulsantwort und Schrittantwort die gleichen 3, wenn ich nur bitshift, bin ich Art ein verwendet, um diese Methode nicht sicher, ob die reinterprate Funktion weniger Ressourcen verwendet. Aber danke, dass du es bemerkt hast. 4, Die zeitgesteuerte Schleife iteriert alle 425.532 Zecken einmal. So wird mit einer Frequenz von 94Hz ein Wert durch den Code berechnet, da der Code innerhalb der zeitgesteuerten Schleife nur eine Iteration benötigt. Oder bin ich missunderstanding Ihre Frage Ich bin nicht sicher, welche weiteren Informationen Sie benötigen. Ich versuche, die Sprungantwort eines gleitenden Durchschnitts mit einem exponentiellen gleitenden Durchschnitt (EWMA) zu vergleichen. Eigentlich möchte ich nur die Theorie bestätigen. Wie ich oben erwähnte, um eine Zeitkonstante von 2s bei einer Abtastrate von 94 Hz zu erhalten, muss alpha 0,00169 sein. Die Anstiegszeit der Sprungantwort von 10 bis 90 des Endwertes unterscheidet sich von der Theorie. Aufstiegzeit sollte 4,4s mit Zeitkonstante 2s sein, aber ich erhalte fast 14s, wenn ich meinen Code auf dem FPGA laufe. Ich bestätigte, dass mit dem Alpha 0,00169 mein Code 1297samples von 0,1 bis 0,9 (Endwert 1, Startwert 0) erhält. Wie Sie in meinem Code sehen können, überprüfe ich die Schleifenzeit mit dem Indikator ticks ewma, um die Abtastrate der SCTL zu bestätigen. Kann jemand anderes die 1297samples bestätigen, die bei alpha benötigt werden 0,00169 Ursache Ich denke, dass ich zu viele Samples benötige um den 0,9 Wert zu erreichen. Ich habe bereits die vorgeschlagene EWMA-Version aus der ersten Antwort. Das gleiche Problem hier. Nachricht 5 von 13 (839 Ansichten) Antworten mit Zitat Hallo ihr Lieben! Meine Eingabe sind 425.532 Ticks, die 94 Hz entspricht. Diese Tickrate wird durch Ticks EWMA bestätigt. --gt Vielleicht kann jemand den Code testen und mir sagen, 2, fand ich Ihren Ansatz in den Tricks und Tipps Abschnitt von Lyon Buch. Ich werde einen Versuch machen, aber könnten Sie erklären, die runden abtreiben ein wenig bin ich ganz neu in diesem Bereich. Gibt es einen weiteren Vorteil aus der Beseitigung eines Multiplikators außer ressources Sind der Frequenzgang, Impulsantwort und Schrittantwort die gleichen 3, wenn ich nur bitshift, bin ich Art ein verwendet, um diese Methode nicht sicher, ob die reinterprate Funktion weniger Ressourcen verwendet. Aber danke, dass du es bemerkt hast. 4, Die zeitgesteuerte Schleife iteriert alle 425.532 Zecken einmal. So wird mit einer Frequenz von 94Hz ein Wert durch den Code berechnet, da der Code innerhalb der zeitgesteuerten Schleife nur eine Iteration benötigt. Oder bin ich missunderstanding Ihre Frage Ich habe eine Kalkulationstabelle zu simulieren, und erhalten fast genau die gleiche Antwort (1299 Zyklen von 0,1 bis 0,9 gehen). Spreadsheets machen ein praktisches Werkzeug für Berechnungen. 1. Okay. Ich habe noch nie die Single-Cycle-Timed-Loop (SCTL) mit der T geschrieben, um die Haltestelle. Es würde dazu führen, dass die mathematischen Funktionen Single-Zyklus, aber Im nicht sicher, ob das ein Vorteil ist. Ich wollte nur sicherstellen, dass die Zeit bestätigt wurde, und es ist. 2. Die Abrundung wird wahrscheinlich nicht angezeigt, es sei denn, Ihre Eingabe ist klein (kleiner als 0,1). Ich sehe jetzt, dass Sie 40 Bits (39 rechts der Dezimalzahl) für die Rückmeldung haben. Das dauert ziemlich viel FPGA zu multiplizieren, aber nicht rund-off Fragen haben. Andere Teile hatten nur 18 Bits (17 rechts von der Dezimalstelle), so dass alpha (0.00169 / - .000007) mal eine Eingabe von 0,1 wäre 0.000169 / - 0,000007 oder 7 Fehler). Aber das Multiplizieren ist auch 40 Bit, also sollten Sie keine Probleme sehen. Typischerweise hat der Ausgang yn weniger Bits und runden das letzte Bit ab. Aber weil es in einer Schleife Multiplikation mit 1-Alpha jedes Mal, die Round-off manchmal akkumuliert jede Schleife, bis es groß genug ist, um die addiert Ergebnisse beeinflussen. Es ist schwer zu erklären, aber meine allgemeine Faustregel ist, dass ich erwarten, dass ein Fehler gleich dem kleinsten Bit geteilt durch alpha, mit der ursprünglichen Methode oder etwa die Hälfte, dass usint die Ein-Multiplikation-Methode. Die Antworten werden fast identisch sein, mit Ausnahme eines kleinen Unterschieds. Der größte Vorteil ist, FPGA Platz zu sparen (und Kompilierzeit). Und Sie können Ihre Anzahl von Bits etwas reduzieren, um noch mehr zu sparen. 3. Sie sind grundsätzlich identisch. Und beide Methoden sind kostenlos in FPGA. Die Bits arent geändert, so dass keine Logik benötigt wird, sie sind einfach umbenannt. 4. Ich glaube, Sie haben es gut beantwortet. In der Regel, an diesem Punkt würde ich einstellen Alpha, bis meine Ergebnisse, was ich wollte, und weitergehen. Ich hasse es nicht verstehen ein Missverhältnis, aber dont haben in der Regel Zeit, um in sie tauchen. Aber, um der Wissenschaft willen, können wir bedenken, dass Ihre Formel fehlerhaft sein kann. Ich denke, Sie können mit einer Formel für einen kontinuierlichen exponentiellen Zerfall (e-t / tau), nicht für einen diskreten exponentiellen Zerfall ((1-alpha) i). Es ist einfacher, dies als eine Schrittfunktion von 1 bis 0 zu betrachten. In diesem Fall ist yn (für ngt0) yn (1-alpha) (n). Wir können n für yn 0.9, als nlog1-alpha (0.9) 62 und n für yn 0.1, als 1361, für eine Differenz von 1299 finden. CLD Benutzer seit rev 8.6. Danke für Ihre ausführliche Antwort. Hinsichtlich des Problems mit der Anstiegszeit glaube ich, dass ich den Fehler gefunden habe. Sie könnten Recht haben, dass die Formel nicht korrekt ist, oder was wohl von mir missverstanden wird und im falschen Kontext steht. Als ich von der Arbeit nach Hause fuhr, erinnerte ich mich an eine praktische Funktion von labview: Glättung der Filterkoeffizienten. vi Hier müssen Sie nur tau / TC und fs setzen und Nominator und Nenner für exponentiellen gleitenden Durchschnitt und gleitenden Durchschnitt berechnen. Da der Nominator alpha ist, könnte ich das Ergebnis mit der Formel vergleichen, die ich verwendet habe, und es gab einen gewissen Unterschied. Labview verwendet die folgende Formel: alpha1-exp (-1 / (fsTC)). Mit dieser Formel ist TC2s gleich alpha0,0053. Und mit diesem Alpha meine Simulation funktioniert Risetime 4,4s Zitieren Sie: In der Regel, an diesem Punkt würde ich einstellen Alpha, bis meine Ergebnisse, was ich wollte, und gehen weiter. Ich würde gerne das gleiche tun, aber da dies meine Masterarbeit ist, muss ich solche Dinge jetzt wieder auf die Rundung Fragen zu lösen. Ich verstehe, dass kleine Werte ein größeres Problem sind. Da dieser Filter in einem Lock-In verwendet wird, werden die Werte WIRKLICH klein sein. Aber ich habe es bereits auf unserem Messgerät getestet und es funktioniert, dafür werde ich deine Version auch testen, aber wenn ich keine Probleme bekomme, schätze ich es bei 40bits. Die Simulation des folgenden Setups verursachte einen Fehler von 2.3. Mit 57 Bits reduzierte den Fehler auf unter 1. Ich denke, 40bits sollte genug sein. Und in Bezug auf die Ressourcen habe ich keine Sorgen. Obwohl mit einem Myrio am Ende habe ich noch eine Menge DSP Slices für die Multiplikation und 10 gratis FlipFlops. Also ich denke, dieses Thema ist gelöst. Dank für Ihre große Hilfe und interessante Gedanken. Cool Im froh, seine Arbeit, jetzt. Ich wuchs in der Ära ohne DSP-Scheiben in FPGAs und kleinere Zellenzahlen, so immer noch dazu neigen, in diesen Begriffen zu denken. Ich bevorzuge immer noch, 25 Minuten Programmierung zu verbringen, um meine Kompilierzeiten nach unten, though. Ive hatte Fälle, in denen ich Schnitt kompilieren Zeit von 90 Minuten bis 45 Minuten durch Optimierung ziemlich viel. Mit einem leistungsfähigen Server für das Kompilieren, das ist weniger wichtig. Eine dieser Optimierungen ist, Bit-Zählungen zu reduzieren, wo ich kann, vor allem für Multiplikationen. Zum Beispiel ist alpha / 16/0 und für 0,0053 könnten Sie auch / 12 / -4 (negative Integerzahl) verwenden. Sie können auch in der Lage, eine Menge von oberen Bits aus Ihrer Eingabe zu beseitigen. 5 Minuten, um die kleinste Bit-Zählung holen kann leicht zu speichern 2-10 Minuten für jedes Kompilieren. Meine zweite Optimierung ist, Multiplikationen zu reduzieren, aber mit einem DSP-Slice, das ist nicht so wichtig. Ich kippe finde gute Dokumentation über die DSP-Scheiben (wenn Sie einige haben, bitte Pfostenverbindungen), aber, wie ich es verstehe, wenn Sie größere Zahlen (Bitzählimpulse) vermehren, benötigt es mehrfache Scheiben und möglicherweise Zeit, die Resultate zu kombinieren. Und ein weiterer Trick: wählen Sie ein Alpha mit einem einfachen binären Wert, wie 1/256 (Sie ausgewählt etwa 1/189), und ändern Sie fs, bis Sie die gewünschte Glättung erhalten. Verwenden Sie dann eine Konstante für alpha. Multiplizieren mit einer konstanten 1/256 ist im FPGA frei (es schiebt nur die Bits). Für diese Angelegenheit, die Herstellung Alpha-Konstante kann optimieren die Multiplikationen ziemlich viel. Abhängig von den Smarts des Optimierers kann es stattdessen zu einem Satz von Addierern geändert werden. Front-Panel-Eingänge sind großartig für die Dinge zu arbeiten, aber Konstanten optimieren viel besser. CLD Benutzer seit rev 8.6. Wenn Sie durchschnittlich 16 mal so viele Samples (fs 16x was es war), sollten Sie 4 weitere Bits in Ihr Feedback. Sie haben bereits pleanty, so dass möglicherweise nicht wichtig, wenn Sie viel schneller gehen. Ansonsten ist die Erhöhung fs wahrscheinlich gut. Wenn der Eingang hat Niederfrequenz-Rauschen, über Sampling nicht helfen, beseitigen, dass überhaupt. Hochfrequentes Rauschen verringert sich jedoch bei einer Überabtastung. Wenn zum Beispiel das Rauschen über 10 Hz -5dB (das ist das 10- .5-fache der Amplitude des Signals, das Sie mögen), und Sie Probe bei 20S / s, werden Sie wahrscheinlich abholen -5dB in Ihrem ersten Lesungen. Wenn Ihr -3dB (fc) ist auch 10Hz, dann youll am Ende mit rund -8dB Rauschen in Ihrem Signal links. Wenn Sie stattdessen 200S / s nehmen, durchschnittliche Gruppen von 10, dann diese Durchschnitte an den Filter weitergeben, werden Sie nicht helfen, Rauschen bei 10Hz (Sie wurden 10Hz Rauschen ohne Sampling-Effekte), sondern reduziert Rauschen über 100Hz um etwa einen Faktor (Aber nicht wirklich) 10. Es gibt ganze Semester-lange Klassen, die diskutieren, warum, wie, etc. Die kurze Version ist dies: Jedes Sample ist die Summe aus dem Signal und Lärm. Wenn Sie 10 Samples hinzufügen, erhalten Sie 10x das gewünschte Signal und die Summe von 10 Rauschen. Die Art des Rauschens bestimmt, was Sie erhalten, wenn Sie die 10 Samples von Rauschen hinzufügen. Gauss-Rauschen fügt einen Weg hinzu (so etwa: Wenn 83 von Proben unter X liegen, hat die Summe 83 Summen unter 1.1X oder so ähnlich). Lineares Rauschen fügt einen anderen Weg. Und wiederholen Muster hinzufügen einen anderen Weg. Also, ohne genau zu wissen, was der Lärm ist, kann niemand Sie mit Sicherheit beantworten, außer dass die Mittelung mehrere Proben wahrscheinlich hilft, und fast nie weh tut. Es gibt auch die Frage des Aliasing. Wenn Sie eine Sinus-Interferenz von 60Hz haben, bei -3dB, und Sie Probe bei 10.001S / s (immer davon ausgehen, dass die Uhren nicht passt genau), erhalten Sie etwas wie 0.006Hz bei -3dB hinzugefügt, um Ihr Signal, und Ihr Filter nicht entfernen Sie es. Aber stoßen Sie Ihre Sample-Rate auf 100.001S / s, wird die Interferenz auf etwa 40Hz, so dass Ihr Filter sollte es zu beseitigen. Mittelung von 10 Proben zu einem Zeitpunkt ist eine Art von Filter (Feld). Wenn Sie es in einem Frequenzbereich betrachten, können Sie sehen, dass einige höhere Frequenzen zu niedrigeren Frequenzen auf eine ungerade Weise verschoben werden, und nicht alle werden reduziert. Wenn Sie durchschnittlich 4000 S / s, 100 zu einem Zeitpunkt, youll erhalten eine durchschnittliche 40 Mal pro Sekunde. Mit 60Hz Störung, erhalten Sie etwa 1/3 so viel Rauschen, verschoben auf 20Hz, die nicht Filter sowie 60Hz haben würde. So wäre es besser, den EWMA-Filter mit der höheren Abtastrate zu verwenden. Als zu durchschnittlichen Blöcken von Eingängen, dann filtern. Und die Mittelung ist (wahrscheinlich) besser als nur eine langsamere Abtastrate. Wenn Sie einen Eingangsadapter mit eingebauten elektronischen Filtern haben, ist das sogar besser, und es gibt keine Notwendigkeit, mehr als 2x die Filterfrequenz zu probieren. CLD Benutzer seit rev 8.6.


No comments:

Post a Comment