LabVIEWForum.de - Moving-Average Filter mit FGV

LabVIEWForum.de

Normale Version: Moving-Average Filter mit FGV
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hey Ihr!!!
Ich habe diese blöde Aufgabe von meinem Dozenten bekommen....

Es soll das VI verwendet werden, dass im letzten Seminar erstellt wurde und eine Sinus-Kurve in einem
X-Y-Graph darstellt.
Nun soll anstatt des "reinen" Sinus-Signals ein verrauschtes Signal im X-Y-Graph dargestellt werden.
Hierzu einfach das VI "Disturb" zwischen Sinus-Generator und Graph einfügen. Das VI kann im FELIX
heruntergeladen werden.
Über einen Moving-Average-Filter soll nun das verrauschte Signal wieder geglättet werden. Hierzu schalten sie
einen Filter zwischen "Disturb"-VI und Graph.

Die Aufgabe besteht nun darin den Filter zu programmieren.
Hierzu soll eine FGV verwendet werden. In der FGV wird ein Array aus 20 Werten gespeichert. Über das ENUM-
Auswahlfeld SET soll ein Array Element mit Index n durch den neuen Wert ersetzt werden. Bei erneutem Aufruf der
FGV mit SET im ENUM-Auswahlfeld ersetzt das neue Element das Array-Element mit Index n+1 usw.
Beachten sie dass der Indexzähler niemals höher als 19 sein darf. Nach 19 folgt in diesem Fall wieder 0. Auf
diese Weise stehen im Array immer die 20 letzten Werte die über SET in die FGV geladen wurden.
Um die gewünschte Funktionalität zu erreichen muss somit neben dem Array auch der Indexzähler in der FGV
gespeichert werden.
Die eigentliche Filterung wird dadurch erreicht, dass der Mittelwert aller Array-Elemente gebildet wird.


ich habe den Sinusgenerator bereits schon hinbekommen...und das Disturb VI integriert.
Das FGV habe ich auch bin mir nur unsicher, dass ich diesen richtig aufgebaut habe...
Jedoch das Hauptproblem ist wie ich das FGV richtig einbinde...habe bereits eine Case-Struktur in das VI Aufgabe_Moving_Average-Filter.vi eingefügt. ohne Filter funktioniert das VI jedoch wie integier ich diesen Filter?

Schon mal vielen Dank!!!!!
Grüße
Chiefhood

EDIT jg: Inzwischen Crosspost: http://labviewportal.eu/viewtopic.php?f=...291#p36574
Hallo chief,

da dies eine offensichtliche Uni-Aufgabe ist, habe ich nur die FGV bearbeitet und wieder angehangen.

Alles weitere ist dir überlassen. Aber wie immer gilt die Reihenfolge:
- nachdenken
- PAP aufmalen
- programmieren...
Wink
okay...dann rätsel ich mal bissi weiter!!!
Vielen DANKE ABER!!!!

Grüße

Chiefhood
Hallo!
ich denke ich habe einen kleinen Fehler entdeckt...
kann es sein, dass ich die konstante 0 bei Schift-Register entfernen muss??
da das VI sonst bei jeder Ausführung ja dann bei null anfängt und nicht weiterzählt....
das gleiche gilt jedoch auch für das Array...das Array wird jedesmal neu initialisiert und somit ist der alter wert weg!!
Der Dozent hat zwar detaillierte Hilfestellung zur Programmierung gegeben, aber vergessen auszuschließen, dass ein FIR-Punkt-zu-Punkt Filter verwendet werden darf (In Basic-Version allerdings nicht enthalten). Insofern wäre das auch erlaubt. (Der Rücksetz-Schalter wäre noch durch ein Enum zu ersetzen um der Aufgabe gerecht zu werden)
[attachment=37986]
Hallo chief,

Zitat:kann es sein, dass ich die konstante 0 bei Schift-Register entfernen muss??
Ja, ein kleiner Lapsus...

Zitat:das gleiche gilt jedoch auch für das Array...das Array wird jedesmal neu initialisiert und somit ist der alter wert weg!!
Das Array wird nur im "Reset"-Case initialisiert - und der wird üblicherweise nur einmal am Anfang aufgerufen. Ansonsten arbeitest du mit "Set" und "Get"...
Hallo,

ja ich denke, da hast du recht.
Außerdem würde ich das Berechnen des Mittelwert in den Case reinpacken und einen Selector statt Quotient and Remainder nehmen - nennt mich verbohrt, aber die Quotient and Remander Funktion ist mir unsympatisch. Wahrscheinlich wegen der FPGA-Programmierung, da ist es der Platzfresser schlechthin...

hier das leicht geänderte VI:
[attachment=37988]

Gruß
Hallo Erik,

Zitat:aber die Quotient and Remander Funktion ist mir unsympatisch
Es wurde bisher nicht deutlich, dass Chiefhood für ein FPGA-Target programmieren soll - und damit ist Q&R die deutlich platzsparendere Alternative. Selbst ein cRIO hat genug CPU-Reserven für ein gelegentlich ausgeführtes Q&R...

Zitat:würde ich das Berechnen des Mittelwert in den Case reinpacken
Ich habe es extra heraus genommen, da man so diese Berechnung nicht in jedem Case extra programmieren muss (wie es vorher der Fall war) und man außerdem bei jedem Aufruf der FGV auch den aktuellen Mittelwert gemeldet bekommt...
Hallo Gerd,

soweit ich das beim überfliegen des VIs gesehen hatte gabs nur einen Case der das Array so verändert dass der Mittelwert neu berechnet werden muss.
Und die Quotient and Remainder Funktion nehme ich auch manchmal, aber hier nicht, weil eh klar ist, dass der Index sich immer nur um 1 erhöht, und keine "Riesenzahlen" mit Rest dividiert werden sollen.
Die Vorschläge werde ja immer komplizierter. Es sei mal darauf hingewiesen, daß die Funktion "Array rotieren", entgegen wie man vernuten könnte, rasend schnell ist, und dass deshalb nichts gegen deren Verwendung spricht.
Außerdem: Man gibt einen Wert ein und holt gleichzeitig den Mittelwert heraus. Mittels "Get" mehrere Male denselben Wert abrufen zu können macht doch keinen Sinn. Sollte man das nicht im Enum weglassen? Diskutieren sollte man auch, ob bei "Reset" am Ausgang Null herauskommen soll, oder ob der gleichzeitig anliegende Eingangsswert als erstes neues Element schon berücksichtig werden soll.
[attachment=37989]
Edit: Wie man aus der detaillierten Programmieranweisung mit Indexzähler usw. sieht, hat der Dozent an diese einfache Möglichkeit ebensowenig gedacht wie an das vorgenannte FIR-Filter.
Seiten: 1 2
Referenz-URLs