ملٹیپل ڈیٹا اسٹریمز کی ہم آہنگی کے لیے لیب اسٹریمنگ لیئر (LSL)

ڈاکٹر روشنی رندینیا اور لوکاس کلائن

اپ ڈیٹ کیا گیا

17 مئی، 2024

ملٹیپل ڈیٹا اسٹریمز کی ہم آہنگی کے لیے لیب اسٹریمنگ لیئر (LSL)

ڈاکٹر روشنی رندینیا اور لوکاس کلائن

اپ ڈیٹ کیا گیا

17 مئی، 2024

ملٹیپل ڈیٹا اسٹریمز کی ہم آہنگی کے لیے لیب اسٹریمنگ لیئر (LSL)

ڈاکٹر روشنی رندینیا اور لوکاس کلائن

اپ ڈیٹ کیا گیا

17 مئی، 2024

خوش آمدید! اس ٹیوٹوریل میں ہم کثیر ڈیوائسز سے Emotiv EEG ڈیٹا کو اکٹھا اور ہم آہنگ کرنے کے لیے Python میں Lab Streaming Layer (LSL) کا استعمال کرنا سیکھیں گے۔ اس کے لیے Python پروگرامنگ زبان کا بنیادی عملی علم ہونا ضروری ہے۔

آپ کیا سیکھیں گے

  1. لیب اسٹریمنگ لیئر (LSL) کیا ہے اور محققین اس کا استعمال کیوں کرتے ہیں

  2. متعدد Emotiv EEG ڈیوائسز سے ہم آہنگ ڈیٹا کو کیسے اکٹھا کریں

  3. اکٹھے کیے گئے ڈیٹا کو امپورٹ اور اس کا معائنہ کیسے کریں

1.1 LSL کیا ہے اور یہ کس لیے موزوں ہے؟

لیب اسٹریمنگ لیئر (LSL) ایک اوپن سورس ٹول بکس ہے جس کا استعمال متنوع سینسر ہارڈویئر سے اعصابی، جسمانی، اور رویہ جاتی ڈیٹا کے بہاؤ (سٹریمز) کو بھیجنے، وصول کرنے اور ہم آہنگ کرنے کے لیے کیا جا سکتا ہے۔ تیزی سے زیادہ قابل، درست اور پورٹیبل دماغی اور جسمانی سینسنگ ہارڈویئر ڈیوائسز (جیسے Emotiv EEG سسٹمز) نیورو سائنس کو لیب سے باہر حقیقی وقت کے ڈیٹا کی دنیا میں لا رہی ہیں۔ جہاں کبھی EEG اور MEG جیسی دماغی پیمائشیں صرف تحقیقی لیبارٹریوں تک محدود تھیں، اب پورٹیبل ڈیوائسز ہمیں زیادہ قدرتی ماحول میں، اور ایک ساتھ متعدد لوگوں سے ڈیٹا کے متعدد نمونے اکٹھا کرنے کی اجازت دیتی ہیں۔

ایک محقق دو لوگوں کے درمیان جسمانی ہم آہنگی میں دلچسپی لے سکتا ہے جو ایک ہی موسیقی سن رہے ہوں۔ LSL ہمیں دو EEG ہیڈ سیٹس سے الگ الگ ڈیٹا اکٹھا کرنے میں مدد کر سکتا ہے جو آواز کی پیشکش کے ساتھ بھی ہم آہنگ ہوتا ہے۔

LSL کے دیگر استعمالات کی کچھ مثالیں:

  1. کسی تجربے سے ایونٹ مارکرز کو جاری EEG ڈیٹا میں شامل کرنا

  2. واحد شریک کے لیے متعدد ذرائع (مثلاً دل کی دھڑکن، EMG، EEG) سے حاصل ہونے والے ڈیٹا کو وقت کے لحاظ سے ہم آہنگ کرنا

  3. متعدد شرکاء سے حاصل ہونے والے ڈیٹا کو وقت کے مطابق ترتیب دینا (مثلاً EEG Hyperscanning اسٹڈیز)

1.2 LSL کیسے کام کرتا ہے؟

Lab Streaming Layer متعدد ڈیوائسز کے درمیان ٹائم-سیریز ڈیٹا کے حقیقی وقت میں تبادلے کا ایک پروٹوکول ہے۔ LSL کو ازگر (Python) ، MATLAB، C++، Java اور دیگر پروگرامنگ زبانوں کی اوپن سورس لائبریریوں کا استعمال کرتے ہوئے نافذ کیا جا سکتا ہے۔

بنیادی افادیت LSL ڈیٹا اسٹریمز کے گرد گھومتی ہے:

ایک حصولی ڈیوائس/سافٹ ویئر ڈیٹا اکٹھا کرتا ہے اور ایک ڈیٹا اسٹریم بناتا ہے - میٹا ڈیٹا (سیمپلی گ ریٹ، ڈیٹا کی قسم، چینل کی معلومات وغیرہ) سمیت EEG ریکارڈنگ ڈیوائسز، آئی-ٹریکرز، موشن کیپچر سسٹمز، ہارٹ ریٹ مانیٹرز وغیرہ سے LSL پر فزیولوجیکل ڈیٹا اسٹریم کیا جا سکتا ہے - تجربات سے ایونٹ مارکرز (مثلاً PsychoPy کا استعمال کرتے ہوئے) کو بھی LSL کا استعمال کرتے ہوئے ڈیٹا اسٹریم کے طور پر بھیجا جا سکتا ہے

ڈیٹا اسٹریم کو نیٹ ورک پر پبلش کیا جاتا ہے - LSL کا استعمال کرتے ہوئے ڈیٹا اسی طرح بھیجا جاتا ہے؛ ڈیٹا اسٹریم نیٹ ورک پر "براڈکاسٹ" ہوتی ہے - پبلش کردہ اسٹریمز نیٹ ورک پر دستیاب ہوتی ہیں اور اسی نیٹ ورک پر موجود دیگر LSL سپورٹڈ ڈیوائسز کے ذریعے تلاش کی جا سکتی ہیں - LSL ایک مشترکہ کلاک کی بنیاد پر ہر ڈیٹا ٹکرے یا نمونے کو ایک ٹائم اسٹیمپ تفویض کرتا ہے (نیٹ ورک ٹائم پروٹوکول کے تحت)۔ - اسٹریم کو ایک "آؤٹ لیٹ" کے ذریعے نمونہ بہ نمونہ (یا ٹکڑے بہ ٹکڑے) آگے دھکیلا جاتا ہے

مجموعہ ڈیوائسز ڈیٹا اسٹریمز کی "سبسکرپشن" حاصل کرتی ہیں - LSL کا استعمال کرتے ہوئے ڈیٹا اسی طرح موصول ہوتا ہے - اسی نیٹ ورک پر موجود مجموعہ ڈیوائسز "ان لیٹس" کے ذریعے پبلش کردہ ڈیٹا اسٹریمز حاصل کرتی ہیں۔ - ہر انلیٹ صرف ایک آؤٹ لیٹ سے اسٹریم کے نمونے اور میٹا ڈیٹا وصول کرتا ہے

ڈیٹا محفوظ کریں - ڈیٹا اسٹریم کی سبسکرپشن حاصل کرنے پر، آپ اسے اپنی پسندیدہ پروگرامنگ زبان میں ایک متغیر (variable) میں محفوظ کر سکتے ہیں، یا اسے معیاری فارمیٹ جیسے .xdf میں محفوظ کرنے کے لیے LSL کے فراہم کردہ سافٹ ویئر LabRecorder کا استعمال کر سکتے ہیں۔

2.0 ٹیوٹوریل کا جائزہ

اس ٹیوٹوریل میں، ہم ایک مثالی تجرباتی سیٹ اپ لیں گے اور Python میں LSL کا استعمال کرتے ہوئے اسے نافذ کرنے کے لیے ضروری مراحل اور کوڈ کے ذریعے آپ کی رہنمائی کریں گے۔ ہم Emotiv ہیڈسیٹ پہنے ہوئے دو لوگوں سے EEG ڈیٹا اکٹھا کرنے کے دوران آواز چلانے کے لیے Python کا استعمال کریں گے۔ ہم EEG ڈیٹا اکٹھا کرنے کے لیے دو کمپیوٹرز کا استعمال کریں گے جن میں سے ہر ایک پر EmotivPRO چل رہا ہوگا، اور ہر اسٹریم کو ایک علیحدہ LSL آؤٹ لیٹ کے ذریعے براڈکاسٹ کریں گے۔ ہم آڈیو فائل چلانے کے لیے پائتھن لائبریری کا استعمال کریں گے اور فائل شروع ہونے پر بیک وقت ایک ٹرگر بھیجیں گے۔

مراحل:

1. ان LSL آؤٹ لیٹس کے ذریعے ڈیٹا اسٹریم کرنے کے لیے EmotivPRO کا استعمال کریں جس میں EEG ڈیٹا (اور/یا تحریک، رابطے کا معیار، سگنل کا معیار وغیرہ) شامل ہے۔ 2۔ Python اسکرپٹ کا استعمال کرتے ہوئے ایک آڈیو ٹریک چلائیں، اور ساتھ ہی ایک اور LSL کے ذریعے ٹرگر بھیجیں، LSL انلیٹ کے ذریعے تینوں ڈیٹا اسٹریمز کو کیپچر اور محفوظ کرنے کے لیے LabRecorder کا استعمال کریں۔

2.1 مرحلہ 1 - سیٹ اپ اور انسٹالیشن

  1. ڈیٹا کیپچر کرنے کے لیے آپ کو سپورٹ شدہ ڈیٹا ایکوزیشن ڈیوائسز کی ضرورت ہوگی
    • Emotiv کی تمام دماغی ڈیوائسز EmotivPRO سافٹ ویئر کے ذریعے LSL سے منسلک ہوتی ہیں

  2. اپنی ڈیوائس پر EmotivPRO انسٹال کریں۔ LSL استعمال کرنے کے لیے آپ کو ایک درست EmotivPRO لائسنس کی ضرورت ہوگی۔

  3. درج ذیل کمانڈ کے ساتھ Python LSL لائبریری انسٹال کریں:
    pip install pylsl

  4. LabRecorder سافٹ ویئر ڈاؤن لوڈ کریں۔ یہ ایک آسان، مفت ایپ ہے جسے کمانڈ لائن سے یا اسٹینڈ اکیلے ڈاؤن لوڈ کے طور پر چلایا جا سکتا ہے

  5. ہمارے تجربے کے لیے : Python کا استعمال کرتے ہوئے آڈیو چلانے کے لیے ضروری پیکجز انسٹال کریں
    pip install sounddevice soundfile

2.2 مرحلہ 3 - EmotivPRO سے ایک LSL اسٹریم کے ذریعے ڈیٹا بھیجیں

  1. ایپ کے اوپری دائیں کونے میں "..." تلاش کریں، Settings پر جائیں

  2. ‘Lab Streaming Layer’ سیکشن اور ‘Outlet’ سب سیکشن تلاش کریں

  3. وہ تمام ڈیٹا ٹائپس منتخب کریں جنہیں آپ براڈکاسٹ کرنا چاہتے ہیں

  4. ڈیٹا فارمیٹ منتخب کریں (32-bit float یا 64-bit double)

  5. منتخب کریں کہ آیا ڈیٹا نمونہ بہ نمونہ بھیجنا ہے یا نمونوں کے ٹکڑوں (chunks) میں

  6. LSL ڈیٹا اسٹریم براڈکاسٹ کرنے کے لیے 'Start' پر کلک کریں


2.3 مرحلہ 4 - آڈیو چلانے اور ٹرگرز بھیجنے کے لیے Python اسکرپٹ کا استعمال کریں

  1. درج ذیل کوڈ بلاک کو کاپی کر کے ایک پائتھن فائل میں پیسٹ کریں اور اسے اپنے کمپیوٹر میں محفوظ کر لیں۔

  2. ایک آڈیو فائل تلاش کریں (مثالی طور پر ایک .wav فائل) جسے آپ چلانا چاہتے ہیں اور اسکرپٹ میں متغیر audio_filepath کو تبدیل کر کے اپنے کمپیوٹر پر موجود اس فائل کا پاتھ درج کریں

  3. کمانڈ لائن سے بات چیت کرنے کے لیے ایک کمانڈ پرامپٹ کھولیں اور اس فولڈر پر جائیں جہاں آپ کی Python فائل محفوظ ہے

  4. درج کریں: python3 filename.py
    • آپ کی Python انسٹالیشن پر منحصر ہے، آپ 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
        )

2.4 مرحلہ 5 - تمام LSL اسٹریمز کو دیکھنے اور محفوظ کرنے کے لیے LabRecorder کا استعمال کریں

  1. LabRecorder کھولیں

  2. Update دبائیں۔ دستیاب LSL اسٹریمز اسٹریم لسٹ میں نظر آنی چاہئیں
    • آپ کو دونوں EmotivPROs (عام طور پر "Emotiv-DataStream" کہلانے والے) اور مارکر اسٹریم ("AudioMarkers" کہلانے والے) کی اسٹریمز دیکھنے کے قابل ہونا چاہئے

  3. ڈیٹا کو ذخيرہ کرنے کا مقام منتخب کرنے (اور دیگر پیرامیٹرز کو سیٹ کرنے) کے لیے Browse پر کلک کریں

  4. تمام اسٹریمز کو منتخب کریں اور ریکارڈنگ شروع کرنے کے لیے Record دبائیں

3.0 ڈیٹا کے ساتھ کام کرنا

LabRecorder ایک XDF فائل (Extensible Data Format) تیار کرتا ہے جس میں تمام اسٹریمز کا ڈیٹا ہوتا ہے۔ 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"


4.0 اضافی وسائل

سرکاری دستاویزات

  1. آن لائن دستاویزات کو دیکھیں، بشمول GitHub پر آفیشل README فائل

  2. اضافی وسائل:
    • مثال اسکرپٹس کے ساتھ، Emotiv کی ڈیوائسز کا استعمال کرتے ہوئے LSL چلانے کے لیے کوڈ
    • یوٹیوب پر مفید LSL ڈیمو
    • تمام متعلقہ لائبریریوں کے لیے SCCN LSL GitHub ریپوزٹری
    • ذیلی ماڈیولز اور ایپس کے مجموعہ کے لیے LSL GitHub ریپوزٹری

  3. ہائپر سکیننگ اسٹڈیز کے لیے HyPyP تجزیہ پائپ لائن

خوش آمدید! اس ٹیوٹوریل میں ہم کثیر ڈیوائسز سے Emotiv EEG ڈیٹا کو اکٹھا اور ہم آہنگ کرنے کے لیے Python میں Lab Streaming Layer (LSL) کا استعمال کرنا سیکھیں گے۔ اس کے لیے Python پروگرامنگ زبان کا بنیادی عملی علم ہونا ضروری ہے۔

آپ کیا سیکھیں گے

  1. لیب اسٹریمنگ لیئر (LSL) کیا ہے اور محققین اس کا استعمال کیوں کرتے ہیں

  2. متعدد Emotiv EEG ڈیوائسز سے ہم آہنگ ڈیٹا کو کیسے اکٹھا کریں

  3. اکٹھے کیے گئے ڈیٹا کو امپورٹ اور اس کا معائنہ کیسے کریں

1.1 LSL کیا ہے اور یہ کس لیے موزوں ہے؟

لیب اسٹریمنگ لیئر (LSL) ایک اوپن سورس ٹول بکس ہے جس کا استعمال متنوع سینسر ہارڈویئر سے اعصابی، جسمانی، اور رویہ جاتی ڈیٹا کے بہاؤ (سٹریمز) کو بھیجنے، وصول کرنے اور ہم آہنگ کرنے کے لیے کیا جا سکتا ہے۔ تیزی سے زیادہ قابل، درست اور پورٹیبل دماغی اور جسمانی سینسنگ ہارڈویئر ڈیوائسز (جیسے Emotiv EEG سسٹمز) نیورو سائنس کو لیب سے باہر حقیقی وقت کے ڈیٹا کی دنیا میں لا رہی ہیں۔ جہاں کبھی EEG اور MEG جیسی دماغی پیمائشیں صرف تحقیقی لیبارٹریوں تک محدود تھیں، اب پورٹیبل ڈیوائسز ہمیں زیادہ قدرتی ماحول میں، اور ایک ساتھ متعدد لوگوں سے ڈیٹا کے متعدد نمونے اکٹھا کرنے کی اجازت دیتی ہیں۔

ایک محقق دو لوگوں کے درمیان جسمانی ہم آہنگی میں دلچسپی لے سکتا ہے جو ایک ہی موسیقی سن رہے ہوں۔ LSL ہمیں دو EEG ہیڈ سیٹس سے الگ الگ ڈیٹا اکٹھا کرنے میں مدد کر سکتا ہے جو آواز کی پیشکش کے ساتھ بھی ہم آہنگ ہوتا ہے۔

LSL کے دیگر استعمالات کی کچھ مثالیں:

  1. کسی تجربے سے ایونٹ مارکرز کو جاری EEG ڈیٹا میں شامل کرنا

  2. واحد شریک کے لیے متعدد ذرائع (مثلاً دل کی دھڑکن، EMG، EEG) سے حاصل ہونے والے ڈیٹا کو وقت کے لحاظ سے ہم آہنگ کرنا

  3. متعدد شرکاء سے حاصل ہونے والے ڈیٹا کو وقت کے مطابق ترتیب دینا (مثلاً EEG Hyperscanning اسٹڈیز)

1.2 LSL کیسے کام کرتا ہے؟

Lab Streaming Layer متعدد ڈیوائسز کے درمیان ٹائم-سیریز ڈیٹا کے حقیقی وقت میں تبادلے کا ایک پروٹوکول ہے۔ LSL کو ازگر (Python) ، MATLAB، C++، Java اور دیگر پروگرامنگ زبانوں کی اوپن سورس لائبریریوں کا استعمال کرتے ہوئے نافذ کیا جا سکتا ہے۔

بنیادی افادیت LSL ڈیٹا اسٹریمز کے گرد گھومتی ہے:

ایک حصولی ڈیوائس/سافٹ ویئر ڈیٹا اکٹھا کرتا ہے اور ایک ڈیٹا اسٹریم بناتا ہے - میٹا ڈیٹا (سیمپلی گ ریٹ، ڈیٹا کی قسم، چینل کی معلومات وغیرہ) سمیت EEG ریکارڈنگ ڈیوائسز، آئی-ٹریکرز، موشن کیپچر سسٹمز، ہارٹ ریٹ مانیٹرز وغیرہ سے LSL پر فزیولوجیکل ڈیٹا اسٹریم کیا جا سکتا ہے - تجربات سے ایونٹ مارکرز (مثلاً PsychoPy کا استعمال کرتے ہوئے) کو بھی LSL کا استعمال کرتے ہوئے ڈیٹا اسٹریم کے طور پر بھیجا جا سکتا ہے

ڈیٹا اسٹریم کو نیٹ ورک پر پبلش کیا جاتا ہے - LSL کا استعمال کرتے ہوئے ڈیٹا اسی طرح بھیجا جاتا ہے؛ ڈیٹا اسٹریم نیٹ ورک پر "براڈکاسٹ" ہوتی ہے - پبلش کردہ اسٹریمز نیٹ ورک پر دستیاب ہوتی ہیں اور اسی نیٹ ورک پر موجود دیگر LSL سپورٹڈ ڈیوائسز کے ذریعے تلاش کی جا سکتی ہیں - LSL ایک مشترکہ کلاک کی بنیاد پر ہر ڈیٹا ٹکرے یا نمونے کو ایک ٹائم اسٹیمپ تفویض کرتا ہے (نیٹ ورک ٹائم پروٹوکول کے تحت)۔ - اسٹریم کو ایک "آؤٹ لیٹ" کے ذریعے نمونہ بہ نمونہ (یا ٹکڑے بہ ٹکڑے) آگے دھکیلا جاتا ہے

مجموعہ ڈیوائسز ڈیٹا اسٹریمز کی "سبسکرپشن" حاصل کرتی ہیں - LSL کا استعمال کرتے ہوئے ڈیٹا اسی طرح موصول ہوتا ہے - اسی نیٹ ورک پر موجود مجموعہ ڈیوائسز "ان لیٹس" کے ذریعے پبلش کردہ ڈیٹا اسٹریمز حاصل کرتی ہیں۔ - ہر انلیٹ صرف ایک آؤٹ لیٹ سے اسٹریم کے نمونے اور میٹا ڈیٹا وصول کرتا ہے

ڈیٹا محفوظ کریں - ڈیٹا اسٹریم کی سبسکرپشن حاصل کرنے پر، آپ اسے اپنی پسندیدہ پروگرامنگ زبان میں ایک متغیر (variable) میں محفوظ کر سکتے ہیں، یا اسے معیاری فارمیٹ جیسے .xdf میں محفوظ کرنے کے لیے LSL کے فراہم کردہ سافٹ ویئر LabRecorder کا استعمال کر سکتے ہیں۔

2.0 ٹیوٹوریل کا جائزہ

اس ٹیوٹوریل میں، ہم ایک مثالی تجرباتی سیٹ اپ لیں گے اور Python میں LSL کا استعمال کرتے ہوئے اسے نافذ کرنے کے لیے ضروری مراحل اور کوڈ کے ذریعے آپ کی رہنمائی کریں گے۔ ہم Emotiv ہیڈسیٹ پہنے ہوئے دو لوگوں سے EEG ڈیٹا اکٹھا کرنے کے دوران آواز چلانے کے لیے Python کا استعمال کریں گے۔ ہم EEG ڈیٹا اکٹھا کرنے کے لیے دو کمپیوٹرز کا استعمال کریں گے جن میں سے ہر ایک پر EmotivPRO چل رہا ہوگا، اور ہر اسٹریم کو ایک علیحدہ LSL آؤٹ لیٹ کے ذریعے براڈکاسٹ کریں گے۔ ہم آڈیو فائل چلانے کے لیے پائتھن لائبریری کا استعمال کریں گے اور فائل شروع ہونے پر بیک وقت ایک ٹرگر بھیجیں گے۔

مراحل:

1. ان LSL آؤٹ لیٹس کے ذریعے ڈیٹا اسٹریم کرنے کے لیے EmotivPRO کا استعمال کریں جس میں EEG ڈیٹا (اور/یا تحریک، رابطے کا معیار، سگنل کا معیار وغیرہ) شامل ہے۔ 2۔ Python اسکرپٹ کا استعمال کرتے ہوئے ایک آڈیو ٹریک چلائیں، اور ساتھ ہی ایک اور LSL کے ذریعے ٹرگر بھیجیں، LSL انلیٹ کے ذریعے تینوں ڈیٹا اسٹریمز کو کیپچر اور محفوظ کرنے کے لیے LabRecorder کا استعمال کریں۔

2.1 مرحلہ 1 - سیٹ اپ اور انسٹالیشن

  1. ڈیٹا کیپچر کرنے کے لیے آپ کو سپورٹ شدہ ڈیٹا ایکوزیشن ڈیوائسز کی ضرورت ہوگی
    • Emotiv کی تمام دماغی ڈیوائسز EmotivPRO سافٹ ویئر کے ذریعے LSL سے منسلک ہوتی ہیں

  2. اپنی ڈیوائس پر EmotivPRO انسٹال کریں۔ LSL استعمال کرنے کے لیے آپ کو ایک درست EmotivPRO لائسنس کی ضرورت ہوگی۔

  3. درج ذیل کمانڈ کے ساتھ Python LSL لائبریری انسٹال کریں:
    pip install pylsl

  4. LabRecorder سافٹ ویئر ڈاؤن لوڈ کریں۔ یہ ایک آسان، مفت ایپ ہے جسے کمانڈ لائن سے یا اسٹینڈ اکیلے ڈاؤن لوڈ کے طور پر چلایا جا سکتا ہے

  5. ہمارے تجربے کے لیے : Python کا استعمال کرتے ہوئے آڈیو چلانے کے لیے ضروری پیکجز انسٹال کریں
    pip install sounddevice soundfile

2.2 مرحلہ 3 - EmotivPRO سے ایک LSL اسٹریم کے ذریعے ڈیٹا بھیجیں

  1. ایپ کے اوپری دائیں کونے میں "..." تلاش کریں، Settings پر جائیں

  2. ‘Lab Streaming Layer’ سیکشن اور ‘Outlet’ سب سیکشن تلاش کریں

  3. وہ تمام ڈیٹا ٹائپس منتخب کریں جنہیں آپ براڈکاسٹ کرنا چاہتے ہیں

  4. ڈیٹا فارمیٹ منتخب کریں (32-bit float یا 64-bit double)

  5. منتخب کریں کہ آیا ڈیٹا نمونہ بہ نمونہ بھیجنا ہے یا نمونوں کے ٹکڑوں (chunks) میں

  6. LSL ڈیٹا اسٹریم براڈکاسٹ کرنے کے لیے 'Start' پر کلک کریں


2.3 مرحلہ 4 - آڈیو چلانے اور ٹرگرز بھیجنے کے لیے Python اسکرپٹ کا استعمال کریں

  1. درج ذیل کوڈ بلاک کو کاپی کر کے ایک پائتھن فائل میں پیسٹ کریں اور اسے اپنے کمپیوٹر میں محفوظ کر لیں۔

  2. ایک آڈیو فائل تلاش کریں (مثالی طور پر ایک .wav فائل) جسے آپ چلانا چاہتے ہیں اور اسکرپٹ میں متغیر audio_filepath کو تبدیل کر کے اپنے کمپیوٹر پر موجود اس فائل کا پاتھ درج کریں

  3. کمانڈ لائن سے بات چیت کرنے کے لیے ایک کمانڈ پرامپٹ کھولیں اور اس فولڈر پر جائیں جہاں آپ کی Python فائل محفوظ ہے

  4. درج کریں: python3 filename.py
    • آپ کی Python انسٹالیشن پر منحصر ہے، آپ 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
        )

2.4 مرحلہ 5 - تمام LSL اسٹریمز کو دیکھنے اور محفوظ کرنے کے لیے LabRecorder کا استعمال کریں

  1. LabRecorder کھولیں

  2. Update دبائیں۔ دستیاب LSL اسٹریمز اسٹریم لسٹ میں نظر آنی چاہئیں
    • آپ کو دونوں EmotivPROs (عام طور پر "Emotiv-DataStream" کہلانے والے) اور مارکر اسٹریم ("AudioMarkers" کہلانے والے) کی اسٹریمز دیکھنے کے قابل ہونا چاہئے

  3. ڈیٹا کو ذخيرہ کرنے کا مقام منتخب کرنے (اور دیگر پیرامیٹرز کو سیٹ کرنے) کے لیے Browse پر کلک کریں

  4. تمام اسٹریمز کو منتخب کریں اور ریکارڈنگ شروع کرنے کے لیے Record دبائیں

3.0 ڈیٹا کے ساتھ کام کرنا

LabRecorder ایک XDF فائل (Extensible Data Format) تیار کرتا ہے جس میں تمام اسٹریمز کا ڈیٹا ہوتا ہے۔ 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"


4.0 اضافی وسائل

سرکاری دستاویزات

  1. آن لائن دستاویزات کو دیکھیں، بشمول GitHub پر آفیشل README فائل

  2. اضافی وسائل:
    • مثال اسکرپٹس کے ساتھ، Emotiv کی ڈیوائسز کا استعمال کرتے ہوئے LSL چلانے کے لیے کوڈ
    • یوٹیوب پر مفید LSL ڈیمو
    • تمام متعلقہ لائبریریوں کے لیے SCCN LSL GitHub ریپوزٹری
    • ذیلی ماڈیولز اور ایپس کے مجموعہ کے لیے LSL GitHub ریپوزٹری

  3. ہائپر سکیننگ اسٹڈیز کے لیے HyPyP تجزیہ پائپ لائن

خوش آمدید! اس ٹیوٹوریل میں ہم کثیر ڈیوائسز سے Emotiv EEG ڈیٹا کو اکٹھا اور ہم آہنگ کرنے کے لیے Python میں Lab Streaming Layer (LSL) کا استعمال کرنا سیکھیں گے۔ اس کے لیے Python پروگرامنگ زبان کا بنیادی عملی علم ہونا ضروری ہے۔

آپ کیا سیکھیں گے

  1. لیب اسٹریمنگ لیئر (LSL) کیا ہے اور محققین اس کا استعمال کیوں کرتے ہیں

  2. متعدد Emotiv EEG ڈیوائسز سے ہم آہنگ ڈیٹا کو کیسے اکٹھا کریں

  3. اکٹھے کیے گئے ڈیٹا کو امپورٹ اور اس کا معائنہ کیسے کریں

1.1 LSL کیا ہے اور یہ کس لیے موزوں ہے؟

لیب اسٹریمنگ لیئر (LSL) ایک اوپن سورس ٹول بکس ہے جس کا استعمال متنوع سینسر ہارڈویئر سے اعصابی، جسمانی، اور رویہ جاتی ڈیٹا کے بہاؤ (سٹریمز) کو بھیجنے، وصول کرنے اور ہم آہنگ کرنے کے لیے کیا جا سکتا ہے۔ تیزی سے زیادہ قابل، درست اور پورٹیبل دماغی اور جسمانی سینسنگ ہارڈویئر ڈیوائسز (جیسے Emotiv EEG سسٹمز) نیورو سائنس کو لیب سے باہر حقیقی وقت کے ڈیٹا کی دنیا میں لا رہی ہیں۔ جہاں کبھی EEG اور MEG جیسی دماغی پیمائشیں صرف تحقیقی لیبارٹریوں تک محدود تھیں، اب پورٹیبل ڈیوائسز ہمیں زیادہ قدرتی ماحول میں، اور ایک ساتھ متعدد لوگوں سے ڈیٹا کے متعدد نمونے اکٹھا کرنے کی اجازت دیتی ہیں۔

ایک محقق دو لوگوں کے درمیان جسمانی ہم آہنگی میں دلچسپی لے سکتا ہے جو ایک ہی موسیقی سن رہے ہوں۔ LSL ہمیں دو EEG ہیڈ سیٹس سے الگ الگ ڈیٹا اکٹھا کرنے میں مدد کر سکتا ہے جو آواز کی پیشکش کے ساتھ بھی ہم آہنگ ہوتا ہے۔

LSL کے دیگر استعمالات کی کچھ مثالیں:

  1. کسی تجربے سے ایونٹ مارکرز کو جاری EEG ڈیٹا میں شامل کرنا

  2. واحد شریک کے لیے متعدد ذرائع (مثلاً دل کی دھڑکن، EMG، EEG) سے حاصل ہونے والے ڈیٹا کو وقت کے لحاظ سے ہم آہنگ کرنا

  3. متعدد شرکاء سے حاصل ہونے والے ڈیٹا کو وقت کے مطابق ترتیب دینا (مثلاً EEG Hyperscanning اسٹڈیز)

1.2 LSL کیسے کام کرتا ہے؟

Lab Streaming Layer متعدد ڈیوائسز کے درمیان ٹائم-سیریز ڈیٹا کے حقیقی وقت میں تبادلے کا ایک پروٹوکول ہے۔ LSL کو ازگر (Python) ، MATLAB، C++، Java اور دیگر پروگرامنگ زبانوں کی اوپن سورس لائبریریوں کا استعمال کرتے ہوئے نافذ کیا جا سکتا ہے۔

بنیادی افادیت LSL ڈیٹا اسٹریمز کے گرد گھومتی ہے:

ایک حصولی ڈیوائس/سافٹ ویئر ڈیٹا اکٹھا کرتا ہے اور ایک ڈیٹا اسٹریم بناتا ہے - میٹا ڈیٹا (سیمپلی گ ریٹ، ڈیٹا کی قسم، چینل کی معلومات وغیرہ) سمیت EEG ریکارڈنگ ڈیوائسز، آئی-ٹریکرز، موشن کیپچر سسٹمز، ہارٹ ریٹ مانیٹرز وغیرہ سے LSL پر فزیولوجیکل ڈیٹا اسٹریم کیا جا سکتا ہے - تجربات سے ایونٹ مارکرز (مثلاً PsychoPy کا استعمال کرتے ہوئے) کو بھی LSL کا استعمال کرتے ہوئے ڈیٹا اسٹریم کے طور پر بھیجا جا سکتا ہے

ڈیٹا اسٹریم کو نیٹ ورک پر پبلش کیا جاتا ہے - LSL کا استعمال کرتے ہوئے ڈیٹا اسی طرح بھیجا جاتا ہے؛ ڈیٹا اسٹریم نیٹ ورک پر "براڈکاسٹ" ہوتی ہے - پبلش کردہ اسٹریمز نیٹ ورک پر دستیاب ہوتی ہیں اور اسی نیٹ ورک پر موجود دیگر LSL سپورٹڈ ڈیوائسز کے ذریعے تلاش کی جا سکتی ہیں - LSL ایک مشترکہ کلاک کی بنیاد پر ہر ڈیٹا ٹکرے یا نمونے کو ایک ٹائم اسٹیمپ تفویض کرتا ہے (نیٹ ورک ٹائم پروٹوکول کے تحت)۔ - اسٹریم کو ایک "آؤٹ لیٹ" کے ذریعے نمونہ بہ نمونہ (یا ٹکڑے بہ ٹکڑے) آگے دھکیلا جاتا ہے

مجموعہ ڈیوائسز ڈیٹا اسٹریمز کی "سبسکرپشن" حاصل کرتی ہیں - LSL کا استعمال کرتے ہوئے ڈیٹا اسی طرح موصول ہوتا ہے - اسی نیٹ ورک پر موجود مجموعہ ڈیوائسز "ان لیٹس" کے ذریعے پبلش کردہ ڈیٹا اسٹریمز حاصل کرتی ہیں۔ - ہر انلیٹ صرف ایک آؤٹ لیٹ سے اسٹریم کے نمونے اور میٹا ڈیٹا وصول کرتا ہے

ڈیٹا محفوظ کریں - ڈیٹا اسٹریم کی سبسکرپشن حاصل کرنے پر، آپ اسے اپنی پسندیدہ پروگرامنگ زبان میں ایک متغیر (variable) میں محفوظ کر سکتے ہیں، یا اسے معیاری فارمیٹ جیسے .xdf میں محفوظ کرنے کے لیے LSL کے فراہم کردہ سافٹ ویئر LabRecorder کا استعمال کر سکتے ہیں۔

2.0 ٹیوٹوریل کا جائزہ

اس ٹیوٹوریل میں، ہم ایک مثالی تجرباتی سیٹ اپ لیں گے اور Python میں LSL کا استعمال کرتے ہوئے اسے نافذ کرنے کے لیے ضروری مراحل اور کوڈ کے ذریعے آپ کی رہنمائی کریں گے۔ ہم Emotiv ہیڈسیٹ پہنے ہوئے دو لوگوں سے EEG ڈیٹا اکٹھا کرنے کے دوران آواز چلانے کے لیے Python کا استعمال کریں گے۔ ہم EEG ڈیٹا اکٹھا کرنے کے لیے دو کمپیوٹرز کا استعمال کریں گے جن میں سے ہر ایک پر EmotivPRO چل رہا ہوگا، اور ہر اسٹریم کو ایک علیحدہ LSL آؤٹ لیٹ کے ذریعے براڈکاسٹ کریں گے۔ ہم آڈیو فائل چلانے کے لیے پائتھن لائبریری کا استعمال کریں گے اور فائل شروع ہونے پر بیک وقت ایک ٹرگر بھیجیں گے۔

مراحل:

1. ان LSL آؤٹ لیٹس کے ذریعے ڈیٹا اسٹریم کرنے کے لیے EmotivPRO کا استعمال کریں جس میں EEG ڈیٹا (اور/یا تحریک، رابطے کا معیار، سگنل کا معیار وغیرہ) شامل ہے۔ 2۔ Python اسکرپٹ کا استعمال کرتے ہوئے ایک آڈیو ٹریک چلائیں، اور ساتھ ہی ایک اور LSL کے ذریعے ٹرگر بھیجیں، LSL انلیٹ کے ذریعے تینوں ڈیٹا اسٹریمز کو کیپچر اور محفوظ کرنے کے لیے LabRecorder کا استعمال کریں۔

2.1 مرحلہ 1 - سیٹ اپ اور انسٹالیشن

  1. ڈیٹا کیپچر کرنے کے لیے آپ کو سپورٹ شدہ ڈیٹا ایکوزیشن ڈیوائسز کی ضرورت ہوگی
    • Emotiv کی تمام دماغی ڈیوائسز EmotivPRO سافٹ ویئر کے ذریعے LSL سے منسلک ہوتی ہیں

  2. اپنی ڈیوائس پر EmotivPRO انسٹال کریں۔ LSL استعمال کرنے کے لیے آپ کو ایک درست EmotivPRO لائسنس کی ضرورت ہوگی۔

  3. درج ذیل کمانڈ کے ساتھ Python LSL لائبریری انسٹال کریں:
    pip install pylsl

  4. LabRecorder سافٹ ویئر ڈاؤن لوڈ کریں۔ یہ ایک آسان، مفت ایپ ہے جسے کمانڈ لائن سے یا اسٹینڈ اکیلے ڈاؤن لوڈ کے طور پر چلایا جا سکتا ہے

  5. ہمارے تجربے کے لیے : Python کا استعمال کرتے ہوئے آڈیو چلانے کے لیے ضروری پیکجز انسٹال کریں
    pip install sounddevice soundfile

2.2 مرحلہ 3 - EmotivPRO سے ایک LSL اسٹریم کے ذریعے ڈیٹا بھیجیں

  1. ایپ کے اوپری دائیں کونے میں "..." تلاش کریں، Settings پر جائیں

  2. ‘Lab Streaming Layer’ سیکشن اور ‘Outlet’ سب سیکشن تلاش کریں

  3. وہ تمام ڈیٹا ٹائپس منتخب کریں جنہیں آپ براڈکاسٹ کرنا چاہتے ہیں

  4. ڈیٹا فارمیٹ منتخب کریں (32-bit float یا 64-bit double)

  5. منتخب کریں کہ آیا ڈیٹا نمونہ بہ نمونہ بھیجنا ہے یا نمونوں کے ٹکڑوں (chunks) میں

  6. LSL ڈیٹا اسٹریم براڈکاسٹ کرنے کے لیے 'Start' پر کلک کریں


2.3 مرحلہ 4 - آڈیو چلانے اور ٹرگرز بھیجنے کے لیے Python اسکرپٹ کا استعمال کریں

  1. درج ذیل کوڈ بلاک کو کاپی کر کے ایک پائتھن فائل میں پیسٹ کریں اور اسے اپنے کمپیوٹر میں محفوظ کر لیں۔

  2. ایک آڈیو فائل تلاش کریں (مثالی طور پر ایک .wav فائل) جسے آپ چلانا چاہتے ہیں اور اسکرپٹ میں متغیر audio_filepath کو تبدیل کر کے اپنے کمپیوٹر پر موجود اس فائل کا پاتھ درج کریں

  3. کمانڈ لائن سے بات چیت کرنے کے لیے ایک کمانڈ پرامپٹ کھولیں اور اس فولڈر پر جائیں جہاں آپ کی Python فائل محفوظ ہے

  4. درج کریں: python3 filename.py
    • آپ کی Python انسٹالیشن پر منحصر ہے، آپ 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
        )

2.4 مرحلہ 5 - تمام LSL اسٹریمز کو دیکھنے اور محفوظ کرنے کے لیے LabRecorder کا استعمال کریں

  1. LabRecorder کھولیں

  2. Update دبائیں۔ دستیاب LSL اسٹریمز اسٹریم لسٹ میں نظر آنی چاہئیں
    • آپ کو دونوں EmotivPROs (عام طور پر "Emotiv-DataStream" کہلانے والے) اور مارکر اسٹریم ("AudioMarkers" کہلانے والے) کی اسٹریمز دیکھنے کے قابل ہونا چاہئے

  3. ڈیٹا کو ذخيرہ کرنے کا مقام منتخب کرنے (اور دیگر پیرامیٹرز کو سیٹ کرنے) کے لیے Browse پر کلک کریں

  4. تمام اسٹریمز کو منتخب کریں اور ریکارڈنگ شروع کرنے کے لیے Record دبائیں

3.0 ڈیٹا کے ساتھ کام کرنا

LabRecorder ایک XDF فائل (Extensible Data Format) تیار کرتا ہے جس میں تمام اسٹریمز کا ڈیٹا ہوتا ہے۔ 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"


4.0 اضافی وسائل

سرکاری دستاویزات

  1. آن لائن دستاویزات کو دیکھیں، بشمول GitHub پر آفیشل README فائل

  2. اضافی وسائل:
    • مثال اسکرپٹس کے ساتھ، Emotiv کی ڈیوائسز کا استعمال کرتے ہوئے LSL چلانے کے لیے کوڈ
    • یوٹیوب پر مفید LSL ڈیمو
    • تمام متعلقہ لائبریریوں کے لیے SCCN LSL GitHub ریپوزٹری
    • ذیلی ماڈیولز اور ایپس کے مجموعہ کے لیے LSL GitHub ریپوزٹری

  3. ہائپر سکیننگ اسٹڈیز کے لیے HyPyP تجزیہ پائپ لائن

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

پڑھنا جاری رکھیں

Basics of Neural Oscillations