
Lab Streaming Layer (LSL) untuk Menyinkronkan Beberapa Aliran Data
Dr. Roshini Randeniya dan Lucas Kleine
Diperbarui pada
17 Mei 2024

Lab Streaming Layer (LSL) untuk Menyinkronkan Beberapa Aliran Data
Dr. Roshini Randeniya dan Lucas Kleine
Diperbarui pada
17 Mei 2024

Lab Streaming Layer (LSL) untuk Menyinkronkan Beberapa Aliran Data
Dr. Roshini Randeniya dan Lucas Kleine
Diperbarui pada
17 Mei 2024
Selamat datang! Dalam tutorial ini kita akan mempelajari cara menggunakan Lab Streaming Layer (LSL) di Python untuk mengumpulkan dan menyinkronkan data EEG Emotiv dari beberapa perangkat. Ini akan membutuhkan pengetahuan kerja dasar tentang bahasa pemrograman Python.
Apa yang Akan Anda Pelajari
Apa itu Lab Streaming Layer (LSL) dan mengapa para peneliti menggunakannya
Cara mengumpulkan data yang disinkronkan dari beberapa perangkat EEG Emotiv
Cara mengimpor dan memeriksa data yang dikumpulkan
1.1 Apa Itu LSL dan Apa Kegunaannya?
Lab streaming layer (LSL) adalah kotak alat sumber terbuka (open-source) yang dapat digunakan untuk mengirim, menerima & menyinkronkan aliran data saraf, fisiologis, dan perilaku dari berbagai perangkat keras sensor. Perangkat keras penginderaan otak dan tubuh yang semakin mumpuni, presisi, dan seluler (seperti sistem EEG Emotiv) membawa ilmu saraf ke luar laboratorium ke dalam dunia data waktu nyata (real-time). Ketika pengukuran otak seperti EEG dan MEG dulunya terbatas pada laboratorium penelitian, perangkat seluler memungkinkan kita mengumpulkan banyak data di lingkungan yang lebih alami, dan dari banyak orang sekaligus.
Seorang peneliti mungkin tertarik pada sinkronisasi fisiologis antara dua orang yang mendengarkan musik yang sama. LSL dapat membantu kita mengumpulkan data dari dua headset EEG secara terpisah yang juga disinkronkan dengan presentasi suara.
Beberapa contoh kegunaan lain untuk LSL:
Menambahkan penanda peristiwa (event marker) dari eksperimen ke data EEG yang sedang berlangsung
Menyelaraskan waktu data dari berbagai sumber untuk satu peserta (misalnya detak jantung, EMG, EEG)
Menyelaraskan waktu data dari beberapa peserta (misalnya Studi Hyperscanning EEG)
1.2 Bagaimana Cara Kerja LSL?
Lab Streaming Layer adalah protokol untuk pertukaran data deret waktu (time-series) secara waktu nyata (real-time) antara beberapa perangkat. LSL dapat diimplementasikan menggunakan pustaka sumber terbuka untuk bahasa pemrograman seperti Python, MATLAB, C++, Java, dan lainnya.

Fungsionalitas inti berputar di sekitar aliran data LSL:
1. Perangkat/perangkat lunak akuisisi mengumpulkan data dan membuat aliran data - Data fisiologis dapat dialirkan ke LSL dari perangkat perekom EEG, pelacak mata (eye-tracker), sistem penangkap gerak (motion capture), pemantau detak jantung, dll., termasuk metadata (tingkat sampling, jenis data, informasi saluran, dll.) - Penanda peristiwa dari eksperimen (misalnya menggunakan PsychoPy) juga dapat dikirim sebagai aliran data menggunakan LSL
2. Aliran data diterbitkan ke jaringan - Ini adalah cara data dikirim menggunakan LSL; aliran data "disiarkan" ke jaringan - Aliran data yang diterbitkan tersedia di jaringan dan dapat ditemukan oleh perangkat lain yang mendukung LSL di jaringan yang sama - LSL menetapkan stempel waktu (timestamp) untuk setiap bongkahan data atau sampel berdasarkan jam bersama (mengikuti Network Time Protocol). - Aliran data didorong sampel-demi-sampel (atau bongkahan-demi-bongkahan) melalui "outlet"
3. Perangkat pengumpul "berlangganan" ke aliran data - Ini adalah cara data diterima menggunakan LSL - Perangkat pengumpul di jaringan yang sama menerima aliran data yang diterbitkan melalui "inlet". - Masing-masing inlet menerima sampel aliran dan metadata dari hanya satu outlet
4. Menyimpan data - Setelah berlangganan ke aliran data, Anda dapat menyimpannya ke variabel dalam bahasa pemrograman pilihan Anda, atau menggunakan perangkat lunak yang disediakan LSL, LabRecorder, untuk menyimpannya ke format standar seperti .xdf.
2.0 Gambaran Umum Tutorial
Dalam tutorial ini, kita akan mengambil contoh pengaturan eksperimental dan memandu Anda melalui langkah-langkah serta kode yang diperlukan untuk menerapkannya menggunakan LSL di Python. Kita akan menggunakan Python untuk memutar suara sambil mengumpulkan data EEG dari dua orang yang mengenakan headset Emotiv. Kita akan menggunakan dua komputer yang masing-masing menjalankan EmotivPRO untuk mengumpulkan data EEG, dan menyiarkan setiap aliran data melalui outlet LSL yang terpisah. Kita akan menggunakan pustaka Python untuk memutar file audio dan secara bersamaan mengirim pemicu (trigger) setiap kali file tersebut dimulai.
LANGKAH-LANGKAH:
1. Gunakan EmotivPRO untuk mengalirkan data melalui outlet LSL yang mencakup data EEG (dan/atau gerakan, kualitas kontak, kualitas sinyal, dll.) 2. Putar trek audio menggunakan skrip Python, dan secara bersamaan kirim pemicu melalui LSL lainnya. Gunakan LabRecorder untuk menangkap dan menyimpan ketiga aliran data tersebut melalui sebuah inlet LSL.

2.1 LANGKAH 1 - Pengaturan dan instalasi
Anda memerlukan perangkat akuisisi data yang didukung untuk mengumpulkan data
• Semua perangkat brainware Emotiv terhubung ke LSL melalui perangkat lunak EmotivPROInstal EmotivPRO pada perangkat Anda. Anda akan memerlukan lisensi EmotivPRO yang valid untuk menggunakan LSL.
Instal pustaka LSL Python dengan perintah berikut:
pip install pylslUnduh perangkat lunak LabRecorder. Ini adalah aplikasi sederhana dan gratis yang dapat dijalankan dari
baris perintah atau menggunakan unduhan mandiriUntuk eksperimen kita: Instal paket yang diperlukan untuk memutar audio menggunakan Python
pip install sounddevice soundfile
2.2 LANGKAH 3 - Kirim data dari EmotivPRO melalui aliran LSL
Temukan ikon "..." di sudut kanan atas aplikasi, navigasikan ke Pengaturan (Settings)
Temukan bagian 'Lab Streaming Layer' dan sub-bagian 'Outlet'
Pilih semua tipe data yang ingin Anda siarkan
Pilih format data (float 32-bit atau double 64-bit)
Pilih apakah ingin mengirim data sampel-demi-sampel atau dalam bongkahan (chunks) sampel
Klik 'Mulai' (Start) untuk menyiarkan aliran data LSL
2.3 LANGKAH 4 - Gunakan skrip Python untuk memutar audio dan mengirim pemicu
Salin dan tempel blok kode berikut ke dalam file Python dan simpan ke komputer Anda.
Temukan file audio (idealnya file .wav) yang ingin Anda putar dan edit skripnya dengan mengubah
variabelaudio_filepathke jalur file (filepath) audio Anda di komputer AndaBuka command prompt untuk berinteraksi dengan baris perintah (command line) dan navigasikan ke folder tempat
file Python Anda disimpanMasukkan:
python3 namafile.py
• Tergantung pada instalasi Python Anda, Anda mungkin menggunakanpythondan bukanpython3
Catatan: Ganti/path/to/audio.wavdengan lokasi file audio yang ingin Anda putar selama eksperimen Anda.
""" LSL Example: Play audio and send a trigger marker This script creates an LSL marker stream, waits for the user to press ENTER, then plays an audio file and sends a marker that can be synchronized with EEG data collected through LabRecorder. """ import sounddevice as sd import soundfile as sf from pylsl import StreamInfo, StreamOutlet def wait_for_keypress(): print("Press ENTER to start audio playback and send an LSL marker.") while True: if input() == "": break def play_audio_and_send_marker(audio_file, outlet): data, fs = sf.read(audio_file) print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("Audio playback finished.") if __name__ == "__main__": info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )
""" LSL Example: Play audio and send a trigger marker This script creates an LSL marker stream, waits for the user to press ENTER, then plays an audio file and sends a marker that can be synchronized with EEG data collected through LabRecorder. """ import sounddevice as sd import soundfile as sf from pylsl import StreamInfo, StreamOutlet def wait_for_keypress(): print("Press ENTER to start audio playback and send an LSL marker.") while True: if input() == "": break def play_audio_and_send_marker(audio_file, outlet): data, fs = sf.read(audio_file) print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("Audio playback finished.") if __name__ == "__main__": info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )
""" LSL Example: Play audio and send a trigger marker This script creates an LSL marker stream, waits for the user to press ENTER, then plays an audio file and sends a marker that can be synchronized with EEG data collected through LabRecorder. """ import sounddevice as sd import soundfile as sf from pylsl import StreamInfo, StreamOutlet def wait_for_keypress(): print("Press ENTER to start audio playback and send an LSL marker.") while True: if input() == "": break def play_audio_and_send_marker(audio_file, outlet): data, fs = sf.read(audio_file) print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("Audio playback finished.") if __name__ == "__main__": info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )
2.4 LANGKAH 5 - Gunakan LabRecorder untuk melihat dan menyimpan semua aliran LSL
Buka LabRecorder
Tekan
Update. Aliran LSL yang tersedia akan terlihat dalam daftar aliran
• Anda seharusnya dapat melihat aliran dari kedua EmotivPRO (biasanya disebut "Emotiv-
DataStream") dan aliran penanda (disebut "AudioMarkers")Klik
Browseuntuk memilih lokasi penyimpanan data (dan atur parameter lainnya)Pilih semua aliran dan tekan
Recorduntuk mulai merekam
3.0 Bekerja dengan data
LabRecorder menghasilkan file XDF (Extensible Data Format) yang berisi data dari semua aliran. File XDF disusun menjadi aliran-aliran, masing-masing dengan header berbeda yang menjelaskan isinya (nama perangkat, tipe data, tingkat sampling, saluran, dan banyak lagi). Anda dapat menggunakan blok kode di bawah ini untuk membuka file XDF Anda dan menampilkan beberapa informasi dasar.
Catatan: Ganti /path/to/your/file.xdf dengan jalur file untuk file output XDF LabRecorder Anda.
import pyxdf import mne import matplotlib.pyplot as plt import numpy as np # Give the path to your LSL output file here. data_path = "/path/to/your/file.xdf" # Load the XDF file. streams, fileheader = pyxdf.load_xdf(data_path) print("XDF File Header:", fileheader) print("Number of streams found:", len(streams)) for i, stream in enumerate(streams): print("\nStream", i + 1) print("Stream Name:", stream["info"]["name"][0]) print("Stream Type:", stream["info"]["type"][0]) print("Number of Channels:", stream["info"]["channel_count"][0]) sfreq = float(stream["info"]["nominal_srate"][0]) print("Sampling Rate:", sfreq) print("Number of Samples:", len(stream["time_series"])) print("First 5 data points:", 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"
import pyxdf import mne import matplotlib.pyplot as plt import numpy as np # Give the path to your LSL output file here. data_path = "/path/to/your/file.xdf" # Load the XDF file. streams, fileheader = pyxdf.load_xdf(data_path) print("XDF File Header:", fileheader) print("Number of streams found:", len(streams)) for i, stream in enumerate(streams): print("\nStream", i + 1) print("Stream Name:", stream["info"]["name"][0]) print("Stream Type:", stream["info"]["type"][0]) print("Number of Channels:", stream["info"]["channel_count"][0]) sfreq = float(stream["info"]["nominal_srate"][0]) print("Sampling Rate:", sfreq) print("Number of Samples:", len(stream["time_series"])) print("First 5 data points:", 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"
import pyxdf import mne import matplotlib.pyplot as plt import numpy as np # Give the path to your LSL output file here. data_path = "/path/to/your/file.xdf" # Load the XDF file. streams, fileheader = pyxdf.load_xdf(data_path) print("XDF File Header:", fileheader) print("Number of streams found:", len(streams)) for i, stream in enumerate(streams): print("\nStream", i + 1) print("Stream Name:", stream["info"]["name"][0]) print("Stream Type:", stream["info"]["type"][0]) print("Number of Channels:", stream["info"]["channel_count"][0]) sfreq = float(stream["info"]["nominal_srate"][0]) print("Sampling Rate:", sfreq) print("Number of Samples:", len(stream["time_series"])) print("First 5 data points:", 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"
4.0 Sumber Daya Tambahan
Dokumentasi Resmi
Lihat dokumentasi online, termasuk file README resmi di GitHub
Sumber daya tambahan:
• Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan contoh skrip
• Demo LSL yang berguna di YouTube
• Repositori GitHub SCCN LSL untuk semua pustaka terkait
• Repositori GitHub LSL untuk kumpulan submodul dan aplikasiAlur analisis HyPyP untuk studi Hyperscanning
Selamat datang! Dalam tutorial ini kita akan mempelajari cara menggunakan Lab Streaming Layer (LSL) di Python untuk mengumpulkan dan menyinkronkan data EEG Emotiv dari beberapa perangkat. Ini akan membutuhkan pengetahuan kerja dasar tentang bahasa pemrograman Python.
Apa yang Akan Anda Pelajari
Apa itu Lab Streaming Layer (LSL) dan mengapa para peneliti menggunakannya
Cara mengumpulkan data yang disinkronkan dari beberapa perangkat EEG Emotiv
Cara mengimpor dan memeriksa data yang dikumpulkan
1.1 Apa Itu LSL dan Apa Kegunaannya?
Lab streaming layer (LSL) adalah kotak alat sumber terbuka (open-source) yang dapat digunakan untuk mengirim, menerima & menyinkronkan aliran data saraf, fisiologis, dan perilaku dari berbagai perangkat keras sensor. Perangkat keras penginderaan otak dan tubuh yang semakin mumpuni, presisi, dan seluler (seperti sistem EEG Emotiv) membawa ilmu saraf ke luar laboratorium ke dalam dunia data waktu nyata (real-time). Ketika pengukuran otak seperti EEG dan MEG dulunya terbatas pada laboratorium penelitian, perangkat seluler memungkinkan kita mengumpulkan banyak data di lingkungan yang lebih alami, dan dari banyak orang sekaligus.
Seorang peneliti mungkin tertarik pada sinkronisasi fisiologis antara dua orang yang mendengarkan musik yang sama. LSL dapat membantu kita mengumpulkan data dari dua headset EEG secara terpisah yang juga disinkronkan dengan presentasi suara.
Beberapa contoh kegunaan lain untuk LSL:
Menambahkan penanda peristiwa (event marker) dari eksperimen ke data EEG yang sedang berlangsung
Menyelaraskan waktu data dari berbagai sumber untuk satu peserta (misalnya detak jantung, EMG, EEG)
Menyelaraskan waktu data dari beberapa peserta (misalnya Studi Hyperscanning EEG)
1.2 Bagaimana Cara Kerja LSL?
Lab Streaming Layer adalah protokol untuk pertukaran data deret waktu (time-series) secara waktu nyata (real-time) antara beberapa perangkat. LSL dapat diimplementasikan menggunakan pustaka sumber terbuka untuk bahasa pemrograman seperti Python, MATLAB, C++, Java, dan lainnya.

Fungsionalitas inti berputar di sekitar aliran data LSL:
1. Perangkat/perangkat lunak akuisisi mengumpulkan data dan membuat aliran data - Data fisiologis dapat dialirkan ke LSL dari perangkat perekom EEG, pelacak mata (eye-tracker), sistem penangkap gerak (motion capture), pemantau detak jantung, dll., termasuk metadata (tingkat sampling, jenis data, informasi saluran, dll.) - Penanda peristiwa dari eksperimen (misalnya menggunakan PsychoPy) juga dapat dikirim sebagai aliran data menggunakan LSL
2. Aliran data diterbitkan ke jaringan - Ini adalah cara data dikirim menggunakan LSL; aliran data "disiarkan" ke jaringan - Aliran data yang diterbitkan tersedia di jaringan dan dapat ditemukan oleh perangkat lain yang mendukung LSL di jaringan yang sama - LSL menetapkan stempel waktu (timestamp) untuk setiap bongkahan data atau sampel berdasarkan jam bersama (mengikuti Network Time Protocol). - Aliran data didorong sampel-demi-sampel (atau bongkahan-demi-bongkahan) melalui "outlet"
3. Perangkat pengumpul "berlangganan" ke aliran data - Ini adalah cara data diterima menggunakan LSL - Perangkat pengumpul di jaringan yang sama menerima aliran data yang diterbitkan melalui "inlet". - Masing-masing inlet menerima sampel aliran dan metadata dari hanya satu outlet
4. Menyimpan data - Setelah berlangganan ke aliran data, Anda dapat menyimpannya ke variabel dalam bahasa pemrograman pilihan Anda, atau menggunakan perangkat lunak yang disediakan LSL, LabRecorder, untuk menyimpannya ke format standar seperti .xdf.
2.0 Gambaran Umum Tutorial
Dalam tutorial ini, kita akan mengambil contoh pengaturan eksperimental dan memandu Anda melalui langkah-langkah serta kode yang diperlukan untuk menerapkannya menggunakan LSL di Python. Kita akan menggunakan Python untuk memutar suara sambil mengumpulkan data EEG dari dua orang yang mengenakan headset Emotiv. Kita akan menggunakan dua komputer yang masing-masing menjalankan EmotivPRO untuk mengumpulkan data EEG, dan menyiarkan setiap aliran data melalui outlet LSL yang terpisah. Kita akan menggunakan pustaka Python untuk memutar file audio dan secara bersamaan mengirim pemicu (trigger) setiap kali file tersebut dimulai.
LANGKAH-LANGKAH:
1. Gunakan EmotivPRO untuk mengalirkan data melalui outlet LSL yang mencakup data EEG (dan/atau gerakan, kualitas kontak, kualitas sinyal, dll.) 2. Putar trek audio menggunakan skrip Python, dan secara bersamaan kirim pemicu melalui LSL lainnya. Gunakan LabRecorder untuk menangkap dan menyimpan ketiga aliran data tersebut melalui sebuah inlet LSL.

2.1 LANGKAH 1 - Pengaturan dan instalasi
Anda memerlukan perangkat akuisisi data yang didukung untuk mengumpulkan data
• Semua perangkat brainware Emotiv terhubung ke LSL melalui perangkat lunak EmotivPROInstal EmotivPRO pada perangkat Anda. Anda akan memerlukan lisensi EmotivPRO yang valid untuk menggunakan LSL.
Instal pustaka LSL Python dengan perintah berikut:
pip install pylslUnduh perangkat lunak LabRecorder. Ini adalah aplikasi sederhana dan gratis yang dapat dijalankan dari
baris perintah atau menggunakan unduhan mandiriUntuk eksperimen kita: Instal paket yang diperlukan untuk memutar audio menggunakan Python
pip install sounddevice soundfile
2.2 LANGKAH 3 - Kirim data dari EmotivPRO melalui aliran LSL
Temukan ikon "..." di sudut kanan atas aplikasi, navigasikan ke Pengaturan (Settings)
Temukan bagian 'Lab Streaming Layer' dan sub-bagian 'Outlet'
Pilih semua tipe data yang ingin Anda siarkan
Pilih format data (float 32-bit atau double 64-bit)
Pilih apakah ingin mengirim data sampel-demi-sampel atau dalam bongkahan (chunks) sampel
Klik 'Mulai' (Start) untuk menyiarkan aliran data LSL
2.3 LANGKAH 4 - Gunakan skrip Python untuk memutar audio dan mengirim pemicu
Salin dan tempel blok kode berikut ke dalam file Python dan simpan ke komputer Anda.
Temukan file audio (idealnya file .wav) yang ingin Anda putar dan edit skripnya dengan mengubah
variabelaudio_filepathke jalur file (filepath) audio Anda di komputer AndaBuka command prompt untuk berinteraksi dengan baris perintah (command line) dan navigasikan ke folder tempat
file Python Anda disimpanMasukkan:
python3 namafile.py
• Tergantung pada instalasi Python Anda, Anda mungkin menggunakanpythondan bukanpython3
Catatan: Ganti/path/to/audio.wavdengan lokasi file audio yang ingin Anda putar selama eksperimen Anda.
""" LSL Example: Play audio and send a trigger marker This script creates an LSL marker stream, waits for the user to press ENTER, then plays an audio file and sends a marker that can be synchronized with EEG data collected through LabRecorder. """ import sounddevice as sd import soundfile as sf from pylsl import StreamInfo, StreamOutlet def wait_for_keypress(): print("Press ENTER to start audio playback and send an LSL marker.") while True: if input() == "": break def play_audio_and_send_marker(audio_file, outlet): data, fs = sf.read(audio_file) print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("Audio playback finished.") if __name__ == "__main__": info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )
2.4 LANGKAH 5 - Gunakan LabRecorder untuk melihat dan menyimpan semua aliran LSL
Buka LabRecorder
Tekan
Update. Aliran LSL yang tersedia akan terlihat dalam daftar aliran
• Anda seharusnya dapat melihat aliran dari kedua EmotivPRO (biasanya disebut "Emotiv-
DataStream") dan aliran penanda (disebut "AudioMarkers")Klik
Browseuntuk memilih lokasi penyimpanan data (dan atur parameter lainnya)Pilih semua aliran dan tekan
Recorduntuk mulai merekam
3.0 Bekerja dengan data
LabRecorder menghasilkan file XDF (Extensible Data Format) yang berisi data dari semua aliran. File XDF disusun menjadi aliran-aliran, masing-masing dengan header berbeda yang menjelaskan isinya (nama perangkat, tipe data, tingkat sampling, saluran, dan banyak lagi). Anda dapat menggunakan blok kode di bawah ini untuk membuka file XDF Anda dan menampilkan beberapa informasi dasar.
Catatan: Ganti /path/to/your/file.xdf dengan jalur file untuk file output XDF LabRecorder Anda.
import pyxdf import mne import matplotlib.pyplot as plt import numpy as np # Give the path to your LSL output file here. data_path = "/path/to/your/file.xdf" # Load the XDF file. streams, fileheader = pyxdf.load_xdf(data_path) print("XDF File Header:", fileheader) print("Number of streams found:", len(streams)) for i, stream in enumerate(streams): print("\nStream", i + 1) print("Stream Name:", stream["info"]["name"][0]) print("Stream Type:", stream["info"]["type"][0]) print("Number of Channels:", stream["info"]["channel_count"][0]) sfreq = float(stream["info"]["nominal_srate"][0]) print("Sampling Rate:", sfreq) print("Number of Samples:", len(stream["time_series"])) print("First 5 data points:", 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"
4.0 Sumber Daya Tambahan
Dokumentasi Resmi
Lihat dokumentasi online, termasuk file README resmi di GitHub
Sumber daya tambahan:
• Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan contoh skrip
• Demo LSL yang berguna di YouTube
• Repositori GitHub SCCN LSL untuk semua pustaka terkait
• Repositori GitHub LSL untuk kumpulan submodul dan aplikasiAlur analisis HyPyP untuk studi Hyperscanning
Selamat datang! Dalam tutorial ini kita akan mempelajari cara menggunakan Lab Streaming Layer (LSL) di Python untuk mengumpulkan dan menyinkronkan data EEG Emotiv dari beberapa perangkat. Ini akan membutuhkan pengetahuan kerja dasar tentang bahasa pemrograman Python.
Apa yang Akan Anda Pelajari
Apa itu Lab Streaming Layer (LSL) dan mengapa para peneliti menggunakannya
Cara mengumpulkan data yang disinkronkan dari beberapa perangkat EEG Emotiv
Cara mengimpor dan memeriksa data yang dikumpulkan
1.1 Apa Itu LSL dan Apa Kegunaannya?
Lab streaming layer (LSL) adalah kotak alat sumber terbuka (open-source) yang dapat digunakan untuk mengirim, menerima & menyinkronkan aliran data saraf, fisiologis, dan perilaku dari berbagai perangkat keras sensor. Perangkat keras penginderaan otak dan tubuh yang semakin mumpuni, presisi, dan seluler (seperti sistem EEG Emotiv) membawa ilmu saraf ke luar laboratorium ke dalam dunia data waktu nyata (real-time). Ketika pengukuran otak seperti EEG dan MEG dulunya terbatas pada laboratorium penelitian, perangkat seluler memungkinkan kita mengumpulkan banyak data di lingkungan yang lebih alami, dan dari banyak orang sekaligus.
Seorang peneliti mungkin tertarik pada sinkronisasi fisiologis antara dua orang yang mendengarkan musik yang sama. LSL dapat membantu kita mengumpulkan data dari dua headset EEG secara terpisah yang juga disinkronkan dengan presentasi suara.
Beberapa contoh kegunaan lain untuk LSL:
Menambahkan penanda peristiwa (event marker) dari eksperimen ke data EEG yang sedang berlangsung
Menyelaraskan waktu data dari berbagai sumber untuk satu peserta (misalnya detak jantung, EMG, EEG)
Menyelaraskan waktu data dari beberapa peserta (misalnya Studi Hyperscanning EEG)
1.2 Bagaimana Cara Kerja LSL?
Lab Streaming Layer adalah protokol untuk pertukaran data deret waktu (time-series) secara waktu nyata (real-time) antara beberapa perangkat. LSL dapat diimplementasikan menggunakan pustaka sumber terbuka untuk bahasa pemrograman seperti Python, MATLAB, C++, Java, dan lainnya.

Fungsionalitas inti berputar di sekitar aliran data LSL:
1. Perangkat/perangkat lunak akuisisi mengumpulkan data dan membuat aliran data - Data fisiologis dapat dialirkan ke LSL dari perangkat perekom EEG, pelacak mata (eye-tracker), sistem penangkap gerak (motion capture), pemantau detak jantung, dll., termasuk metadata (tingkat sampling, jenis data, informasi saluran, dll.) - Penanda peristiwa dari eksperimen (misalnya menggunakan PsychoPy) juga dapat dikirim sebagai aliran data menggunakan LSL
2. Aliran data diterbitkan ke jaringan - Ini adalah cara data dikirim menggunakan LSL; aliran data "disiarkan" ke jaringan - Aliran data yang diterbitkan tersedia di jaringan dan dapat ditemukan oleh perangkat lain yang mendukung LSL di jaringan yang sama - LSL menetapkan stempel waktu (timestamp) untuk setiap bongkahan data atau sampel berdasarkan jam bersama (mengikuti Network Time Protocol). - Aliran data didorong sampel-demi-sampel (atau bongkahan-demi-bongkahan) melalui "outlet"
3. Perangkat pengumpul "berlangganan" ke aliran data - Ini adalah cara data diterima menggunakan LSL - Perangkat pengumpul di jaringan yang sama menerima aliran data yang diterbitkan melalui "inlet". - Masing-masing inlet menerima sampel aliran dan metadata dari hanya satu outlet
4. Menyimpan data - Setelah berlangganan ke aliran data, Anda dapat menyimpannya ke variabel dalam bahasa pemrograman pilihan Anda, atau menggunakan perangkat lunak yang disediakan LSL, LabRecorder, untuk menyimpannya ke format standar seperti .xdf.
2.0 Gambaran Umum Tutorial
Dalam tutorial ini, kita akan mengambil contoh pengaturan eksperimental dan memandu Anda melalui langkah-langkah serta kode yang diperlukan untuk menerapkannya menggunakan LSL di Python. Kita akan menggunakan Python untuk memutar suara sambil mengumpulkan data EEG dari dua orang yang mengenakan headset Emotiv. Kita akan menggunakan dua komputer yang masing-masing menjalankan EmotivPRO untuk mengumpulkan data EEG, dan menyiarkan setiap aliran data melalui outlet LSL yang terpisah. Kita akan menggunakan pustaka Python untuk memutar file audio dan secara bersamaan mengirim pemicu (trigger) setiap kali file tersebut dimulai.
LANGKAH-LANGKAH:
1. Gunakan EmotivPRO untuk mengalirkan data melalui outlet LSL yang mencakup data EEG (dan/atau gerakan, kualitas kontak, kualitas sinyal, dll.) 2. Putar trek audio menggunakan skrip Python, dan secara bersamaan kirim pemicu melalui LSL lainnya. Gunakan LabRecorder untuk menangkap dan menyimpan ketiga aliran data tersebut melalui sebuah inlet LSL.

2.1 LANGKAH 1 - Pengaturan dan instalasi
Anda memerlukan perangkat akuisisi data yang didukung untuk mengumpulkan data
• Semua perangkat brainware Emotiv terhubung ke LSL melalui perangkat lunak EmotivPROInstal EmotivPRO pada perangkat Anda. Anda akan memerlukan lisensi EmotivPRO yang valid untuk menggunakan LSL.
Instal pustaka LSL Python dengan perintah berikut:
pip install pylslUnduh perangkat lunak LabRecorder. Ini adalah aplikasi sederhana dan gratis yang dapat dijalankan dari
baris perintah atau menggunakan unduhan mandiriUntuk eksperimen kita: Instal paket yang diperlukan untuk memutar audio menggunakan Python
pip install sounddevice soundfile
2.2 LANGKAH 3 - Kirim data dari EmotivPRO melalui aliran LSL
Temukan ikon "..." di sudut kanan atas aplikasi, navigasikan ke Pengaturan (Settings)
Temukan bagian 'Lab Streaming Layer' dan sub-bagian 'Outlet'
Pilih semua tipe data yang ingin Anda siarkan
Pilih format data (float 32-bit atau double 64-bit)
Pilih apakah ingin mengirim data sampel-demi-sampel atau dalam bongkahan (chunks) sampel
Klik 'Mulai' (Start) untuk menyiarkan aliran data LSL
2.3 LANGKAH 4 - Gunakan skrip Python untuk memutar audio dan mengirim pemicu
Salin dan tempel blok kode berikut ke dalam file Python dan simpan ke komputer Anda.
Temukan file audio (idealnya file .wav) yang ingin Anda putar dan edit skripnya dengan mengubah
variabelaudio_filepathke jalur file (filepath) audio Anda di komputer AndaBuka command prompt untuk berinteraksi dengan baris perintah (command line) dan navigasikan ke folder tempat
file Python Anda disimpanMasukkan:
python3 namafile.py
• Tergantung pada instalasi Python Anda, Anda mungkin menggunakanpythondan bukanpython3
Catatan: Ganti/path/to/audio.wavdengan lokasi file audio yang ingin Anda putar selama eksperimen Anda.
""" LSL Example: Play audio and send a trigger marker This script creates an LSL marker stream, waits for the user to press ENTER, then plays an audio file and sends a marker that can be synchronized with EEG data collected through LabRecorder. """ import sounddevice as sd import soundfile as sf from pylsl import StreamInfo, StreamOutlet def wait_for_keypress(): print("Press ENTER to start audio playback and send an LSL marker.") while True: if input() == "": break def play_audio_and_send_marker(audio_file, outlet): data, fs = sf.read(audio_file) print("Playing audio and sending LSL marker...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("Audio playback finished.") if __name__ == "__main__": info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )
2.4 LANGKAH 5 - Gunakan LabRecorder untuk melihat dan menyimpan semua aliran LSL
Buka LabRecorder
Tekan
Update. Aliran LSL yang tersedia akan terlihat dalam daftar aliran
• Anda seharusnya dapat melihat aliran dari kedua EmotivPRO (biasanya disebut "Emotiv-
DataStream") dan aliran penanda (disebut "AudioMarkers")Klik
Browseuntuk memilih lokasi penyimpanan data (dan atur parameter lainnya)Pilih semua aliran dan tekan
Recorduntuk mulai merekam
3.0 Bekerja dengan data
LabRecorder menghasilkan file XDF (Extensible Data Format) yang berisi data dari semua aliran. File XDF disusun menjadi aliran-aliran, masing-masing dengan header berbeda yang menjelaskan isinya (nama perangkat, tipe data, tingkat sampling, saluran, dan banyak lagi). Anda dapat menggunakan blok kode di bawah ini untuk membuka file XDF Anda dan menampilkan beberapa informasi dasar.
Catatan: Ganti /path/to/your/file.xdf dengan jalur file untuk file output XDF LabRecorder Anda.
import pyxdf import mne import matplotlib.pyplot as plt import numpy as np # Give the path to your LSL output file here. data_path = "/path/to/your/file.xdf" # Load the XDF file. streams, fileheader = pyxdf.load_xdf(data_path) print("XDF File Header:", fileheader) print("Number of streams found:", len(streams)) for i, stream in enumerate(streams): print("\nStream", i + 1) print("Stream Name:", stream["info"]["name"][0]) print("Stream Type:", stream["info"]["type"][0]) print("Number of Channels:", stream["info"]["channel_count"][0]) sfreq = float(stream["info"]["nominal_srate"][0]) print("Sampling Rate:", sfreq) print("Number of Samples:", len(stream["time_series"])) print("First 5 data points:", 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"
4.0 Sumber Daya Tambahan
Dokumentasi Resmi
Lihat dokumentasi online, termasuk file README resmi di GitHub
Sumber daya tambahan:
• Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan contoh skrip
• Demo LSL yang berguna di YouTube
• Repositori GitHub SCCN LSL untuk semua pustaka terkait
• Repositori GitHub LSL untuk kumpulan submodul dan aplikasiAlur analisis HyPyP untuk studi Hyperscanning

Lanjutkan membaca