Lab Streaming Layer (LSL) do synchronizacji wielu strumieni danych

Roshini Randeniya

1 paź 2025

Udostępnij:

autorzy Roshini Randeniya i Lucas Kleine

Operacja:
Po uruchomieniu w wierszu poleceń, ten skrypt natychmiast inicjuje strumień LSL. Kiedy klawisz 'Enter' jest naciśnięty, wysyła trigger i odtwarza plik audio."""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet

def wait_for_keypress():
print("Naciśnij ENTER, aby rozpocząć odtwarzanie audio i wysłać znacznik LSL.")

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): # funkcja do odtwarzania audio i wysyłania znacznika
data, fs = sf.read(audio_file) # Wczytaj plik audio

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.")

if name == "main": # GŁÓWNA PĘTLA
# Konfiguracja strumienia LSL dla znaczników
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Ustaw na 0 częstotliwości próbkowania, ponieważ znaczniki są nieregularne
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>

Ten przykładowy skrypt demonstruje kilka podstawowych funkcji do importowania i adnotowania danych EEG zebranych z oprogramowania EmotivPRO. Używa MNE do załadowania pliku XDF, wydrukowania podstawowych metadanych, utworzenia obiektu info i wykreślenia widma mocy."""

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

Ścieżka do twojego pliku XDF

data_path = '/path/to/your/xdf_file.xdf'

Załaduj plik XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("Nagłówek pliku XDF:", fileheader)
print("Liczba znalezionych strumieni:", len(streams))

dla i, stream w enumerate(streams):
print("\nStrumień", i + 1)
print("Nazwa strumienia:", stream['info']['name'][0])
print("Typ strumienia:", stream['info']['type'][0])
print("Liczba kanałów:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Częstotliwość próbkowania:", sfreq)
print("Liczba próbek:", len(stream['time_series']))
print("Wydrukuj pierwsze 5 punktów danych:", 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'

Utwórz obiekt MNE info

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Dane muszą być przetransponowane: kanały x próbki
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # wykreśl prosty spektrogram (gęstość mocy widmowej)Dodatkowe zasobyPobierz ten samouczek jako notatnik Jupyter z EMOTIV GitHubSprawdź dokumentację online LSL, w tym oficjalny plik README na GitHubBędziesz potrzebować jednego lub więcej obsługiwanych urządzeń do akwizycji danych do zbierania danychWszystkie urządzenia brainware EMOTIV łączą się z oprogramowaniem EmotivPRO, które ma wbudowane możliwości LSL do wysyłania i odbierania strumieni danychDodatkowe zasoby:Kod do uruchomienia LSL z użyciem urządzeń Emotiv, z przykładowymi skryptamiUżyteczna prezentacja LSL na YouTubeRepozytorium GitHub SCCN LSL dla wszystkich powiązanych bibliotekRepozytorium GitHub dla kolekcji podmodułów i aplikacjiPipeline analizy HyPyP dla badań nad hiperskanowaniem

autorzy Roshini Randeniya i Lucas Kleine

Operacja:
Po uruchomieniu w wierszu poleceń, ten skrypt natychmiast inicjuje strumień LSL. Kiedy klawisz 'Enter' jest naciśnięty, wysyła trigger i odtwarza plik audio."""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet

def wait_for_keypress():
print("Naciśnij ENTER, aby rozpocząć odtwarzanie audio i wysłać znacznik LSL.")

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): # funkcja do odtwarzania audio i wysyłania znacznika
data, fs = sf.read(audio_file) # Wczytaj plik audio

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.")

if name == "main": # GŁÓWNA PĘTLA
# Konfiguracja strumienia LSL dla znaczników
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Ustaw na 0 częstotliwości próbkowania, ponieważ znaczniki są nieregularne
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>

Ten przykładowy skrypt demonstruje kilka podstawowych funkcji do importowania i adnotowania danych EEG zebranych z oprogramowania EmotivPRO. Używa MNE do załadowania pliku XDF, wydrukowania podstawowych metadanych, utworzenia obiektu info i wykreślenia widma mocy."""

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

Ścieżka do twojego pliku XDF

data_path = '/path/to/your/xdf_file.xdf'

Załaduj plik XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("Nagłówek pliku XDF:", fileheader)
print("Liczba znalezionych strumieni:", len(streams))

dla i, stream w enumerate(streams):
print("\nStrumień", i + 1)
print("Nazwa strumienia:", stream['info']['name'][0])
print("Typ strumienia:", stream['info']['type'][0])
print("Liczba kanałów:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Częstotliwość próbkowania:", sfreq)
print("Liczba próbek:", len(stream['time_series']))
print("Wydrukuj pierwsze 5 punktów danych:", 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'

Utwórz obiekt MNE info

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Dane muszą być przetransponowane: kanały x próbki
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # wykreśl prosty spektrogram (gęstość mocy widmowej)Dodatkowe zasobyPobierz ten samouczek jako notatnik Jupyter z EMOTIV GitHubSprawdź dokumentację online LSL, w tym oficjalny plik README na GitHubBędziesz potrzebować jednego lub więcej obsługiwanych urządzeń do akwizycji danych do zbierania danychWszystkie urządzenia brainware EMOTIV łączą się z oprogramowaniem EmotivPRO, które ma wbudowane możliwości LSL do wysyłania i odbierania strumieni danychDodatkowe zasoby:Kod do uruchomienia LSL z użyciem urządzeń Emotiv, z przykładowymi skryptamiUżyteczna prezentacja LSL na YouTubeRepozytorium GitHub SCCN LSL dla wszystkich powiązanych bibliotekRepozytorium GitHub dla kolekcji podmodułów i aplikacjiPipeline analizy HyPyP dla badań nad hiperskanowaniem

autorzy Roshini Randeniya i Lucas Kleine

Operacja:
Po uruchomieniu w wierszu poleceń, ten skrypt natychmiast inicjuje strumień LSL. Kiedy klawisz 'Enter' jest naciśnięty, wysyła trigger i odtwarza plik audio."""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet

def wait_for_keypress():
print("Naciśnij ENTER, aby rozpocząć odtwarzanie audio i wysłać znacznik LSL.")

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): # funkcja do odtwarzania audio i wysyłania znacznika
data, fs = sf.read(audio_file) # Wczytaj plik audio

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.")

if name == "main": # GŁÓWNA PĘTLA
# Konfiguracja strumienia LSL dla znaczników
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Ustaw na 0 częstotliwości próbkowania, ponieważ znaczniki są nieregularne
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>

Ten przykładowy skrypt demonstruje kilka podstawowych funkcji do importowania i adnotowania danych EEG zebranych z oprogramowania EmotivPRO. Używa MNE do załadowania pliku XDF, wydrukowania podstawowych metadanych, utworzenia obiektu info i wykreślenia widma mocy."""

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

Ścieżka do twojego pliku XDF

data_path = '/path/to/your/xdf_file.xdf'

Załaduj plik XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("Nagłówek pliku XDF:", fileheader)
print("Liczba znalezionych strumieni:", len(streams))

dla i, stream w enumerate(streams):
print("\nStrumień", i + 1)
print("Nazwa strumienia:", stream['info']['name'][0])
print("Typ strumienia:", stream['info']['type'][0])
print("Liczba kanałów:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Częstotliwość próbkowania:", sfreq)
print("Liczba próbek:", len(stream['time_series']))
print("Wydrukuj pierwsze 5 punktów danych:", 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'

Utwórz obiekt MNE info

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Dane muszą być przetransponowane: kanały x próbki
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # wykreśl prosty spektrogram (gęstość mocy widmowej)Dodatkowe zasobyPobierz ten samouczek jako notatnik Jupyter z EMOTIV GitHubSprawdź dokumentację online LSL, w tym oficjalny plik README na GitHubBędziesz potrzebować jednego lub więcej obsługiwanych urządzeń do akwizycji danych do zbierania danychWszystkie urządzenia brainware EMOTIV łączą się z oprogramowaniem EmotivPRO, które ma wbudowane możliwości LSL do wysyłania i odbierania strumieni danychDodatkowe zasoby:Kod do uruchomienia LSL z użyciem urządzeń Emotiv, z przykładowymi skryptamiUżyteczna prezentacja LSL na YouTubeRepozytorium GitHub SCCN LSL dla wszystkich powiązanych bibliotekRepozytorium GitHub dla kolekcji podmodułów i aplikacjiPipeline analizy HyPyP dla badań nad hiperskanowaniem

Kontynuuj czytanie

Podstawy oscylacji neuronalnych

© 2025 EMOTIV, Wszelkie prawa zastrzeżone.

Consent

Twoje wybory dotyczące prywatności (ustawienia plików cookie)

*Zastrzeżenie – Produkty EMOTIV przeznaczone są wyłącznie do zastosowań badawczych i osobistych. Nasze produkty nie są sprzedawane jako wyroby medyczne, jak określono w dyrektywie UE 93/42/EEC. Nasze produkty nie są zaprojektowane ani przeznaczone do diagnozowania ani leczenia chorób.

Uwaga dotycząca tłumaczeń: nieangielskie wersje tej witryny zostały przetłumaczone dla Twojej wygody przy użyciu sztucznej inteligencji. Chociaż dążymy do dokładności, automatyczne tłumaczenia mogą zawierać błędy lub niuanse różniące się od oryginalnego tekstu. Aby uzyskać najdokładniejsze informacje, prosimy o odniesienie się do angielskiej wersji tej witryny.

© 2025 EMOTIV, Wszelkie prawa zastrzeżone.

Consent

Twoje wybory dotyczące prywatności (ustawienia plików cookie)

*Zastrzeżenie – Produkty EMOTIV przeznaczone są wyłącznie do zastosowań badawczych i osobistych. Nasze produkty nie są sprzedawane jako wyroby medyczne, jak określono w dyrektywie UE 93/42/EEC. Nasze produkty nie są zaprojektowane ani przeznaczone do diagnozowania ani leczenia chorób.

Uwaga dotycząca tłumaczeń: nieangielskie wersje tej witryny zostały przetłumaczone dla Twojej wygody przy użyciu sztucznej inteligencji. Chociaż dążymy do dokładności, automatyczne tłumaczenia mogą zawierać błędy lub niuanse różniące się od oryginalnego tekstu. Aby uzyskać najdokładniejsze informacje, prosimy o odniesienie się do angielskiej wersji tej witryny.

© 2025 EMOTIV, Wszelkie prawa zastrzeżone.

Consent

Twoje wybory dotyczące prywatności (ustawienia plików cookie)

*Zastrzeżenie – Produkty EMOTIV przeznaczone są wyłącznie do zastosowań badawczych i osobistych. Nasze produkty nie są sprzedawane jako wyroby medyczne, jak określono w dyrektywie UE 93/42/EEC. Nasze produkty nie są zaprojektowane ani przeznaczone do diagnozowania ani leczenia chorób.

Uwaga dotycząca tłumaczeń: nieangielskie wersje tej witryny zostały przetłumaczone dla Twojej wygody przy użyciu sztucznej inteligencji. Chociaż dążymy do dokładności, automatyczne tłumaczenia mogą zawierać błędy lub niuanse różniące się od oryginalnego tekstu. Aby uzyskać najdokładniejsze informacje, prosimy o odniesienie się do angielskiej wersji tej witryny.