基于脑电信号的实验刺激系统设计与实现

作者: 赵增伟 陈钰华

摘要:脑电实验刺激系统是脑科学与神经科学研究领域中不可或缺的工具软件。目前市场上此类软件主要由国外公司开发,其价格高昂且缺乏可扩展性。为解决这一问题,该研究采用C#开发了一套脑电实验刺激软件。该系统成功实现了事件相关电位、稳态视觉诱发电位、运动想象等多种刺激模式,并具备出色的扩展性,能够根据用户的具体需求迅速开发出新的功能模块。在实验应用中,该系统表现出良好的稳定性,能够精准地呈现各类刺激模式,有效诱发目标脑电信号,显著提高了实验的效率与准确性,为脑电实验的顺利开展提供了有力的支撑。

关键词:脑电信号;刺激系统;事件相关电位 (ERP);稳态视觉诱发电位 (SSVEP);运动想象

中图分类号:TP311   文献标识码:A

文章编号:1009-3044(2025)08-0063-04

开放科学(资源服务) 标识码(OSID)

0 引言

随着脑科学与神经科学的发展,脑电波(EEG) 作为一种有效的神经活动监测工具,在认知心理学、临床医学、神经工程等领域的应用日益广泛。脑电实验刺激系统是研究者在实验中获取脑电信号的关键工具。

目前常见的脑电信号刺激软件有Neuroscan Stim2、E-Prime、OpenSesame、PsychoPy、Inquisit等。Neuroscan Stim2主要用于事件相关电位(ERP) 和功能成像研究,它在心理学和神经科学领域得到了广泛应用,尤其是在深入探索注意力和记忆机制方面效果显著[1]。E-Prime能够精确控制刺激的呈现时间和顺序,从而实现高精度的实验设计[2]。OpenSesame基于Python编程语言开发,支持拖放界面,拥有丰富的插件库[3]。PsychoPy允许研究人员通过图形用户界面或脚本编程轻松创建复杂的实验任务[4]。Inquisit的独特功能在于可通过网络收集实验数据并对数据加密,支持基于互联网的实验[5]。

然而,当前市场上可获得的脑电信号刺激系统多由国外公司开发,这不仅导致了高昂的购买成本,也限制了系统的功能和灵活性。许多现有软件缺乏足够的可扩展性,难以满足个别研究者对特定实验设计和刺激模式的需求。本研究利用C#语言开发了一套适应多种需求的脑电实验刺激系统,从设计到实现的每一个环节均考虑用户的易用性和系统的扩展性。该系统不仅能够实现常见的脑电刺激模式,如事件相关电位(ERP) 、稳态视觉诱发电位(SSVEP) 、听觉诱发电位(AEP) 及运动想象等,更为重要的是,它提供了简洁直观的管理与设置界面,便于用户快速配置各类实验参数[6-7]。此外,基于模块化设计的系统架构,还能根据用户需求迅速开发新功能,满足不同科研团队的特定实验需求。

1 需求分析

脑电信号刺激系统是脑电实验所必须的软件,用户通过该刺激系统的参数设置,诱发受试者产生各种类型的脑电信号,包括事件相关电位、稳态视觉诱发电位、运动想象等。

1.1 事件相关电位

事件相关电位(Event-Related Potentials, ERPs) 是一种特殊的脑诱发电位,它通过有意地赋予刺激以特殊的心理意义,利用多个或多样的刺激所引起的脑电位变化来反映认知过程中大脑的神经电生理变化[8-9]。ERPs具有高时间分辨率,能够提供关于认知和感觉处理过程的精确时间信息。

事件相关电位的刺激模式主要包含视觉刺激和听觉刺激两种,其中视觉刺激模式包括不同强度和色调的光、单词、语句、图形、图像、照片等。而听觉刺激模式则包括短声、纯音、语音、言语及其他自然或非自然声音(如流水声、狗叫等) 。

事件相关电位有很多种类的实验范式,常见的ERPs实验范式包括Oddball、Go/No-Go、Stroop效应、Flanker任务、视觉搜索等。以经典的Oddball实验范式为例,它包括两种及以上不同概率的刺激序列,并以特定或随机方式出现。要求刺激持续的时间、两次刺激之间的间隔可以设置为固定值或在特定时间段内随机,不同类型的刺激可以设定出现的概率,单次实验的刺激总数可以设定。图1展示的是一个基于Oddball的实验模式图。

该实验模式中所有的刺激类型分为靶刺激和非靶刺激,其中靶刺激出现的概率为20%,在图中用O标记,而其他的刺激类型全部为非靶刺激,出现概率为80%,在图中用B表示。实验过程包含多组Block,其中Baseline Block和Oddball Block交替出现。每组Block都是先3 000 ms的提示指令,在图中用I表示,然后出现25组刺激指令,每组刺激持续800 ms,然后间隔200 ms再进行下一组刺激,每个Block总长度为28 000 ms。两种Block的区别在于Baseline Block全部出现的是非靶刺激,而Oddball Block有20%概率出现靶刺激。

1.2 稳态视觉诱发电位

SSVEP(steady-state visually evoked potential) 是一种通过视觉刺激引起的稳态脑电位。它是一种特殊的脑电信号,当人眼注视频率固定的视觉刺激时,大脑神经元会以相同的频率同步振荡产生电活动[10]。这种同步振荡的电活动可以通过脑电图记录和分析。如图2所示,我们首先选择实验模式,基于SSVEP的脑电实验模式有多种不同的视觉诱发模式可以选择,比如棋盘格翻转、条栅翻转、单个目标闪烁、目标震荡运动等,然后选择实验参数,包括两个刺激类型的颜色、刺激频率、亮度、大小,以及本组实验需要刺激的次数等。实验参数设定好后可以启动实验,系统会自动在两个刺激类型之间按照设定的实验参数快速翻转,每次翻转后检查是否达到刺激设定的次数,如果达到则结束本组实验,否则继续交替显示两种刺激类型。

1.3 运动想象

运动想象是指在不实际移动的情况下想象人体某部分(例如,肢体) 的运动过程[11]。运动想象脑电实验能分别诱发三种不同的电位:准备电位、运动电位和运动监测电位。如图3所示,该刺激运行一次共7秒钟,其中前两秒为黑屏,然后屏幕中央出现十字并发出Beep声。在第3秒时出现箭头,箭头的方向在上、下、左、右中随机生成。到第4秒时,箭头消失,而十字则在这一轮刺激结束后消失。从第3秒钟箭头出现到第7秒钟刺激结束,受试者必须根据箭头的方向来想象左右手的运动。

2 系统设计

2.1 系统结构设计

脑电信号采集系统的基本结构如图4所示,系统的关键部分位于脑电屏蔽实验室内,该实验室可屏蔽外界的电磁干扰和噪音干扰,同时实验室内部大量采用吸音材料,以防止内部回音对受试者的干扰。脑电信号刺激系统安装在屏蔽室内的电脑上,当系统运行时,通过显示器和耳机将各种图像、文字和声音刺激信号按照实验设计好的刺激模式发送给受试者。受试者接受到视觉和听觉刺激后,大脑会产生相应的脑电波,并导致脑部皮层电位发生相应的变化。该细微的电位变化通过用于脑电采集的高精度电极帽获取并发送给脑电信号放大器。该信号经过A/D转换和放大后,成为原始脑电信号发送给系统单元。系统单元是专门用来采集和处理脑电信号的实验设备之一。与此同时,刺激系统还将刺激类别与动作类别等刺激信号标记通过并口发送到系统单元中。两路信号经过系统单元的汇总和匹配后,一并发给屏蔽室外的采集系统。该采集系统不仅能实时显示原始脑电信号及其基本特征,还能对脑电信号进行存储管理。

2.2 软件模块设计

脑电实验刺激系统的软件模块设计如图5所示。系统运行在一个安装了 .NET 运行与开发环境的电脑上,最底层的模块实现了绘制字符串、图案、图片以及播放音视频等刺激方式的输出功能。这些模块采用的是基于 .NET 的 GDI+ 编程技术以及基于媒体播放器的编程接口来实现,同时还通过调用 winio32.dll 中的接口实现了通过并口卡输出刺激信号与反馈信号的功能。

基于这些基本功能,我们定义了各种脑电实验刺激物以及脑电实验参数在系统中的实现方式。通过将实验刺激物和实验参数传递给底层模块,实现了基本的刺激功能。在系统的最顶层,我们基于多种不同的实验模式定义了多组基于刺激物与实验参数的复杂组合,每一种复杂组合构成一组脑电实验模式,系统基于定义好的实验模式自动完成整个实验过程。

3 系统实现

3.1 刺激信号的发送

该刺激系统必须通过并口卡向采集设备发送刺激信号与反馈信号。以下是用 C# 编写的信号发送代码,它使用了 P/Invoke(平台调用服务) 来调用 Windows 的 WinIO32.dll 库中的相关函数,以便与硬件端口进行交互。首先,我们声明一个外部函数,该函数位于名为winio32.dll的动态链接库中。通过该声明来告诉 .NET 的 Common Language Runtime (CLR) 如何找到并调用这个外部函数。然后声明了一个名为 SetPortVal 的外部函数。这个函数接受三个参数:wPortAddr 是一个指向端口地址的指针,dwPortVal 是要写入端口的值,bSize 是要写入的值的大小(以字节为单位) 。该函数返回一个布尔值,表示操作是否成功。接着,通过私有静态字段存储一个指向特定硬件端口地址的指针。代码中的端口地址被硬编码为 0xe010,这是系统中查询到的并口刺激发送单元的端口地址。然后设置一个公共方法,它接受一个整数参数 WriteValue 来存储要写入端口的值。通过赋值语句后,调用之前声明的 SetPortVal 函数,将端口地址、要写入的值和数据长度作为参数传递。这个调用将尝试将 WriteValue 的值写入到指定的硬件端口。

[DllImport("winio32.dll")] // 声明动态链接库 winio32.dll 中的相关函数

public static extern bool SetPortVal(IntPtr wPortAddr, int dwPortVal, byte bSize);

private static IntPtr data_port = (IntPtr)0xe010; // 数据端口地址 D0-D7 8个端口

public void setDateBuff(int WriteValue) // 定义写入方法,参数 WriteValue 为待写入的值

{

IntPtr m_nport = data_port; // 数据端口地址 data_port

int m_nValue = WriteValue; // 调用 WinIo 库函数 SetPortVal 写端口值

SetPortVal(m_nport, m_nValue, 1); // 将一个字节的值写入指定的 IO 端口

}

3.2 刺激元素的呈现

系统通过控制外部设备(如显示器、扬声器等) 来呈现刺激,可以根据实验设计的要求控制刺激的类型、强度和时间等参数。图6是基于稳态视觉诱发电位的部分刺激图型展示,图中的图型部分通过Graphics类的 FillRectangle方法或者 FillEllipse方法来实现,色彩和亮度部分通过SolidBrush类实现。对于文字类刺激,可以通过Graphics 类的DrawString方法实现,同时使用 Font 类来设置文字的字体和大小,SolidBrush 类设置字体的颜色和亮度。而图片或照片类的刺激则需要使用 Graphics 类的 DrawImage 方法,被绘制的图片素材使用 Image 类的 FromFile 方法进行加载。如果是音频刺激元素,则使用 SoundPlayer 类来实现,而视频刺激元素可用的方法比较多,可以调用多种播放器的开放接口进行播放。

经典小说推荐

杂志订阅