لایه استریمینگ آزمایشگاهی (LSL) برای همگام‌سازی چندین جریان داده

دکتر روشینی راندنیا و لوکاس کلاین

به‌روزرسانی در

۲۸ اردیبهشت ۱۴۰۳

لایه استریمینگ آزمایشگاهی (LSL) برای همگام‌سازی چندین جریان داده

دکتر روشینی راندنیا و لوکاس کلاین

به‌روزرسانی در

۲۸ اردیبهشت ۱۴۰۳

لایه استریمینگ آزمایشگاهی (LSL) برای همگام‌سازی چندین جریان داده

دکتر روشینی راندنیا و لوکاس کلاین

به‌روزرسانی در

۲۸ اردیبهشت ۱۴۰۳

خوش آمدید! در این آموزش یاد خواهیم گرفت که چگونه از Lab Streaming Layer (LSL) در پایتون برای جمع‌آوری و همگام‌سازی داده‌های EEG مربوط به Emotiv از چندین دستگاه استفاده کنیم. این کار به دانش پایه و کاربردی از زبان برنامه‌نویسی پایتون نیاز دارد.

آنچه یاد خواهید گرفت

  1. Lab Streaming Layer (LSL) چیست و چرا پژوهشگران از آن استفاده می‌کنند

  2. چگونه داده‌های همگام‌سازی‌شده را از چندین دستگاه EEG متعلق به Emotiv جمع‌آوری کنیم

  3. چگونه داده‌های جمع‌آوری‌شده را وارد و بررسی کنیم

۱.۱ LSL چیست و چه کاربردهایی دارد؟

لایه استریم آزمایشگاهی (LSL) یک جعبه‌ابزار متن‌باز است که می‌توان از آن برای ارسال، دریافت و همگام‌سازی جریان‌های داده‌های عصبی، فیزیولوژیکی و رفتاری از سخت‌افزارهای حسگر مختلف استفاده کرد. دستگاه‌های سخت‌افزاری سنجش مغز و بدن که به طور فزاینده‌ای توانمند، دقیق و قابل حمل هستند (مانند سیستم‌های EEG مربوط به Emotiv)، در حال انتقال علوم اعصاب از آزمایشگاه به دنیای داده‌های بلادرنگ هستند. در حالی که اندازه‌گیری‌های مغزی مانند EEG و MEG زمانی به آزمایشگاه‌های تحقیقاتی محدود بودند، دستگاه‌های تلفن همراه به ما اجازه می‌دهند حجم زیادی از داده‌ها را در محیط‌های طبیعی‌تر و از چندین نفر به طور همزمان جمع‌آوری کنیم.

یک پژوهشگر ممکن است به همگام‌سازی فیزیولوژیکی بین دو نفر که به یک موسیقی گوش می‌دهند علاقه داشته باشد. LSL می‌تواند به ما کمک کند تا داده‌ها را از دو هدست EEG به صورت جداگانه جمع‌آوری کنیم که با پخش صدا نیز همگام‌سازی شده‌اند.

چند نمونه از کاربردهای دیگر LSL:

  1. افزودن نشانگرهای رویداد از یک آزمایش به داده‌های EEG در حال انجام

  2. تراز زمانی داده‌ها از چندین منبع برای یک شرکت‌کننده واحد (به عنوان مثال، ضربان قلب، EMG، EEG)

  3. تراز زمانی داده‌های چندین شرکت‌کننده (به عنوان مثال، مطالعات هایپراسکنینگ EEG)

۱.۲ LSL چگونه کار می‌کند؟

Lab Streaming Layer پروتکلی برای تبادل بلادرنگ داده‌های سری زمانی بین چندین دستگاه است. LSL را می‌توان با استفاده از کتابخانه‌های متن‌باز برای زبان‌های برنامه‌نویسی مانند پایتون، متلب، C++، جاوا و غیره پیاده‌سازی کرد.

عملکرد اصلی حول محور جریان‌های داده LSL می‌چرخد:

۱. یک دستگاه/نرم‌افزار دریافت‌کننده، داده‌ها را جمع‌آوری کرده و یک جریان داده ایجاد می‌کند - داده‌های فیزیولوژیکی را می‌توان از دستگاه‌های ثبت EEG، ردیاب‌های چشم، سیستم‌های ثبت حرکت، مانیتورهای ضربان قلب و غیره به LSL ارسال کرد، از جمله متادیتا (نرخ نمونه‌برداری، نوع داده، اطلاعات کانال و غیره) - نشانگرهای رویداد از آزمایش‌ها (به عنوان مثال با استفاده از PsychoPy) نیز می‌توانند به عنوان یک جریان داده با استفاده از LSL ارسال شوند

۲. جریان داده در شبکه منتشر می‌شود - این نحوه ارسال داده با استفاده از LSL است؛ جریان داده در شبکه "پخش" می‌شود - جریان‌های منتشر شده در شبکه در دسترس هستند و توسط سایر دستگاه‌های پشتیبانی‌شده توسط LSL در همان شبکه قابل شناسایی می‌باشند - LSL بر اساس یک ساعت مشترک (پیرو پروتکل زمان شبکه یا NTP)، به هر بخش داده یا نمونه یک برچسب زمانی اختصاص می‌دهد. - جریان داده نمونه‌به‌نمونه (یا بخش‌به‌بخش) از طریق یک "خروجی" فرستاده می‌شود

۳. دستگاه(های) جمع‌آوری به جریان(های) داده "مشترک" می‌شوند - این نحوه دریافت داده با استفاده از LSL است - دستگاه‌های جمع‌آوری در همان شبکه، جریان‌های داده منتشر شده را از طریق "ورودی‌ها" دریافت می‌کنند. - هر ورودی نمونه‌های جریان و متادیتا را تنها از یک خروجی دریافت می‌کند

۴. ذخیره داده‌ها - پس از اشتراک در یک جریان داده، می‌توانید آن را در یک متغیر در زبان برنامه‌نویسی مورد نظر خود ذخیره کنید، یا از نرم‌افزار ارائه شده LSL یعنی LabRecorder برای ذخیره آن در یک قالب استاندارد مانند .xdf استفاده کنید.

۲.۰ مرور کلی آموزش

در این آموزش، ما یک نمونه راه‌اندازی آزمایشی را در نظر می‌گیریم و شما را از طریق مراحل و کدهای لازم برای پیاده‌سازی آن با استفاده از LSL در پایتون راهنمایی می‌کنیم. ما از پایتون برای پخش صدا در حین جمع‌آوری داده‌های EEG از دو نفر که هدست‌های Emotiv بر سر دارند استفاده خواهیم کرد. ما از دو کامپیوتر که هر کدام برنامه EmotivPRO را اجرا می‌کنند برای جمع‌آوری داده‌های EEG استفاده می‌کنیم و هر جریان را از طریق یک خروجی LSL مجزا پخش خواهیم کرد. ما از یک کتابخانه پایتون برای پخش یک فایل صوتی و ارسال همزمان یک تریگر (محرک) در هر بار شروع فایل استفاده خواهیم کرد.

مراحل:

۱. از EmotivPRO برای جریان دادن داده‌ها از طریق خروجی‌های LSL مجهز به داده‌های EEG (و/یا حرکت، کیفیت تماس، کیفیت سیگنال و غیره) استفاده کنید. ۲. یک قطعه صوتی را با استفاده از اسکریپت پایتون پخش کنید و همزمان یک تریگر را از طریق یک LSL دیگر ارسال کنید. از LabRecorder برای ثبت و ذخیره هر سه جریان داده از طریق یک ورودی LSL استفاده کنید.

۲.۱ مرحله ۱ - راه‌اندازی و نصب

  1. شما برای جمع‌آوری داده‌ها به دستگاه‌های دریافت داده پشتیبانی‌شده نیاز خواهید داشت
    • تمام دستگاه‌های مغزی Emotiv از طریق نرم‌افزار EmotivPRO به LSL متصل می‌شوند

  2. برنامه EmotivPRO را روی دستگاه(های) خود نصب کنید. برای استفاده از LSL به یک لایسنس معتبر EmotivPRO نیاز دارید.

  3. کتابخانه LSL پایتون را با دستور زیر نصب کنید:
    pip install pylsl

  4. نرم‌افزار LabRecorder را دانلود کنید. این یک برنامه ساده و رایگان است که می‌توان آن را از طریق خط فرمان یا با استفاده از نسخه مستقل دانلود شده اجرا کرد

  5. برای آزمایش ما: بسته‌های لازم برای پخش صدا با استفاده از پایتون را نصب کنید
    pip install sounddevice soundfile

۲.۲ مرحله ۳ - ارسال داده‌ها از EmotivPRO از طریق یک جریان LSL

  1. علامت "..." را در گوشه سمت راست بالای برنامه پیدا کرده و به بخش Settings بروید

  2. بخش 'Lab Streaming Layer' و زیربخش 'Outlet' را پیدا کنید

  3. تمام انواع داده‌هایی را که مایل به پخش آن‌ها هستید انتخاب کنید

  4. فرمت داده را انتخاب کنید (فلوت ۳۲ بیتی یا دابل ۶۴ بیتی)

  5. انتخاب کنید که آیا داده‌ها به صورت نمونه‌به‌نمونه فرستاده شوند یا به صورت دسته‌ای از نمونه‌ها

  6. برای پخش جریان داده LSL روی 'Start' کلیک کنید


۲.۳ مرحله ۴ - استفاده از اسکریپت پایتون برای پخش صدا و ارسال تریگرها

  1. بلوک کد زیر را کپی کرده و در یک فایل پایتون در کامپیوتر خود ذخیره کنید.

  2. یک فایل صوتی (ترجیحاً یک فایل .wav) را که می‌خواهید پخش شود پیدا کنید و اسکریپت را با تغییر متغیر audio_filepath به مسیر فایل صوتی در کامپیوتر خود ویرایش کنید

  3. یک خط فرمان را برای تعامل با خط دستور باز کنید و به پوشه‌ای که فایل پایتون شما در آن ذخیره شده است بروید

  4. وارد کنید: python3 filename.py
    • بسته به نصب پایتون خود، ممکن است به جای python3 از python استفاده کنید

    توجه: عبارت /path/to/audio.wav را با مسیر فایل صوتی که می‌خواهید در طول آزمایش پخش شود، جایگزین کنید.

"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )
"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )
"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )

۲.۴ مرحله ۵ - استفاده از LabRecorder برای مشاهده و ذخیره تمام جریان‌های LSL

  1. برنامه LabRecorder را باز کنید

  2. دکمه Update را فشار دهید. جریان‌های LSL موجود باید در لیست جریان‌ها قابل مشاهده باشند
    • شما باید بتوانید جریان‌های مربوط به هر دو دستگاه EmotivPRO (معمولاً به نام "Emotiv-DataStream") و جریان نشانگر (به نام "AudioMarkers") را ببینید

  3. روی Browse کلیک کنید تا مکانی را برای ذخیره داده‌ها انتخاب کنید (و سایر پارامترها را تنظیم کنید)

  4. همه جریان‌ها را انتخاب کرده و دکمه Record را برای شروع ضبط فشار دهید

۳.۰ کار با داده‌ها

برنامه LabRecorder یک فایل XDF (فرمت داده‌های توسعه‌پذیر) خروجی می‌دهد که حاوی داده‌های تمام جریان‌ها است. فایل‌های XDF به چندین جریان ساختار یافته‌اند که هر کدام دارای هدر متفاوتی هستند که محتویات آن را توصیف می‌کند (نام دستگاه، نوع داده، نرخ نمونه‌برداری، کانال‌ها و موارد دیگر). برای باز کردن فایل XDF خود و نمایش برخی اطلاعات اولیه، می‌توانید از بلوک کد زیر استفاده کنید.

توجه: مسیر /path/to/your/file.xdf را با مسیر فایل خروجی LabRecorder XDF خود جایگزین کنید.

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", stream["time_series"][:5])

    channel_names = [
        chan["label"][0]
        for chan in stream["info"]["desc"][0]["channels"][0]["channel"]
    ]

    print("Channel Names:", channel_names)

    channel_types = "eeg"
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", stream["time_series"][:5])

    channel_names = [
        chan["label"][0]
        for chan in stream["info"]["desc"][0]["channels"][0]["channel"]
    ]

    print("Channel Names:", channel_names)

    channel_types = "eeg"
import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", stream["time_series"][:5])

    channel_names = [
        chan["label"][0]
        for chan in stream["info"]["desc"][0]["channels"][0]["channel"]
    ]

    print("Channel Names:", channel_names)

    channel_types = "eeg"


۴.۰ منابع اضافی

مستندات رسمی

  1. مستندات آنلاین، از جمله فایل رسمی README در گیت‌هاب را بررسی کنید

  2. منابع اضافی:
    کد مربوط به اجرای LSL با استفاده از دستگاه‌های Emotiv همراه با نمونه اسکریپت‌ها
    • یک دموی کاربردی از LSL در یوتیوب
    مخزن گیت‌هاب SCCN LSL برای تمامی کتابخانه‌های مرتبط
    مخزن گیت‌هاب LSL برای مجموعه‌ای از زیرماژول‌ها و برنامه‌ها

  3. پایپ‌لاین تجزیه و تحلیل HyPyP برای مطالعات هایپراسکنینگ

خوش آمدید! در این آموزش یاد خواهیم گرفت که چگونه از Lab Streaming Layer (LSL) در پایتون برای جمع‌آوری و همگام‌سازی داده‌های EEG مربوط به Emotiv از چندین دستگاه استفاده کنیم. این کار به دانش پایه و کاربردی از زبان برنامه‌نویسی پایتون نیاز دارد.

آنچه یاد خواهید گرفت

  1. Lab Streaming Layer (LSL) چیست و چرا پژوهشگران از آن استفاده می‌کنند

  2. چگونه داده‌های همگام‌سازی‌شده را از چندین دستگاه EEG متعلق به Emotiv جمع‌آوری کنیم

  3. چگونه داده‌های جمع‌آوری‌شده را وارد و بررسی کنیم

۱.۱ LSL چیست و چه کاربردهایی دارد؟

لایه استریم آزمایشگاهی (LSL) یک جعبه‌ابزار متن‌باز است که می‌توان از آن برای ارسال، دریافت و همگام‌سازی جریان‌های داده‌های عصبی، فیزیولوژیکی و رفتاری از سخت‌افزارهای حسگر مختلف استفاده کرد. دستگاه‌های سخت‌افزاری سنجش مغز و بدن که به طور فزاینده‌ای توانمند، دقیق و قابل حمل هستند (مانند سیستم‌های EEG مربوط به Emotiv)، در حال انتقال علوم اعصاب از آزمایشگاه به دنیای داده‌های بلادرنگ هستند. در حالی که اندازه‌گیری‌های مغزی مانند EEG و MEG زمانی به آزمایشگاه‌های تحقیقاتی محدود بودند، دستگاه‌های تلفن همراه به ما اجازه می‌دهند حجم زیادی از داده‌ها را در محیط‌های طبیعی‌تر و از چندین نفر به طور همزمان جمع‌آوری کنیم.

یک پژوهشگر ممکن است به همگام‌سازی فیزیولوژیکی بین دو نفر که به یک موسیقی گوش می‌دهند علاقه داشته باشد. LSL می‌تواند به ما کمک کند تا داده‌ها را از دو هدست EEG به صورت جداگانه جمع‌آوری کنیم که با پخش صدا نیز همگام‌سازی شده‌اند.

چند نمونه از کاربردهای دیگر LSL:

  1. افزودن نشانگرهای رویداد از یک آزمایش به داده‌های EEG در حال انجام

  2. تراز زمانی داده‌ها از چندین منبع برای یک شرکت‌کننده واحد (به عنوان مثال، ضربان قلب، EMG، EEG)

  3. تراز زمانی داده‌های چندین شرکت‌کننده (به عنوان مثال، مطالعات هایپراسکنینگ EEG)

۱.۲ LSL چگونه کار می‌کند؟

Lab Streaming Layer پروتکلی برای تبادل بلادرنگ داده‌های سری زمانی بین چندین دستگاه است. LSL را می‌توان با استفاده از کتابخانه‌های متن‌باز برای زبان‌های برنامه‌نویسی مانند پایتون، متلب، C++، جاوا و غیره پیاده‌سازی کرد.

عملکرد اصلی حول محور جریان‌های داده LSL می‌چرخد:

۱. یک دستگاه/نرم‌افزار دریافت‌کننده، داده‌ها را جمع‌آوری کرده و یک جریان داده ایجاد می‌کند - داده‌های فیزیولوژیکی را می‌توان از دستگاه‌های ثبت EEG، ردیاب‌های چشم، سیستم‌های ثبت حرکت، مانیتورهای ضربان قلب و غیره به LSL ارسال کرد، از جمله متادیتا (نرخ نمونه‌برداری، نوع داده، اطلاعات کانال و غیره) - نشانگرهای رویداد از آزمایش‌ها (به عنوان مثال با استفاده از PsychoPy) نیز می‌توانند به عنوان یک جریان داده با استفاده از LSL ارسال شوند

۲. جریان داده در شبکه منتشر می‌شود - این نحوه ارسال داده با استفاده از LSL است؛ جریان داده در شبکه "پخش" می‌شود - جریان‌های منتشر شده در شبکه در دسترس هستند و توسط سایر دستگاه‌های پشتیبانی‌شده توسط LSL در همان شبکه قابل شناسایی می‌باشند - LSL بر اساس یک ساعت مشترک (پیرو پروتکل زمان شبکه یا NTP)، به هر بخش داده یا نمونه یک برچسب زمانی اختصاص می‌دهد. - جریان داده نمونه‌به‌نمونه (یا بخش‌به‌بخش) از طریق یک "خروجی" فرستاده می‌شود

۳. دستگاه(های) جمع‌آوری به جریان(های) داده "مشترک" می‌شوند - این نحوه دریافت داده با استفاده از LSL است - دستگاه‌های جمع‌آوری در همان شبکه، جریان‌های داده منتشر شده را از طریق "ورودی‌ها" دریافت می‌کنند. - هر ورودی نمونه‌های جریان و متادیتا را تنها از یک خروجی دریافت می‌کند

۴. ذخیره داده‌ها - پس از اشتراک در یک جریان داده، می‌توانید آن را در یک متغیر در زبان برنامه‌نویسی مورد نظر خود ذخیره کنید، یا از نرم‌افزار ارائه شده LSL یعنی LabRecorder برای ذخیره آن در یک قالب استاندارد مانند .xdf استفاده کنید.

۲.۰ مرور کلی آموزش

در این آموزش، ما یک نمونه راه‌اندازی آزمایشی را در نظر می‌گیریم و شما را از طریق مراحل و کدهای لازم برای پیاده‌سازی آن با استفاده از LSL در پایتون راهنمایی می‌کنیم. ما از پایتون برای پخش صدا در حین جمع‌آوری داده‌های EEG از دو نفر که هدست‌های Emotiv بر سر دارند استفاده خواهیم کرد. ما از دو کامپیوتر که هر کدام برنامه EmotivPRO را اجرا می‌کنند برای جمع‌آوری داده‌های EEG استفاده می‌کنیم و هر جریان را از طریق یک خروجی LSL مجزا پخش خواهیم کرد. ما از یک کتابخانه پایتون برای پخش یک فایل صوتی و ارسال همزمان یک تریگر (محرک) در هر بار شروع فایل استفاده خواهیم کرد.

مراحل:

۱. از EmotivPRO برای جریان دادن داده‌ها از طریق خروجی‌های LSL مجهز به داده‌های EEG (و/یا حرکت، کیفیت تماس، کیفیت سیگنال و غیره) استفاده کنید. ۲. یک قطعه صوتی را با استفاده از اسکریپت پایتون پخش کنید و همزمان یک تریگر را از طریق یک LSL دیگر ارسال کنید. از LabRecorder برای ثبت و ذخیره هر سه جریان داده از طریق یک ورودی LSL استفاده کنید.

۲.۱ مرحله ۱ - راه‌اندازی و نصب

  1. شما برای جمع‌آوری داده‌ها به دستگاه‌های دریافت داده پشتیبانی‌شده نیاز خواهید داشت
    • تمام دستگاه‌های مغزی Emotiv از طریق نرم‌افزار EmotivPRO به LSL متصل می‌شوند

  2. برنامه EmotivPRO را روی دستگاه(های) خود نصب کنید. برای استفاده از LSL به یک لایسنس معتبر EmotivPRO نیاز دارید.

  3. کتابخانه LSL پایتون را با دستور زیر نصب کنید:
    pip install pylsl

  4. نرم‌افزار LabRecorder را دانلود کنید. این یک برنامه ساده و رایگان است که می‌توان آن را از طریق خط فرمان یا با استفاده از نسخه مستقل دانلود شده اجرا کرد

  5. برای آزمایش ما: بسته‌های لازم برای پخش صدا با استفاده از پایتون را نصب کنید
    pip install sounddevice soundfile

۲.۲ مرحله ۳ - ارسال داده‌ها از EmotivPRO از طریق یک جریان LSL

  1. علامت "..." را در گوشه سمت راست بالای برنامه پیدا کرده و به بخش Settings بروید

  2. بخش 'Lab Streaming Layer' و زیربخش 'Outlet' را پیدا کنید

  3. تمام انواع داده‌هایی را که مایل به پخش آن‌ها هستید انتخاب کنید

  4. فرمت داده را انتخاب کنید (فلوت ۳۲ بیتی یا دابل ۶۴ بیتی)

  5. انتخاب کنید که آیا داده‌ها به صورت نمونه‌به‌نمونه فرستاده شوند یا به صورت دسته‌ای از نمونه‌ها

  6. برای پخش جریان داده LSL روی 'Start' کلیک کنید


۲.۳ مرحله ۴ - استفاده از اسکریپت پایتون برای پخش صدا و ارسال تریگرها

  1. بلوک کد زیر را کپی کرده و در یک فایل پایتون در کامپیوتر خود ذخیره کنید.

  2. یک فایل صوتی (ترجیحاً یک فایل .wav) را که می‌خواهید پخش شود پیدا کنید و اسکریپت را با تغییر متغیر audio_filepath به مسیر فایل صوتی در کامپیوتر خود ویرایش کنید

  3. یک خط فرمان را برای تعامل با خط دستور باز کنید و به پوشه‌ای که فایل پایتون شما در آن ذخیره شده است بروید

  4. وارد کنید: python3 filename.py
    • بسته به نصب پایتون خود، ممکن است به جای python3 از python استفاده کنید

    توجه: عبارت /path/to/audio.wav را با مسیر فایل صوتی که می‌خواهید در طول آزمایش پخش شود، جایگزین کنید.

"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )

۲.۴ مرحله ۵ - استفاده از LabRecorder برای مشاهده و ذخیره تمام جریان‌های LSL

  1. برنامه LabRecorder را باز کنید

  2. دکمه Update را فشار دهید. جریان‌های LSL موجود باید در لیست جریان‌ها قابل مشاهده باشند
    • شما باید بتوانید جریان‌های مربوط به هر دو دستگاه EmotivPRO (معمولاً به نام "Emotiv-DataStream") و جریان نشانگر (به نام "AudioMarkers") را ببینید

  3. روی Browse کلیک کنید تا مکانی را برای ذخیره داده‌ها انتخاب کنید (و سایر پارامترها را تنظیم کنید)

  4. همه جریان‌ها را انتخاب کرده و دکمه Record را برای شروع ضبط فشار دهید

۳.۰ کار با داده‌ها

برنامه LabRecorder یک فایل XDF (فرمت داده‌های توسعه‌پذیر) خروجی می‌دهد که حاوی داده‌های تمام جریان‌ها است. فایل‌های XDF به چندین جریان ساختار یافته‌اند که هر کدام دارای هدر متفاوتی هستند که محتویات آن را توصیف می‌کند (نام دستگاه، نوع داده، نرخ نمونه‌برداری، کانال‌ها و موارد دیگر). برای باز کردن فایل XDF خود و نمایش برخی اطلاعات اولیه، می‌توانید از بلوک کد زیر استفاده کنید.

توجه: مسیر /path/to/your/file.xdf را با مسیر فایل خروجی LabRecorder XDF خود جایگزین کنید.

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", stream["time_series"][:5])

    channel_names = [
        chan["label"][0]
        for chan in stream["info"]["desc"][0]["channels"][0]["channel"]
    ]

    print("Channel Names:", channel_names)

    channel_types = "eeg"


۴.۰ منابع اضافی

مستندات رسمی

  1. مستندات آنلاین، از جمله فایل رسمی README در گیت‌هاب را بررسی کنید

  2. منابع اضافی:
    کد مربوط به اجرای LSL با استفاده از دستگاه‌های Emotiv همراه با نمونه اسکریپت‌ها
    • یک دموی کاربردی از LSL در یوتیوب
    مخزن گیت‌هاب SCCN LSL برای تمامی کتابخانه‌های مرتبط
    مخزن گیت‌هاب LSL برای مجموعه‌ای از زیرماژول‌ها و برنامه‌ها

  3. پایپ‌لاین تجزیه و تحلیل HyPyP برای مطالعات هایپراسکنینگ

خوش آمدید! در این آموزش یاد خواهیم گرفت که چگونه از Lab Streaming Layer (LSL) در پایتون برای جمع‌آوری و همگام‌سازی داده‌های EEG مربوط به Emotiv از چندین دستگاه استفاده کنیم. این کار به دانش پایه و کاربردی از زبان برنامه‌نویسی پایتون نیاز دارد.

آنچه یاد خواهید گرفت

  1. Lab Streaming Layer (LSL) چیست و چرا پژوهشگران از آن استفاده می‌کنند

  2. چگونه داده‌های همگام‌سازی‌شده را از چندین دستگاه EEG متعلق به Emotiv جمع‌آوری کنیم

  3. چگونه داده‌های جمع‌آوری‌شده را وارد و بررسی کنیم

۱.۱ LSL چیست و چه کاربردهایی دارد؟

لایه استریم آزمایشگاهی (LSL) یک جعبه‌ابزار متن‌باز است که می‌توان از آن برای ارسال، دریافت و همگام‌سازی جریان‌های داده‌های عصبی، فیزیولوژیکی و رفتاری از سخت‌افزارهای حسگر مختلف استفاده کرد. دستگاه‌های سخت‌افزاری سنجش مغز و بدن که به طور فزاینده‌ای توانمند، دقیق و قابل حمل هستند (مانند سیستم‌های EEG مربوط به Emotiv)، در حال انتقال علوم اعصاب از آزمایشگاه به دنیای داده‌های بلادرنگ هستند. در حالی که اندازه‌گیری‌های مغزی مانند EEG و MEG زمانی به آزمایشگاه‌های تحقیقاتی محدود بودند، دستگاه‌های تلفن همراه به ما اجازه می‌دهند حجم زیادی از داده‌ها را در محیط‌های طبیعی‌تر و از چندین نفر به طور همزمان جمع‌آوری کنیم.

یک پژوهشگر ممکن است به همگام‌سازی فیزیولوژیکی بین دو نفر که به یک موسیقی گوش می‌دهند علاقه داشته باشد. LSL می‌تواند به ما کمک کند تا داده‌ها را از دو هدست EEG به صورت جداگانه جمع‌آوری کنیم که با پخش صدا نیز همگام‌سازی شده‌اند.

چند نمونه از کاربردهای دیگر LSL:

  1. افزودن نشانگرهای رویداد از یک آزمایش به داده‌های EEG در حال انجام

  2. تراز زمانی داده‌ها از چندین منبع برای یک شرکت‌کننده واحد (به عنوان مثال، ضربان قلب، EMG، EEG)

  3. تراز زمانی داده‌های چندین شرکت‌کننده (به عنوان مثال، مطالعات هایپراسکنینگ EEG)

۱.۲ LSL چگونه کار می‌کند؟

Lab Streaming Layer پروتکلی برای تبادل بلادرنگ داده‌های سری زمانی بین چندین دستگاه است. LSL را می‌توان با استفاده از کتابخانه‌های متن‌باز برای زبان‌های برنامه‌نویسی مانند پایتون، متلب، C++، جاوا و غیره پیاده‌سازی کرد.

عملکرد اصلی حول محور جریان‌های داده LSL می‌چرخد:

۱. یک دستگاه/نرم‌افزار دریافت‌کننده، داده‌ها را جمع‌آوری کرده و یک جریان داده ایجاد می‌کند - داده‌های فیزیولوژیکی را می‌توان از دستگاه‌های ثبت EEG، ردیاب‌های چشم، سیستم‌های ثبت حرکت، مانیتورهای ضربان قلب و غیره به LSL ارسال کرد، از جمله متادیتا (نرخ نمونه‌برداری، نوع داده، اطلاعات کانال و غیره) - نشانگرهای رویداد از آزمایش‌ها (به عنوان مثال با استفاده از PsychoPy) نیز می‌توانند به عنوان یک جریان داده با استفاده از LSL ارسال شوند

۲. جریان داده در شبکه منتشر می‌شود - این نحوه ارسال داده با استفاده از LSL است؛ جریان داده در شبکه "پخش" می‌شود - جریان‌های منتشر شده در شبکه در دسترس هستند و توسط سایر دستگاه‌های پشتیبانی‌شده توسط LSL در همان شبکه قابل شناسایی می‌باشند - LSL بر اساس یک ساعت مشترک (پیرو پروتکل زمان شبکه یا NTP)، به هر بخش داده یا نمونه یک برچسب زمانی اختصاص می‌دهد. - جریان داده نمونه‌به‌نمونه (یا بخش‌به‌بخش) از طریق یک "خروجی" فرستاده می‌شود

۳. دستگاه(های) جمع‌آوری به جریان(های) داده "مشترک" می‌شوند - این نحوه دریافت داده با استفاده از LSL است - دستگاه‌های جمع‌آوری در همان شبکه، جریان‌های داده منتشر شده را از طریق "ورودی‌ها" دریافت می‌کنند. - هر ورودی نمونه‌های جریان و متادیتا را تنها از یک خروجی دریافت می‌کند

۴. ذخیره داده‌ها - پس از اشتراک در یک جریان داده، می‌توانید آن را در یک متغیر در زبان برنامه‌نویسی مورد نظر خود ذخیره کنید، یا از نرم‌افزار ارائه شده LSL یعنی LabRecorder برای ذخیره آن در یک قالب استاندارد مانند .xdf استفاده کنید.

۲.۰ مرور کلی آموزش

در این آموزش، ما یک نمونه راه‌اندازی آزمایشی را در نظر می‌گیریم و شما را از طریق مراحل و کدهای لازم برای پیاده‌سازی آن با استفاده از LSL در پایتون راهنمایی می‌کنیم. ما از پایتون برای پخش صدا در حین جمع‌آوری داده‌های EEG از دو نفر که هدست‌های Emotiv بر سر دارند استفاده خواهیم کرد. ما از دو کامپیوتر که هر کدام برنامه EmotivPRO را اجرا می‌کنند برای جمع‌آوری داده‌های EEG استفاده می‌کنیم و هر جریان را از طریق یک خروجی LSL مجزا پخش خواهیم کرد. ما از یک کتابخانه پایتون برای پخش یک فایل صوتی و ارسال همزمان یک تریگر (محرک) در هر بار شروع فایل استفاده خواهیم کرد.

مراحل:

۱. از EmotivPRO برای جریان دادن داده‌ها از طریق خروجی‌های LSL مجهز به داده‌های EEG (و/یا حرکت، کیفیت تماس، کیفیت سیگنال و غیره) استفاده کنید. ۲. یک قطعه صوتی را با استفاده از اسکریپت پایتون پخش کنید و همزمان یک تریگر را از طریق یک LSL دیگر ارسال کنید. از LabRecorder برای ثبت و ذخیره هر سه جریان داده از طریق یک ورودی LSL استفاده کنید.

۲.۱ مرحله ۱ - راه‌اندازی و نصب

  1. شما برای جمع‌آوری داده‌ها به دستگاه‌های دریافت داده پشتیبانی‌شده نیاز خواهید داشت
    • تمام دستگاه‌های مغزی Emotiv از طریق نرم‌افزار EmotivPRO به LSL متصل می‌شوند

  2. برنامه EmotivPRO را روی دستگاه(های) خود نصب کنید. برای استفاده از LSL به یک لایسنس معتبر EmotivPRO نیاز دارید.

  3. کتابخانه LSL پایتون را با دستور زیر نصب کنید:
    pip install pylsl

  4. نرم‌افزار LabRecorder را دانلود کنید. این یک برنامه ساده و رایگان است که می‌توان آن را از طریق خط فرمان یا با استفاده از نسخه مستقل دانلود شده اجرا کرد

  5. برای آزمایش ما: بسته‌های لازم برای پخش صدا با استفاده از پایتون را نصب کنید
    pip install sounddevice soundfile

۲.۲ مرحله ۳ - ارسال داده‌ها از EmotivPRO از طریق یک جریان LSL

  1. علامت "..." را در گوشه سمت راست بالای برنامه پیدا کرده و به بخش Settings بروید

  2. بخش 'Lab Streaming Layer' و زیربخش 'Outlet' را پیدا کنید

  3. تمام انواع داده‌هایی را که مایل به پخش آن‌ها هستید انتخاب کنید

  4. فرمت داده را انتخاب کنید (فلوت ۳۲ بیتی یا دابل ۶۴ بیتی)

  5. انتخاب کنید که آیا داده‌ها به صورت نمونه‌به‌نمونه فرستاده شوند یا به صورت دسته‌ای از نمونه‌ها

  6. برای پخش جریان داده LSL روی 'Start' کلیک کنید


۲.۳ مرحله ۴ - استفاده از اسکریپت پایتون برای پخش صدا و ارسال تریگرها

  1. بلوک کد زیر را کپی کرده و در یک فایل پایتون در کامپیوتر خود ذخیره کنید.

  2. یک فایل صوتی (ترجیحاً یک فایل .wav) را که می‌خواهید پخش شود پیدا کنید و اسکریپت را با تغییر متغیر audio_filepath به مسیر فایل صوتی در کامپیوتر خود ویرایش کنید

  3. یک خط فرمان را برای تعامل با خط دستور باز کنید و به پوشه‌ای که فایل پایتون شما در آن ذخیره شده است بروید

  4. وارد کنید: python3 filename.py
    • بسته به نصب پایتون خود، ممکن است به جای python3 از python استفاده کنید

    توجه: عبارت /path/to/audio.wav را با مسیر فایل صوتی که می‌خواهید در طول آزمایش پخش شود، جایگزین کنید.

"""
LSL Example: Play audio and send a trigger marker

This script creates an LSL marker stream, waits for the user to
press ENTER, then plays an audio file and sends a marker that
can be synchronized with EEG data collected through LabRecorder.
"""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet


def wait_for_keypress():
    print("Press ENTER to start audio playback and send an LSL marker.")
    while True:
        if input() == "":
            break


def play_audio_and_send_marker(audio_file, outlet):
    data, fs = sf.read(audio_file)

    print("Playing audio and sending LSL marker...")

    marker_val = [1]
    outlet.push_sample(marker_val)

    sd.play(data, fs)
    sd.wait()

    print("Audio playback finished.")


if __name__ == "__main__":

    info = StreamInfo(
        name="AudioMarkers",
        type="Markers",
        channel_count=1,
        nominal_srate=0,
        channel_format="int32",
        source_id="uniqueMarkerID12345"
    )

    outlet = StreamOutlet(info)

    while True:
        wait_for_keypress()

        audio_filepath = "/path/to/audio.wav"

        play_audio_and_send_marker(
            audio_filepath,
            outlet
        )

۲.۴ مرحله ۵ - استفاده از LabRecorder برای مشاهده و ذخیره تمام جریان‌های LSL

  1. برنامه LabRecorder را باز کنید

  2. دکمه Update را فشار دهید. جریان‌های LSL موجود باید در لیست جریان‌ها قابل مشاهده باشند
    • شما باید بتوانید جریان‌های مربوط به هر دو دستگاه EmotivPRO (معمولاً به نام "Emotiv-DataStream") و جریان نشانگر (به نام "AudioMarkers") را ببینید

  3. روی Browse کلیک کنید تا مکانی را برای ذخیره داده‌ها انتخاب کنید (و سایر پارامترها را تنظیم کنید)

  4. همه جریان‌ها را انتخاب کرده و دکمه Record را برای شروع ضبط فشار دهید

۳.۰ کار با داده‌ها

برنامه LabRecorder یک فایل XDF (فرمت داده‌های توسعه‌پذیر) خروجی می‌دهد که حاوی داده‌های تمام جریان‌ها است. فایل‌های XDF به چندین جریان ساختار یافته‌اند که هر کدام دارای هدر متفاوتی هستند که محتویات آن را توصیف می‌کند (نام دستگاه، نوع داده، نرخ نمونه‌برداری، کانال‌ها و موارد دیگر). برای باز کردن فایل XDF خود و نمایش برخی اطلاعات اولیه، می‌توانید از بلوک کد زیر استفاده کنید.

توجه: مسیر /path/to/your/file.xdf را با مسیر فایل خروجی LabRecorder XDF خود جایگزین کنید.

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

# Give the path to your LSL output file here.
data_path = "/path/to/your/file.xdf"

# Load the XDF file.
streams, fileheader = pyxdf.load_xdf(data_path)

print("XDF File Header:", fileheader)
print("Number of streams found:", len(streams))

for i, stream in enumerate(streams):
    print("\nStream", i + 1)
    print("Stream Name:", stream["info"]["name"][0])
    print("Stream Type:", stream["info"]["type"][0])
    print("Number of Channels:", stream["info"]["channel_count"][0])

    sfreq = float(stream["info"]["nominal_srate"][0])
    print("Sampling Rate:", sfreq)

    print("Number of Samples:", len(stream["time_series"]))
    print("First 5 data points:", stream["time_series"][:5])

    channel_names = [
        chan["label"][0]
        for chan in stream["info"]["desc"][0]["channels"][0]["channel"]
    ]

    print("Channel Names:", channel_names)

    channel_types = "eeg"


۴.۰ منابع اضافی

مستندات رسمی

  1. مستندات آنلاین، از جمله فایل رسمی README در گیت‌هاب را بررسی کنید

  2. منابع اضافی:
    کد مربوط به اجرای LSL با استفاده از دستگاه‌های Emotiv همراه با نمونه اسکریپت‌ها
    • یک دموی کاربردی از LSL در یوتیوب
    مخزن گیت‌هاب SCCN LSL برای تمامی کتابخانه‌های مرتبط
    مخزن گیت‌هاب LSL برای مجموعه‌ای از زیرماژول‌ها و برنامه‌ها

  3. پایپ‌لاین تجزیه و تحلیل HyPyP برای مطالعات هایپراسکنینگ

A technician fits an Emotiv saline EEG headset on a test participant.

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

Basics of Neural Oscillations