Diagram yang mengilustrasikan pengumpulan data ilmu saraf yang sinkron menggunakan Lab Streaming Layer (LSL). Headset EEG Emotiv, sumber audio, dan pemicu peristiwa mengalirkan sinyal EEG, bentuk gelombang audio, dan penanda waktu ke dalam lini masa selaras yang menyatu dalam antarmuka perekaman terpusat untuk analisis data multimodal yang tersinkronisasi.

Lab Streaming Layer (LSL) untuk Menyinkronkan Beberapa Aliran Data

Dr. Roshini Randeniya dan Lucas Kleine

Diperbarui pada

17 Mei 2024

Diagram yang mengilustrasikan pengumpulan data ilmu saraf yang sinkron menggunakan Lab Streaming Layer (LSL). Headset EEG Emotiv, sumber audio, dan pemicu peristiwa mengalirkan sinyal EEG, bentuk gelombang audio, dan penanda waktu ke dalam lini masa selaras yang menyatu dalam antarmuka perekaman terpusat untuk analisis data multimodal yang tersinkronisasi.

Lab Streaming Layer (LSL) untuk Menyinkronkan Beberapa Aliran Data

Dr. Roshini Randeniya dan Lucas Kleine

Diperbarui pada

17 Mei 2024

Diagram yang mengilustrasikan pengumpulan data ilmu saraf yang sinkron menggunakan Lab Streaming Layer (LSL). Headset EEG Emotiv, sumber audio, dan pemicu peristiwa mengalirkan sinyal EEG, bentuk gelombang audio, dan penanda waktu ke dalam lini masa selaras yang menyatu dalam antarmuka perekaman terpusat untuk analisis data multimodal yang tersinkronisasi.

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

  1. Apa itu Lab Streaming Layer (LSL) dan mengapa para peneliti menggunakannya

  2. Cara mengumpulkan data yang disinkronkan dari beberapa perangkat EEG Emotiv

  3. 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 keluar dari laboratorium ke dunia data waktu nyata (real-time). Di mana 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 keselarasan 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:

  1. Menambahkan penanda peristiwa (event marker) dari eksperimen ke data EEG yang sedang berlangsung

  2. Menyelaraskan waktu data dari berbagai sumber untuk satu peserta (misalnya detak jantung, EMG, EEG)

  3. 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 real-time antara beberapa perangkat. LSL dapat diimplementasikan menggunakan pustaka sumber terbuka untuk bahasa pemrograman seperti Python, MATLAB, C++, Java, dan lainnya.

Fungsi inti berkisar pada LSL aliran data (data streams):

1. Perangkat/perangkat lunak akuisisi mengumpulkan data dan membuat aliran data - Data fisiologis dapat dialirkan ke LSL dari perangkat perekam EEG, pelacak mata (eye-tracker), sistem penangkap gerak (motion capture), pemantau detak jantung, dll., termasuk metadata (tingkat pengambilan sampel, jenis data, informasi saluran, dll.) - Penanda peristiwa dari eksperimen (misalnya menggunakan PsychoPy) juga dapat dikirim sebagai aliran data menggunakan LSL

2. Aliran data dipublikasikan (published) ke jaringan - Ini adalah cara pengiriman data menggunakan LSL; aliran data "disiarkan" ke jaringan - Aliran yang dipublikasikan tersedia di jaringan dan dapat ditemukan oleh perangkat lain yang didukung LSL di jaringan yang sama - LSL menetapkan setiap potongan data atau sampel stempel waktu (timestamp) berdasarkan jam umum (mengikuti Protokol Waktu Jaringan/Network Time Protocol). - Aliran didorong sampel demi sampel (atau potongan demi potongan) melalui "outlet"

3. Perangkat pengumpul "berlangganan" (subscribe) ke aliran data - Ini adalah cara penerimaan data menggunakan LSL - Perangkat pengumpul pada jaringan yang sama menerima aliran data yang dipublikasikan melalui "inlet". - Masing-masing inlet menerima sampel aliran dan metadata hanya dari satu outlet

4. Menyimpan data - Setelah berlangganan 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, kami akan mengambil contoh penyiapan eksperimental dan memandu Anda melalui langkah-langkah serta kode yang diperlukan untuk mengimplementasikannya 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 melalui outlet LSL yang terpisah. Kita akan menggunakan pustaka Python untuk memutar file audio dan secara bersamaan mengirimkan pemicu (trigger) setiap kali file 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 lain Gunakan LabRecorder untuk menangkap dan menyimpan ketiga data aliran tersebut melalui inlet LSL.

2.1 LANGKAH 1 - Pengaturan dan instalasi

  1. Anda memerlukan perangkat akuisisi data yang didukung untuk mengumpulkan data
    • Semua perangkat brainware Emotiv terhubung ke LSL melalui perangkat lunak EmotivPRO

  2. Instal EmotivPRO pada perangkat Anda. Anda akan memerlukan lisensi EmotivPRO yang valid untuk menggunakan LSL.

  3. Instal pustaka Python LSL dengan perintah berikut:
    pip install pylsl

  4. Unduh perangkat lunak LabRecorder. Ini adalah aplikasi sederhana dan gratis yang dapat dijalankan dari
    baris perintah atau menggunakan unduhan mandiri

  5. Untuk eksperimen kita: Instal paket-paket yang diperlukan untuk memutar audio menggunakan Python
    pip install sounddevice soundfile

2.2 LANGKAH 3 - Kirim data dari EmotivPRO melalui aliran LSL

  1. Temukan tanda "..." di sudut kanan atas aplikasi, navigasikan ke Settings (Pengaturan)

  2. Temukan bagian 'Lab Streaming Layer' dan subbagian 'Outlet'

  3. Pilih semua tipe data yang ingin Anda siarkan

  4. Pilih format data (float 32-bit atau double 64-bit)

  5. Pilih apakah ingin mengirimkan sampel data satu per satu atau dalam potongan sampel

  6. Klik 'Start' untuk menyiarkan aliran data LSL

2.3 LANGKAH 4 - Gunakan skrip Python untuk memutar audio dan mengirim pemicu

  1. Salin dan tempel blok kode berikut ke dalam file python dan simpan ke komputer Anda.

  2. Temukan file audio (idealnya file .wav) yang ingin Anda putar dan edit skrip dengan mengubah
    variabel audio_filepath ke jalur file (filepath) untuk file audio di komputer Anda

  3. Buka prompt perintah untuk berinteraksi dengan baris perintah dan navigasikan ke folder tempat
    file Python Anda disimpan

  4. Masukkan: python3 filename.py
    • Bergantung pada instalasi Python Anda, Anda mungkin menggunakan python alih-alih python3

    Catatan: Ganti /path/to/audio.wav dengan lokasi file audio yang ingin Anda putar selama eksperimen Anda.

"""
LSL Example: Play audio and send a trigger marker
<p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p>
<p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p>
<p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p>
<p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p>
<pre><code>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.")
</code></pre>
<p>if <strong>name</strong> == "<strong>main</strong>":</p>
<pre><code>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
    )</code></pre><h2 dir="auto">2.4 STEP 5 - Use LabRecorder to view and save all LSL streams</h2><ol dir="auto"><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <code>Update</code>. The available LSL streams should be visible in the stream list<br> You should be able to see streams from both EmotivPROs (usually called “Emotiv-<br>DataStream”) and the marker stream (called “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Click <code>Browse</code> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <code>Record</code> to start recording</p></li></ol><h2 dir="auto">3.0 Working with the data</h2><p dir="auto">LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, streams, each with a different header 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.</p><p dir="auto"><strong>Note: Replace </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> with the filepath for your LabRecorder XDF output file.</strong></p><pre data-language="JSX"><code>import pyxdf
</code></pre>
<p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p>
<h1>Give the path to your LSL output file here.</h1>
<p>data_path = "/path/to/your/file.xdf"</p>
<h1>Load the XDF file.</h1>
<p>streams, fileheader = pyxdf.load_xdf(data_path)</p>
<p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p>
<p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p>
<pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Additional Resources</h2><h4 dir="auto">Official Documentation</h4><ol dir="auto"><li data-preset-tag="p"><p>Check out the <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">online documentation</a>, including the <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">official README file on GitHub</a></p></li><li data-preset-tag="p"><p>Additional resources:<br> <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Code</a> to run LSL using Emotiv’s devices, with example scripts<br> Useful <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL demo on YouTube</a><br> <a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub repository</a> for all associated libraries<br> <a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub repository</a> for a collection a submodules and apps</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP analysis pipeline</a> for Hyperscanning studies</p></li></ol>
</code></pre

"""
LSL Example: Play audio and send a trigger marker
<p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p>
<p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p>
<p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p>
<p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p>
<pre><code>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.")
</code></pre>
<p>if <strong>name</strong> == "<strong>main</strong>":</p>
<pre><code>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
    )</code></pre><h2 dir="auto">2.4 STEP 5 - Use LabRecorder to view and save all LSL streams</h2><ol dir="auto"><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <code>Update</code>. The available LSL streams should be visible in the stream list<br> You should be able to see streams from both EmotivPROs (usually called “Emotiv-<br>DataStream”) and the marker stream (called “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Click <code>Browse</code> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <code>Record</code> to start recording</p></li></ol><h2 dir="auto">3.0 Working with the data</h2><p dir="auto">LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, streams, each with a different header 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.</p><p dir="auto"><strong>Note: Replace </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> with the filepath for your LabRecorder XDF output file.</strong></p><pre data-language="JSX"><code>import pyxdf
</code></pre>
<p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p>
<h1>Give the path to your LSL output file here.</h1>
<p>data_path = "/path/to/your/file.xdf"</p>
<h1>Load the XDF file.</h1>
<p>streams, fileheader = pyxdf.load_xdf(data_path)</p>
<p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p>
<p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p>
<pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Additional Resources</h2><h4 dir="auto">Official Documentation</h4><ol dir="auto"><li data-preset-tag="p"><p>Check out the <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">online documentation</a>, including the <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">official README file on GitHub</a></p></li><li data-preset-tag="p"><p>Additional resources:<br> <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Code</a> to run LSL using Emotiv’s devices, with example scripts<br> Useful <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL demo on YouTube</a><br> <a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub repository</a> for all associated libraries<br> <a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub repository</a> for a collection a submodules and apps</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP analysis pipeline</a> for Hyperscanning studies</p></li></ol>
</code></pre

"""
LSL Example: Play audio and send a trigger marker
<p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p>
<p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p>
<p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p>
<p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p>
<pre><code>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.")
</code></pre>
<p>if <strong>name</strong> == "<strong>main</strong>":</p>
<pre><code>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
    )</code></pre><h2 dir="auto">2.4 STEP 5 - Use LabRecorder to view and save all LSL streams</h2><ol dir="auto"><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <code>Update</code>. The available LSL streams should be visible in the stream list<br> You should be able to see streams from both EmotivPROs (usually called “Emotiv-<br>DataStream”) and the marker stream (called “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Click <code>Browse</code> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <code>Record</code> to start recording</p></li></ol><h2 dir="auto">3.0 Working with the data</h2><p dir="auto">LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, streams, each with a different header 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.</p><p dir="auto"><strong>Note: Replace </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> with the filepath for your LabRecorder XDF output file.</strong></p><pre data-language="JSX"><code>import pyxdf
</code></pre>
<p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p>
<h1>Give the path to your LSL output file here.</h1>
<p>data_path = "/path/to/your/file.xdf"</p>
<h1>Load the XDF file.</h1>
<p>streams, fileheader = pyxdf.load_xdf(data_path)</p>
<p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p>
<p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p>
<pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Additional Resources</h2><h4 dir="auto">Official Documentation</h4><ol dir="auto"><li data-preset-tag="p"><p>Check out the <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">online documentation</a>, including the <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">official README file on GitHub</a></p></li><li data-preset-tag="p"><p>Additional resources:<br> <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Code</a> to run LSL using Emotiv’s devices, with example scripts<br> Useful <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL demo on YouTube</a><br> <a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub repository</a> for all associated libraries<br> <a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub repository</a> for a collection a submodules and apps</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP analysis pipeline</a> for Hyperscanning studies</p></li></ol>
</code></pre

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

  1. Apa itu Lab Streaming Layer (LSL) dan mengapa para peneliti menggunakannya

  2. Cara mengumpulkan data yang disinkronkan dari beberapa perangkat EEG Emotiv

  3. 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 keluar dari laboratorium ke dunia data waktu nyata (real-time). Di mana 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 keselarasan 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:

  1. Menambahkan penanda peristiwa (event marker) dari eksperimen ke data EEG yang sedang berlangsung

  2. Menyelaraskan waktu data dari berbagai sumber untuk satu peserta (misalnya detak jantung, EMG, EEG)

  3. 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 real-time antara beberapa perangkat. LSL dapat diimplementasikan menggunakan pustaka sumber terbuka untuk bahasa pemrograman seperti Python, MATLAB, C++, Java, dan lainnya.

Fungsi inti berkisar pada LSL aliran data (data streams):

1. Perangkat/perangkat lunak akuisisi mengumpulkan data dan membuat aliran data - Data fisiologis dapat dialirkan ke LSL dari perangkat perekam EEG, pelacak mata (eye-tracker), sistem penangkap gerak (motion capture), pemantau detak jantung, dll., termasuk metadata (tingkat pengambilan sampel, jenis data, informasi saluran, dll.) - Penanda peristiwa dari eksperimen (misalnya menggunakan PsychoPy) juga dapat dikirim sebagai aliran data menggunakan LSL

2. Aliran data dipublikasikan (published) ke jaringan - Ini adalah cara pengiriman data menggunakan LSL; aliran data "disiarkan" ke jaringan - Aliran yang dipublikasikan tersedia di jaringan dan dapat ditemukan oleh perangkat lain yang didukung LSL di jaringan yang sama - LSL menetapkan setiap potongan data atau sampel stempel waktu (timestamp) berdasarkan jam umum (mengikuti Protokol Waktu Jaringan/Network Time Protocol). - Aliran didorong sampel demi sampel (atau potongan demi potongan) melalui "outlet"

3. Perangkat pengumpul "berlangganan" (subscribe) ke aliran data - Ini adalah cara penerimaan data menggunakan LSL - Perangkat pengumpul pada jaringan yang sama menerima aliran data yang dipublikasikan melalui "inlet". - Masing-masing inlet menerima sampel aliran dan metadata hanya dari satu outlet

4. Menyimpan data - Setelah berlangganan 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, kami akan mengambil contoh penyiapan eksperimental dan memandu Anda melalui langkah-langkah serta kode yang diperlukan untuk mengimplementasikannya 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 melalui outlet LSL yang terpisah. Kita akan menggunakan pustaka Python untuk memutar file audio dan secara bersamaan mengirimkan pemicu (trigger) setiap kali file 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 lain Gunakan LabRecorder untuk menangkap dan menyimpan ketiga data aliran tersebut melalui inlet LSL.

2.1 LANGKAH 1 - Pengaturan dan instalasi

  1. Anda memerlukan perangkat akuisisi data yang didukung untuk mengumpulkan data
    • Semua perangkat brainware Emotiv terhubung ke LSL melalui perangkat lunak EmotivPRO

  2. Instal EmotivPRO pada perangkat Anda. Anda akan memerlukan lisensi EmotivPRO yang valid untuk menggunakan LSL.

  3. Instal pustaka Python LSL dengan perintah berikut:
    pip install pylsl

  4. Unduh perangkat lunak LabRecorder. Ini adalah aplikasi sederhana dan gratis yang dapat dijalankan dari
    baris perintah atau menggunakan unduhan mandiri

  5. Untuk eksperimen kita: Instal paket-paket yang diperlukan untuk memutar audio menggunakan Python
    pip install sounddevice soundfile

2.2 LANGKAH 3 - Kirim data dari EmotivPRO melalui aliran LSL

  1. Temukan tanda "..." di sudut kanan atas aplikasi, navigasikan ke Settings (Pengaturan)

  2. Temukan bagian 'Lab Streaming Layer' dan subbagian 'Outlet'

  3. Pilih semua tipe data yang ingin Anda siarkan

  4. Pilih format data (float 32-bit atau double 64-bit)

  5. Pilih apakah ingin mengirimkan sampel data satu per satu atau dalam potongan sampel

  6. Klik 'Start' untuk menyiarkan aliran data LSL

2.3 LANGKAH 4 - Gunakan skrip Python untuk memutar audio dan mengirim pemicu

  1. Salin dan tempel blok kode berikut ke dalam file python dan simpan ke komputer Anda.

  2. Temukan file audio (idealnya file .wav) yang ingin Anda putar dan edit skrip dengan mengubah
    variabel audio_filepath ke jalur file (filepath) untuk file audio di komputer Anda

  3. Buka prompt perintah untuk berinteraksi dengan baris perintah dan navigasikan ke folder tempat
    file Python Anda disimpan

  4. Masukkan: python3 filename.py
    • Bergantung pada instalasi Python Anda, Anda mungkin menggunakan python alih-alih python3

    Catatan: Ganti /path/to/audio.wav dengan lokasi file audio yang ingin Anda putar selama eksperimen Anda.

"""
LSL Example: Play audio and send a trigger marker
<p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p>
<p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p>
<p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p>
<p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p>
<pre><code>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.")
</code></pre>
<p>if <strong>name</strong> == "<strong>main</strong>":</p>
<pre><code>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
    )</code></pre><h2 dir="auto">2.4 STEP 5 - Use LabRecorder to view and save all LSL streams</h2><ol dir="auto"><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <code>Update</code>. The available LSL streams should be visible in the stream list<br> You should be able to see streams from both EmotivPROs (usually called “Emotiv-<br>DataStream”) and the marker stream (called “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Click <code>Browse</code> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <code>Record</code> to start recording</p></li></ol><h2 dir="auto">3.0 Working with the data</h2><p dir="auto">LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, streams, each with a different header 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.</p><p dir="auto"><strong>Note: Replace </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> with the filepath for your LabRecorder XDF output file.</strong></p><pre data-language="JSX"><code>import pyxdf
</code></pre>
<p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p>
<h1>Give the path to your LSL output file here.</h1>
<p>data_path = "/path/to/your/file.xdf"</p>
<h1>Load the XDF file.</h1>
<p>streams, fileheader = pyxdf.load_xdf(data_path)</p>
<p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p>
<p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p>
<pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Additional Resources</h2><h4 dir="auto">Official Documentation</h4><ol dir="auto"><li data-preset-tag="p"><p>Check out the <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">online documentation</a>, including the <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">official README file on GitHub</a></p></li><li data-preset-tag="p"><p>Additional resources:<br> <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Code</a> to run LSL using Emotiv’s devices, with example scripts<br> Useful <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL demo on YouTube</a><br> <a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub repository</a> for all associated libraries<br> <a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub repository</a> for a collection a submodules and apps</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP analysis pipeline</a> for Hyperscanning studies</p></li></ol>
</code></pre

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

  1. Apa itu Lab Streaming Layer (LSL) dan mengapa para peneliti menggunakannya

  2. Cara mengumpulkan data yang disinkronkan dari beberapa perangkat EEG Emotiv

  3. 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 keluar dari laboratorium ke dunia data waktu nyata (real-time). Di mana 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 keselarasan 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:

  1. Menambahkan penanda peristiwa (event marker) dari eksperimen ke data EEG yang sedang berlangsung

  2. Menyelaraskan waktu data dari berbagai sumber untuk satu peserta (misalnya detak jantung, EMG, EEG)

  3. 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 real-time antara beberapa perangkat. LSL dapat diimplementasikan menggunakan pustaka sumber terbuka untuk bahasa pemrograman seperti Python, MATLAB, C++, Java, dan lainnya.

Fungsi inti berkisar pada LSL aliran data (data streams):

1. Perangkat/perangkat lunak akuisisi mengumpulkan data dan membuat aliran data - Data fisiologis dapat dialirkan ke LSL dari perangkat perekam EEG, pelacak mata (eye-tracker), sistem penangkap gerak (motion capture), pemantau detak jantung, dll., termasuk metadata (tingkat pengambilan sampel, jenis data, informasi saluran, dll.) - Penanda peristiwa dari eksperimen (misalnya menggunakan PsychoPy) juga dapat dikirim sebagai aliran data menggunakan LSL

2. Aliran data dipublikasikan (published) ke jaringan - Ini adalah cara pengiriman data menggunakan LSL; aliran data "disiarkan" ke jaringan - Aliran yang dipublikasikan tersedia di jaringan dan dapat ditemukan oleh perangkat lain yang didukung LSL di jaringan yang sama - LSL menetapkan setiap potongan data atau sampel stempel waktu (timestamp) berdasarkan jam umum (mengikuti Protokol Waktu Jaringan/Network Time Protocol). - Aliran didorong sampel demi sampel (atau potongan demi potongan) melalui "outlet"

3. Perangkat pengumpul "berlangganan" (subscribe) ke aliran data - Ini adalah cara penerimaan data menggunakan LSL - Perangkat pengumpul pada jaringan yang sama menerima aliran data yang dipublikasikan melalui "inlet". - Masing-masing inlet menerima sampel aliran dan metadata hanya dari satu outlet

4. Menyimpan data - Setelah berlangganan 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, kami akan mengambil contoh penyiapan eksperimental dan memandu Anda melalui langkah-langkah serta kode yang diperlukan untuk mengimplementasikannya 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 melalui outlet LSL yang terpisah. Kita akan menggunakan pustaka Python untuk memutar file audio dan secara bersamaan mengirimkan pemicu (trigger) setiap kali file 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 lain Gunakan LabRecorder untuk menangkap dan menyimpan ketiga data aliran tersebut melalui inlet LSL.

2.1 LANGKAH 1 - Pengaturan dan instalasi

  1. Anda memerlukan perangkat akuisisi data yang didukung untuk mengumpulkan data
    • Semua perangkat brainware Emotiv terhubung ke LSL melalui perangkat lunak EmotivPRO

  2. Instal EmotivPRO pada perangkat Anda. Anda akan memerlukan lisensi EmotivPRO yang valid untuk menggunakan LSL.

  3. Instal pustaka Python LSL dengan perintah berikut:
    pip install pylsl

  4. Unduh perangkat lunak LabRecorder. Ini adalah aplikasi sederhana dan gratis yang dapat dijalankan dari
    baris perintah atau menggunakan unduhan mandiri

  5. Untuk eksperimen kita: Instal paket-paket yang diperlukan untuk memutar audio menggunakan Python
    pip install sounddevice soundfile

2.2 LANGKAH 3 - Kirim data dari EmotivPRO melalui aliran LSL

  1. Temukan tanda "..." di sudut kanan atas aplikasi, navigasikan ke Settings (Pengaturan)

  2. Temukan bagian 'Lab Streaming Layer' dan subbagian 'Outlet'

  3. Pilih semua tipe data yang ingin Anda siarkan

  4. Pilih format data (float 32-bit atau double 64-bit)

  5. Pilih apakah ingin mengirimkan sampel data satu per satu atau dalam potongan sampel

  6. Klik 'Start' untuk menyiarkan aliran data LSL

2.3 LANGKAH 4 - Gunakan skrip Python untuk memutar audio dan mengirim pemicu

  1. Salin dan tempel blok kode berikut ke dalam file python dan simpan ke komputer Anda.

  2. Temukan file audio (idealnya file .wav) yang ingin Anda putar dan edit skrip dengan mengubah
    variabel audio_filepath ke jalur file (filepath) untuk file audio di komputer Anda

  3. Buka prompt perintah untuk berinteraksi dengan baris perintah dan navigasikan ke folder tempat
    file Python Anda disimpan

  4. Masukkan: python3 filename.py
    • Bergantung pada instalasi Python Anda, Anda mungkin menggunakan python alih-alih python3

    Catatan: Ganti /path/to/audio.wav dengan lokasi file audio yang ingin Anda putar selama eksperimen Anda.

"""
LSL Example: Play audio and send a trigger marker
<p>This script creates an LSL marker stream, waits for the user to<br>press ENTER, then plays an audio file and sends a marker that<br>can be synchronized with EEG data collected through LabRecorder.<br>"""</p>
<p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p>
<p>def wait_for_keypress():<br>print("Press ENTER to start audio playback and send an LSL marker.")<br>while True:<br>if input() == "":<br>break</p>
<p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p>
<pre><code>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.")
</code></pre>
<p>if <strong>name</strong> == "<strong>main</strong>":</p>
<pre><code>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
    )</code></pre><h2 dir="auto">2.4 STEP 5 - Use LabRecorder to view and save all LSL streams</h2><ol dir="auto"><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <code>Update</code>. The available LSL streams should be visible in the stream list<br> You should be able to see streams from both EmotivPROs (usually called “Emotiv-<br>DataStream”) and the marker stream (called “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Click <code>Browse</code> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <code>Record</code> to start recording</p></li></ol><h2 dir="auto">3.0 Working with the data</h2><p dir="auto">LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, streams, each with a different header 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.</p><p dir="auto"><strong>Note: Replace </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> with the filepath for your LabRecorder XDF output file.</strong></p><pre data-language="JSX"><code>import pyxdf
</code></pre>
<p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p>
<h1>Give the path to your LSL output file here.</h1>
<p>data_path = "/path/to/your/file.xdf"</p>
<h1>Load the XDF file.</h1>
<p>streams, fileheader = pyxdf.load_xdf(data_path)</p>
<p>print("XDF File Header:", fileheader)<br>print("Number of streams found:", len(streams))</p>
<p>for i, stream in enumerate(streams):<br>print("\nStream", i + 1)<br>print("Stream Name:", stream["info"]["name"][0])<br>print("Stream Type:", stream["info"]["type"][0])<br>print("Number of Channels:", stream["info"]["channel_count"][0])</p>
<pre><code>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"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Additional Resources</h2><h4 dir="auto">Official Documentation</h4><ol dir="auto"><li data-preset-tag="p"><p>Check out the <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">online documentation</a>, including the <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">official README file on GitHub</a></p></li><li data-preset-tag="p"><p>Additional resources:<br> <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Code</a> to run LSL using Emotiv’s devices, with example scripts<br> Useful <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL demo on YouTube</a><br> <a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub repository</a> for all associated libraries<br> <a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub repository</a> for a collection a submodules and apps</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP analysis pipeline</a> for Hyperscanning studies</p></li></ol>
</code></pre

Dasar-Dasar Osilasi Saraf - Emotiv

Lanjutkan membaca

Dasar-Dasar Osilasi Neural