
طبقة تدفق المختبر (LSL) لمزامنة تدفقات البيانات المتعددة
د. روشيني راندينيا ولوكاس كلاينه
تم التحديث في
17/05/2024

طبقة تدفق المختبر (LSL) لمزامنة تدفقات البيانات المتعددة
د. روشيني راندينيا ولوكاس كلاينه
تم التحديث في
17/05/2024

طبقة تدفق المختبر (LSL) لمزامنة تدفقات البيانات المتعددة
د. روشيني راندينيا ولوكاس كلاينه
تم التحديث في
17/05/2024
مرحباً! في هذا البرنامج التعليمي، سنتعلم كيفية استخدام Lab Streaming Layer (LSL) في Python لجمع وتزامن بيانات Emotiv EEG من أجهزة متعددة. سيتطلب ذلك معرفة عملية أساسية بلغة البرمجة Python.
ما ستتعلمه
ما هي Lab Streaming Layer (LSL) ولماذا يستخدمها الباحثون
كيفية جمع بيانات متزامنة من أجهزة Emotiv EEG متعددة
كيفية استيراد وفحص البيانات التي تم جمعها
1.1 ما هي LSL وفيمَ تفيد؟
تعد Lab streaming layer (LSL) مجموعة أدوات مفتوحة المصدر يمكن استخدامها لإرسال واستقبال وتزامن تدفقات البيانات العصبية والفسيولوجية والسلوكية من أجهزة استشعار متنوعة. تساهم أجهزة استشعار الدماغ والجسم المحمولة والأكثر دقة وقدرة باستمرار (مثل أنظمة Emotiv EEG) في نقل علم الأعصاب خارج المختبر إلى عالم البيانات في الوقت الفعلي. بينما كانت قياسات الدماغ مثل تخطيط كهربائية الدماغ (EEG) وتخطيط مغناطيسية الدماغ (MEG) مقتصرة في السابق على مختبرات الأبحاث، تتيح لنا الأجهزة المحمولة جمع تدفقات متعددة من البيانات في بيئات أكثر طبيعية، ومن عدة أشخاص في نفس الوقت.
قد يهتم الباحث بالتزامن الفسيولوجي بين شخصين يستمعان إلى نفس الموسيقى. يمكن أن تساعدنا LSL في جمع البيانات من سماعتي رأس EEG بشكل منفصل وتزامنها أيضاً مع عرض الصوت.
بعض الأمثلة على الاستخدامات الأخرى لـ LSL:
إضافة علامات الأحداث من تجربة ما إلى بيانات EEG جارية
محاذاة البيانات زمنياً من مصادر متعددة لمشارك واحد (مثل معدل ضربات القلب، تخطيط كهربية العضل EMG، وتخطيط كهربائية الدماغ EEG)
محاذاة البيانات زمنياً من مشاركين متعددين (مثل دراسات المسح الفوقي لتخطيط كهربائية الدماغ EEG Hyperscanning)
1.2 كيف تعمل LSL؟
تعد Lab Streaming Layer بروتوكولاً للتبادل الفوري لبيانات السلاسل الزمنية بين أجهزة متعددة. يمكن تنفيذ LSL باستخدام مكتبات مفتوحة المصدر للغات البرمجة مثل Python وMATLAB وC++ وJava وغيرها.

تتمحور الوظيفة الأساسية حول تدفقات بيانات LSL:
1. يقوم جهاز/برنامج الحصول على البيانات بجمع البيانات وإنشاء تدفق بيانات - يمكن بث البيانات الفسيولوجية إلى LSL من أجهزة تسجيل EEG، وأجهزة تتبع العين، وأنظمة التقاط الحركة، وأجهزة مراقبة معدل ضربات القلب، وما إلى ذلك، بما في ذلك البيانات الوصفية (معدل أخذ العينات، نوع البيانات، معلومات القناة، إلخ) - يمكن أيضاً إرسال علامات الأحداث من التجارب (على سبيل المثال باستخدام PsychoPy) كتدفق بيانات باستخدام LSL
2. يتم نشر تدفق البيانات على الشبكة - هذه هي طريقة إرسال البيانات باستخدام LSL؛ حيث يتم "بث" تدفق البيانات إلى الشبكة - تكون التدفقات المنشورة متاحة على الشبكة ويمكن اكتشافها بواسطة الأجهزة الأخرى التي تدعم LSL على نفس الشبكة - تقوم LSL بتعيين طابع زمني لكل جزء بيانات أو عينة بناءً على ساعة مشتركة (وفقاً لبروتوكول وقت الشبكة). - يتم دفع التدفق عينة بعينة (أو جزءاً بجزء) عبر "منفذ مخرج" (outlet)
3. تقوم أجهزة الجمع "بالاشتراك" في تدفق (تدفقات) البيانات - هذه هي طريقة استقبال البيانات باستخدام LSL - تستقبل أجهزة الجمع الموجودة على نفس الشبكة تدفقات البيانات المنشورة عبر "منافذ مدخل" (inlets). - يستقبل كل منفذ مدخل عينات التدفق والبيانات الوصفية من منفذ مخرج واحد فقط
4. حفظ البيانات - عند الاشتراك في تدفق بيانات، يمكنك حفظه في متغير بلغة البرمجة المفضلة لديك، أو استخدام برنامج LabRecorder المقدم من LSL لحفظه بتنسيق قياسي مثل .xdf.
2.0 نظرة عامة على البرنامج التعليمي
في هذا البرنامج التعليمي، سنأخذ مثالاً لإعداد تجريبي ونرشدك عبر الخطوات والتعليمات البرمجية اللازمة لتنفيذه باستخدام LSL في Python. سنستخدم برنامج Python لتشغيل صوت أثناء جمع بيانات EEG من شخصين يرتديان سماعات Emotiv. سنستخدم جهازي كمبيوتر يقوم كل منهما بتشغيل EmotivPRO لجمع بيانات EEG، وبث كل تدفق عبر منفذ مخرج LSL منفصل. سنستخدم مكتبة Python لتشغيل ملف صوتي وإرسال محفز في نفس الوقت في كل مرة يبدأ فيها الملف.
الخطوات:
1. استخدم EmotivPRO لبث البيانات عبر منافذ مخرج LSL التي تتضمن بيانات EEG (و/أو الحركة، جودة الاتصال، جودة الإشارة، إلخ) 2. قم بتشغيل مسار صوتي باستخدام نص Python البرمجي، وأرسل محفزاً في نفس الوقت عبر منفذ LSL آخر. استخدم LabRecorder لالتقاط وحفظ جميع تدفقات البيانات الثلاثة عبر منفذ مدخل LSL.

2.1 الخطوة 1 - الإعداد والتثبيت
ستحتاج إلى أجهزة معتمدة للحصول على البيانات لجمع البيانات
• تتصل جميع أجهزة Emotiv لقراءة الدماغ بـ LSL عبر برنامج EmotivPROقم بتثبيت EmotivPRO على جهازك (أجهزتك). ستحتاج إلى ترخيص EmotivPRO صالح لاستخدام LSL.
قم بتثبيت مكتبة Python LSL باستخدام الأمر التالي:
pip install pylslقم بتنزيل برنامج LabRecorder. وهو تطبيق بسيط ومجاني يمكن تشغيله من
سطر الأوامر أو باستخدام تنزيل مستقللتجربتنا: قم بتثبيت الحزم اللازمة لتشغيل الصوت باستخدام Python
pip install sounddevice soundfile
2.2 الخطوة 3 - إرسال البيانات من EmotivPRO عبر تدفق LSL
حدد موقع النقاط الثلاث "..." في الزاوية العلوية اليمنى من التطبيق، وانتقل إلى الإعدادات (Settings)
ابحث عن قسم 'Lab Streaming Layer' والقسم الفرعي 'Outlet'
حدد جميع أنواع البيانات التي ترغب في بثها
حدد تنسيق البيانات (32-bit float أو 64-bit double)
اختر ما إذا كنت تريد إرسال البيانات عينة بعينة أو في أجزاء من العينات
انقر على 'Start' لبث تدفق بيانات LSL
2.3 الخطوة 4 - استخدام نص برمجي بلغة Python لتشغيل الصوت وإرسال المحفزات
انسخ كتل البرمجية التالية والصقها في ملف python واحفظها على جهاز الكمبيوتر الخاص بك.
حدد موقع ملف صوتي (يُفضل أن يكون بتنسيق .wav) ترغب في تشغيله وقم بتعديل النص البرمجي عن طريق تغيير
المتغيرaudio_filepathإلى مسار الملف الصوتي على جهاز الكمبيوتر الخاص بكافتح موجه الأوامر للتفاعل مع سطر الأوامر وانتقل إلى المجلد الذي
يتم فيه تخزين ملف Python الخاص بكأدخل:
python3 filename.py
• اعتماداً على تثبيت Python لديك، قد تستخدم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 الخطوة 5 - استخدام LabRecorder لعرض وحفظ جميع تدفقات LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>افتح LabRecorder</p></li><li data-preset-tag="p"><p>اضغط على <code>Update</code>. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفق<br>• يجب أن تكون قادراً على رؤية التدفقات من كلا جهازي EmotivPRO (تسمى عادةً "Emotiv-<br>DataStream") وتدفق العلامات (يسمى "AudioMarkers")</p></li><li data-preset-tag="p"><p>انقر على <code>Browse</code> لتحديد موقع لتخزين البيانات (وضبط المعلمات الأخرى)</p></li><li data-preset-tag="p"><p>حدد جميع التدفقات واضغط على <code>Record</code> لبدء التسجيل</p></li></ol><h2 dir="auto">3.0 العمل مع البيانات</h2><p dir="auto">يقوم LabRecorder بإخراج ملف XDF (Extensible Data Format) الذي يحتوي على بيانات من جميع التدفقات. يتم تنظيم ملفات XDF في تدفقات، يمتلك كل منها رأساً (header) مختلفاً يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل أخذ العينات، القنوات، والمزيد). يمكنك استخدام كتلة التعليمات البرمجية أدناه لفتح ملف XDF الخاص بك وعرض بعض المعلومات الأساسية.</p><p dir="auto"><strong>ملاحظة: استبدل </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> بمسار الملف لملف مخرجات LabRecorder XDF الخاص بك.</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>أدخل مسار ملف مخرجات LSL هنا.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>قم بتحميل ملف XDF.</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 مصادر إضافية</h2><h4 dir="auto">الوثائق الرسمية</h4><ol dir="auto"><li data-preset-tag="p"><p>راجع <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">الوثائق عبر الإنترنت</a>، بما في ذلك <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">ملف README الرسمي على GitHub</a></p></li><li data-preset-tag="p"><p>مصادر إضافية:• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">كود</a> لتشغيل LSL باستخدام أجهزة Emotiv، مع نصوص برمجية توضيحية• <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">عرض توضيحي مفيد لـ LSL على YouTube</a>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">مستودع SCCN LSL على GitHub</a> لجميع المكتبات المرتبطة• <a href="https://github.com/labstreaminglayer" target="_blank">مستودع LSL على GitHub</a> لمجموعة من الوحدات الفرعية والتطبيقات</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</a> لدراسات المسح الفوقي (Hyperscanning)</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 الخطوة 5 - استخدام LabRecorder لعرض وحفظ جميع تدفقات LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>افتح LabRecorder</p></li><li data-preset-tag="p"><p>اضغط على <code>Update</code>. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفق<br>• يجب أن تكون قادراً على رؤية التدفقات من كلا جهازي EmotivPRO (تسمى عادةً "Emotiv-<br>DataStream") وتدفق العلامات (يسمى "AudioMarkers")</p></li><li data-preset-tag="p"><p>انقر على <code>Browse</code> لتحديد موقع لتخزين البيانات (وضبط المعلمات الأخرى)</p></li><li data-preset-tag="p"><p>حدد جميع التدفقات واضغط على <code>Record</code> لبدء التسجيل</p></li></ol><h2 dir="auto">3.0 العمل مع البيانات</h2><p dir="auto">يقوم LabRecorder بإخراج ملف XDF (Extensible Data Format) الذي يحتوي على بيانات من جميع التدفقات. يتم تنظيم ملفات XDF في تدفقات، يمتلك كل منها رأساً (header) مختلفاً يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل أخذ العينات، القنوات، والمزيد). يمكنك استخدام كتلة التعليمات البرمجية أدناه لفتح ملف XDF الخاص بك وعرض بعض المعلومات الأساسية.</p><p dir="auto"><strong>ملاحظة: استبدل </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> بمسار الملف لملف مخرجات LabRecorder XDF الخاص بك.</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>أدخل مسار ملف مخرجات LSL هنا.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>قم بتحميل ملف XDF.</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 مصادر إضافية</h2><h4 dir="auto">الوثائق الرسمية</h4><ol dir="auto"><li data-preset-tag="p"><p>راجع <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">الوثائق عبر الإنترنت</a>، بما في ذلك <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">ملف README الرسمي على GitHub</a></p></li><li data-preset-tag="p"><p>مصادر إضافية:• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">كود</a> لتشغيل LSL باستخدام أجهزة Emotiv، مع نصوص برمجية توضيحية• <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">عرض توضيحي مفيد لـ LSL على YouTube</a>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">مستودع SCCN LSL على GitHub</a> لجميع المكتبات المرتبطة• <a href="https://github.com/labstreaminglayer" target="_blank">مستودع LSL على GitHub</a> لمجموعة من الوحدات الفرعية والتطبيقات</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</a> لدراسات المسح الفوقي (Hyperscanning)</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 الخطوة 5 - استخدام LabRecorder لعرض وحفظ جميع تدفقات LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>افتح LabRecorder</p></li><li data-preset-tag="p"><p>اضغط على <code>Update</code>. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفق<br>• يجب أن تكون قادراً على رؤية التدفقات من كلا جهازي EmotivPRO (تسمى عادةً "Emotiv-<br>DataStream") وتدفق العلامات (يسمى "AudioMarkers")</p></li><li data-preset-tag="p"><p>انقر على <code>Browse</code> لتحديد موقع لتخزين البيانات (وضبط المعلمات الأخرى)</p></li><li data-preset-tag="p"><p>حدد جميع التدفقات واضغط على <code>Record</code> لبدء التسجيل</p></li></ol><h2 dir="auto">3.0 العمل مع البيانات</h2><p dir="auto">يقوم LabRecorder بإخراج ملف XDF (Extensible Data Format) الذي يحتوي على بيانات من جميع التدفقات. يتم تنظيم ملفات XDF في تدفقات، يمتلك كل منها رأساً (header) مختلفاً يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل أخذ العينات، القنوات، والمزيد). يمكنك استخدام كتلة التعليمات البرمجية أدناه لفتح ملف XDF الخاص بك وعرض بعض المعلومات الأساسية.</p><p dir="auto"><strong>ملاحظة: استبدل </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> بمسار الملف لملف مخرجات LabRecorder XDF الخاص بك.</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>أدخل مسار ملف مخرجات LSL هنا.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>قم بتحميل ملف XDF.</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 مصادر إضافية</h2><h4 dir="auto">الوثائق الرسمية</h4><ol dir="auto"><li data-preset-tag="p"><p>راجع <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">الوثائق عبر الإنترنت</a>، بما في ذلك <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">ملف README الرسمي على GitHub</a></p></li><li data-preset-tag="p"><p>مصادر إضافية:• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">كود</a> لتشغيل LSL باستخدام أجهزة Emotiv، مع نصوص برمجية توضيحية• <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">عرض توضيحي مفيد لـ LSL على YouTube</a>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">مستودع SCCN LSL على GitHub</a> لجميع المكتبات المرتبطة• <a href="https://github.com/labstreaminglayer" target="_blank">مستودع LSL على GitHub</a> لمجموعة من الوحدات الفرعية والتطبيقات</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</a> لدراسات المسح الفوقي (Hyperscanning)</p></li></ol> </code></pre
مرحباً! في هذا البرنامج التعليمي، سنتعلم كيفية استخدام Lab Streaming Layer (LSL) في Python لجمع وتزامن بيانات Emotiv EEG من أجهزة متعددة. سيتطلب ذلك معرفة عملية أساسية بلغة البرمجة Python.
ما ستتعلمه
ما هي Lab Streaming Layer (LSL) ولماذا يستخدمها الباحثون
كيفية جمع بيانات متزامنة من أجهزة Emotiv EEG متعددة
كيفية استيراد وفحص البيانات التي تم جمعها
1.1 ما هي LSL وفيمَ تفيد؟
تعد Lab streaming layer (LSL) مجموعة أدوات مفتوحة المصدر يمكن استخدامها لإرسال واستقبال وتزامن تدفقات البيانات العصبية والفسيولوجية والسلوكية من أجهزة استشعار متنوعة. تساهم أجهزة استشعار الدماغ والجسم المحمولة والأكثر دقة وقدرة باستمرار (مثل أنظمة Emotiv EEG) في نقل علم الأعصاب خارج المختبر إلى عالم البيانات في الوقت الفعلي. بينما كانت قياسات الدماغ مثل تخطيط كهربائية الدماغ (EEG) وتخطيط مغناطيسية الدماغ (MEG) مقتصرة في السابق على مختبرات الأبحاث، تتيح لنا الأجهزة المحمولة جمع تدفقات متعددة من البيانات في بيئات أكثر طبيعية، ومن عدة أشخاص في نفس الوقت.
قد يهتم الباحث بالتزامن الفسيولوجي بين شخصين يستمعان إلى نفس الموسيقى. يمكن أن تساعدنا LSL في جمع البيانات من سماعتي رأس EEG بشكل منفصل وتزامنها أيضاً مع عرض الصوت.
بعض الأمثلة على الاستخدامات الأخرى لـ LSL:
إضافة علامات الأحداث من تجربة ما إلى بيانات EEG جارية
محاذاة البيانات زمنياً من مصادر متعددة لمشارك واحد (مثل معدل ضربات القلب، تخطيط كهربية العضل EMG، وتخطيط كهربائية الدماغ EEG)
محاذاة البيانات زمنياً من مشاركين متعددين (مثل دراسات المسح الفوقي لتخطيط كهربائية الدماغ EEG Hyperscanning)
1.2 كيف تعمل LSL؟
تعد Lab Streaming Layer بروتوكولاً للتبادل الفوري لبيانات السلاسل الزمنية بين أجهزة متعددة. يمكن تنفيذ LSL باستخدام مكتبات مفتوحة المصدر للغات البرمجة مثل Python وMATLAB وC++ وJava وغيرها.

تتمحور الوظيفة الأساسية حول تدفقات بيانات LSL:
1. يقوم جهاز/برنامج الحصول على البيانات بجمع البيانات وإنشاء تدفق بيانات - يمكن بث البيانات الفسيولوجية إلى LSL من أجهزة تسجيل EEG، وأجهزة تتبع العين، وأنظمة التقاط الحركة، وأجهزة مراقبة معدل ضربات القلب، وما إلى ذلك، بما في ذلك البيانات الوصفية (معدل أخذ العينات، نوع البيانات، معلومات القناة، إلخ) - يمكن أيضاً إرسال علامات الأحداث من التجارب (على سبيل المثال باستخدام PsychoPy) كتدفق بيانات باستخدام LSL
2. يتم نشر تدفق البيانات على الشبكة - هذه هي طريقة إرسال البيانات باستخدام LSL؛ حيث يتم "بث" تدفق البيانات إلى الشبكة - تكون التدفقات المنشورة متاحة على الشبكة ويمكن اكتشافها بواسطة الأجهزة الأخرى التي تدعم LSL على نفس الشبكة - تقوم LSL بتعيين طابع زمني لكل جزء بيانات أو عينة بناءً على ساعة مشتركة (وفقاً لبروتوكول وقت الشبكة). - يتم دفع التدفق عينة بعينة (أو جزءاً بجزء) عبر "منفذ مخرج" (outlet)
3. تقوم أجهزة الجمع "بالاشتراك" في تدفق (تدفقات) البيانات - هذه هي طريقة استقبال البيانات باستخدام LSL - تستقبل أجهزة الجمع الموجودة على نفس الشبكة تدفقات البيانات المنشورة عبر "منافذ مدخل" (inlets). - يستقبل كل منفذ مدخل عينات التدفق والبيانات الوصفية من منفذ مخرج واحد فقط
4. حفظ البيانات - عند الاشتراك في تدفق بيانات، يمكنك حفظه في متغير بلغة البرمجة المفضلة لديك، أو استخدام برنامج LabRecorder المقدم من LSL لحفظه بتنسيق قياسي مثل .xdf.
2.0 نظرة عامة على البرنامج التعليمي
في هذا البرنامج التعليمي، سنأخذ مثالاً لإعداد تجريبي ونرشدك عبر الخطوات والتعليمات البرمجية اللازمة لتنفيذه باستخدام LSL في Python. سنستخدم برنامج Python لتشغيل صوت أثناء جمع بيانات EEG من شخصين يرتديان سماعات Emotiv. سنستخدم جهازي كمبيوتر يقوم كل منهما بتشغيل EmotivPRO لجمع بيانات EEG، وبث كل تدفق عبر منفذ مخرج LSL منفصل. سنستخدم مكتبة Python لتشغيل ملف صوتي وإرسال محفز في نفس الوقت في كل مرة يبدأ فيها الملف.
الخطوات:
1. استخدم EmotivPRO لبث البيانات عبر منافذ مخرج LSL التي تتضمن بيانات EEG (و/أو الحركة، جودة الاتصال، جودة الإشارة، إلخ) 2. قم بتشغيل مسار صوتي باستخدام نص Python البرمجي، وأرسل محفزاً في نفس الوقت عبر منفذ LSL آخر. استخدم LabRecorder لالتقاط وحفظ جميع تدفقات البيانات الثلاثة عبر منفذ مدخل LSL.

2.1 الخطوة 1 - الإعداد والتثبيت
ستحتاج إلى أجهزة معتمدة للحصول على البيانات لجمع البيانات
• تتصل جميع أجهزة Emotiv لقراءة الدماغ بـ LSL عبر برنامج EmotivPROقم بتثبيت EmotivPRO على جهازك (أجهزتك). ستحتاج إلى ترخيص EmotivPRO صالح لاستخدام LSL.
قم بتثبيت مكتبة Python LSL باستخدام الأمر التالي:
pip install pylslقم بتنزيل برنامج LabRecorder. وهو تطبيق بسيط ومجاني يمكن تشغيله من
سطر الأوامر أو باستخدام تنزيل مستقللتجربتنا: قم بتثبيت الحزم اللازمة لتشغيل الصوت باستخدام Python
pip install sounddevice soundfile
2.2 الخطوة 3 - إرسال البيانات من EmotivPRO عبر تدفق LSL
حدد موقع النقاط الثلاث "..." في الزاوية العلوية اليمنى من التطبيق، وانتقل إلى الإعدادات (Settings)
ابحث عن قسم 'Lab Streaming Layer' والقسم الفرعي 'Outlet'
حدد جميع أنواع البيانات التي ترغب في بثها
حدد تنسيق البيانات (32-bit float أو 64-bit double)
اختر ما إذا كنت تريد إرسال البيانات عينة بعينة أو في أجزاء من العينات
انقر على 'Start' لبث تدفق بيانات LSL
2.3 الخطوة 4 - استخدام نص برمجي بلغة Python لتشغيل الصوت وإرسال المحفزات
انسخ كتل البرمجية التالية والصقها في ملف python واحفظها على جهاز الكمبيوتر الخاص بك.
حدد موقع ملف صوتي (يُفضل أن يكون بتنسيق .wav) ترغب في تشغيله وقم بتعديل النص البرمجي عن طريق تغيير
المتغيرaudio_filepathإلى مسار الملف الصوتي على جهاز الكمبيوتر الخاص بكافتح موجه الأوامر للتفاعل مع سطر الأوامر وانتقل إلى المجلد الذي
يتم فيه تخزين ملف Python الخاص بكأدخل:
python3 filename.py
• اعتماداً على تثبيت Python لديك، قد تستخدم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 الخطوة 5 - استخدام LabRecorder لعرض وحفظ جميع تدفقات LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>افتح LabRecorder</p></li><li data-preset-tag="p"><p>اضغط على <code>Update</code>. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفق<br>• يجب أن تكون قادراً على رؤية التدفقات من كلا جهازي EmotivPRO (تسمى عادةً "Emotiv-<br>DataStream") وتدفق العلامات (يسمى "AudioMarkers")</p></li><li data-preset-tag="p"><p>انقر على <code>Browse</code> لتحديد موقع لتخزين البيانات (وضبط المعلمات الأخرى)</p></li><li data-preset-tag="p"><p>حدد جميع التدفقات واضغط على <code>Record</code> لبدء التسجيل</p></li></ol><h2 dir="auto">3.0 العمل مع البيانات</h2><p dir="auto">يقوم LabRecorder بإخراج ملف XDF (Extensible Data Format) الذي يحتوي على بيانات من جميع التدفقات. يتم تنظيم ملفات XDF في تدفقات، يمتلك كل منها رأساً (header) مختلفاً يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل أخذ العينات، القنوات، والمزيد). يمكنك استخدام كتلة التعليمات البرمجية أدناه لفتح ملف XDF الخاص بك وعرض بعض المعلومات الأساسية.</p><p dir="auto"><strong>ملاحظة: استبدل </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> بمسار الملف لملف مخرجات LabRecorder XDF الخاص بك.</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>أدخل مسار ملف مخرجات LSL هنا.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>قم بتحميل ملف XDF.</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 مصادر إضافية</h2><h4 dir="auto">الوثائق الرسمية</h4><ol dir="auto"><li data-preset-tag="p"><p>راجع <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">الوثائق عبر الإنترنت</a>، بما في ذلك <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">ملف README الرسمي على GitHub</a></p></li><li data-preset-tag="p"><p>مصادر إضافية:• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">كود</a> لتشغيل LSL باستخدام أجهزة Emotiv، مع نصوص برمجية توضيحية• <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">عرض توضيحي مفيد لـ LSL على YouTube</a>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">مستودع SCCN LSL على GitHub</a> لجميع المكتبات المرتبطة• <a href="https://github.com/labstreaminglayer" target="_blank">مستودع LSL على GitHub</a> لمجموعة من الوحدات الفرعية والتطبيقات</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</a> لدراسات المسح الفوقي (Hyperscanning)</p></li></ol> </code></pre
مرحباً! في هذا البرنامج التعليمي، سنتعلم كيفية استخدام Lab Streaming Layer (LSL) في Python لجمع وتزامن بيانات Emotiv EEG من أجهزة متعددة. سيتطلب ذلك معرفة عملية أساسية بلغة البرمجة Python.
ما ستتعلمه
ما هي Lab Streaming Layer (LSL) ولماذا يستخدمها الباحثون
كيفية جمع بيانات متزامنة من أجهزة Emotiv EEG متعددة
كيفية استيراد وفحص البيانات التي تم جمعها
1.1 ما هي LSL وفيمَ تفيد؟
تعد Lab streaming layer (LSL) مجموعة أدوات مفتوحة المصدر يمكن استخدامها لإرسال واستقبال وتزامن تدفقات البيانات العصبية والفسيولوجية والسلوكية من أجهزة استشعار متنوعة. تساهم أجهزة استشعار الدماغ والجسم المحمولة والأكثر دقة وقدرة باستمرار (مثل أنظمة Emotiv EEG) في نقل علم الأعصاب خارج المختبر إلى عالم البيانات في الوقت الفعلي. بينما كانت قياسات الدماغ مثل تخطيط كهربائية الدماغ (EEG) وتخطيط مغناطيسية الدماغ (MEG) مقتصرة في السابق على مختبرات الأبحاث، تتيح لنا الأجهزة المحمولة جمع تدفقات متعددة من البيانات في بيئات أكثر طبيعية، ومن عدة أشخاص في نفس الوقت.
قد يهتم الباحث بالتزامن الفسيولوجي بين شخصين يستمعان إلى نفس الموسيقى. يمكن أن تساعدنا LSL في جمع البيانات من سماعتي رأس EEG بشكل منفصل وتزامنها أيضاً مع عرض الصوت.
بعض الأمثلة على الاستخدامات الأخرى لـ LSL:
إضافة علامات الأحداث من تجربة ما إلى بيانات EEG جارية
محاذاة البيانات زمنياً من مصادر متعددة لمشارك واحد (مثل معدل ضربات القلب، تخطيط كهربية العضل EMG، وتخطيط كهربائية الدماغ EEG)
محاذاة البيانات زمنياً من مشاركين متعددين (مثل دراسات المسح الفوقي لتخطيط كهربائية الدماغ EEG Hyperscanning)
1.2 كيف تعمل LSL؟
تعد Lab Streaming Layer بروتوكولاً للتبادل الفوري لبيانات السلاسل الزمنية بين أجهزة متعددة. يمكن تنفيذ LSL باستخدام مكتبات مفتوحة المصدر للغات البرمجة مثل Python وMATLAB وC++ وJava وغيرها.

تتمحور الوظيفة الأساسية حول تدفقات بيانات LSL:
1. يقوم جهاز/برنامج الحصول على البيانات بجمع البيانات وإنشاء تدفق بيانات - يمكن بث البيانات الفسيولوجية إلى LSL من أجهزة تسجيل EEG، وأجهزة تتبع العين، وأنظمة التقاط الحركة، وأجهزة مراقبة معدل ضربات القلب، وما إلى ذلك، بما في ذلك البيانات الوصفية (معدل أخذ العينات، نوع البيانات، معلومات القناة، إلخ) - يمكن أيضاً إرسال علامات الأحداث من التجارب (على سبيل المثال باستخدام PsychoPy) كتدفق بيانات باستخدام LSL
2. يتم نشر تدفق البيانات على الشبكة - هذه هي طريقة إرسال البيانات باستخدام LSL؛ حيث يتم "بث" تدفق البيانات إلى الشبكة - تكون التدفقات المنشورة متاحة على الشبكة ويمكن اكتشافها بواسطة الأجهزة الأخرى التي تدعم LSL على نفس الشبكة - تقوم LSL بتعيين طابع زمني لكل جزء بيانات أو عينة بناءً على ساعة مشتركة (وفقاً لبروتوكول وقت الشبكة). - يتم دفع التدفق عينة بعينة (أو جزءاً بجزء) عبر "منفذ مخرج" (outlet)
3. تقوم أجهزة الجمع "بالاشتراك" في تدفق (تدفقات) البيانات - هذه هي طريقة استقبال البيانات باستخدام LSL - تستقبل أجهزة الجمع الموجودة على نفس الشبكة تدفقات البيانات المنشورة عبر "منافذ مدخل" (inlets). - يستقبل كل منفذ مدخل عينات التدفق والبيانات الوصفية من منفذ مخرج واحد فقط
4. حفظ البيانات - عند الاشتراك في تدفق بيانات، يمكنك حفظه في متغير بلغة البرمجة المفضلة لديك، أو استخدام برنامج LabRecorder المقدم من LSL لحفظه بتنسيق قياسي مثل .xdf.
2.0 نظرة عامة على البرنامج التعليمي
في هذا البرنامج التعليمي، سنأخذ مثالاً لإعداد تجريبي ونرشدك عبر الخطوات والتعليمات البرمجية اللازمة لتنفيذه باستخدام LSL في Python. سنستخدم برنامج Python لتشغيل صوت أثناء جمع بيانات EEG من شخصين يرتديان سماعات Emotiv. سنستخدم جهازي كمبيوتر يقوم كل منهما بتشغيل EmotivPRO لجمع بيانات EEG، وبث كل تدفق عبر منفذ مخرج LSL منفصل. سنستخدم مكتبة Python لتشغيل ملف صوتي وإرسال محفز في نفس الوقت في كل مرة يبدأ فيها الملف.
الخطوات:
1. استخدم EmotivPRO لبث البيانات عبر منافذ مخرج LSL التي تتضمن بيانات EEG (و/أو الحركة، جودة الاتصال، جودة الإشارة، إلخ) 2. قم بتشغيل مسار صوتي باستخدام نص Python البرمجي، وأرسل محفزاً في نفس الوقت عبر منفذ LSL آخر. استخدم LabRecorder لالتقاط وحفظ جميع تدفقات البيانات الثلاثة عبر منفذ مدخل LSL.

2.1 الخطوة 1 - الإعداد والتثبيت
ستحتاج إلى أجهزة معتمدة للحصول على البيانات لجمع البيانات
• تتصل جميع أجهزة Emotiv لقراءة الدماغ بـ LSL عبر برنامج EmotivPROقم بتثبيت EmotivPRO على جهازك (أجهزتك). ستحتاج إلى ترخيص EmotivPRO صالح لاستخدام LSL.
قم بتثبيت مكتبة Python LSL باستخدام الأمر التالي:
pip install pylslقم بتنزيل برنامج LabRecorder. وهو تطبيق بسيط ومجاني يمكن تشغيله من
سطر الأوامر أو باستخدام تنزيل مستقللتجربتنا: قم بتثبيت الحزم اللازمة لتشغيل الصوت باستخدام Python
pip install sounddevice soundfile
2.2 الخطوة 3 - إرسال البيانات من EmotivPRO عبر تدفق LSL
حدد موقع النقاط الثلاث "..." في الزاوية العلوية اليمنى من التطبيق، وانتقل إلى الإعدادات (Settings)
ابحث عن قسم 'Lab Streaming Layer' والقسم الفرعي 'Outlet'
حدد جميع أنواع البيانات التي ترغب في بثها
حدد تنسيق البيانات (32-bit float أو 64-bit double)
اختر ما إذا كنت تريد إرسال البيانات عينة بعينة أو في أجزاء من العينات
انقر على 'Start' لبث تدفق بيانات LSL
2.3 الخطوة 4 - استخدام نص برمجي بلغة Python لتشغيل الصوت وإرسال المحفزات
انسخ كتل البرمجية التالية والصقها في ملف python واحفظها على جهاز الكمبيوتر الخاص بك.
حدد موقع ملف صوتي (يُفضل أن يكون بتنسيق .wav) ترغب في تشغيله وقم بتعديل النص البرمجي عن طريق تغيير
المتغيرaudio_filepathإلى مسار الملف الصوتي على جهاز الكمبيوتر الخاص بكافتح موجه الأوامر للتفاعل مع سطر الأوامر وانتقل إلى المجلد الذي
يتم فيه تخزين ملف Python الخاص بكأدخل:
python3 filename.py
• اعتماداً على تثبيت Python لديك، قد تستخدم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 الخطوة 5 - استخدام LabRecorder لعرض وحفظ جميع تدفقات LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>افتح LabRecorder</p></li><li data-preset-tag="p"><p>اضغط على <code>Update</code>. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفق<br>• يجب أن تكون قادراً على رؤية التدفقات من كلا جهازي EmotivPRO (تسمى عادةً "Emotiv-<br>DataStream") وتدفق العلامات (يسمى "AudioMarkers")</p></li><li data-preset-tag="p"><p>انقر على <code>Browse</code> لتحديد موقع لتخزين البيانات (وضبط المعلمات الأخرى)</p></li><li data-preset-tag="p"><p>حدد جميع التدفقات واضغط على <code>Record</code> لبدء التسجيل</p></li></ol><h2 dir="auto">3.0 العمل مع البيانات</h2><p dir="auto">يقوم LabRecorder بإخراج ملف XDF (Extensible Data Format) الذي يحتوي على بيانات من جميع التدفقات. يتم تنظيم ملفات XDF في تدفقات، يمتلك كل منها رأساً (header) مختلفاً يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل أخذ العينات، القنوات، والمزيد). يمكنك استخدام كتلة التعليمات البرمجية أدناه لفتح ملف XDF الخاص بك وعرض بعض المعلومات الأساسية.</p><p dir="auto"><strong>ملاحظة: استبدل </strong><code><strong>/path/to/your/file.xdf</strong></code><strong> بمسار الملف لملف مخرجات LabRecorder XDF الخاص بك.</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>أدخل مسار ملف مخرجات LSL هنا.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>قم بتحميل ملف XDF.</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 مصادر إضافية</h2><h4 dir="auto">الوثائق الرسمية</h4><ol dir="auto"><li data-preset-tag="p"><p>راجع <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">الوثائق عبر الإنترنت</a>، بما في ذلك <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">ملف README الرسمي على GitHub</a></p></li><li data-preset-tag="p"><p>مصادر إضافية:• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">كود</a> لتشغيل LSL باستخدام أجهزة Emotiv، مع نصوص برمجية توضيحية• <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">عرض توضيحي مفيد لـ LSL على YouTube</a>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">مستودع SCCN LSL على GitHub</a> لجميع المكتبات المرتبطة• <a href="https://github.com/labstreaminglayer" target="_blank">مستودع LSL على GitHub</a> لمجموعة من الوحدات الفرعية والتطبيقات</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</a> لدراسات المسح الفوقي (Hyperscanning)</p></li></ol> </code></pre

تابع القراءة