LabVIEWForum.de
Signalverarbeitung - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Signalverarbeitung (/Thread-Signalverarbeitung--13786)

Seiten: 1 2


Signalverarbeitung - Kopmann - 20.12.2006 23:40

Hallo

ich habe ein Problem mit dem Vi der (Signalverarbeitung --> Punkt für Punkt --> Integral und Differenzial -->) Differenzial Vi.
Dieses Vi scheint nicht innerhalb einer Schleife zu laufen. Beim ersten durchlauf meiner Sequenzen arbeit es sehr genau. Jeder Punkt wird gefunden. Beim zweiten Durchlauf wird einfach mein Positionsindex nur um +1 erhöht. Die anschließende such nach den nächsten Maxima und danach wieder Nulldurchgang funktioniert weiterhin sehr gut. [Beispieldatensatz: 9 (Max); 106 (Nulld.); 129 (Min); 139 (kleines Max); 469 (Max); 580 (Nulld.); 581 (sollte Min sein); 582 (sollte kleines Max sein); 941 (Max)usw.]
Ich habe das Programm schon diverse Male in der Aufbaustruktur geändert um vielleicht das Vi so zum laufen zu bekommen aber nichts Hilft. Es sei denn ich wiederhole immer wieder meine Sequenzen um so eine Schleife zu simulieren.

Ich bin leider kein Programmierer von daher gebt mir bitte eine "ausführlichere" Antwort!
Das Programm wurde mit LV 8.0 geschrieben. Als ich es mal auf einer LV 8.2 Version laufen lies funktionierte es nicht???

Vielen Dank Kopi

[attachment=4423]


Signalverarbeitung - Kvasir - 21.12.2006 10:54

Hmm ich versteh dich nicht ganz.

Wenn du die Schleife zum ersten Mal durchlaufen lässt, dann funktioniert es? Die gesamte Schleife?
Startest du die Schleife dann erneut geht es nicht mehr?

Habe ich das so richtig verstanden?

Gruß


Signalverarbeitung - Kopmann - 21.12.2006 16:13

' schrieb:Hmm ich versteh dich nicht ganz.

Wenn du die Schleife zum ersten Mal durchlaufen lässt, dann funktioniert es? Die gesamte Schleife?
Startest du die Schleife dann erneut geht es nicht mehr?

Habe ich das so richtig verstanden?

Gruß


Bei ersten Durchgang funktioniert alles wunderbar. In dem Moment wo das DifferenzierVI zum zweiten Mal aufgerufen wird gibt es keinen anständigen Wert mehr raus. Wie im Beispiel angegeben (die rot Markierten Werte -- an dieser Stelle sind zwei DifferenzierVi hintereinander "geschaltet") die andern Vi's wie Nulldurchgang suchen oder Spitzenwerterkennung funktionieren weiterhin tadellos.
Wäre für jede Hilfe dankbar.

Kopi


Signalverarbeitung - Kopmann - 21.12.2006 16:26

' schrieb:Hmm ich versteh dich nicht ganz.

Wenn du die Schleife zum ersten Mal durchlaufen lässt, dann funktioniert es? Die gesamte Schleife?
Startest du die Schleife dann erneut geht es nicht mehr?

Habe ich das so richtig verstanden?

Gruß


Noch mal zum Beispieldatensatz. Eine Messwerte-Datei besteht aus 2500 Werten verschiedenster Sensoren.
Das Programm soll als erstes nach einem absoluten Maximum schauen hat es das gefunden folgt ein Nulldurchgang danach ein Minima und danach entweder ein Nulldurchgang oder Maxima (unterschiedlich). An den angegebenen Positionen (blau) findet das Programm die richtigen Punkte rot dagegen sind falsche Positionen.
9 (Max)
106 (Nulld.)
129 (Min)
139 (kleines Max)
469 (Max)[/color]
580 (Nulld.)
581 (sollte Min sein)
582 (sollte kleines Max sein)
941 (Max)
1049 (Nulldurchgang)
1050 (sollte Minima sein)
1051 (sollte kleines Max sein)
1414 (Max)[/color]
usw.

Kopi


Signalverarbeitung - Kvasir - 21.12.2006 17:22

Das Vi Schwellenwert such ja kein Maximum, sondern gibt nur dann ein True aus, wenn Punkte auf einem Bereich von "Breite" über deinem "Schwellenwert" sind. Wenn gleich an der Nebenposition ein Minimum ist, dann liegt dieses vermutlich nicht über der Schwelle.

Probier doch mal deine Breite auf 1 zu setzen.

Gruß


Signalverarbeitung - Kopmann - 21.12.2006 19:30

' schrieb:Das Vi Schwellenwert such ja kein Maximum, sondern gibt nur dann ein True aus, wenn Punkte auf einem Bereich von "Breite" über deinem "Schwellenwert" sind. Wenn gleich an der Nebenposition ein Minimum ist, dann liegt dieses vermutlich nicht über der Schwelle.

Probier doch mal deine Breite auf 1 zu setzen.

Gruß

Das Vi schwellenwert habe ich nur gewählt um wenigstens diesen Punkt zu finden. Vorher habe ich dort auch das DifferenzialVi benutzt, weil es einfach besser arbeitet. Leider kann ich die Testdaten nicht Hochladen, dann würdet ihr mein Dilemma sehen.
Die verschiedenen Punkte liegen auch weit genug auseinander so das die Breite sich nicht auf die andern abfragen auswirkt.
Übrigens das Programm im Anhang ist nicht die Programm-Version die ich Ursprünglich beschrieben habe, dort arbeite ich nicht mit den Sequenzen wie du sicher schon bemerkt hast.
Es funktioniert. – Bis auf diesen einen Fehler!!!

Kopi


Signalverarbeitung - Kopmann - 22.12.2006 02:13

Hallo

nachdem ich beim ersten Mal so wenig Feedback bekommen habe versuche ich mein Problem nochmals ausführlicher zu schildern. Vielleicht kann mir so jemand Helfen.

Ich Versuche ein Programm zu schreiben das Herzschläge analysiert. Sprich es soll das Auswurfsvolumen, das Schlussvolumen und das Leckvolumen bestimmt werden. Um diese Werte zu ermitteln sind 5 Punkte nötig. 4 Davon sind direkt auf der Volumenkurve zu finden der 5te wird durch die Drücke bestimmt. Was bedeutet er kommt aus einem anderen Datensatz parallel zum Volumen aufgenommen. Aber damit gibt es auch keine Probleme.

Um mit der Analyse zu beginnen habe ich mir gedacht es ist am einfachsten, wenn man mit der Suche nach dem Maximum des Auswurfsvolumens sucht (in der Datei mit Schwellwertanalyse gelöst. --> wenn true dann speichere Position (des Wertes) in Arry und erhöhe Caseabfrage von 1 auf 2). Als nächstes wird nach dem folgenden Nulldurchgang gesucht. (gelöst mit NulldurchgangVi -->wenn true dann speichere Position (des Wertes) in Arry und erhöhe Caseabfrage von 2 auf 3). Danach muss nach dem nächsten Minimum gesucht werden ("gelöst" mit DifferenzialVi --> wenn true dann speichere Position (des Wertes) in Arry und erhöhe Caseabfrage von 3 auf 4). Der letzte zu suchende Punkt ist abhängig von der Herzklappe die benutzt wird (biologisch oder mechanisch). Dort muss entweder nach einem neuen Nulldurchgang gesucht werden oder nach einem Maximum (gelöst" mit DifferenzialVi oder Nulldurchgang --> wenn true dann speichere Position in Arry und setze Caseabfrage von 4 auf 1). --> jetzt Schleife weil jetzt mindestens 5 Wiederholungen

Mein Problem: Ich würde gern das DifferenzialVi benutzten aber es arbeitet nicht in einer Schleife. Der erste Durchgang klappt wunderbar aber der zweite eben nicht. Siehe Beispieldatensatz: grün korrekt -- rot falsch
Benutze ich statt dem DifferenzialVi ein Min-MaxVi läuft das Programm korrekt aber die Positionen und damit auch die Werte
sind nicht mit ausreichender Genauigkeit gefunden (mangelhaft).

Frage: Wer kennt sich mit dem DifferenzialVi aus und kann mir Helfen das es in einer While-
Schleife läuft?


Beispieldatensatz: Achtung: Die Werte sind die Positionsangaben wo der Wert auf der x-Achse * delta(t) zu finden ist nicht die Messwerte
selber!!!

9 (Auswurfvolumen Max)
106 (Nulld. von Ausw. nach Schlussvolumen)
129 (Min Schlussvolumen Differenzialvi)
139 (kleines Max Differenzialvi)
469 (Auswurfvolumen Max)
580 (Nulld. von Ausw. nach Schlussvolumen)
581 (sollte Min von Schlussvolumen sein Differenzialvi)
582 (sollte kleines Max sein Differenzialvi)
941 (Auswurfvolumen Max)
1049 (Nulld. von Ausw. nach Schlussvolumen)
1050 (sollte Minima Schlussvolumen sein Differenzialvi)
1051 (sollte kleines Max sein Differenzialvi)
1414 (Auswurfvolumen Max)

[attachment=4436]
[attachment=4442] Achtung der Name der Datei hat sich gegenüber dem Programm geändert.



Kopi


Signalverarbeitung - Kvasir - 22.12.2006 10:23

' schrieb:wenn true dann speichere Position in Arry und setze Caseabfrage von 4 auf 1). --> jetzt Schleife weil jetzt mindestens 5 Wiederholungen

Wie darf ich das verstehen?

Du hast um die Schleife in deinem Programm nochmals eine Schleife? Die 5 Arrays abtastet.
Oder meinst du einfach, dass deine Schleife (die ja schon läuft!) nach finden deines letzten Punktes weiterläuft, bis der Datensatz fertig ist? (dann wäre übrigens eine For Schleife geeigneter)

Das Differenzier Vi besitzt einen Eingang names "Initialisieren". Probier doch mal, diesen auf true zu setzen, wenn du zum 2. mal nach dem Minimum suchst. Aber Achtung du darfst ihn nur beim ersten Wert auf true setzen, dann wieder auf false.


Signalverarbeitung - Kopmann - 22.12.2006 11:44

' schrieb:Wie darf ich das verstehen?

Du hast um die Schleife in deinem Programm nochmals eine Schleife? Die 5 Arrays abtastet.
Oder meinst du einfach, dass deine Schleife (die ja schon läuft!) nach finden deines letzten Punktes weiterläuft, bis der Datensatz fertig ist? (dann wäre übrigens eine For Schleife geeigneter)

Das Differenzier Vi besitzt einen Eingang names "Initialisieren". Probier doch mal, diesen auf true zu setzen, wenn du zum 2. mal nach dem Minimum suchst. Aber Achtung du darfst ihn nur beim ersten Wert auf true setzen, dann wieder auf false.


Der Datensatz besteht in der Regel aus 5 Herzschlägen die analysiert werden sollen. Da die Auswertung bis jetzt manuell lief beschränkte man sich auf 5 Wiederholungen. Sollte das Programm irgendwann laufen soll diese Anzahl beliebig erhöhbar sein. Von daher wäre eine Forschleife nicht so gut. Oder?
Mit dem Initieren habe ich mich auch schon rumgequält. Aber eher weniger Erfolg damit gehabt. Auch ist mir unklar was es mit dem Anfangswert-Eingang auf sich haben soll? Die Hilfe ist einfach mangelaft.

Kopi


Signalverarbeitung - Kvasir - 22.12.2006 16:14

- Eine ForSchleife würde den ganzen Datensatz abarbeiten. Wieviele Zyklen du damit auswertest hängt ja sowieso (auch jetzt schon) vom Datensatz ab.
Zur Zeit brichst du ja einfach bei einem bestimmten Index ab. Dies ist aber sehr willkürlich, da das ja voraussetzt, dass du schon weißt, nach wieviele Daten deine 5 Zyklen fertig sind.

- Das Punkt zu Punkt differenzier Vi, das du benutzt arbeitet wie folgt:
Es nimmt das x, das du als Eingang gibst und subtrahiert davon das x, das du als Eingang gegeben hast 2 Aufrufe davor. Dann dividiert es das ganz noch durch 2*dt.
Wenn es erstmals aufgerufen wird, oder du initialisieren auf true setzt zieht er die Anfangsbedingung von x ab.
(Du siehst also die Funktion funktioniert NUR in einer Schleife, da einmaliges Aufrufen dem Vi nur einen Punkt gibt und nichts, wozu es die Differenz bilden kann)

Bsp: du rufst das Vi mit den Zahlen {1,2,3,4,5} hintereinander auf. Anfangswert setzt du 0 (standard), dt=1. Ergebnis dann also:
1. 1 - 0 / 1 = 1
2. 2 - 0 / 2 (2*dt) = 1
3. 3 - 1 (2 vorher) / 2 = 1
4. 4 - 2 / 2 = 1
5. 5 - 3 /2 = 1;

Initialisieren bewirkt also, dass er für die ersten Werte wieder die Anfangsbedingung nimmt und nicht die Werte die zuletzt waren.