LabVIEWForum.de - 1D-oder 2D-Array puffern und mitteln

LabVIEWForum.de

Normale Version: 1D-oder 2D-Array puffern und mitteln
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

erstmal möchte ich euch danken, ohne dieses Forum mit den kompetenten Beiträgen und der SuFu wäre mein Messprogramm wohl noch lange nicht so weit, wie es jetzt ist. Leider ist es mittlerweile nicht mehr selbstverständlich, dass ein Forum auch über längere Zeit ein Niveau hält, welches deutlich über dem des Internet-Durchschnitts liegt. Als blutiger Anfänger tue ich mir noch schwer.

So, nun zu meinem Problem, ich hole mal ein wenig aus:
Ich fahre eine 20MHz-Messkarte mit einem externen analogen Start-Trigger, welcher alle 20Hz eine neue Messung startet. Die Messung läuft zwecks Wiederholung in einer For-Schleife, die erzeugten Messdaten werden via Autoindizierung nach der Schleife gesammelt, gespeichert und anschließend gesammelt ausgewertet (kein Beispiel-VI). In diesem Offline-Modus kann ich Spektren mitteln um das Rauschen zu minimieren, siehe Beispiel-VI.

Mittlerweile bin ich daran, eine Online-Auswertung zu erstellen. Die Daten werden von der Messkarte als 2D-Array geliefert und dann von mir nach Kanälen aufgetrennt. Ich habe also im Schleifentakt je Kanal ein 1D-Array. Diese sollen gemittelt werden, dies darf jedoch nicht in der gleichen Schleife passieren, da sonst der Puffer auf das nächste Spektrum wartet, während die Messung wartet, bis der Puffer fertig ist. Dazu müsste ich die ausserhalb der Messschleife Messdaten puffern, wahrscheinlich in einem Schieberegister. Dass bekomme ich aber nicht hin, siehe vereinfachtes Problem-VI.[attachment=53113:ProblemV...ion_9.0_.vi]
Du solltest die Messdatenerfassung in einer separaten Schleife haben.

Ich habe mal schnell dein VI etwas aufgeräumt und simuliere in einer extra Schleife die Messdatenerfassung anhand deiner Messwerte in obiger LVM-Datei.

Lv09_img2
[attachment=24691]
[attachment=24692]

Ich hoffe dies hilft dir weiter....
Ich bin mir noch nicht sicher, ob es weiter hilft,.....muss das erstmal verstehen, was du gemacht hast, mit Queue hab ich noch nicht gearbeitet. Und das Programm tut noch nicht das, was ich erwartet hatte. So wird z.B. die Anzahl der Messpunkte verändert? Auf jeden Fall ist ein kleiner Fehler drin, habe ich die Messdaten spaltenweise, so muss man die dann auch simulieren.

Denn ich wollte: Nimm Spektrum 1, 2 und 3 und mittel die, die Puffergrösse wäre dann 3, da 3 Spektren gemittelt werden. Dann warte auf die nächsten 3 Spektren usw. Und macht es nicht Sinn, den Puffer genauso zuwählen wie man Spektren mitteln möchte?
Achso - ich dachte mit Puffer meinst du die Anzahl Messwerte, da du von einer Onlineauswertung gesprochen hast.

Ein Puffer macht nur Sinn, wenn du nur einen Teil deiner Messungen auswerten willst und den Rest dann verwirfst. Sprich du hast drei Messungen und mittelst diese; jetzt kommt die vierte Messung und du schmeisst die erste Messung aus deinem Puffer um anschliessend über Messung 2 bis 4 zu mitteln. Wenn du jetzt deine Puffergröße auf 4 erhöhst, dann wird aber nicht plötzlich über Messung 1 bis 4 gemittelt sondern es wird sobald Messung 5 verfügbar ist über Messung 2 bis 5 gemittelt.

Ich werde meinen Lösungsansatz mal dahingehend anpassen, dass die Daten entsprechend übergeben werden.
Aha, hatte mich nicht genau ausgedrückt....daher hatte ich auch das Offline-Vi angehängt: Ich habe 100 Spektren in der Datei, jedes á 2500 Punkte. Deutlich zu erkennen: das Rauschen vor dem eigentlichen Signal (ca. 1250 Punkte). Das Ziel ist, mehrere (z.B. 4) Spektren zu mitteln, damit hat man nur noch 25 Spektren á 2500 Punkte, aber nicht mehr so viel Rauschen.
Zitat:in Puffer macht nur Sinn, wenn du nur einen Teil deiner Messungen auswerten willst und den Rest dann verwirfst. Sprich du hast drei Messungen und mittelst diese; jetzt kommt die vierte Messung und du schmeisst die erste Messung aus deinem Puffer um anschliessend über Messung 2 bis 4 zu mitteln. Wenn du jetzt deine Puffergröße auf 4 erhöhst, dann wird aber nicht plötzlich über Messung 1 bis 4 gemittelt sondern es wird sobald Messung 5 verfügbar ist über Messung 2 bis 5 gemittelt.

Das wäre ja sogar ein gleitender Mittelwert, oder? Wäre auch nicht schlecht....
Habe es jetzt auf spaltenweises Arbeiten geändert, aber sobald er fertig ist, schreibt er nullen rein und fängt an, vordere Werte zu löschen...
Hier mein neuer Lösungsvorschlag:
Lv09_img2
[attachment=24695]
[attachment=24696]

Jetzt werden die Spektren gemittelt, nachdem sie komplett "erfasst" wurden. Ich habe dazu jedoch auch noch das SubVI entsprechend anpassen müssen.
Ausserdem wird jetzt vorausgesetzt, dass es immer 2500 Messwerte je Spektrum sind (wegen der Performance) und die eine For-Schleife ausserhalb der Consumer-Loop ausgeführt.

Als kleines Gimmick habe ich noch dafür gesorgt, dass solange noch Daten erfasst werden (bzw in der Queue sind) auch die neuen Daten in den Puffer geschrieben werden. Sobald die Queue gelöscht ist, wird nurnoch mit den Daten im Puffer gearbeitet. Dadurch kannst du noch deine Daten im Graph anschauen und verschiedene Mittelungswerte ausprobieren. Nachteil: die Fehlerbehandlung der Queue wird nicht mehr als Abbruchbedingung in der While-Schleife betrachtet.
DA bleibt mir leider nicht viel zu sagen, ausser: Danke, läuft prima, so habe ich mir das vorgestellt. Noch eins: Jetzt ist der Puffer mindestens so groß wie Anzahl der Spektren geladen werden, ich habe häufig auch 10 000 und mehr, da wird das langsam. Aber jetzt habe ich Grundgerüst, dass ich modifizieren kann. Ich werde daher probieren, nur die Spektren, die gemittelt werden sollen, in den Puffer schreiben zu lassen und danach den Puffer zu leeren.
Referenz-URLs