P300脑机接口及数据集处理

Wesley13
• 阅读 836

P300是大脑认知过程中产生的一种事件相关电位,主要与期待、意动、觉醒、注意等心理因素有关。Sutton等人发现,当人脑受到小概率相关事件的刺激时,脑电信号中会出现一个潜伏期约为300ms的正向波峰,P300因此得名。
P300脑机接口及数据集处理

P300脑机接口
在基于P300的oddball刺激范式 BCI 系统研究中,最经典的应用是Farwell和Donchin在 1988年提出并设计的字符拼写器简称为P300 Speller。如下图所示,使用26个英文字母和 1-9个数字以及下划线排列成 6 x 6 的虚拟键盘矩阵。随机高亮字符矩阵的某一行或某一列,一次实验中6 x 6列均被高亮亮一次,一共12次高亮刺激。受试者必须将注意力集中在矩阵中的字符上,以此来选择组成单词的每个字母。当包括此字符的行或者包含此字符的列被高亮时(也就是oddball范式中的靶刺激),要求受试者对此做出反应,予以计数,会产生P300波形;当不包含此字符的行或者列加亮时,被试不做出反应,不予计数,不会产生P300波形,通过解析脑电信号中的P300时序位置,并对照刺激序列的时序,进而确定刺激的行列位置,从而确定出受试者注视的字符,达到根据思维打字的目的。为了有助于保持受试者的注意力,通常要求受试者对目标字符高亮的次数进行计数。值得注意的是重复高亮次数越多,识别准确率越好,但会增加拼写时间。再者每一个字符也可以代表着一个控制指令,从而可以实现36个控制指令。
P300脑机接口及数据集处理
p300数据集
1、整个P300数据由基于Oddball范式的P300字符实验产生,实验过程如下:实验过程由一名被试者完成,字符矩阵的显示周期为2.5s,在这个周期内,字符矩阵的每行或列均被随机地加亮一次,加亮的持续时间为lOOms,两次加亮之间的时间间隔为75ms:对于每个目标字符,受试者需连续重复进行15次实验,即要经历15个字符矩阵显示周期,因此对于一个目标字符,字符矩阵会进行12×15次加亮。
第一节各段的目标字符分别为CAT,DOG,FISH,WATER,BOWL;
第二节各段的目标字符分别为HAT,HAT,GLOVE,SHOES,FISH,RAT;
第三节各段的目标字符为FOOD,MOOT,HAM,PIE,CAKE,TUNA,ZYGOT,4567。
在实验过程中,设备通过位于受试者脑部头皮上的64个采样电极,以240Hz的采样频率记录脑电信号。并将记录的信号分为三节,每节信号又根据英文单词或字符组的不同分成许多段。其中第一节(Session 10)包括5个段,第二节(Session 11)包括6个段,第三部分(Session 12)包括8个段。每段数据存储为一个Matlab数据格式文件,如第一节第四段的实验数据存储为文件“AAS010R04”,第二节第六段的实验数据存储为文件“AAS011R06”。
2、AAS011R06中有多个数组,数据集中的信号存放在signal的2维数组中,64个电极的采样点
p300数据集
MATLAB处理数据集
1、代码包含绘制cat的时域图,字符的时域图。
2、如cat,把64个电极采样结果平均,再把字符c的15个周期取平均,就得到了字符c在一个字符矩阵显示周期的时域图了

load('AAS010R01.mat');
y=sum(signal,2)/64;
t=(0:length(y)-1)/240;
%-------------------------------------------%
figure(1)
plot(t(1:8776),y(1:8776),'g')
hold on
plot(t(8776:17752),y(8776:17752),'r')
hold on
plot(t(17753:26328),y(17753:26328),'b')
title('CAT')
axis([t(1) t(end)+10 -1.2*max(y) 1.2*max(y)]);
%------------------------------------------%
figure(2)
subplot(3,1,1)
y=y/10;
t=(0:length(y)-1)/240;
plot(t,y)
title('CAT:0-5秒')
wow=t(1200);
axis([0  wow -400 400]);
subplot(3,1,2)
plot(t,y)
title('CAT:35-40秒')
axis([35 40 -400 400]);
subplot(3,1,3)
plot(t,y)
title('CAT:70-75秒')
axis([70 75 -400 400]);
%------------------------------------------%
a=1:585;b=8777:9361;c=17553:18137;
z_1=y(a);z_2=y(b);z_3=y(c);
s_1=z_1;s_2=z_2;s_3=z_3;
for k=1:14
    a=a+585;b=b+585;c=c+585;
    z_1=y(a);z_2=y(b);z_3=y(c);
    s_1=s_1+z_1;s_2=s_2+z_2;s_3=s_3+z_3;
end
s_1=s_1/15;s_2=s_2/15;s_3=s_3/15;
v=(0:584)/240;
figure(3)
subplot(3,1,1)
plot(v,s_1)
title('15周期平均后字符c波形')
subplot(3,1,2)
plot(v,s_2)
title('15周期平均后字符a波形')
subplot(3,1,3)
plot(v,s_3)
title('15周期平均后字符t波形')

结果展示
一个段数据的实验过程时域图(26328/240=109.7秒)
26328个采样点,240为采样频率,一个字符的输入时间大概为36.56秒
P300脑机接口及数据集处理
把信号放大,取其中5秒来看(0-5,35-40,70-75秒)
可以明显的观察出突出的p300波形
P300脑机接口及数据集处理
将cat段每个字符的取15个周期的平均值
P300脑机接口及数据集处理

P300频率
它是以delta(0.5-4hz)脑波为主要贡献和theta(4-7.5hz)脑波响应的融合
进一步分析,可以添加滤波部分,可以把上面生成波通过低通滤波器,在MATLAB中filter designer工具箱中生成阻带12hz,通带8hz的滤波器

Hd = lowfilter;
%引入滤波器,Hd包含了lowfilter滤波器的各项参数
d_1 = filter(Hd,s_1);
%通过filter函数将信号y送入参数为Hd的滤波器,输出信号d_1
d_2 = filter(Hd,s_2);
%通过filter函数将信号y送入参数为Hd的滤波器,输出信号d_2
d_3 = filter(Hd,s_3);
%通过filter函数将信号y送入参数为Hd的滤波器,输出信号d_3
figure(4)
subplot(3,1,1)
plot(v,d_1);%画出通过滤波器的信号d_1的波形
title('通过滤波器后字符c波形')
subplot(3,1,2)
plot(v,d_2);%画出通过滤波器的信号d_2的波形
title('通过滤波器后字符a波形')
subplot(3,1,3)
plot(v,d_3);%画出通过滤波器的信号d_3的波形
title('通过滤波器后字符t波形')

效果展示
P300脑机接口及数据集处理

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这