Fordern Sie Ihr Gedächtnis heraus! Spielen Sie das neue N-Back-Spiel in der Emotiv-App
Fordern Sie Ihr Gedächtnis heraus! Spielen Sie das neue N-Back-Spiel in der Emotiv-App
Fordern Sie Ihr Gedächtnis heraus! Spielen Sie das neue N-Back-Spiel in der Emotiv-App
Lab Streaming Layer (LSL) zur Synchronisierung mehrerer Datenströme
Roshini Randeniya
01.10.2025
Teilen:


von Roshini Randeniya und Lucas Kleine
Operation:
Sobald im Kommandozeilenfenster ausgeführt, startet dieses Skript sofort einen LSL-Stream. Jedes Mal, wenn die 'Enter'-Taste gedrückt wird, sendet es einen Trigger und spielt eine Audiodatei ab.
import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet
def wait_for_keypress():
print("Drücken Sie ENTER, um die Audiowiedergabe zu starten und einen LSL-Marker zu senden.")
while True: # This loop waits for a keyboard input input_str = input() # Wait for input from the terminal if input_str == "": # If the enter key is pressed, proceed break
def AudioMarker(audio_file, outlet): # Funktion zum Abspielen von Audio und Senden von Markern
data, fs = sf.read(audio_file) # Audiodatei laden
print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) # Send marker indicating the start of audio playback sd.play(data, fs) # play the audio sd.wait() # Wait until audio is done playing print("Audio playback finished.")
wenn name == "main": # HAUPTSCHLEIFE
# LSL-Stream für Marker einrichten
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Abtastrate auf 0 setzen, da Marker unregelmäßig sind
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'
info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id) outlet = StreamOutlet(info) # create LSL outlet # Keep the script running and wait for ENTER key to play audio and send marker while True: wait_for_keypress() audio_filepath = "/path/to/your/audio_file.wav" # replace with correct path to your audio file AudioMarker(audio_filepath, outlet) # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>
**Mit dem Ausführen dieser Datei (selbst vor dem Abspielen des Audios) haben Sie einen LSL-Stream über einen Ausgang initiiert. Jetzt werden wir diesen Stream in LabRecorder anzeigen
SCHRITT 5 - LabRecorder verwenden, um alle LSL-Ströme anzuzeigen und zu speichern
LabRecorder öffnen
Drücken Sie Aktualisieren. Die verfügbaren LSL-Ströme sollten in der Streamliste sichtbar sein
• Sie sollten in der Lage sein, Streams von beiden EmotivPROs (normalerweise "EmotivDataStream" genannt) und den Marker-Stream (genannt "AudioMarkers") zu sehenKlicken Sie auf Durchsuchen, um einen Speicherort für die Daten auszuwählen (und andere Parameter festzulegen)
Wählen Sie alle Streams aus und drücken Sie Aufnehmen, um die Aufnahme zu starten
Klicken Sie auf Stop, wenn Sie die Aufnahme beenden möchten

Mit den Daten arbeiten
LabRecorder gibt eine XDF-Datei (Extensible Data Format) aus, die Daten von allen Streams enthält. XDF-Dateien sind in Streams strukturiert, von denen jeder einen anderen Header enthält, der beschreibt, was er enthält (Gerätename, Datentyp, Abtastrate, Kanäle und mehr). Sie können den untenstehenden Codeblock verwenden, um Ihre XDF-Datei zu öffnen und einige grundlegende Informationen anzuzeigen.
Dieses Beispiels-Skript demonstriert einige grundlegende Funktionen zum Importieren und Annotieren von EEG-Daten, die mit der EmotivPRO-Software gesammelt wurden. Es verwendet MNE, um eine XDF-Datei zu laden, einige grundlegende Metadaten auszudrucken, ein info-Objekt zu erstellen und das Leistungsspektrum zu plotten."""
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy als np
Pfad zu Ihrer XDF-Datei
data_path = '/path/to/your/xdf_file.xdf'
XDF-Datei laden
streams, fileheader = pyxdf.load_xdf(data_path)
print("XDF-Dateikopf:", fileheader)
print("Anzahl der gefundenen Streams:", len(streams))
für i, stream in enumerate(streams):
print("\nStream", i + 1)
print("Stream Name:", stream['info']['name'][0])
print("Stream-Typ:", stream['info']['type'][0])
print("Anzahl der Kanäle:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Abtastrate:", sfreq)
print("Anzahl der Proben:", len(stream['time_series']))
print("Erste 5 Datenpunkte drucken:", stream['time_series'][:5])
channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']] print("Channel Names:", channel_names) channel_types = 'eeg'
MNE-Info-Objekt erstellen
info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Daten müssen transponiert werden: Kanäle x Proben
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # Ein einfaches Spektrogramm (Leistungsdichtespektrum) plottenZusätzliche RessourcenLaden Sie dieses Tutorial als Jupyter-Notebook von EMOTIV GitHub herunterÜberprüfen Sie die LSL-Online-Dokumentation, einschließlich der offiziellen README-Datei auf GitHubSie benötigen ein oder mehrere unterstützte Datenerfassungsgeräte, um Daten zu sammelnAlle EMOTIVs Brainware-Geräte verbinden sich mit der EmotivPRO-Software, die integrierte LSL-Funktionen zum Senden und Empfangen von DatenströmenZusätzliche Ressourcen:Code zum Ausführen von LSL mit Emotiv-Geräten, mit BeispielskriptenNützliches LSL-Demo auf YouTubeSCCN LSL GitHub-Repository für alle zugehörigen BibliothekenGitHub-Repository für eine Sammlung von Untermodulen und AppsHyPyP-Analysepipeline für Hyperscanning-Studien
von Roshini Randeniya und Lucas Kleine
Operation:
Sobald im Kommandozeilenfenster ausgeführt, startet dieses Skript sofort einen LSL-Stream. Jedes Mal, wenn die 'Enter'-Taste gedrückt wird, sendet es einen Trigger und spielt eine Audiodatei ab.
import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet
def wait_for_keypress():
print("Drücken Sie ENTER, um die Audiowiedergabe zu starten und einen LSL-Marker zu senden.")
while True: # This loop waits for a keyboard input input_str = input() # Wait for input from the terminal if input_str == "": # If the enter key is pressed, proceed break
def AudioMarker(audio_file, outlet): # Funktion zum Abspielen von Audio und Senden von Markern
data, fs = sf.read(audio_file) # Audiodatei laden
print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) # Send marker indicating the start of audio playback sd.play(data, fs) # play the audio sd.wait() # Wait until audio is done playing print("Audio playback finished.")
wenn name == "main": # HAUPTSCHLEIFE
# LSL-Stream für Marker einrichten
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Abtastrate auf 0 setzen, da Marker unregelmäßig sind
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'
info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id) outlet = StreamOutlet(info) # create LSL outlet # Keep the script running and wait for ENTER key to play audio and send marker while True: wait_for_keypress() audio_filepath = "/path/to/your/audio_file.wav" # replace with correct path to your audio file AudioMarker(audio_filepath, outlet) # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>
**Mit dem Ausführen dieser Datei (selbst vor dem Abspielen des Audios) haben Sie einen LSL-Stream über einen Ausgang initiiert. Jetzt werden wir diesen Stream in LabRecorder anzeigen
SCHRITT 5 - LabRecorder verwenden, um alle LSL-Ströme anzuzeigen und zu speichern
LabRecorder öffnen
Drücken Sie Aktualisieren. Die verfügbaren LSL-Ströme sollten in der Streamliste sichtbar sein
• Sie sollten in der Lage sein, Streams von beiden EmotivPROs (normalerweise "EmotivDataStream" genannt) und den Marker-Stream (genannt "AudioMarkers") zu sehenKlicken Sie auf Durchsuchen, um einen Speicherort für die Daten auszuwählen (und andere Parameter festzulegen)
Wählen Sie alle Streams aus und drücken Sie Aufnehmen, um die Aufnahme zu starten
Klicken Sie auf Stop, wenn Sie die Aufnahme beenden möchten

Mit den Daten arbeiten
LabRecorder gibt eine XDF-Datei (Extensible Data Format) aus, die Daten von allen Streams enthält. XDF-Dateien sind in Streams strukturiert, von denen jeder einen anderen Header enthält, der beschreibt, was er enthält (Gerätename, Datentyp, Abtastrate, Kanäle und mehr). Sie können den untenstehenden Codeblock verwenden, um Ihre XDF-Datei zu öffnen und einige grundlegende Informationen anzuzeigen.
Dieses Beispiels-Skript demonstriert einige grundlegende Funktionen zum Importieren und Annotieren von EEG-Daten, die mit der EmotivPRO-Software gesammelt wurden. Es verwendet MNE, um eine XDF-Datei zu laden, einige grundlegende Metadaten auszudrucken, ein info-Objekt zu erstellen und das Leistungsspektrum zu plotten."""
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy als np
Pfad zu Ihrer XDF-Datei
data_path = '/path/to/your/xdf_file.xdf'
XDF-Datei laden
streams, fileheader = pyxdf.load_xdf(data_path)
print("XDF-Dateikopf:", fileheader)
print("Anzahl der gefundenen Streams:", len(streams))
für i, stream in enumerate(streams):
print("\nStream", i + 1)
print("Stream Name:", stream['info']['name'][0])
print("Stream-Typ:", stream['info']['type'][0])
print("Anzahl der Kanäle:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Abtastrate:", sfreq)
print("Anzahl der Proben:", len(stream['time_series']))
print("Erste 5 Datenpunkte drucken:", stream['time_series'][:5])
channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']] print("Channel Names:", channel_names) channel_types = 'eeg'
MNE-Info-Objekt erstellen
info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Daten müssen transponiert werden: Kanäle x Proben
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # Ein einfaches Spektrogramm (Leistungsdichtespektrum) plottenZusätzliche RessourcenLaden Sie dieses Tutorial als Jupyter-Notebook von EMOTIV GitHub herunterÜberprüfen Sie die LSL-Online-Dokumentation, einschließlich der offiziellen README-Datei auf GitHubSie benötigen ein oder mehrere unterstützte Datenerfassungsgeräte, um Daten zu sammelnAlle EMOTIVs Brainware-Geräte verbinden sich mit der EmotivPRO-Software, die integrierte LSL-Funktionen zum Senden und Empfangen von DatenströmenZusätzliche Ressourcen:Code zum Ausführen von LSL mit Emotiv-Geräten, mit BeispielskriptenNützliches LSL-Demo auf YouTubeSCCN LSL GitHub-Repository für alle zugehörigen BibliothekenGitHub-Repository für eine Sammlung von Untermodulen und AppsHyPyP-Analysepipeline für Hyperscanning-Studien
von Roshini Randeniya und Lucas Kleine
Operation:
Sobald im Kommandozeilenfenster ausgeführt, startet dieses Skript sofort einen LSL-Stream. Jedes Mal, wenn die 'Enter'-Taste gedrückt wird, sendet es einen Trigger und spielt eine Audiodatei ab.
import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet
def wait_for_keypress():
print("Drücken Sie ENTER, um die Audiowiedergabe zu starten und einen LSL-Marker zu senden.")
while True: # This loop waits for a keyboard input input_str = input() # Wait for input from the terminal if input_str == "": # If the enter key is pressed, proceed break
def AudioMarker(audio_file, outlet): # Funktion zum Abspielen von Audio und Senden von Markern
data, fs = sf.read(audio_file) # Audiodatei laden
print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) # Send marker indicating the start of audio playback sd.play(data, fs) # play the audio sd.wait() # Wait until audio is done playing print("Audio playback finished.")
wenn name == "main": # HAUPTSCHLEIFE
# LSL-Stream für Marker einrichten
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Abtastrate auf 0 setzen, da Marker unregelmäßig sind
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'
info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id) outlet = StreamOutlet(info) # create LSL outlet # Keep the script running and wait for ENTER key to play audio and send marker while True: wait_for_keypress() audio_filepath = "/path/to/your/audio_file.wav" # replace with correct path to your audio file AudioMarker(audio_filepath, outlet) # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>
**Mit dem Ausführen dieser Datei (selbst vor dem Abspielen des Audios) haben Sie einen LSL-Stream über einen Ausgang initiiert. Jetzt werden wir diesen Stream in LabRecorder anzeigen
SCHRITT 5 - LabRecorder verwenden, um alle LSL-Ströme anzuzeigen und zu speichern
LabRecorder öffnen
Drücken Sie Aktualisieren. Die verfügbaren LSL-Ströme sollten in der Streamliste sichtbar sein
• Sie sollten in der Lage sein, Streams von beiden EmotivPROs (normalerweise "EmotivDataStream" genannt) und den Marker-Stream (genannt "AudioMarkers") zu sehenKlicken Sie auf Durchsuchen, um einen Speicherort für die Daten auszuwählen (und andere Parameter festzulegen)
Wählen Sie alle Streams aus und drücken Sie Aufnehmen, um die Aufnahme zu starten
Klicken Sie auf Stop, wenn Sie die Aufnahme beenden möchten

Mit den Daten arbeiten
LabRecorder gibt eine XDF-Datei (Extensible Data Format) aus, die Daten von allen Streams enthält. XDF-Dateien sind in Streams strukturiert, von denen jeder einen anderen Header enthält, der beschreibt, was er enthält (Gerätename, Datentyp, Abtastrate, Kanäle und mehr). Sie können den untenstehenden Codeblock verwenden, um Ihre XDF-Datei zu öffnen und einige grundlegende Informationen anzuzeigen.
Dieses Beispiels-Skript demonstriert einige grundlegende Funktionen zum Importieren und Annotieren von EEG-Daten, die mit der EmotivPRO-Software gesammelt wurden. Es verwendet MNE, um eine XDF-Datei zu laden, einige grundlegende Metadaten auszudrucken, ein info-Objekt zu erstellen und das Leistungsspektrum zu plotten."""
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy als np
Pfad zu Ihrer XDF-Datei
data_path = '/path/to/your/xdf_file.xdf'
XDF-Datei laden
streams, fileheader = pyxdf.load_xdf(data_path)
print("XDF-Dateikopf:", fileheader)
print("Anzahl der gefundenen Streams:", len(streams))
für i, stream in enumerate(streams):
print("\nStream", i + 1)
print("Stream Name:", stream['info']['name'][0])
print("Stream-Typ:", stream['info']['type'][0])
print("Anzahl der Kanäle:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Abtastrate:", sfreq)
print("Anzahl der Proben:", len(stream['time_series']))
print("Erste 5 Datenpunkte drucken:", stream['time_series'][:5])
channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']] print("Channel Names:", channel_names) channel_types = 'eeg'
MNE-Info-Objekt erstellen
info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Daten müssen transponiert werden: Kanäle x Proben
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # Ein einfaches Spektrogramm (Leistungsdichtespektrum) plottenZusätzliche RessourcenLaden Sie dieses Tutorial als Jupyter-Notebook von EMOTIV GitHub herunterÜberprüfen Sie die LSL-Online-Dokumentation, einschließlich der offiziellen README-Datei auf GitHubSie benötigen ein oder mehrere unterstützte Datenerfassungsgeräte, um Daten zu sammelnAlle EMOTIVs Brainware-Geräte verbinden sich mit der EmotivPRO-Software, die integrierte LSL-Funktionen zum Senden und Empfangen von DatenströmenZusätzliche Ressourcen:Code zum Ausführen von LSL mit Emotiv-Geräten, mit BeispielskriptenNützliches LSL-Demo auf YouTubeSCCN LSL GitHub-Repository für alle zugehörigen BibliothekenGitHub-Repository für eine Sammlung von Untermodulen und AppsHyPyP-Analysepipeline für Hyperscanning-Studien
