Lab Streaming Layer(LSL)を使用した、同期された神経科学データ収集を示す図。Emotiv EEGヘッドセット、オーディオソース、およびイベントトリガーが、EEG信号、オーディオ波形、および時間マーカーを整列されたタイムラインにストリーミングし、これらが中央の記録インターフェースに集約されて、同期されたマルチモーダルデータ分析が行われます。

複数データストリーム同期のためのLab Streaming Layer (LSL)

ロシニ・ランデニヤ博士とルーカス・クライネ

更新日

2024/05/17

Lab Streaming Layer(LSL)を使用した、同期された神経科学データ収集を示す図。Emotiv EEGヘッドセット、オーディオソース、およびイベントトリガーが、EEG信号、オーディオ波形、および時間マーカーを整列されたタイムラインにストリーミングし、これらが中央の記録インターフェースに集約されて、同期されたマルチモーダルデータ分析が行われます。

複数データストリーム同期のためのLab Streaming Layer (LSL)

ロシニ・ランデニヤ博士とルーカス・クライネ

更新日

2024/05/17

Lab Streaming Layer(LSL)を使用した、同期された神経科学データ収集を示す図。Emotiv EEGヘッドセット、オーディオソース、およびイベントトリガーが、EEG信号、オーディオ波形、および時間マーカーを整列されたタイムラインにストリーミングし、これらが中央の記録インターフェースに集約されて、同期されたマルチモーダルデータ分析が行われます。

複数データストリーム同期のためのLab Streaming Layer (LSL)

ロシニ・ランデニヤ博士とルーカス・クライネ

更新日

2024/05/17

ようこそ!このチュートリアルでは、PythonでLab Streaming Layer(LSL)を使用して、複数のデバイスから流入するEmotiv EEG(脳波)データを収集および同期する方法を学びます。本チュートリアルを進めるには、Pythonプログラミング言語の基本的な知識が必要となります。

学習内容

  1. Lab Streaming Layer(LSL)とは何か、そしてなぜ研究者がそれを使用するのか

  2. 複数のEmotiv EEGデバイスから同期されたデータを収集する方法

  3. 収集したデータをインポートして検査する方法

1.1 LSLとは何か、何に役立つのか?

Lab Streaming Layer(LSL)は、さまざまなセンサーハードウェアから供給される神経データ、生理学的データ、および行動データのストリームを送信、受信、同期するために使用できるオープンソースツールボックスです。Emotiv EEGシステムのように、高機能で高精度、かつモバイル対応の脳・身体センサハードウェアデバイスの登場により、神経科学はラボから飛び出し、リアルタイムデータの世界へと移行しつつあります。EEGやMEGなどの脳測定はかつて研究室内に限定されていましたが、モバイルデバイスのおかげで、より自然な環境下で、複数の人々から同時にさまざまなデータを収集できるようになりました。

研究者は、同じ音楽を聴いている2人の間の生理学的同調性に関心を持つかもしれません。LSLを使用すれば、音の提示に同期した形で、2台のEEGヘッドセットから個別にデータを収集できます。

LSLのその他の使用イメージ:

  1. 実験中のイベントマーカーを継続しているEEGデータに追加する

  2. 1人の参加者の複数のデータソース(心拍数、EMG、EEGなど)の時間軸を合わせる

  3. 複数人の参加者のデータ(EEGハイパースキャニング研究など)の時間軸を合わせる

1.2 LSLの仕組みは?

Lab Streaming Layerは、複数のデバイス間で時系列データをリアルタイムにやり取りするためのプロトコルです。LSLは、Python、MATLAB、C++、Javaなどのプログラミング言語向けのオープンソースライブラリを使用することで実装できます。

その中核機能は、LSLのデータストリームを中心に展開されます:

1. 計測デバイスもしくはソフトウェアがデータを収集し、データストリームを作成する - EEG記録デバイス、視線追跡システム、モーションキャプチャシステム、心拍モニターなどから、メタデータ(サンプリングレート、データ形式、チャネル情報など)を含む生理学的データがLSLにストリーミング送信されます。PsychoPy等を使用した実験からのイベントマーカーも、LSLを用いてデータストリームとして送信できます。

2. データストリームがネットワーク上に「パブリッシュ(公開)」される - LSLを介してデータが送信される仕組みです。データストリームはネットワークに「ブロードキャスト」されます。公開されたストリームはネットワーク上で利用可能になり、同じネットワーク上の他のLSL対応デバイスから検出できるようになります。LSLは共通のクロック(ネットワークタイムプロトコルに従う)に基づいて、各データチャンクまたはサンプルにタイムスタンプを割り当てます。ストリームは「アウトレット」を介して、サンプルごと(またはチャンクごと)にプッシュされます。

3. データ収集デバイスがデータストリームを「サブスクライブ(受信)」する - LSLを使用してデータを受信します。同一ネットワーク上の収集デバイスは、「インレット」を介して公開されたデータストリームを受信します。各インレットは、1つのアウトレットのみからストリームサンプルとメタデータを受信します。

4. データを保存する - データストリームを購読すると、好みのプログラミング言語の変数にデータを保存したり、LSLが提供するソフトウェア「LabRecorder」を使用して .xdf などの標準フォーマットに保存したりできます。

2.0 チュートリアルの概要

このチュートリアルでは、実験セットアップの例を取り上げ、PythonでLSLを使用して実装するために必要なステップとコードを案内します。Emotivヘッドセットを装着した2人のEEGデータを収集しながら、Pythonを使って音声を再生します。それぞれEmotivPROを実行している2台のコンピュータを使用しておのおののEEGデータを集め、それぞれ個別のアウトレットを介してLSLへストリーミング配信します。またPythonライブラリを使用してオーディオファイルを再生し、ファイルが開始されるたびにトリガーを同時に送信します。

手順:

1. EmotivPROを使用して、EEGデータ(および/またはモーション、接触品質、信号品質など)を含むLSLアウトレットを介してデータをストリーミング配信します。2. Pythonスクリプトを用いてオーディオトラックを再生し、同時に別のLSLからトリガーを送信します。LabRecorderを利用して、LSLインレットを介して3つすべてのデータストリームをキャプチャし保存します。

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. データをサンプルごとに送信するか、サンプルのチャンク(塊)ごとに送信するかを選択します。

  6. 「Start」をクリックして、LSLデータストリームの配信を開始します。

2.3 ステップ 4 - Pythonスクリプトを使用してオーディオ再生とトリガー送信を行う

  1. 以下のコードブロックをコピーしてpythonファイルに貼り付け、コンピュータに保存します。

  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
<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> 両方の EmotivPROs からのストリーム(通常は「Emotiv-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ファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して 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>GitHub 上にある公式の README ファイルを含めた <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"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br> Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br> 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br> 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br> サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol

"""
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> 両方の EmotivPROs からのストリーム(通常は「Emotiv-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ファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して 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>GitHub 上にある公式の README ファイルを含めた <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"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br> Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br> 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br> 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br> サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol

"""
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> 両方の EmotivPROs からのストリーム(通常は「Emotiv-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ファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して 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>GitHub 上にある公式の README ファイルを含めた <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"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br> Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br> 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br> 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br> サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol

ようこそ!このチュートリアルでは、PythonでLab Streaming Layer(LSL)を使用して、複数のデバイスから流入するEmotiv EEG(脳波)データを収集および同期する方法を学びます。本チュートリアルを進めるには、Pythonプログラミング言語の基本的な知識が必要となります。

学習内容

  1. Lab Streaming Layer(LSL)とは何か、そしてなぜ研究者がそれを使用するのか

  2. 複数のEmotiv EEGデバイスから同期されたデータを収集する方法

  3. 収集したデータをインポートして検査する方法

1.1 LSLとは何か、何に役立つのか?

Lab Streaming Layer(LSL)は、さまざまなセンサーハードウェアから供給される神経データ、生理学的データ、および行動データのストリームを送信、受信、同期するために使用できるオープンソースツールボックスです。Emotiv EEGシステムのように、高機能で高精度、かつモバイル対応の脳・身体センサハードウェアデバイスの登場により、神経科学はラボから飛び出し、リアルタイムデータの世界へと移行しつつあります。EEGやMEGなどの脳測定はかつて研究室内に限定されていましたが、モバイルデバイスのおかげで、より自然な環境下で、複数の人々から同時にさまざまなデータを収集できるようになりました。

研究者は、同じ音楽を聴いている2人の間の生理学的同調性に関心を持つかもしれません。LSLを使用すれば、音の提示に同期した形で、2台のEEGヘッドセットから個別にデータを収集できます。

LSLのその他の使用イメージ:

  1. 実験中のイベントマーカーを継続しているEEGデータに追加する

  2. 1人の参加者の複数のデータソース(心拍数、EMG、EEGなど)の時間軸を合わせる

  3. 複数人の参加者のデータ(EEGハイパースキャニング研究など)の時間軸を合わせる

1.2 LSLの仕組みは?

Lab Streaming Layerは、複数のデバイス間で時系列データをリアルタイムにやり取りするためのプロトコルです。LSLは、Python、MATLAB、C++、Javaなどのプログラミング言語向けのオープンソースライブラリを使用することで実装できます。

その中核機能は、LSLのデータストリームを中心に展開されます:

1. 計測デバイスもしくはソフトウェアがデータを収集し、データストリームを作成する - EEG記録デバイス、視線追跡システム、モーションキャプチャシステム、心拍モニターなどから、メタデータ(サンプリングレート、データ形式、チャネル情報など)を含む生理学的データがLSLにストリーミング送信されます。PsychoPy等を使用した実験からのイベントマーカーも、LSLを用いてデータストリームとして送信できます。

2. データストリームがネットワーク上に「パブリッシュ(公開)」される - LSLを介してデータが送信される仕組みです。データストリームはネットワークに「ブロードキャスト」されます。公開されたストリームはネットワーク上で利用可能になり、同じネットワーク上の他のLSL対応デバイスから検出できるようになります。LSLは共通のクロック(ネットワークタイムプロトコルに従う)に基づいて、各データチャンクまたはサンプルにタイムスタンプを割り当てます。ストリームは「アウトレット」を介して、サンプルごと(またはチャンクごと)にプッシュされます。

3. データ収集デバイスがデータストリームを「サブスクライブ(受信)」する - LSLを使用してデータを受信します。同一ネットワーク上の収集デバイスは、「インレット」を介して公開されたデータストリームを受信します。各インレットは、1つのアウトレットのみからストリームサンプルとメタデータを受信します。

4. データを保存する - データストリームを購読すると、好みのプログラミング言語の変数にデータを保存したり、LSLが提供するソフトウェア「LabRecorder」を使用して .xdf などの標準フォーマットに保存したりできます。

2.0 チュートリアルの概要

このチュートリアルでは、実験セットアップの例を取り上げ、PythonでLSLを使用して実装するために必要なステップとコードを案内します。Emotivヘッドセットを装着した2人のEEGデータを収集しながら、Pythonを使って音声を再生します。それぞれEmotivPROを実行している2台のコンピュータを使用しておのおののEEGデータを集め、それぞれ個別のアウトレットを介してLSLへストリーミング配信します。またPythonライブラリを使用してオーディオファイルを再生し、ファイルが開始されるたびにトリガーを同時に送信します。

手順:

1. EmotivPROを使用して、EEGデータ(および/またはモーション、接触品質、信号品質など)を含むLSLアウトレットを介してデータをストリーミング配信します。2. Pythonスクリプトを用いてオーディオトラックを再生し、同時に別のLSLからトリガーを送信します。LabRecorderを利用して、LSLインレットを介して3つすべてのデータストリームをキャプチャし保存します。

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. データをサンプルごとに送信するか、サンプルのチャンク(塊)ごとに送信するかを選択します。

  6. 「Start」をクリックして、LSLデータストリームの配信を開始します。

2.3 ステップ 4 - Pythonスクリプトを使用してオーディオ再生とトリガー送信を行う

  1. 以下のコードブロックをコピーしてpythonファイルに貼り付け、コンピュータに保存します。

  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
<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> 両方の EmotivPROs からのストリーム(通常は「Emotiv-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ファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して 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>GitHub 上にある公式の README ファイルを含めた <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"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br> Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br> 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br> 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br> サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol

ようこそ!このチュートリアルでは、PythonでLab Streaming Layer(LSL)を使用して、複数のデバイスから流入するEmotiv EEG(脳波)データを収集および同期する方法を学びます。本チュートリアルを進めるには、Pythonプログラミング言語の基本的な知識が必要となります。

学習内容

  1. Lab Streaming Layer(LSL)とは何か、そしてなぜ研究者がそれを使用するのか

  2. 複数のEmotiv EEGデバイスから同期されたデータを収集する方法

  3. 収集したデータをインポートして検査する方法

1.1 LSLとは何か、何に役立つのか?

Lab Streaming Layer(LSL)は、さまざまなセンサーハードウェアから供給される神経データ、生理学的データ、および行動データのストリームを送信、受信、同期するために使用できるオープンソースツールボックスです。Emotiv EEGシステムのように、高機能で高精度、かつモバイル対応の脳・身体センサハードウェアデバイスの登場により、神経科学はラボから飛び出し、リアルタイムデータの世界へと移行しつつあります。EEGやMEGなどの脳測定はかつて研究室内に限定されていましたが、モバイルデバイスのおかげで、より自然な環境下で、複数の人々から同時にさまざまなデータを収集できるようになりました。

研究者は、同じ音楽を聴いている2人の間の生理学的同調性に関心を持つかもしれません。LSLを使用すれば、音の提示に同期した形で、2台のEEGヘッドセットから個別にデータを収集できます。

LSLのその他の使用イメージ:

  1. 実験中のイベントマーカーを継続しているEEGデータに追加する

  2. 1人の参加者の複数のデータソース(心拍数、EMG、EEGなど)の時間軸を合わせる

  3. 複数人の参加者のデータ(EEGハイパースキャニング研究など)の時間軸を合わせる

1.2 LSLの仕組みは?

Lab Streaming Layerは、複数のデバイス間で時系列データをリアルタイムにやり取りするためのプロトコルです。LSLは、Python、MATLAB、C++、Javaなどのプログラミング言語向けのオープンソースライブラリを使用することで実装できます。

その中核機能は、LSLのデータストリームを中心に展開されます:

1. 計測デバイスもしくはソフトウェアがデータを収集し、データストリームを作成する - EEG記録デバイス、視線追跡システム、モーションキャプチャシステム、心拍モニターなどから、メタデータ(サンプリングレート、データ形式、チャネル情報など)を含む生理学的データがLSLにストリーミング送信されます。PsychoPy等を使用した実験からのイベントマーカーも、LSLを用いてデータストリームとして送信できます。

2. データストリームがネットワーク上に「パブリッシュ(公開)」される - LSLを介してデータが送信される仕組みです。データストリームはネットワークに「ブロードキャスト」されます。公開されたストリームはネットワーク上で利用可能になり、同じネットワーク上の他のLSL対応デバイスから検出できるようになります。LSLは共通のクロック(ネットワークタイムプロトコルに従う)に基づいて、各データチャンクまたはサンプルにタイムスタンプを割り当てます。ストリームは「アウトレット」を介して、サンプルごと(またはチャンクごと)にプッシュされます。

3. データ収集デバイスがデータストリームを「サブスクライブ(受信)」する - LSLを使用してデータを受信します。同一ネットワーク上の収集デバイスは、「インレット」を介して公開されたデータストリームを受信します。各インレットは、1つのアウトレットのみからストリームサンプルとメタデータを受信します。

4. データを保存する - データストリームを購読すると、好みのプログラミング言語の変数にデータを保存したり、LSLが提供するソフトウェア「LabRecorder」を使用して .xdf などの標準フォーマットに保存したりできます。

2.0 チュートリアルの概要

このチュートリアルでは、実験セットアップの例を取り上げ、PythonでLSLを使用して実装するために必要なステップとコードを案内します。Emotivヘッドセットを装着した2人のEEGデータを収集しながら、Pythonを使って音声を再生します。それぞれEmotivPROを実行している2台のコンピュータを使用しておのおののEEGデータを集め、それぞれ個別のアウトレットを介してLSLへストリーミング配信します。またPythonライブラリを使用してオーディオファイルを再生し、ファイルが開始されるたびにトリガーを同時に送信します。

手順:

1. EmotivPROを使用して、EEGデータ(および/またはモーション、接触品質、信号品質など)を含むLSLアウトレットを介してデータをストリーミング配信します。2. Pythonスクリプトを用いてオーディオトラックを再生し、同時に別のLSLからトリガーを送信します。LabRecorderを利用して、LSLインレットを介して3つすべてのデータストリームをキャプチャし保存します。

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. データをサンプルごとに送信するか、サンプルのチャンク(塊)ごとに送信するかを選択します。

  6. 「Start」をクリックして、LSLデータストリームの配信を開始します。

2.3 ステップ 4 - Pythonスクリプトを使用してオーディオ再生とトリガー送信を行う

  1. 以下のコードブロックをコピーしてpythonファイルに貼り付け、コンピュータに保存します。

  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
<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> 両方の EmotivPROs からのストリーム(通常は「Emotiv-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ファイルは複数のストリームで構成されており、各ストリームにはその中身(デバイス名、データ型、サンプリングレート、チャネルなど)を記述した異なるヘッダーが含まれています。以下のコードブロックを使用して 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>GitHub 上にある公式の README ファイルを含めた <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"></a></p></li><li data-preset-tag="p"><p>追加リソース:<br> Emotivのデバイスとサンプルスクリプトを使用してLSLを実行するための<a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">コード</a><br> 便利な<a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&amp;list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">YouTubeでのLSLデモ</a><br> 関連するすべてのライブラリが格納された<a href="https://github.com/sccn/labstreaminglayer" target="_blank">SCCN LSL GitHub リポジトリ</a><br> サブモジュールやアプリを収集した<a href="https://github.com/labstreaminglayer" target="_blank">LSL GitHub リポジトリ</a></p></li><li data-preset-tag="p"><p>Hyperscanning 調査向けの <a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">HyPyP 分析パイプライン</a></p></li></ol

神経振動(ニューラル・オシレーション)の基礎 - Emotiv

読むのを続ける

神経振動(ニューラル・オシレーション)の基礎