Lab Streaming Layer 数据流
在上一篇博文中,我们说到了LSL数据流的简介以及可支持的设备。你会发现LSL是一个非常强大的工具,尤其是对于脑机接口方面,需要实时的读取在线数据时,它将会发挥很大的能力。
今天,我将以MATLAB和python简要的展示,如何通过LSL接收数据和发送数据。
所需工具支持以及code
工具支持:这部分可查看上一篇博文所支持的设备。另一个也可以查看Github上的APP工具箱
代码:这是官网上的示例代码
Matlab示例代码:
Receive接收数据
首先在上面的代码中下载MATLAB的文件夹,打开MATLAB后先将文件夹加载到路径下,并导航到ReceiveData文件下,打开后你会发现以下代码
%% instantiate the library初始化库
disp('Loading the library...');
lib = lsl_loadlib();
% resolve a stream...进行数据流传输
disp('Resolving an EEG stream...');
result = {};
while isempty(result)
result = lsl_resolve_byprop(lib,'type','EEG'); end
% create a new inlet创建数据
disp('Opening an inlet...');
inlet = lsl_inlet(result{1});
disp('Now receiving data...');
while true
% get data from the inlet得到数据
[vec,ts] = inlet.pull_sample();
% and display it展示数据
fprintf('%.2f\t',vec);
fprintf('%.5f\n',ts);
end
在以上代码中有一个地方非常关键。Resolving an EEG stream…
当你需要采集NIRS数据时,将EEG修改为NIRS;
当你需要采集眼动数据时,将EEG修改为eye;
当你需要采集音频数据时,将EEG修改为Audio;
当你需要采集event事件时,将EEG修改为MyEventStream。
Send发送数据
在该文件下打开senddata.m,可查看以下代码;
%% instantiate the library初始化
disp('Loading library...');
lib = lsl_loadlib();
% make a new stream outlet创建
disp('Creating a new streaminfo...');
info = lsl_streaminfo(lib,'BioSemi','EEG',8,100,'cf_float32','sdfwerr32432');
disp('Opening an outlet...');
outlet = lsl_outlet(info);
% send data into the outlet, sample by sample发送
disp('Now transmitting data...');
while true
outlet.push_sample(randn(8,1));
pause(0.01);
end
跟接收数据同样的道理,lib,’BioSemi’,’EEG’,8,100,’cf_float32’,’sdfwerr32432
这一句是非常关键的代码。
当你需要修改时,确保当前的设备名称及数据类型是正确的。
Python示例代码:
当前所使用的python版本可查看图中,首先我们需要在电脑上安装pylsl库,可通过命令行pip install pylsl进行安装。
打开example里的receivedata.py可查看以下代码:
"""Example program to show how to read a multi-channel time series from LSL."""
from pylsl import StreamInlet, resolve_stream
# first resolve an EEG stream on the lab network
print("looking for an EEG stream...")
streams = resolve_stream('type', 'EEG')
# create a new inlet to read from the stream
inlet = StreamInlet(streams[0])
while True:
# get a new sample (you can also omit the timestamp part if you're not
# interested in it)
sample, timestamp = inlet.pull_sample()
print(timestamp, sample)
在这里面跟matlab中是一样的道理,需要得到哪种数据就将EEG修改为哪种数据。
Senddata.py
"""Example program to demonstrate how to send a multi-channel time series to
LSL."""
import time
from random import random as rand
from pylsl import StreamInfo, StreamOutlet
# first create a new stream info (here we set the name to BioSemi,
# the content-type to EEG, 8 channels, 100 Hz, and float-valued data) The
# last value would be the serial number of the device or some other more or
# less locally unique identifier for the stream as far as available (you
# could also omit it but interrupted connections wouldn't auto-recover)
info = StreamInfo('BioSemi', 'EEG', 8, 100, 'float32', 'myuid34234')
# next make an outlet
outlet = StreamOutlet(info)
print("now sending data...")
while True:
# make a new random 8-channel sample; this is converted into a
# pylsl.vectorf (the data type that is expected by push_sample)
mysample = [rand(), rand(), rand(), rand(), rand(), rand(), rand(), rand()]
# now send it and wait for a bit
outlet.push_sample(mysample)
time.sleep(0.01)
使用Psychopy通过LSL发送marker信息到近红外设备,可参考文章
Psychopy通过LAN网线触发marker连接NIRX设备
谢谢大家观看,如有帮助,来个喜欢或者关注吧!
本文作者:Chen Rui
博客地址 : Chen Rui Blog
知乎地址 : 知乎专栏
B站地址 : B站主页
书店地址 : 书店主页
网易云音乐地址 : 音乐主页
版权声明:本文由 陈锐CR 在 2020年03月31日发表。本博客文章作者为陈锐CR时均采用属于个人原创撰写,未经许可,禁止在任何媒介以任何形式复制、发行本文章,如需转载,请查看About联系方式,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《LSL上手操作》