基于脑电的脑机接口刺激系统的研制

究基于多种刺激模式的脑机接口视觉刺激器,采用计算机编程,在计算机屏幕上实现了基于VEP、P300、想象运动的3类刺激模式。该系统能够通过特定的刺激从而有效地诱发出可识别特征的脑电信号,采用XML技术使得该刺激系统具有较强的可扩展性,可以满足脑机接口实验的需要。

胡剑锋,等:基于脑电的脑机接口刺激系统的研制

屏蔽的策略,不允许任何的直接I/O动作发生,对并行口的读写就是如此1

(4)不同的刺激系统模板设计的统一性问题:不同脑信

脑机接口是一个比较复杂的系统,刺激软件既要准确地显示图像,还要有实时的数据传输,时间的精度直接影响到信号采集和信号分析的结果1BCI系统的采样率一般在

100~1000Hz,所以整个系统的时间误差最好控制在1ms

号有不同的刺激模式,这些刺激模式有不同的参数需要调整,比如基于想象运动的刺激系统需要调整时程、间隔、种类及等待时间等参数1

在本设计中,采用了XML以及处理器计时器和.net绘图类库,来设计在windowsXP环境下运行的视觉刺激器,程序的编译环境为基于WindowsXP操作系统下的Visual

Studio.net1

以内,否则信号分析可能会产生错误的结果1本文比较了常用的以下3种定时方法:.net时间类、多媒体定时器和处理器定时器1

(1).net时间类

.net,使用Add2)1其计时精度达1,因此不能作为本刺激系统的计时

1 ,同时也1设计时应考虑以下因素:

(1)刺激系统能产生有效的视觉刺激,以便检测出可靠

1

(2)多媒体定时器

Windows的多媒体编程接口中有一套定时器操作函数,

可用来实现高精度的定时器,用法主要是通过timeGetTime

()和GetTickCount()来获得系统定时器的精确定时服务[3]1

的脑电诱发信号1

(2)刺激目标代表着使用者可能做出的不同的选择或

其计时精度可达1ms,该方法的误差与操作系统有关,在

WindowsXP下误差在15ms左右,但在Windows2000Server

控制信号,所以应明确表示具体信息1

(3)刺激器能产生多种不同的刺激模式,应该尽可能让

下误差约为3ms,仍然无法满足BCI系统的需要1

(3)处理器定时器

使用者更易接受,最好有较强的可扩展性,便于不断增添新的刺激模式1

(4)能够向并口写入数据,以与记录数据同步1(5)有良好的时间分辨率,较小的时间误差1

(6)操作简便,有良好的人机界面可调整参数,为满足

使用对于精确度要求更高的定时操作,则应该使用

QueryPerformanceFrequency()和QueryPerformanceCounter()

函数1这2个函数是VC提供的仅供Windows95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器1在进行定时之前,先调用QueryPerformanceFre2

quency()函数获得机器内部定时器的时钟频率,然后在需

脑机接口实验要求,刺激系统应提供可视化参数设置功能1为了提高刺激的对比度,一般目标为白色,屏幕背景设为黑色,表达选择或控制信息的字符设为醒目的颜色如红色,也可根据受试者的要求和特点选择彩色刺激1

要严格定时的事件发生之前和发生之后分别调用

QueryPerformanceCounter()函数,利用2次获得的计数之差

2 实现的方法

2.1 .net图形技术的应用

在.net基础类库中提供了大量与绘图相关的类,使用方便而且功能丰富,完全能够满足脑机接口刺激系统的需求1而且开发效率要远远超过一般常用的DirectX,对于刺激模式的不断扩充具有很强的适应性1

String3a="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

e->Graphics->Clear(Color::Black);

System::Drawing::Font3myfont=newSystem::Drawing::Font("Arial",44);

SolidBrush3mybrush=newSolidBrush(Color::Red);for(inti=0;i<6;i++) for(intj=0;j<6;j++) {

 e->Graphics->DrawString(a->Substring(i36+j,1),myfont,mybrush,400+j3100,100+i3100);

}

及时钟频率,计算出事件所经历的精确时间1该方法的计时精度和误差与处理器的主频有关,在Intel1.84G双核处理器上测试的结果是精度小于1μs,误差小于5μs1

usingnamespaceSystem::Runtime::InteropServices;[DllImport("Kernel32")]extern"C"boolQueryPerformanceCounter(unsignedlong3lp2)Count;[DllImport("Kernel32")]

extern"C"boolQueryPerformanceFrequency(unsignedlong3lpRate);

longmodule::gettime(void){

  unsignedlongtime;

  QueryPerformanceCounter(&time);  returntime;}

longmodule::getrate(void){

  unsignedlongrate;

  QueryPerformanceFrequency(&rate);  returnrate;}

上面这段代码的作用是在一个黑屏用红色显示26个大写的英文字母和10个阿拉伯数字所构成的6乘6的矩阵1从这个例子中我们可以看出,使用.net开发显示模块不仅代码量少,而且结构非常清晰,程序在不加任何注释的情况下也能够看明白每一行代码的作用1

以上程序使用.net通过接口调用动态链接库中的API函数来读取处理器计数器的数值和定时器的时钟频率1考虑到整个系统的需求,采用处理器定时器方式实现精确定时比较合适1

2.2 处理器定时器的使用

361

你可能喜欢

  • matlab代码
  • matlab信号处理
  • 测量仪器
  • 脑电监护
  • 信号基础
  • 脑与认知

基于脑电的脑机接口刺激系统的研制相关文档

最新文档

返回顶部