
لایه استریمینگ آزمایشگاهی (LSL) برای همگامسازی چندین جریان داده
دکتر روشینی راندنیا و لوکاس کلاین
بهروزرسانی در
۲۸ اردیبهشت ۱۴۰۳

لایه استریمینگ آزمایشگاهی (LSL) برای همگامسازی چندین جریان داده
دکتر روشینی راندنیا و لوکاس کلاین
بهروزرسانی در
۲۸ اردیبهشت ۱۴۰۳

لایه استریمینگ آزمایشگاهی (LSL) برای همگامسازی چندین جریان داده
دکتر روشینی راندنیا و لوکاس کلاین
بهروزرسانی در
۲۸ اردیبهشت ۱۴۰۳
خوش آمدید! در این آموزش یاد خواهیم گرفت که چگونه از Lab Streaming Layer (LSL) در پایتون برای جمعآوری و همگامسازی دادههای EEG مربوط به Emotiv از چندین دستگاه استفاده کنیم. این کار به دانش پایه و کاربردی از زبان برنامهنویسی پایتون نیاز دارد.
آنچه یاد خواهید گرفت
Lab Streaming Layer (LSL) چیست و چرا محققان از آن استفاده میکنند
چگونه دادههای همگامسازی شده را از چندین دستگاه EEG مربوط به Emotiv جمعآوری کنیم
چگونه دادههای جمعآوری شده را وارد و بررسی کنیم
۱.۱ LSL چیست و برای چه کاری مناسب است؟
لایه استریم آزمایشگاهی (LSL) یک جعبهابزار متنباز است که میتواند برای ارسال، دریافت و همگامسازی جریانهای دادههای عصبی، فیزیولوژیکی و رفتاری از سختافزارهای حسگر مختلف استفاده شود. دستگاههای سختافزاری سنجش مغز و بدن که به طور فزایندهای توانمند، دقیق و قابل حمل هستند (مانند سیستمهای EEG مربوط به Emotiv)، علوم اعصاب را از آزمایشگاه خارج کرده و به دنیای دادههای زنده و بلادرنگ میآورند. در حالی که اندازهگیریهای مغزی مانند EEG و MEG زمانی به آزمایشگاههای تحقیقاتی محدود بودند، دستگاههای تلفن همراه به ما اجازه میدهند مقادیر متعددی از دادهها را در محیطهای طبیعیتر و از چندین نفر به طور همزمان جمعآوری کنیم.
یک محقق ممکن است به همگامسازی فیزیولوژیکی بین دو نفر که به یک موسیقی گوش میدهند علاقهمند باشد. LSL میتواند به ما کمک کند تا دادهها را از دو هدست EEG به طور جداگانه جمعآوری کنیم که با پخش صدا همگامسازی شده باشد.
چند نمونه از کاربردهای دیگر LSL:
افزودن نشانگرهای رویداد از یک آزمایش به دادههای در حال جریان EEG
تراز کردن زمانی دادهها از چندین منبع برای یک شرکتکننده واحد (به عنوان مثال ضربان قلب، EMG، EEG)
تراز کردن زمانی دادهها از چندین شرکتکننده (به عنوان مثال مطالعات فوق اسکن EEG)
۱.۲ LSL چگونه کار میکند؟
Lab Streaming Layer پروتکلی برای تبادل بلادرنگ دادههای سری زمانی بین چندین دستگاه است. LSL را میتوان با استفاده از کتابخانههای متنباز برای زبانهای برنامهنویسی مانند پایتون، متلب، C++، جاوا و غیره پیادهسازی کرد.

عملکرد اصلی حول محور جریانهای داده (data streams) LSL میچرخد:
۱. یک دستگاه/نرمافزار دریافتکننده، دادهها را جمعآوری کرده و یک جریان داده ایجاد میکند - دادههای فیزیولوژیکی میتوانند از دستگاههای ثبت EEG، ردیابهای چشم، سیستمهای ثبت حرکتی، مانیتورهای ضربان قلب و غیره، به همراه متادیتا (نرخ نمونهبرداری، نوع داده، اطلاعات کانال و غیره) به صورت زنده به LSL ارسال شوند - نشانگرهای رویداد از آزمایشها (به عنوان مثال با استفاده از PsychoPy) نیز میتوانند به عنوان یک جریان داده با استفاده از LSL ارسال شوند.
۲. جریان داده در شبکه منتشر میشود - این روش ارسال دادهها با استفاده از LSL است؛ جریان داده در شبکه "پخش" میشود - جریانهای منتشر شده در شبکه در دسترس هستند و توسط سایر دستگاههای پشتیبانیشده از LSL در همان شبکه قابل شناسایی میباشند - LSL بر اساس یک ساعت مشترک (با پیروی از پروتکل زمان شبکه NTP) به هر بخش داده یا نمونه یک مهر زمانی اختصاص میدهد. - جریان به صورت نمونهبهنمونه (یا بخشبهبخش) از طریق یک "خروجی" (outlet) ارسال میشود.
۳. دستگاه(های) جمعآوری به جریان(های) داده "مشترک" میشوند - به این ترتیب دادهها با استفاده از LSL دریافت میشوند - دستگاههای جمعآوری در همان شبکه، جریانهای داده منتشر شده را از طریق "ورودیها" (inlets) دریافت میکنند. - هر ورودی نمونههای جریان و متادیتا را تنها از یک خروجی دریافت میکند.
۴. ذخیره دادهها - پس از اشتراک در یک جریان داده، میتوانید آن را در یک متغیر در زبان برنامهنویسی مورد نظر خود ذخیره کنید یا از نرمافزار ارائهشده LSL یعنی LabRecorder برای ذخیره آن در یک قالب استاندارد مانند xdf. استفاده کنید.
۲.۰ مرور کلی آموزش
در این آموزش، ما یک نمونه فرآیند آزمایشگاهی را در نظر گرفته و شما را از طریق مراحل و کدهای لازم برای پیادهسازی آن با استفاده از LSL در پایتون راهنمایی میکنیم. ما از یک برنامه پایتون برای پخش صدا در حین جمعآوری دادههای EEG از دو نفر که هدستهای Emotiv بر تن دارند استفاده خواهیم کرد. ما از دو کامپیوتر استفاده میکنیم که هر کدام EmotivPRO را برای جمعآوری دادههای EEG اجرا میکنند و هر جریان را از طریق یک خروجی مجزای LSL پخش میکنند. ما از یک کتابخانه پایتون برای پخش یک فایل صوتی و ارسال همزمان یک تریگر در هر بار شروع فایل استفاده خواهیم کرد.
مراحل:
۱. از EmotivPRO برای پخش جریان داده از طریق خروجیهای LSL که شامل دادههای EEG (و/یا حرکت، کیفیت تماس، کیفیت سیگنال و غیره) است استفاده کنید. ۲. یک فایل صوتی را با استفاده از اسکریپت پایتون پخش کنید و همزمان یک تریگر را از طریق LSL دیگر ارسال کنید و از LabRecorder برای ضبط و ذخیره هر سه جریان داده از طریق یک ورودی LSL استفاده کنید.

۲.۱ مرحله ۱ - راهاندازی و نصب
شما نیاز به دستگاههای دریافت داده پشتیبانیشده برای جمعآوری دادهها دارید
• تمام دستگاههای سختافزاری مغز Emotiv از طریق نرمافزار EmotivPRO به LSL متصل میشوندنرمافزار EmotivPRO را روی دستگاه(های) خود نصب کنید. برای استفاده از LSL به مجوز معتبر EmotivPRO نیاز دارید.
کتابخانه Python LSL را با دستور زیر نصب کنید:
pip install pylslنرمافزار LabRecorder را دانلود کنید. این یک برنامه ساده و رایگان است که میتوان آن را از طریق خط فرمان یا با استفاده از دانلود مستقیم اجرا کرد.
برای آزمایش ما: بستههای لازم برای پخش صدا با استفاده از پایتون را نصب کنید
pip install sounddevice soundfile
۲.۲ مرحله ۳ - ارسال دادهها از EmotivPRO از طریق جریان LSL
علامت „...“ را در گوشه سمت راست بالای برنامه پیدا کرده و به Settings بروید
بخش 'Lab Streaming Layer' و زیربخش 'Outlet' را پیدا کنید
تمام انواع دادهای که مایل به پخش آنها هستید را انتخاب کنید
فرمت داده را انتخاب کنید (32-bit float یا 64-bit double)
انتخاب کنید که آیا دادهها به صورت نمونهبهنمونه ارسال شوند یا در قالب بخشهایی از نمونهها
روی 'Start' کلیک کنید تا جریان داده LSL پخش شود
۲.۳ مرحله ۴ - استفاده از اسکریپت پایتون برای پخش صدا و ارسال تریگرها
بلوک کد زیر را کپی کرده و در یک فایل پایتون پیست کنید و آن را روی کامپیوتر خود ذخیره کنید.
یک فایل صوتی (ترجیحاً یک فایل wav.) که میخواهید پخش شود را پیدا کرده و با تغییر فایلمسیر متغیر
audio_filepathبه فایلمسیر فایل صوتی در کامپیوتر خود، اسکریپت را ویرایش کنید.یک ترمینال خط فرمان را باز کرده و به پوشهای که فایل پایتون شما در آن ذخیره شده است بروید.
این دستور را وارد کنید:
python3 filename.py
• بسته به نسخه پایتون نصبشده شما، ممکن است ازpythonبه جایpython3استفاده کنید.
توجه: بخش/path/to/audio.wavرا با مسیر فایل صوتی که میخواهید در طول آزمایش پخش کنید جایگزین کنید.
""" 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&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&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&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
خوش آمدید! در این آموزش یاد خواهیم گرفت که چگونه از Lab Streaming Layer (LSL) در پایتون برای جمعآوری و همگامسازی دادههای EEG مربوط به Emotiv از چندین دستگاه استفاده کنیم. این کار به دانش پایه و کاربردی از زبان برنامهنویسی پایتون نیاز دارد.
آنچه یاد خواهید گرفت
Lab Streaming Layer (LSL) چیست و چرا محققان از آن استفاده میکنند
چگونه دادههای همگامسازی شده را از چندین دستگاه EEG مربوط به Emotiv جمعآوری کنیم
چگونه دادههای جمعآوری شده را وارد و بررسی کنیم
۱.۱ LSL چیست و برای چه کاری مناسب است؟
لایه استریم آزمایشگاهی (LSL) یک جعبهابزار متنباز است که میتواند برای ارسال، دریافت و همگامسازی جریانهای دادههای عصبی، فیزیولوژیکی و رفتاری از سختافزارهای حسگر مختلف استفاده شود. دستگاههای سختافزاری سنجش مغز و بدن که به طور فزایندهای توانمند، دقیق و قابل حمل هستند (مانند سیستمهای EEG مربوط به Emotiv)، علوم اعصاب را از آزمایشگاه خارج کرده و به دنیای دادههای زنده و بلادرنگ میآورند. در حالی که اندازهگیریهای مغزی مانند EEG و MEG زمانی به آزمایشگاههای تحقیقاتی محدود بودند، دستگاههای تلفن همراه به ما اجازه میدهند مقادیر متعددی از دادهها را در محیطهای طبیعیتر و از چندین نفر به طور همزمان جمعآوری کنیم.
یک محقق ممکن است به همگامسازی فیزیولوژیکی بین دو نفر که به یک موسیقی گوش میدهند علاقهمند باشد. LSL میتواند به ما کمک کند تا دادهها را از دو هدست EEG به طور جداگانه جمعآوری کنیم که با پخش صدا همگامسازی شده باشد.
چند نمونه از کاربردهای دیگر LSL:
افزودن نشانگرهای رویداد از یک آزمایش به دادههای در حال جریان EEG
تراز کردن زمانی دادهها از چندین منبع برای یک شرکتکننده واحد (به عنوان مثال ضربان قلب، EMG، EEG)
تراز کردن زمانی دادهها از چندین شرکتکننده (به عنوان مثال مطالعات فوق اسکن EEG)
۱.۲ LSL چگونه کار میکند؟
Lab Streaming Layer پروتکلی برای تبادل بلادرنگ دادههای سری زمانی بین چندین دستگاه است. LSL را میتوان با استفاده از کتابخانههای متنباز برای زبانهای برنامهنویسی مانند پایتون، متلب، C++، جاوا و غیره پیادهسازی کرد.

عملکرد اصلی حول محور جریانهای داده (data streams) LSL میچرخد:
۱. یک دستگاه/نرمافزار دریافتکننده، دادهها را جمعآوری کرده و یک جریان داده ایجاد میکند - دادههای فیزیولوژیکی میتوانند از دستگاههای ثبت EEG، ردیابهای چشم، سیستمهای ثبت حرکتی، مانیتورهای ضربان قلب و غیره، به همراه متادیتا (نرخ نمونهبرداری، نوع داده، اطلاعات کانال و غیره) به صورت زنده به LSL ارسال شوند - نشانگرهای رویداد از آزمایشها (به عنوان مثال با استفاده از PsychoPy) نیز میتوانند به عنوان یک جریان داده با استفاده از LSL ارسال شوند.
۲. جریان داده در شبکه منتشر میشود - این روش ارسال دادهها با استفاده از LSL است؛ جریان داده در شبکه "پخش" میشود - جریانهای منتشر شده در شبکه در دسترس هستند و توسط سایر دستگاههای پشتیبانیشده از LSL در همان شبکه قابل شناسایی میباشند - LSL بر اساس یک ساعت مشترک (با پیروی از پروتکل زمان شبکه NTP) به هر بخش داده یا نمونه یک مهر زمانی اختصاص میدهد. - جریان به صورت نمونهبهنمونه (یا بخشبهبخش) از طریق یک "خروجی" (outlet) ارسال میشود.
۳. دستگاه(های) جمعآوری به جریان(های) داده "مشترک" میشوند - به این ترتیب دادهها با استفاده از LSL دریافت میشوند - دستگاههای جمعآوری در همان شبکه، جریانهای داده منتشر شده را از طریق "ورودیها" (inlets) دریافت میکنند. - هر ورودی نمونههای جریان و متادیتا را تنها از یک خروجی دریافت میکند.
۴. ذخیره دادهها - پس از اشتراک در یک جریان داده، میتوانید آن را در یک متغیر در زبان برنامهنویسی مورد نظر خود ذخیره کنید یا از نرمافزار ارائهشده LSL یعنی LabRecorder برای ذخیره آن در یک قالب استاندارد مانند xdf. استفاده کنید.
۲.۰ مرور کلی آموزش
در این آموزش، ما یک نمونه فرآیند آزمایشگاهی را در نظر گرفته و شما را از طریق مراحل و کدهای لازم برای پیادهسازی آن با استفاده از LSL در پایتون راهنمایی میکنیم. ما از یک برنامه پایتون برای پخش صدا در حین جمعآوری دادههای EEG از دو نفر که هدستهای Emotiv بر تن دارند استفاده خواهیم کرد. ما از دو کامپیوتر استفاده میکنیم که هر کدام EmotivPRO را برای جمعآوری دادههای EEG اجرا میکنند و هر جریان را از طریق یک خروجی مجزای LSL پخش میکنند. ما از یک کتابخانه پایتون برای پخش یک فایل صوتی و ارسال همزمان یک تریگر در هر بار شروع فایل استفاده خواهیم کرد.
مراحل:
۱. از EmotivPRO برای پخش جریان داده از طریق خروجیهای LSL که شامل دادههای EEG (و/یا حرکت، کیفیت تماس، کیفیت سیگنال و غیره) است استفاده کنید. ۲. یک فایل صوتی را با استفاده از اسکریپت پایتون پخش کنید و همزمان یک تریگر را از طریق LSL دیگر ارسال کنید و از LabRecorder برای ضبط و ذخیره هر سه جریان داده از طریق یک ورودی LSL استفاده کنید.

۲.۱ مرحله ۱ - راهاندازی و نصب
شما نیاز به دستگاههای دریافت داده پشتیبانیشده برای جمعآوری دادهها دارید
• تمام دستگاههای سختافزاری مغز Emotiv از طریق نرمافزار EmotivPRO به LSL متصل میشوندنرمافزار EmotivPRO را روی دستگاه(های) خود نصب کنید. برای استفاده از LSL به مجوز معتبر EmotivPRO نیاز دارید.
کتابخانه Python LSL را با دستور زیر نصب کنید:
pip install pylslنرمافزار LabRecorder را دانلود کنید. این یک برنامه ساده و رایگان است که میتوان آن را از طریق خط فرمان یا با استفاده از دانلود مستقیم اجرا کرد.
برای آزمایش ما: بستههای لازم برای پخش صدا با استفاده از پایتون را نصب کنید
pip install sounddevice soundfile
۲.۲ مرحله ۳ - ارسال دادهها از EmotivPRO از طریق جریان LSL
علامت „...“ را در گوشه سمت راست بالای برنامه پیدا کرده و به Settings بروید
بخش 'Lab Streaming Layer' و زیربخش 'Outlet' را پیدا کنید
تمام انواع دادهای که مایل به پخش آنها هستید را انتخاب کنید
فرمت داده را انتخاب کنید (32-bit float یا 64-bit double)
انتخاب کنید که آیا دادهها به صورت نمونهبهنمونه ارسال شوند یا در قالب بخشهایی از نمونهها
روی 'Start' کلیک کنید تا جریان داده LSL پخش شود
۲.۳ مرحله ۴ - استفاده از اسکریپت پایتون برای پخش صدا و ارسال تریگرها
بلوک کد زیر را کپی کرده و در یک فایل پایتون پیست کنید و آن را روی کامپیوتر خود ذخیره کنید.
یک فایل صوتی (ترجیحاً یک فایل wav.) که میخواهید پخش شود را پیدا کرده و با تغییر فایلمسیر متغیر
audio_filepathبه فایلمسیر فایل صوتی در کامپیوتر خود، اسکریپت را ویرایش کنید.یک ترمینال خط فرمان را باز کرده و به پوشهای که فایل پایتون شما در آن ذخیره شده است بروید.
این دستور را وارد کنید:
python3 filename.py
• بسته به نسخه پایتون نصبشده شما، ممکن است ازpythonبه جایpython3استفاده کنید.
توجه: بخش/path/to/audio.wavرا با مسیر فایل صوتی که میخواهید در طول آزمایش پخش کنید جایگزین کنید.
""" 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&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
خوش آمدید! در این آموزش یاد خواهیم گرفت که چگونه از Lab Streaming Layer (LSL) در پایتون برای جمعآوری و همگامسازی دادههای EEG مربوط به Emotiv از چندین دستگاه استفاده کنیم. این کار به دانش پایه و کاربردی از زبان برنامهنویسی پایتون نیاز دارد.
آنچه یاد خواهید گرفت
Lab Streaming Layer (LSL) چیست و چرا محققان از آن استفاده میکنند
چگونه دادههای همگامسازی شده را از چندین دستگاه EEG مربوط به Emotiv جمعآوری کنیم
چگونه دادههای جمعآوری شده را وارد و بررسی کنیم
۱.۱ LSL چیست و برای چه کاری مناسب است؟
لایه استریم آزمایشگاهی (LSL) یک جعبهابزار متنباز است که میتواند برای ارسال، دریافت و همگامسازی جریانهای دادههای عصبی، فیزیولوژیکی و رفتاری از سختافزارهای حسگر مختلف استفاده شود. دستگاههای سختافزاری سنجش مغز و بدن که به طور فزایندهای توانمند، دقیق و قابل حمل هستند (مانند سیستمهای EEG مربوط به Emotiv)، علوم اعصاب را از آزمایشگاه خارج کرده و به دنیای دادههای زنده و بلادرنگ میآورند. در حالی که اندازهگیریهای مغزی مانند EEG و MEG زمانی به آزمایشگاههای تحقیقاتی محدود بودند، دستگاههای تلفن همراه به ما اجازه میدهند مقادیر متعددی از دادهها را در محیطهای طبیعیتر و از چندین نفر به طور همزمان جمعآوری کنیم.
یک محقق ممکن است به همگامسازی فیزیولوژیکی بین دو نفر که به یک موسیقی گوش میدهند علاقهمند باشد. LSL میتواند به ما کمک کند تا دادهها را از دو هدست EEG به طور جداگانه جمعآوری کنیم که با پخش صدا همگامسازی شده باشد.
چند نمونه از کاربردهای دیگر LSL:
افزودن نشانگرهای رویداد از یک آزمایش به دادههای در حال جریان EEG
تراز کردن زمانی دادهها از چندین منبع برای یک شرکتکننده واحد (به عنوان مثال ضربان قلب، EMG، EEG)
تراز کردن زمانی دادهها از چندین شرکتکننده (به عنوان مثال مطالعات فوق اسکن EEG)
۱.۲ LSL چگونه کار میکند؟
Lab Streaming Layer پروتکلی برای تبادل بلادرنگ دادههای سری زمانی بین چندین دستگاه است. LSL را میتوان با استفاده از کتابخانههای متنباز برای زبانهای برنامهنویسی مانند پایتون، متلب، C++، جاوا و غیره پیادهسازی کرد.

عملکرد اصلی حول محور جریانهای داده (data streams) LSL میچرخد:
۱. یک دستگاه/نرمافزار دریافتکننده، دادهها را جمعآوری کرده و یک جریان داده ایجاد میکند - دادههای فیزیولوژیکی میتوانند از دستگاههای ثبت EEG، ردیابهای چشم، سیستمهای ثبت حرکتی، مانیتورهای ضربان قلب و غیره، به همراه متادیتا (نرخ نمونهبرداری، نوع داده، اطلاعات کانال و غیره) به صورت زنده به LSL ارسال شوند - نشانگرهای رویداد از آزمایشها (به عنوان مثال با استفاده از PsychoPy) نیز میتوانند به عنوان یک جریان داده با استفاده از LSL ارسال شوند.
۲. جریان داده در شبکه منتشر میشود - این روش ارسال دادهها با استفاده از LSL است؛ جریان داده در شبکه "پخش" میشود - جریانهای منتشر شده در شبکه در دسترس هستند و توسط سایر دستگاههای پشتیبانیشده از LSL در همان شبکه قابل شناسایی میباشند - LSL بر اساس یک ساعت مشترک (با پیروی از پروتکل زمان شبکه NTP) به هر بخش داده یا نمونه یک مهر زمانی اختصاص میدهد. - جریان به صورت نمونهبهنمونه (یا بخشبهبخش) از طریق یک "خروجی" (outlet) ارسال میشود.
۳. دستگاه(های) جمعآوری به جریان(های) داده "مشترک" میشوند - به این ترتیب دادهها با استفاده از LSL دریافت میشوند - دستگاههای جمعآوری در همان شبکه، جریانهای داده منتشر شده را از طریق "ورودیها" (inlets) دریافت میکنند. - هر ورودی نمونههای جریان و متادیتا را تنها از یک خروجی دریافت میکند.
۴. ذخیره دادهها - پس از اشتراک در یک جریان داده، میتوانید آن را در یک متغیر در زبان برنامهنویسی مورد نظر خود ذخیره کنید یا از نرمافزار ارائهشده LSL یعنی LabRecorder برای ذخیره آن در یک قالب استاندارد مانند xdf. استفاده کنید.
۲.۰ مرور کلی آموزش
در این آموزش، ما یک نمونه فرآیند آزمایشگاهی را در نظر گرفته و شما را از طریق مراحل و کدهای لازم برای پیادهسازی آن با استفاده از LSL در پایتون راهنمایی میکنیم. ما از یک برنامه پایتون برای پخش صدا در حین جمعآوری دادههای EEG از دو نفر که هدستهای Emotiv بر تن دارند استفاده خواهیم کرد. ما از دو کامپیوتر استفاده میکنیم که هر کدام EmotivPRO را برای جمعآوری دادههای EEG اجرا میکنند و هر جریان را از طریق یک خروجی مجزای LSL پخش میکنند. ما از یک کتابخانه پایتون برای پخش یک فایل صوتی و ارسال همزمان یک تریگر در هر بار شروع فایل استفاده خواهیم کرد.
مراحل:
۱. از EmotivPRO برای پخش جریان داده از طریق خروجیهای LSL که شامل دادههای EEG (و/یا حرکت، کیفیت تماس، کیفیت سیگنال و غیره) است استفاده کنید. ۲. یک فایل صوتی را با استفاده از اسکریپت پایتون پخش کنید و همزمان یک تریگر را از طریق LSL دیگر ارسال کنید و از LabRecorder برای ضبط و ذخیره هر سه جریان داده از طریق یک ورودی LSL استفاده کنید.

۲.۱ مرحله ۱ - راهاندازی و نصب
شما نیاز به دستگاههای دریافت داده پشتیبانیشده برای جمعآوری دادهها دارید
• تمام دستگاههای سختافزاری مغز Emotiv از طریق نرمافزار EmotivPRO به LSL متصل میشوندنرمافزار EmotivPRO را روی دستگاه(های) خود نصب کنید. برای استفاده از LSL به مجوز معتبر EmotivPRO نیاز دارید.
کتابخانه Python LSL را با دستور زیر نصب کنید:
pip install pylslنرمافزار LabRecorder را دانلود کنید. این یک برنامه ساده و رایگان است که میتوان آن را از طریق خط فرمان یا با استفاده از دانلود مستقیم اجرا کرد.
برای آزمایش ما: بستههای لازم برای پخش صدا با استفاده از پایتون را نصب کنید
pip install sounddevice soundfile
۲.۲ مرحله ۳ - ارسال دادهها از EmotivPRO از طریق جریان LSL
علامت „...“ را در گوشه سمت راست بالای برنامه پیدا کرده و به Settings بروید
بخش 'Lab Streaming Layer' و زیربخش 'Outlet' را پیدا کنید
تمام انواع دادهای که مایل به پخش آنها هستید را انتخاب کنید
فرمت داده را انتخاب کنید (32-bit float یا 64-bit double)
انتخاب کنید که آیا دادهها به صورت نمونهبهنمونه ارسال شوند یا در قالب بخشهایی از نمونهها
روی 'Start' کلیک کنید تا جریان داده LSL پخش شود
۲.۳ مرحله ۴ - استفاده از اسکریپت پایتون برای پخش صدا و ارسال تریگرها
بلوک کد زیر را کپی کرده و در یک فایل پایتون پیست کنید و آن را روی کامپیوتر خود ذخیره کنید.
یک فایل صوتی (ترجیحاً یک فایل wav.) که میخواهید پخش شود را پیدا کرده و با تغییر فایلمسیر متغیر
audio_filepathبه فایلمسیر فایل صوتی در کامپیوتر خود، اسکریپت را ویرایش کنید.یک ترمینال خط فرمان را باز کرده و به پوشهای که فایل پایتون شما در آن ذخیره شده است بروید.
این دستور را وارد کنید:
python3 filename.py
• بسته به نسخه پایتون نصبشده شما، ممکن است ازpythonبه جایpython3استفاده کنید.
توجه: بخش/path/to/audio.wavرا با مسیر فایل صوتی که میخواهید در طول آزمایش پخش کنید جایگزین کنید.
""" 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&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

به خواندن ادامه دهید