IPB

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> Azhl. Schwingungen von kontinuierlichen Signal...
Gunni1979
post 22. Feb 2007, 12:40
Post #1


Member
**

Group: Members
Posts: 68
Joined: 14.02.2007
From: Erfurt
Member No.: 19
LV Version: 8.00 / 8.2
Zertifizierung: keine
LV User seit: 2006



Mahlzeit.

Ich habe im Rahmen meiner Diplomarbeit eine LabVIEW-Anwendung zu erstellen. Nach langem Informationen sammeln/kopieren und Basteln bin ich soweit das ich vom FPGA zum PC HOST meine Signaldaten übertrage. Da handelt es sich zum einen um die Daten des Originalsignals und zum anderen des gemessenen Signals. ich habe vor diese in einen Vergleich zu stellen.

Die Messung kann oder soll über einen längeren Zeitraum laufen. da ich die Vergleichswerte in einer Tabelle darstellen soll, macht es keinen Sinn alle Werte dafür zu benutzen. Es reicht also immer einen gewissen Abschnitt zu behandeln. Ich dachte da so an 5 Schwingungen.

Jetzt habe ich dafür eine kleine Vergleichsrechnung aufgestellt. Die einzeln empfangenen Datenpaktet sollen solange zu einem Gesamt-Array gepackt werden, solange die Anzahl der darin befindlichen Elemente kleiner ist als die 5-fache Periodenzeit. das habe ich versucht damit zu verwirklichen indem folgende Rechnung aufstellte:
5 mal "eingestellte Looprate" / "aktuelle Frequenz". Wenn dann die Anzahl der schon mitgeschnittenen Elemente kleiner ist als dieser Wert, soll weiter in das Array reingepackt werden. Nach beenden der Hauptschleife lasse ich mir das ergebnis im 2. Signalverlaufsgraph anzeigen.
[attachment=67:Datenauf...PC_Host_.vi]
Leider läuft es nicht immer so wie es soll. es werden bei unterschiedlich eingestellten Frequenzen oft weit mehr Schwingungen protokolliert. dann scheint Es beim erneuten Start von Anfang an werte ins "Sammel-Array" zu packen obwohl noch keine Taste betätigt wurde.
Hier liegt entweder ein denkfehler meinerseits vor oder ich weiß auch nicht.


Gunni

Go to the top of the page
 
+Quote Post
CB
post 22. Feb 2007, 20:22
Post #2


proven Member
****

Group: Administrators
Posts: 315
Joined: 16.10.2006
From: Düsseldorf
Member No.: 2
LV Version: current
Zertifizierung: CLA
LV User seit: 2001



QUOTE(Gunni1979 @ 22. Feb 2007, 12:40) [snapback]104[/snapback]
Hier liegt entweder ein denkfehler meinerseits vor oder ich weiß auch nicht.
Gunni


was du brauchst ist ein "Puffer", du füllst aber dein Array mit "build Array" und "insert into Array" nach und nach auf. Besser wäre es ein Array mit einer bestimmten Länge zu initialisieren und dieses solange mit "replace Array Subset" zu überschreiben, bis es voll ist. Dabei musst du bei einen "Zeiger" mitführen, in dem du abspeicherst, wieviel Werte du gerade eingefügt hast.

Schau dir nochmal die Beispiele an, dass ich im zu diesem Thema LVF gepostet habe. Im RT-VI ist soetwas in der Richtung schon drin.


--------------------
künstliche Intelligenz ist besser als natürliche Dummheit!
rotabench:rotierende Prüfstände nach dem Baukasten-Prinzip
Go to the top of the page
 
+Quote Post
Gunni1979
post 23. Feb 2007, 09:59
Post #3


Member
**

Group: Members
Posts: 68
Joined: 14.02.2007
From: Erfurt
Member No.: 19
LV Version: 8.00 / 8.2
Zertifizierung: keine
LV User seit: 2006



QUOTE(CB @ 22. Feb 2007, 20:22) [snapback]105[/snapback]
was du brauchst ist ein "Puffer", du füllst aber dein Array mit "build Array" und "insert into Array" nach und nach auf. Besser wäre es ein Array mit einer bestimmten Länge zu initialisieren und dieses solange mit "replace Array Subset" zu überschreiben, bis es voll ist. Dabei musst du bei einen "Zeiger" mitführen, in dem du abspeicherst, wieviel Werte du gerade eingefügt hast.

Schau dir nochmal die Beispiele an, dass ich im zu diesem Thema LVF gepostet habe. Im RT-VI ist soetwas in der Richtung schon drin.


Morgen.

Was tut es denn dann wenn das Array voll ist? Gibt es mir irgendwas zurück was ich benutzen kann, damit ich festlege nur bis zu dieser Menge "mitschneiden"? Ich werde es dann so machen wie du meinst. Mit "Replace Array Subset" hat es sogar den Vorteil das ich diese Vergleichsaufzeichnung der Werte ständig neu starten kann im laufenden Betrieb. Ich müßte ja nur den Von dir erwähnten "Zeiger" zurück setzten.


Gunni
Go to the top of the page
 
+Quote Post
Gunni1979
post 23. Feb 2007, 11:12
Post #4


Member
**

Group: Members
Posts: 68
Joined: 14.02.2007
From: Erfurt
Member No.: 19
LV Version: 8.00 / 8.2
Zertifizierung: keine
LV User seit: 2006



...so jetzt habe ich es mal auf diese Art probiert, aber es funzt nicht. [attachment=69:2D_Array...lisieren.JPG]Wenn ich das "Array initialisieren" weg lasse und anstatt dessen eine 2D-Array-Konstante setzte, dann läuft wenigstens die Datenerfassung. So bekomme ich Signale auf dem Graph angezeigt. So wie es jetztist geht gar nichts.[attachment=70:Datenauf...PC_Host_.vi] Es kann doch nicht sein das 100000 pro Dimension zu viel gewählt ist. Bei nur beispielhaft 1 Hz habe ich mit 100kHz Abtastung schon 100000 Werte. ich hätte sogar gern 3 bis 5 Schwingungen im Vergleich, damit das ganze nicht so nackig aussieht.

Gunni

This post has been edited by Gunni1979: 23. Feb 2007, 11:37
Go to the top of the page
 
+Quote Post
CB
post 23. Feb 2007, 22:19
Post #5


proven Member
****

Group: Administrators
Posts: 315
Joined: 16.10.2006
From: Düsseldorf
Member No.: 2
LV Version: current
Zertifizierung: CLA
LV User seit: 2001



QUOTE(Gunni1979 @ 23. Feb 2007, 11:12) [snapback]108[/snapback]
...so jetzt habe ich es mal auf diese Art probiert, aber es funzt nicht. [attachment=69:2D_Array...lisieren.JPG]Wenn ich das "Array initialisieren" weg lasse und anstatt dessen eine 2D-Array-Konstante setzte, dann läuft wenigstens die Datenerfassung. So bekomme ich Signale auf dem Graph angezeigt. So wie es jetztist geht gar nichts.[attachment=70:Datenauf...PC_Host_.vi] Es kann doch nicht sein das 100000 pro Dimension zu viel gewählt ist. Bei nur beispielhaft 1 Hz habe ich mit 100kHz Abtastung schon 100000 Werte. ich hätte sogar gern 3 bis 5 Schwingungen im Vergleich, damit das ganze nicht so nackig aussieht.

Gunni


Gunni, Gunni, Gunni .... <seufz>

du hast da ein Array mit 100000 mal 100000 Double-Werten erzeugt, das sind ca. 75 Gigabyte - es würde mich wundern, wenn dein Rechner über so viel Speicherkapazität verfügt ...

Du brauchst 2 Zeilen und (z.B.) 100000 Spalten um deine 2 Kanäle in einem Ringspeicher zwischenzupuffern


--------------------
künstliche Intelligenz ist besser als natürliche Dummheit!
rotabench:rotierende Prüfstände nach dem Baukasten-Prinzip
Go to the top of the page
 
+Quote Post
Gunni1979
post 25. Feb 2007, 21:54
Post #6


Member
**

Group: Members
Posts: 68
Joined: 14.02.2007
From: Erfurt
Member No.: 19
LV Version: 8.00 / 8.2
Zertifizierung: keine
LV User seit: 2006



QUOTE(CB @ 23. Feb 2007, 22:19) [snapback]110[/snapback]
Gunni, Gunni, Gunni .... <seufz>

du hast da ein Array mit 100000 mal 100000 Double-Werten erzeugt, das sind ca. 75 Gigabyte - es würde mich wundern, wenn dein Rechner über so viel Speicherkapazität verfügt ...

Du brauchst 2 Zeilen und (z.B.) 100000 Spalten um deine 2 Kanäle in einem Ringspeicher zwischenzupuffern


blush.gif oje da habe ich wohl ganz schön Mist zusammen gebaut. So ist das wenn man am liebsten mit dem Kopf durch die Wand möchte. Na dann werde ich es morgen früh gleich mit ein paar weniger Zeilen probieren.

Gunni
Go to the top of the page
 
+Quote Post
CB
post 26. Feb 2007, 07:52
Post #7


proven Member
****

Group: Administrators
Posts: 315
Joined: 16.10.2006
From: Düsseldorf
Member No.: 2
LV Version: current
Zertifizierung: CLA
LV User seit: 2001



So, ich hab dir mal ein Beispiel für einen Ringspeicher programmiert, das ist ungefähr so das, was du brauchst um 3 Schwingungen "am Stück" darzustellen. Ich hab es mal komplett unkommentiert gelassen, damit du noch selber was zum "drauf rumdenken" hast wink.gif

Im Prinzip funktioniert das VI so, dass die simulierten Messdaten fortlaufend in ein "Zwischenspeicher-Array" geschrieben werden, das eine bestimmte Länge hat. Die Länge des Arrays bestimmt mehr oder weniger, wecher "Zeitausschnitt" im Graphen dargestellt wird. Wenn du z.B. jede Sekunde 1000 Messwerte erfasst und du den Zwischenspeicher 10000 Werte groß machst, dann wird ein Zeitfenster von 10 Sekunden zwischengespeichert.

Attached File  ringspeicher.vi ( 38.91K ) Number of downloads: 965



--------------------
künstliche Intelligenz ist besser als natürliche Dummheit!
rotabench:rotierende Prüfstände nach dem Baukasten-Prinzip
Go to the top of the page
 
+Quote Post
Gunni1979
post 26. Feb 2007, 10:04
Post #8


Member
**

Group: Members
Posts: 68
Joined: 14.02.2007
From: Erfurt
Member No.: 19
LV Version: 8.00 / 8.2
Zertifizierung: keine
LV User seit: 2006



QUOTE(CB @ 26. Feb 2007, 07:52) [snapback]112[/snapback]
So, ich hab dir mal ein Beispiel für einen Ringspeicher programmiert, das ist ungefähr so das, was du brauchst um 3 Schwingungen "am Stück" darzustellen. Ich hab es mal komplett unkommentiert gelassen, damit du noch selber was zum "drauf rumdenken" hast wink.gif

Im Prinzip funktioniert das VI so, dass die simulierten Messdaten fortlaufend in ein "Zwischenspeicher-Array" geschrieben werden, das eine bestimmte Länge hat. Die Länge des Arrays bestimmt mehr oder weniger, wecher "Zeitausschnitt" im Graphen dargestellt wird. Wenn du z.B. jede Sekunde 1000 Messwerte erfasst und du den Zwischenspeicher 10000 Werte groß machst, dann wird ein Zeitfenster von 10 Sekunden zwischengespeichert.

Attached File  ringspeicher.vi ( 38.91K ) Number of downloads: 965



Morgen.

Okay. Du läßt eine FOR-Schleife kontinuierlich ansteigende Werte erzeugen. So viele Werte wie das sind, so oft läuft die nächste Schleife um diese in ein Array zu schreiben. Nach 10000 Werten überschreibst du dieses wieder. Was ich nicht verstehe ist, warum du vor dem Graph dein 1D Array in zwei Teilarrays splittest und auch noch wieder verkehrt herum zusammen fügst.

Bei mir habe ich weiterhin das Problem das ich zwei 1D Teilarrays zu einem 2D Array zusammenfügen möchte. [attachment=72:1D_Array...2D_Array.JPG]Der Index ist wo sie nacheinander dazu gefügt werden ist die Anzahl voriger Werte. In meiner Tabelle am Ende ist aber nur die erste Zeile beschrieben.

Gunni

This post has been edited by Gunni1979: 26. Feb 2007, 10:09
Go to the top of the page
 
+Quote Post
CB
post 26. Feb 2007, 10:38
Post #9


proven Member
****

Group: Administrators
Posts: 315
Joined: 16.10.2006
From: Düsseldorf
Member No.: 2
LV Version: current
Zertifizierung: CLA
LV User seit: 2001



Ok, einen Teil des Rätsels hast du gelöst smile.gif

Die kontinuierlich aufsteigenden Werte sind die Demo-Daten, die "normalerweise" von deiner Messkarte, etc. kommen und zwischengespeichert werden sollen. Das obere Array ist das Ringspeicher Array, in dem die Messdaten zwischengespeichert werden. Ich produziere die Demo-Daten extra streng monton steigend, damit man sieht, was bei dem "Zerlegen und umgekehrt zusammensetzen" passiert. Probiers einfach mal aus smile.gif

Wenn du ein 2D-Array brauchst, was spricht dagegen diese "Vorrichtung" zu duplizieren? wink.gif



--------------------
künstliche Intelligenz ist besser als natürliche Dummheit!
rotabench:rotierende Prüfstände nach dem Baukasten-Prinzip
Go to the top of the page
 
+Quote Post
Gunni1979
post 26. Feb 2007, 11:02
Post #10


Member
**

Group: Members
Posts: 68
Joined: 14.02.2007
From: Erfurt
Member No.: 19
LV Version: 8.00 / 8.2
Zertifizierung: keine
LV User seit: 2006



QUOTE(CB @ 26. Feb 2007, 10:38) [snapback]114[/snapback]
Ok, einen Teil des Rätsels hast du gelöst smile.gif

Die kontinuierlich aufsteigenden Werte sind die Demo-Daten, die "normalerweise" von deiner Messkarte, etc. kommen und zwischengespeichert werden sollen. Das obere Array ist das Ringspeicher Array, in dem die Messdaten zwischengespeichert werden. Ich produziere die Demo-Daten extra streng monton steigend, damit man sieht, was bei dem "Zerlegen und umgekehrt zusammensetzen" passiert. Probiers einfach mal aus smile.gif

Wenn du ein 2D-Array brauchst, was spricht dagegen diese "Vorrichtung" zu duplizieren? wink.gif


Du meinst mit duplizieren bestimmt das ich nicht beide Datenpakte sofort in ein "2D Array packen soll, sondern beide in ein "Teilarray erzeugen" schieben könne. Diese am Ende mit einem "Built Array" ja zu einem 2D Array zusammenfügen kann.

Ich galube du splittest es um im nächsten Graph-Bild einen Teil des vorigen Bildes mit anzuzeigen. Dadurch glaubt man nicht neue Messungen vorliegen zu haben sondern, das diese zusammen gehören.

Gunni
Go to the top of the page
 
+Quote Post
CB
post 26. Feb 2007, 16:26
Post #11


proven Member
****

Group: Administrators
Posts: 315
Joined: 16.10.2006
From: Düsseldorf
Member No.: 2
LV Version: current
Zertifizierung: CLA
LV User seit: 2001



QUOTE(Gunni1979 @ 26. Feb 2007, 11:02) [snapback]115[/snapback]
Du meinst mit duplizieren bestimmt das ich nicht beide Datenpakte sofort in ein "2D Array packen soll, sondern beide in ein "Teilarray erzeugen" schieben könne. Diese am Ende mit einem "Built Array" ja zu einem 2D Array zusammenfügen kann.


jau, mach 2 Schieberegister um deine Daten zwischenzuspeichern und füge die beiden 1D Arrays erst zusammen, wenn du sie anzeigen möchtest. Man kann zwar so ein Schieberegister auch in 2D aufbauen, das wird aber unter Umständen deutlich komplizierter.

QUOTE(Gunni1979 @ 26. Feb 2007, 11:02) [snapback]115[/snapback]
Ich galube du splittest es um im nächsten Graph-Bild einen Teil des vorigen Bildes mit anzuzeigen. Dadurch glaubt man nicht neue Messungen vorliegen zu haben sondern, das diese zusammen gehören.


jau, genau dieses. Der Sinn der Sache ist, dass man in der While-Schleife, die die Daten abholt nicht nur das gerade abgeholte Paket visualisieren kann, sondern eine größere Portion (eben den Gesamten Ringspeicher)

Beispiel: du holst mit deiner While-Schleife alle 100 Millisekunden 200 Werte von deinem Messgerät ab (wie du nun im Detail geschickt werden ist erstmal egal). Wenn du nun insgesamt einen zeitlichen Verlauf von - sagen wir mal 2 Sekunden - in deinem Graphen darstellen willst, dann musst du die letzten 19 Pakete irgendwo "puffern". Da du ingesamt 20 Häppchen á 200 Messwerten zwischenspeichern willst, brauchst du einen Ringspeicher, der 4000 Samples speichern kann.

Genau dies geschieht in dem Ringspeicher, in dem immer wieder die ältesten Werte überschrieben werden. Am Ende wird das Ringspeicher-Array an der "Einfügemarke" aufgeteilt und die älterenn Werte werden für die Anzeige vor die neueren gesetzt

Was heist das nun für deine D-Arbeit: du hast eine Sample-Rate von 100 kHz und möchtest ein Sin-Signal von z.B. 5 kHz verarbeiten, dabei sollen immer z.B. 10 volle Sinus-Wellen in deinem Graphen dargestellt werden:
100 kHz / 5 kHz = 20 -> eine Sinus Welle wird mit 20 Samples abgetastet
10 Sinus-Signale möchtest du darstellen => 20 * 10 = 200 => dein Ringspeicher muss 200 Werte puffern um 10 "Sinus-Wellen" darzustellen ...



--------------------
künstliche Intelligenz ist besser als natürliche Dummheit!
rotabench:rotierende Prüfstände nach dem Baukasten-Prinzip
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 



Lo-Fi Version Time is now: 19.03.2024 - 04:40