طبقة تدفق المختبر (LSL) لمزامنة تدفقات البيانات المتعددة

روشييني راندينيا

01‏/10‏/2025

شارك:

بقلم روشيني رانيدينيا ولوكاس كلاين

التشغيل:
بمجرد التشغيل في سطر الأوامر، يبدأ هذا البرنامج على الفور تدفق LSL. كلما تم الضغط على مفتاح 'Enter'، يرسل مشغلًا ويقوم بتشغيل ملف صوتي.

import sounddevice as sd
import soundfile as sf
من pylsl استيراد StreamInfo, StreamOutlet

def wait_for_keypress():
print("اضغط على ENTER لبدء تشغيل الصوت وإرسال علامة LSL.")

while True: # This loop waits for a keyboard input
    input_str = input()  # Wait for input from the terminal
    if input_str == "":  # If the enter key is pressed, proceed
        break

def AudioMarker(audio_file, outlet): # وظيفة لتشغيل الصوت وإرسال علامة
data, fs = sf.read(audio_file) # تحميل ملف الصوت

print("Playing audio and sending LSL marker...")
marker_val = [1]
outlet.push_sample(marker_val) # Send marker indicating the start of audio playback
sd.play(data, fs) # play the audio
sd.wait()  # Wait until audio is done playing
print("Audio playback finished.")

إذا كان الاسم == "الرئيسي": # الحلقة الرئيسية
# إعداد تدفق LSL للعلامات
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # ضبط معدل أخذ العينات على 0 لأن العلامات غير منتظمة
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'

info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id)
outlet = StreamOutlet(info) # create LSL outlet

# Keep the script running and wait for ENTER key to play audio and send marker
while True:
    wait_for_keypress()
    audio_filepath = "/path/to/your/audio_file.wav"  # replace with correct path to your audio file
    AudioMarker(audio_filepath, outlet)
    # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>

**بتشغيل هذا الملف (حتى قبل تشغيل الصوت)، قمت بتفعيل تدفق LSL من خلال منفذ. الآن سنشاهد هذا التدفق في LabRecorder

الخطوة 5 - استخدم LabRecorder لمشاهدة وحفظ جميع تدفقات LSL

  1. افتح LabRecorder

  2. اضغط تحديث. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفقات
    • يجب أن تكون قادرًا على رؤية التدفقات من كلا emotivpro (عادة ما تسمى "EmotivDataStream") وتدفق العلامة (المسمى "AudioMarkers")

  3. انقر على تصفح لتحديد موقع لتخزين البيانات (وتعيين معلمات أخرى)

  4. اختر جميع التدفقات واضغط على تسجيل لبدء التسجيل

  5. اضغط على إيقاف عند رغبتك في إنهاء التسجيل



العمل مع البيانات

يصدر LabRecorder ملف XDF (تنسيق بيانات قابل للتوسع) يحتوي على بيانات من جميع التدفقات. يتم هيكلة ملفات XDF إلى, تدفقات, كل منها يتضمن عنوانًا مختلفًا يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل العينات، القنوات، والمزيد). يمكنك استخدام كتلة الأكواد أدناه لفتح ملف XDF وعرض بعض المعلومات الأساسية.

يوضح هذا البرنامج العمل التجريبي بعض الوظائف الأساسية لاستيراد وتعليق بيانات EEG التي تم جمعها من برامج EmotivPRO. يستخدم MNE لتحميل ملف XDF، وعرض بعض البيانات التعريفية الأساسية، وإنشاء كائن info ورسم طيف القوة."""

استيراد pyxdf
استيراد mne
استيراد matplotlib.pyplot كـ plt
استيراد numpy كـ np

مسار ملف XDF الخاص بك

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

تحميل ملف XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("عنوان ملف XDF:", fileheader)
print("عدد التدفقات التي تم العثور عليها:", len(streams))

ل i، stream في enumerate(streams):
print("\nStream", i + 1)
print("اسم التدفق:", stream['info']['name'][0])
print("نوع التدفق:", stream['info']['type'][0])
print("عدد القنوات:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("معدل العينات:", sfreq)
print("عدد العينات:", len(stream['time_series']))
print("عرض أول 5 نقاط بيانات:", 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'
إنشاء كائن معلومات MNE

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # تحتاج البيانات إلى تحويل: قنوات x عينات
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # رسم طيف بسيط (الكثافة الطيفية للطاقة)موارد إضافيةتحميل هذا الدرس كتطبيق Jupyter من GitHub لـ EMOTIVتحقق من الوثائق الإلكترونية لـ LSL، بما في ذلك ملف README الرسمي على GitHubستحتاج إلى جهاز واحد أو أكثر مدعوم لجمع البياناتتتصل جميع أجهزة brainware من EMOTIV ببرنامج EmotivPRO، الذي يحتوي على قدرات مضمنة لإرسال واستقبال تدفقات البياناتالموارد الإضافية:رمز لتشغيل LSL باستخدام أجهزة Emotiv، مع أمثلة برمجياتمدونة تجريبية مفيدة لـ LSL على YouTubeمستودع SCCN LSL GitHub لجميع المكتبات المرتبطةمستودع GitHub لمجموعة من الوحدات الفرعية والتطبيقاتخط التحليل HyPyP لدراسات البحث المتعدد الأدمغة

بقلم روشيني رانيدينيا ولوكاس كلاين

التشغيل:
بمجرد التشغيل في سطر الأوامر، يبدأ هذا البرنامج على الفور تدفق LSL. كلما تم الضغط على مفتاح 'Enter'، يرسل مشغلًا ويقوم بتشغيل ملف صوتي.

import sounddevice as sd
import soundfile as sf
من pylsl استيراد StreamInfo, StreamOutlet

def wait_for_keypress():
print("اضغط على ENTER لبدء تشغيل الصوت وإرسال علامة LSL.")

while True: # This loop waits for a keyboard input
    input_str = input()  # Wait for input from the terminal
    if input_str == "":  # If the enter key is pressed, proceed
        break

def AudioMarker(audio_file, outlet): # وظيفة لتشغيل الصوت وإرسال علامة
data, fs = sf.read(audio_file) # تحميل ملف الصوت

print("Playing audio and sending LSL marker...")
marker_val = [1]
outlet.push_sample(marker_val) # Send marker indicating the start of audio playback
sd.play(data, fs) # play the audio
sd.wait()  # Wait until audio is done playing
print("Audio playback finished.")

إذا كان الاسم == "الرئيسي": # الحلقة الرئيسية
# إعداد تدفق LSL للعلامات
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # ضبط معدل أخذ العينات على 0 لأن العلامات غير منتظمة
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'

info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id)
outlet = StreamOutlet(info) # create LSL outlet

# Keep the script running and wait for ENTER key to play audio and send marker
while True:
    wait_for_keypress()
    audio_filepath = "/path/to/your/audio_file.wav"  # replace with correct path to your audio file
    AudioMarker(audio_filepath, outlet)
    # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>

**بتشغيل هذا الملف (حتى قبل تشغيل الصوت)، قمت بتفعيل تدفق LSL من خلال منفذ. الآن سنشاهد هذا التدفق في LabRecorder

الخطوة 5 - استخدم LabRecorder لمشاهدة وحفظ جميع تدفقات LSL

  1. افتح LabRecorder

  2. اضغط تحديث. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفقات
    • يجب أن تكون قادرًا على رؤية التدفقات من كلا emotivpro (عادة ما تسمى "EmotivDataStream") وتدفق العلامة (المسمى "AudioMarkers")

  3. انقر على تصفح لتحديد موقع لتخزين البيانات (وتعيين معلمات أخرى)

  4. اختر جميع التدفقات واضغط على تسجيل لبدء التسجيل

  5. اضغط على إيقاف عند رغبتك في إنهاء التسجيل



العمل مع البيانات

يصدر LabRecorder ملف XDF (تنسيق بيانات قابل للتوسع) يحتوي على بيانات من جميع التدفقات. يتم هيكلة ملفات XDF إلى, تدفقات, كل منها يتضمن عنوانًا مختلفًا يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل العينات، القنوات، والمزيد). يمكنك استخدام كتلة الأكواد أدناه لفتح ملف XDF وعرض بعض المعلومات الأساسية.

يوضح هذا البرنامج العمل التجريبي بعض الوظائف الأساسية لاستيراد وتعليق بيانات EEG التي تم جمعها من برامج EmotivPRO. يستخدم MNE لتحميل ملف XDF، وعرض بعض البيانات التعريفية الأساسية، وإنشاء كائن info ورسم طيف القوة."""

استيراد pyxdf
استيراد mne
استيراد matplotlib.pyplot كـ plt
استيراد numpy كـ np

مسار ملف XDF الخاص بك

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

تحميل ملف XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("عنوان ملف XDF:", fileheader)
print("عدد التدفقات التي تم العثور عليها:", len(streams))

ل i، stream في enumerate(streams):
print("\nStream", i + 1)
print("اسم التدفق:", stream['info']['name'][0])
print("نوع التدفق:", stream['info']['type'][0])
print("عدد القنوات:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("معدل العينات:", sfreq)
print("عدد العينات:", len(stream['time_series']))
print("عرض أول 5 نقاط بيانات:", 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'
إنشاء كائن معلومات MNE

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # تحتاج البيانات إلى تحويل: قنوات x عينات
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # رسم طيف بسيط (الكثافة الطيفية للطاقة)موارد إضافيةتحميل هذا الدرس كتطبيق Jupyter من GitHub لـ EMOTIVتحقق من الوثائق الإلكترونية لـ LSL، بما في ذلك ملف README الرسمي على GitHubستحتاج إلى جهاز واحد أو أكثر مدعوم لجمع البياناتتتصل جميع أجهزة brainware من EMOTIV ببرنامج EmotivPRO، الذي يحتوي على قدرات مضمنة لإرسال واستقبال تدفقات البياناتالموارد الإضافية:رمز لتشغيل LSL باستخدام أجهزة Emotiv، مع أمثلة برمجياتمدونة تجريبية مفيدة لـ LSL على YouTubeمستودع SCCN LSL GitHub لجميع المكتبات المرتبطةمستودع GitHub لمجموعة من الوحدات الفرعية والتطبيقاتخط التحليل HyPyP لدراسات البحث المتعدد الأدمغة

بقلم روشيني رانيدينيا ولوكاس كلاين

التشغيل:
بمجرد التشغيل في سطر الأوامر، يبدأ هذا البرنامج على الفور تدفق LSL. كلما تم الضغط على مفتاح 'Enter'، يرسل مشغلًا ويقوم بتشغيل ملف صوتي.

import sounddevice as sd
import soundfile as sf
من pylsl استيراد StreamInfo, StreamOutlet

def wait_for_keypress():
print("اضغط على ENTER لبدء تشغيل الصوت وإرسال علامة LSL.")

while True: # This loop waits for a keyboard input
    input_str = input()  # Wait for input from the terminal
    if input_str == "":  # If the enter key is pressed, proceed
        break

def AudioMarker(audio_file, outlet): # وظيفة لتشغيل الصوت وإرسال علامة
data, fs = sf.read(audio_file) # تحميل ملف الصوت

print("Playing audio and sending LSL marker...")
marker_val = [1]
outlet.push_sample(marker_val) # Send marker indicating the start of audio playback
sd.play(data, fs) # play the audio
sd.wait()  # Wait until audio is done playing
print("Audio playback finished.")

إذا كان الاسم == "الرئيسي": # الحلقة الرئيسية
# إعداد تدفق LSL للعلامات
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # ضبط معدل أخذ العينات على 0 لأن العلامات غير منتظمة
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'

info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id)
outlet = StreamOutlet(info) # create LSL outlet

# Keep the script running and wait for ENTER key to play audio and send marker
while True:
    wait_for_keypress()
    audio_filepath = "/path/to/your/audio_file.wav"  # replace with correct path to your audio file
    AudioMarker(audio_filepath, outlet)
    # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>

**بتشغيل هذا الملف (حتى قبل تشغيل الصوت)، قمت بتفعيل تدفق LSL من خلال منفذ. الآن سنشاهد هذا التدفق في LabRecorder

الخطوة 5 - استخدم LabRecorder لمشاهدة وحفظ جميع تدفقات LSL

  1. افتح LabRecorder

  2. اضغط تحديث. يجب أن تكون تدفقات LSL المتاحة مرئية في قائمة التدفقات
    • يجب أن تكون قادرًا على رؤية التدفقات من كلا emotivpro (عادة ما تسمى "EmotivDataStream") وتدفق العلامة (المسمى "AudioMarkers")

  3. انقر على تصفح لتحديد موقع لتخزين البيانات (وتعيين معلمات أخرى)

  4. اختر جميع التدفقات واضغط على تسجيل لبدء التسجيل

  5. اضغط على إيقاف عند رغبتك في إنهاء التسجيل



العمل مع البيانات

يصدر LabRecorder ملف XDF (تنسيق بيانات قابل للتوسع) يحتوي على بيانات من جميع التدفقات. يتم هيكلة ملفات XDF إلى, تدفقات, كل منها يتضمن عنوانًا مختلفًا يصف ما يحتويه (اسم الجهاز، نوع البيانات، معدل العينات، القنوات، والمزيد). يمكنك استخدام كتلة الأكواد أدناه لفتح ملف XDF وعرض بعض المعلومات الأساسية.

يوضح هذا البرنامج العمل التجريبي بعض الوظائف الأساسية لاستيراد وتعليق بيانات EEG التي تم جمعها من برامج EmotivPRO. يستخدم MNE لتحميل ملف XDF، وعرض بعض البيانات التعريفية الأساسية، وإنشاء كائن info ورسم طيف القوة."""

استيراد pyxdf
استيراد mne
استيراد matplotlib.pyplot كـ plt
استيراد numpy كـ np

مسار ملف XDF الخاص بك

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

تحميل ملف XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("عنوان ملف XDF:", fileheader)
print("عدد التدفقات التي تم العثور عليها:", len(streams))

ل i، stream في enumerate(streams):
print("\nStream", i + 1)
print("اسم التدفق:", stream['info']['name'][0])
print("نوع التدفق:", stream['info']['type'][0])
print("عدد القنوات:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("معدل العينات:", sfreq)
print("عدد العينات:", len(stream['time_series']))
print("عرض أول 5 نقاط بيانات:", 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'
إنشاء كائن معلومات MNE

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # تحتاج البيانات إلى تحويل: قنوات x عينات
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # رسم طيف بسيط (الكثافة الطيفية للطاقة)موارد إضافيةتحميل هذا الدرس كتطبيق Jupyter من GitHub لـ EMOTIVتحقق من الوثائق الإلكترونية لـ LSL، بما في ذلك ملف README الرسمي على GitHubستحتاج إلى جهاز واحد أو أكثر مدعوم لجمع البياناتتتصل جميع أجهزة brainware من EMOTIV ببرنامج EmotivPRO، الذي يحتوي على قدرات مضمنة لإرسال واستقبال تدفقات البياناتالموارد الإضافية:رمز لتشغيل LSL باستخدام أجهزة Emotiv، مع أمثلة برمجياتمدونة تجريبية مفيدة لـ LSL على YouTubeمستودع SCCN LSL GitHub لجميع المكتبات المرتبطةمستودع GitHub لمجموعة من الوحدات الفرعية والتطبيقاتخط التحليل HyPyP لدراسات البحث المتعدد الأدمغة

تابع القراءة

أساسيات التذبذبات العصبية