INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

FFT-Analyse von EEG-Daten via RS232



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

05.03.2011, 16:33 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2011 18:01 von Frank37.)
Beitrag #1

Frank37 Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Feb 2011

Labview 2009
2011
EN

01277
Deutschland
FFT-Analyse von EEG-Daten via RS232
Hallo,

ich habe mir nach den Anleitungen der OpenEEG-community ein EEG-Gerät gebaut.
Da ich mich in Labview einarbeiten möchte, versuche ich nun die Daten, welche das Gerät über die serielle
Schnittstelle an den Computer sendet, aufzubereiten und grafisch zu visualisieren.
Mein Ziel ist die Darstellung der gemessenen Gehirnpotentiale als:

1. Oszilloskopbild
2. FFT der Gehirnströme (4Hz bis 30Hz)
3. Balken, der sich auf und abbewegt, nach Ausfilterung einer bestimmten Frequenz durch einen Bandpass

Nun habe ich folgende Probleme:
-Störfrequenzen im FFT
-Bei Einfügen von neuen Filtern oder neuen Strukturen (z.B. Casestruktur)
schafft es Labview nicht mehr alle Daten von der RS232 abzuholen und verpasst einige Pakete.

Zur Erklärung:

Das EEG-Gerät sendet periodisch 17 Bytes an den PC.
Davon interessant sind:

Byte1/Byte2: Synchronisationsbytes (A5 5A)
Byte3:Versionsnummer
Byte4:Rahmennummer (Zähler)
Byte5:Kanal1 Low Byte
Byte6:Kanal1 High Byte
Byte7 - Byte16:enthalten von mir nicht genutzte Kanäle
Byte17:nicht relevant

Also nach jeweils 17 Bytes erhalte ich einen digitalen 10Bit-Messwert (8Bit und 2 Bit von Byte5 und Byte6 zusammengesetzt).

Das VI habe ich folgendermassen aufgebaut:
Über VISA lese ich kontinuierlich die Daten von der RS232 ein.
Diese werden in der Haupt-Whileschleife am Ausgang in ein Schieberegister geschoben und
erscheinen somit am Eingang der Whileschleife sequentiell nacheinander.
Dort warte ich dann auf die SyncBytes A5 5A (Startkennung).
Sobald diese aufgetreten sind, was die SyncBit LED signalisiert, wird die
Case-Struktur "True" und nimmt den 10Bit-breiten Messwert auf.
Dieser Messwert wird vorher aus Byte5 und Byte6 zusammengesetzt.
In der Case-Struktur verwende ich wieder ein Schieberegister.
Das Oszilloskop ist direkt am ersten Eingang des Schieberegisters angeschlossen und
scheint gut zu funktionieren.
Über "Build Array" fasse ich 64 Messwerte zusammen und übergebe sie "Build Waveform".
Danach erfolgt eine Filterung, um z.B. das 50Hz Brummen auszufiltern und dann folgt das FFT-Modul.

Selbst wenn ich kein Signal vom EEG-Gerät bekomme (Messelektroden auf Masse gelegt), erscheinen im FFT-Diagramm Frequenzen.
In meinem Fall bei 0Hz, 4Hz, 8Hz.

   

Wenn ich ein 20Hz Sinussignal vom EEG einspeise,
bekomme ich 16Hz, 20Hz, 24Hz angezeigt, also die Summe und Differenz dazu.

   

Bei Einspeisung von 30Hz fehlt diese Frequenz komplett und es erscheinen 28Hz und 32Hz

   

Ich gehe davon aus, dass, wenn ich die 4 Hz beseitigen könnte,
auch die Summen- und Differenzenfrequenzen verschwinden werden, oder?
Woher könnten die 0Hz und 4 Hz Störfrequenzen kommen?
Nutze ich zu wenig Daten für das "Build Array" oder ist mein Ansatz falsch?

Ich habe es noch nicht geschafft, das VI mit einer Textdatei anstatt Daten von der RS232 zu speisen,
damit man das Verhalten unabhängig von dem EEG-Gerät ausprobieren kann.
Logisch erschien mir, anstelle des VISA Read Elementes ein Datei Read Element zu setzen, aber
ohne Daten von der RS232 läuft die While-Schleife nicht an. Oder sollte ich besser das komplette VI kopieren,
von allen VISA-Elementen befreien und dann mittels Case-Struktur, mal das Datei-Lese und mal das VISA Blockdiagramm aufrufen?
Vielleicht habt Ihr auch da einen Tip.

Da dies mein allererstes VI ist vermute ich auch noch generelle Fehler,
welche die Performance so verschlechtern, dass es zu den verlorenen Paketen kommt.
Das merke ich vor allem daran, dass nach Ausschalten des EEG-Gerätes Labview noch 2-3sec
weiter Daten im Oszilloskop anzeigt, also noch Daten irgendwo im Puffer liegen.

Damit das VI übersichtlich bleibt, habe ich es auf das Wesentliche reduziert und z.B. die
Paketfehlererkennung rausgenommen.

Danke für Eure Hilfe.

2009 .vi  EEG.vi (Größe: 66,79 KB / Downloads: 256)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
05.03.2011, 18:44 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2011 18:45 von GerdW.)
Beitrag #2

GerdW Offline
______________
LVF-Team

Beiträge: 17.427
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
Hallo Frank,

das hier meinst nicht ernst, oder?
   
Also auf meinem Laptop sehe ich nicht mal annähernd, was das VI so machen soll. Wie soll man da helfen?

Außerdem gibt es sicherlich bessere Methoden, um die geschätzt 50 letzten Messwerte in einem Array zu halten!
Idee: ein Array mit 50 Werten initialisieren und dann mit ReplaceArraySubset jeweils einen Wert ersetzen. Schwups braucht man nur noch ein einfaches Schieberegister...

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.03.2011, 19:51
Beitrag #3

Frank37 Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Feb 2011

Labview 2009
2011
EN

01277
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
(05.03.2011 18:44 )GerdW schrieb:  das hier meinst nicht ernst, oder?
Also auf meinem Laptop sehe ich nicht mal annähernd, was das VI so machen soll. Wie soll man da helfen?

Ursprünglich waren es nur 8 Leitungen.
Diese habe ich dann auf 64 hochgesetzt um zu schauen, ob sich die Qualität des Spektrums verbessert, da ich gelesen hatte, dass
die FFT umso besser wird, je mehr Werte im Array stehen.
Wie gesagt, das ist mein erstes VI und ich hatte gehofft, dass mir hier konstruktiv auf die Sprünge geholfen wird.


(05.03.2011 18:44 )GerdW schrieb:  Außerdem gibt es sicherlich bessere Methoden, um die geschätzt 50 letzten Messwerte in einem Array zu halten!
Idee: ein Array mit 50 Werten initialisieren und dann mit ReplaceArraySubset jeweils einen Wert ersetzen. Schwups braucht man nur noch ein einfaches Schieberegister...

Danke für die Idee, das werde ich umsetzen und dann posten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.03.2011, 23:44
Beitrag #4

Frank37 Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Feb 2011

Labview 2009
2011
EN

01277
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
(05.03.2011 18:44 )GerdW schrieb:  Außerdem gibt es sicherlich bessere Methoden, um die geschätzt 50 letzten Messwerte in einem Array zu halten!
Idee: ein Array mit 50 Werten initialisieren und dann mit ReplaceArraySubset jeweils einen Wert ersetzen. Schwups braucht man nur noch ein einfaches Schieberegister...

Nach nunmehr 8 Stunden muss ich passen.
Ich bekomme es nicht in mein VI integriert.
Die vielen Einzel VI's, die ich heute gemacht hatte, liefen nicht so, wie sie sollten und liessen sich nicht in mein VI integrieren.
Brauche ich zwangsläufig den Rotate1DArray Baustein?
Bin ich beim Konzept Ringpuffer richtig?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
06.03.2011, 18:29 (Dieser Beitrag wurde zuletzt bearbeitet: 06.03.2011 18:30 von GerdW.)
Beitrag #5

GerdW Offline
______________
LVF-Team

Beiträge: 17.427
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
Hallo Frank,

man muss nicht "zwangsläufig" ein Rotate verwenden, aber es vereinfacht das Vorgehen ungemein:
   
Ja, das Konzept "Ringbuffer" trifft es ganz gut...

Zitat:Ursprünglich waren es nur 8 Leitungen. Diese habe ich dann auf 64 hochgesetzt um zu schauen, ob sich die Qualität des Spektrums verbessert, da ich gelesen hatte, dass die FFT umso besser wird, je mehr Werte im Array stehen.
Willst du damit sagen, dass du aus nur 8 Werten eine FFT bildest? Echt?

Zitat:ich hatte gehofft, dass mir hier konstruktiv auf die Sprünge geholfen wird.
Was verstehst du unter "konstruktiv"? Gut gemeinte Ratschläge & Denkanstöße? Hinweise auf Fehlerquellen?
Oder erwartest du etwa fertige Lösungen, die dir kostenlos programmiert werden?

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
06.03.2011, 19:16
Beitrag #6

Frank37 Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Feb 2011

Labview 2009
2011
EN

01277
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
(06.03.2011 18:29 )GerdW schrieb:  Willst du damit sagen, dass du aus nur 8 Werten eine FFT bildest? Echt?

Anfangs ja, da ich mir dachte, dass der FFT-Baustein die Daten intern erst puffert und dann aus z.B. 100*8 Werten seine Analyse macht.
Da das Ergebnis aber schlecht war (Störfrequenzen), habe ich schliesslich auf 64 Leitungen erweitert.


Zitat:Was verstehst du unter "konstruktiv"? Gut gemeinte Ratschläge & Denkanstöße? Hinweise auf Fehlerquellen?
Oder erwartest du etwa fertige Lösungen, die dir kostenlos programmiert werden?

Ups, wie falsch manchmal Text rüberkommen kann.
Das war nicht als Kritik oder Vorwurf gemeint.
Ich wollte damit sagen, dass ich erwartet hatte, dass an meinem Konzept mit den 64 Leitungen etwas verbesserungsfähig ist.
Der Satz war so gemeint:
"Ich hatte innerlich gehofft, dass die Lösung mit den 64 Leitungen falsch ist, und jemand so was sagt wie, "das ist Blödsinn".
denn das würde bedeuten dass das VI dann kleiner und überschaubarer gemacht werden kann."

Ich versuche mich seit 3 Monaten an diesem VI, habe viel wieder verworfen, umgebaut und wieder gelöscht, weil die Performance bei zu vielen Elementen zusammenbrach.
Eigentlich wollte ich es allein schaffen, aber jetzt bin ich an einem Punkt, wo ich Hilfe brauche, da für mein Problem unter anderem theoretisches Verständnis von Signaltheorie notwendig ist und das, was ich mir angelesen und verstanden habe, bei weitem nicht ausreicht.
Ausserdem habe ich Schwierigkeiten, wenn mehrere Strukturen ineinanderverschachtelt sind und dann Daten nach rein und raus gereicht werden müssen.
Für mich als Anfänger ist das Projekt ne Nummer zu gross.
Ich will es aber trotzdem versuchen, da man am besten an konkreten Projekten lernt.

Zitat:Ratschläge & Denkanstöße? Hinweise auf Fehlerquellen?
Genau das suche ich.
Fertige Lösungen natürlich nicht.
Ich hoffe nicht, so rübergekommen zu sein.

Danke bis hier, ich werde mich nächste Woche am Ringpuffer versuchen.
Solo lief er, aber in mein VI habe ich ihn nicht integriert bekommen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
08.03.2011, 20:24 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2011 20:25 von Frank37.)
Beitrag #7

Frank37 Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Feb 2011

Labview 2009
2011
EN

01277
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
Ich habe jetzt mal alles, was nicht unbedingt notwendig war, inclusive der FFT, bei welcher mein eigentliches Problem auftrat, rausgenommen
und versuche nochmal die Funktion zu beschreiben:

VISA gibt die Daten an die äussere Whileschleife.
VISA Read schickt den eingelesenen String an das rechte Schieberegister.
Nun werden die Daten solange an die linken Schieberegisterzellen durchgereicht,
bis die Startkennung A55A an den beiden unteren Schieberegisterzellen anliegt.
In diesem Moment befinden sich die Daten von dem zu messenden Kanal an den beiden oberen Schieberegisterzellen,
werden zusammengesetzt und mittels Type Cast in einen 16Bit Integer Wert umgewandelt.
An der Stelle, wo der schwarze Pfeil hinzeigt, gehen die Daten dann in die Casestruktur, allerdings immer nur dann,
wenn die Synchronisationsbytes A5,5A die Casestruktur auf True setzen.

Die innere For-Schleife habe ich versuchsweise mit 1 Schleifendurchlauf eingefügt, damit ich die Schieberegister
darin platzieren kann.

Das Problem bei dieser Anordnung ist aber nun, dass das Element <Initialize Array> bei jedem erneuten Truesetzen der Casestruktur immer wieder
das Array auf 0 setzt.
Das Array am rechten Schieberegister wird nie nach links durchgereicht, bzw anscheinend immer wieder überschrieben.
Verschiedene andere Variationen funktionierten auch nicht.
Was mache ich dabei falsch?
(Das Array ist erst mal nur zum Testen so klein.)

Das Snippet kann ich nicht in mein Labview hineinziehen.
Ist es mit LV 2010 erstellt?
Wie kann ich mir anzeigen lassen, mit welcher LV-Version ein Snippet erstellt wurde?



2009 .vi  EEG3.vi (Größe: 33,73 KB / Downloads: 190)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.03.2011, 09:44 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2011 09:45 von GerdW.)
Beitrag #8

GerdW Offline
______________
LVF-Team

Beiträge: 17.427
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
Hallo Frank,

Zitat:Das Array am rechten Schieberegister wird nie nach links durchgereicht, bzw anscheinend immer wieder überschrieben.
... Was mache ich dabei falsch?
Nun ja, du initialisierst das Shiftregister der FOR-Loop immer wieder neu. Was erwartest du also für Werte im Register, wenn die Schleife erneut aufgerufen wird?
Du solltest das Schieberegister nur genau einmal initialisieren...

Zitat:Die innere For-Schleife habe ich versuchsweise mit 1 Schleifendurchlauf eingefügt, damit ich die Schieberegister darin platzieren kann.
Dein Fehler: Du hast doch schon eine While-Schleife, um dort Shiftregister zu erzeugen...

Siehe Anhang (Lv09_img2)

P.S.: Dein Umgang mit der seriellen Schnittstelle ist "suboptimal". Lese doch gleich wortweise oder komplette Messages a 6 Byte ein. Du kannst dein "Sync"-Wort auch als Terminierungszeichen verwenden und bräuchtest dann nicht erst noch der korrekten Zeichenzuordnung suchen... Es gibt so viele Threads, die das Thema Serielle Schnittstelle behandeln, einfach mal suchen und lesen...


Angehängte Datei(en)
2009 .vi  EEG3.vi (Größe: 33 KB / Downloads: 182)

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.03.2011, 01:00 (Dieser Beitrag wurde zuletzt bearbeitet: 11.03.2011 01:07 von Frank37.)
Beitrag #9

Frank37 Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Feb 2011

Labview 2009
2011
EN

01277
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
Hallo Gerd,

Toll, es funktioniert besser und ist viel aufgeräumter.
Ich habe die Anzahl der Arrayelemente auf 1024 gesetzt und jetzt sind die Störfrequenzen fast weg.
Sie liegen nun bei < 1 Hz und da stören sie die Nutzsignale nicht mehr.
Die Idee mit dem Terminierungszeichen habe ich eingebaut und lese alle 17 Bytes aufeinmal ein.
Jetzt sind noch ein paar Erweiterungen geplant.
Wenn dann alles läuft würde ich mich freuen, wenn Du nochmal drüberschauen kannst.

Zitat:Nun ja, du initialisierst das Shiftregister der FOR-Loop immer wieder neu. Was erwartest du also für Werte im Register, wenn die Schleife erneut aufgerufen wird?
Du solltest das Schieberegister nur genau einmal initialisieren...
Ich dachte, LV macht eine Initialisierung am Schieberegister nur genau einmal, egal in welchen Strukturen befindlich.
Das hatte ich in einem englischen Beitrag gelesen und wahrscheinlich missverstanden oder falsch übersetzt. So macht es jetzt auf alle Fälle mehr Sinn.

Zitat:Dein Fehler: Du hast doch schon eine While-Schleife, um dort Shiftregister zu erzeugen...
Ich hatte fast genau Deine Version auch mal probiert und wieder verworfen, weil sie nicht funktionierte, da hab ich wohl etwas Anderes falsch gemacht.

   


2009 .vi  Packet_Error.vi (Größe: 9,36 KB / Downloads: 203)

2009 .vi  EEG_6.vi (Größe: 63,71 KB / Downloads: 177)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.03.2011, 09:11
Beitrag #10

GerdW Offline
______________
LVF-Team

Beiträge: 17.427
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: FFT-Analyse von EEG-Daten via RS232
Hallo Frank,

ein Fehler von mir: SerialInit versteht nur U8-Werte als Terminierungszeichen, du kannst also nicht "A55A" dort vorgeben. (Es wird wohl stattdessen "FF" verwendet, da der Wert angepasst wird.) Vielleicht kommen deine PacketErrors dort her...

Zitat:Ich habe die Anzahl der Arrayelemente auf 1024 gesetzt und jetzt sind die Störfrequenzen fast weg. Sie liegen nun bei < 1 Hz und da stören sie die Nutzsignale nicht mehr.
Ja, das hat irgendwas mit den mathematischen Grundlagen der FFT zu tun... Smile

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Hilfe bei der Auswertung von FFT Analyse cesavila2k 1 4.761 22.05.2012 14:59
Letzter Beitrag: chrissyPu
  Order Analyse: schlechte Darstellung bei Drehzahlschwankungen jens_j 4 6.989 15.09.2010 08:11
Letzter Beitrag: jens_j
  Frequenz aus FFT-Analyse als Wert ausgeben quattro 9 11.414 27.07.2010 06:21
Letzter Beitrag: Y-P
  part average analyse(paa) cosmos 5 4.293 04.01.2008 10:30
Letzter Beitrag: Y-P
  FFT - Analyse & Filterung von Signalen durch Änderung der FFT-Koeffizienten? BeFu 1 12.832 19.03.2007 22:02
Letzter Beitrag: dc6xs
  Impact analyse / Pulsauswertung Philip1403 0 3.433 23.04.2006 16:01
Letzter Beitrag: Philip1403

Gehe zu: