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 - 22.12.2006 18:48

' schrieb:- 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.


Hallo Kvasir,

es ist echt toll das du mir versuchst zu helfen. Ich habe übrigens die Testdatendatei hochladen können! Siehe oben! Vielleicht probierst du einmal das Programm aus!

Ich werde deinen Vorschlag einmal ausprobieren. Was mich nur wundert, warum muss ich mit einer Initialisierung nur beim Differenzialvi arbeiten und nicht bei den andern (Nulldurchgang und Max mit Schwellwertsuche)?


Signalverarbeitung - Kvasir - 22.12.2006 21:26

Werds mir morgen mal anschauen.


Signalverarbeitung - Kvasir - 23.12.2006 17:05

Habe dir dein Programm nun umgeschrieben. Schau mal ob das passt.

Der Fehler in deinem Programm liegt definitiv bei initialisieren. Wenn ich deine Variante öfter hintereinander laufen lasse bekomme ich auch jedes mal andere Werte. Ich habe also alles komplett neugeschrieben, somit weiß ich auch nicht, wo das Problem genau gelegen hatSmile

Ich habe auch die Programmstruktur enorm vereinfacht. Dein Programmierstil ist, um es freundlich zu formulieren, "LV-untypisch".

- Versuch lokale Variable zu vermeiden. Diese brauchen viel Speicher und sind enorm unübersichtlich. Es gibt Situationen, wo man auf diese zurückgreift, aber das ist eher die Ausnahme, nicht (wie bei dir) die Regel.

- Ich habe deine Cases in einen zusammengefasst. An eine Casestruktur kann man nicht nur einen Boolean anlegen, sondern auch Zahlen, Enums, ... Das Prinzip nach dem die Schleife nun arbeitet nennt man "state machine". Du findest hier im Forum schon einige Beiträge dazu.

- Viele Array Funktionen brauchen keinen Index. Das ist zwar eine Kleinigkeit, aber so hältst du dein Programm von unnötigen Drähten frei. Auch die "Indexing" Funktion einer For Schleife ist sehr brauchbar. Dadurch sparst du es dir überhaupt die einzelnen Elemente herauszuholen aus dem Array. Das erledigt schon die Schleife.

Ich hoffe das Programm funktioniert nun wie gewünscht. Wenn du noch Fragen hast zu dem Programm meld dich.
Ansonsten wünsch ich schonmal ein frohes Fest.

Gruß


Signalverarbeitung - Kvasir - 23.12.2006 17:43

Hab herausgefunde, was dein Problem war:

Beim ersten Zyklus klappt alles.
Beim zweiten mal durchlaufen funktioniert es bis zum ersten mal die Diff Funktion aufgerufen wird. Hier passiert folgendes:

Die Funktion zieht vom aktuellen Wert den letzten Wert ab. Der letzte Wert in der Diff Funktion ist ja das Minimum vom ersten Zyklus.
Dieser Wert ist jedoch "negativer" als der aktuelle Wert, dadurch wird die Differenz positiv und dein Case ist schon erfüllt.

Das Selbe passiert nun auch beim Maximum suchen. Das Programm befindet sich ja erst im fallenden Ast, da das gefundene Minimum ja keines ist und schon wieder ist die Bedingung sofort erfüllt. Deswegen liegen die falschen Werte auch direkt hintereinander.

Des Problems Lösung ist in meinem Programm schon eingebaut. Initialisieren mit einer "genügend negativen" Anfangsbedingung.

Gruß


Signalverarbeitung - Kopmann - 23.12.2006 18:19

' schrieb:Hab herausgefunde, was dein Problem war:

Beim ersten Zyklus klappt alles.
Beim zweiten mal durchlaufen funktioniert es bis zum ersten mal die Diff Funktion aufgerufen wird. Hier passiert folgendes:

Die Funktion zieht vom aktuellen Wert den letzten Wert ab. Der letzte Wert in der Diff Funktion ist ja das Minimum vom ersten Zyklus.
Dieser Wert ist jedoch "negativer" als der aktuelle Wert, dadurch wird die Differenz positiv und dein Case ist schon erfüllt.

Das Selbe passiert nun auch beim Maximum suchen. Das Programm befindet sich ja erst im fallenden Ast, da das gefundene Minimum ja keines ist und schon wieder ist die Bedingung sofort erfüllt. Deswegen liegen die falschen Werte auch direkt hintereinander.

Des Problems Lösung ist in meinem Programm schon eingebaut. Initialisieren mit einer "genügend negativen" Anfangsbedingung.

Gruß

Hallo Kvasir

Ich bedanke mich für deine Hilfe, obwohl ich erst Mal eine Menge zu verdauen habe!!!

Ich habe selber versucht mit den Schieberegistern klar zu kommen es aber nicht geschafft. Daher habe ich mich letzt endlich für das Forum entschieden und.

Auf jeden Fall werden dir jetzt viele junge Doktorandinnen dankbar sein, weil sie die Dateien nicht mehr per Hand auswerten müssen.

Kopi


Signalverarbeitung - Kopmann - 09.01.2007 17:55

Hallo Kvasir,

hier ist das Programm.

Danke nochmals
Gerrit


Signalverarbeitung - Kopmann - 09.01.2007 19:04

' schrieb:Hallo Kvasir,

hier ist das Programm.

Danke nochmals
Gerrit