查看原文
其他

精华帖 | 心理学MATLAB初学者教程 -- 脑电数据读取

2017-01-18 gsc07 我爱脑科学网

点击上面蓝字   订阅

关注前沿脑科学研究及其应用,为脑科学研究/关注者提供交流平台。

1

NeuroScan数据类型

1、CNT数据

 CNT数据数Neuroscan收集的原始数据,是一种连续的数据,这类数据的一个特点就是大,一般用32导的电极帽收集差不多一个小时的数据大约有200多M的样子。在这个数据当中保存有原始数据,trigger,电极信息以及脑电配置等的信息。这些内容按照一定的组织方式放在一起,具体的组织内容会在下面详细的列出。此类数据用eeglab是可以直接读取的,但一般来说32位的matlab读取超过100MB的数据基本就出出现out of memory的错误。


2、EEG数据

 在BP系统当中也有一个后缀是eeg的数据,但那个数据和这里的eeg数据完全不同,所以虽然后缀相同,但读取的方式是截然不同的。Neuroscan的EEG数据是将cnt按照事件或者其它的一些东西分段之后得到的数据。由于这类数据只是cnt当中的一部分,所以相对CNT来说会小很多。但在这类数据当中所包含的信息基本和cnt数据所包含的信息一样多。当然eeglab也可以读取此类数据,并且如果你的机器无法打开cnt数据的时候,将原始数据处理成eeg在用eeglab分析可能是更好的选择,当然要是自己编程处理,那么就无所谓了。


3、AVG数据

从后缀上可以知道,这个数据是将eeg数据做平均之后得到的数据(在做频谱分析的时候也会出来这样的数据,但可能用到的不多)。这类数据是三种数据当中最小的数据,其所包含的信息也同样小了很多,在这类数据当中有平均后的数据,还保留有其方差信息(推测是用来做点对点t检验的),电极信息以及之前的一些操作的参数信息。在eeglab的gui当中似乎没有直接读取这类数据的方法(不知道新版本的eeglab中是否能读,但在eeglab的函数库中可以找到读取此类数据的函数)。



2

BP数据类型

对于BP系统的处理软件我接触的很少,所以对于BP处理的过程数据格式我不是很了解,在这里可能只能介绍一下BP系统收集的原始数据的类型。


1、EEG数据

 用BP收集数据可能给我留下最大的一个形象就是数据好多,收集一个数据会出来至少三个文件。EEG文件是最大的一个文件,这个文件就保存有原始的数据,这里是连续的数据。并且在这个文件当中除了数据之外就没有任何其他的信息了。


2、vhdr文件

这里我就不用数据这个词了,这个文件是用来保存这个数据的电极信息以及相关的配置的参数信息。这个文件其实可以使用写字板打开,打开之后就可以直接看到很多信息,这里我就不一一说了。


3、vmrk 文件

 同样可以用写字板打开,里面主要保存着打标的一些信息。


         

3

Neuroscan数据的组织方式

1、CNT数据

前面说了cnt数据当中包含了很多的信息,这些信息是按照一定的组织方式安放在这个数据中,只要我们知道具体的组织方式,那么就很容易的就可以读取我们想要的信息。对于cnt数据来说,其组织方式如下:

         第一部分:头信息(在这部分信息当中保存有采样率,采样点数,放大倍数等等一系列信息)


         第二部分:电极信息(包括电极的名称,是否显示在软件上,是否是坏电极,是否skip这个电极等等,如果在处理数据时候需要知道一个电极是否标为坏电极,就在这里可以找到)


         第三部分:数据信息(这里就是记录了所有的数据,数据的储存有两种方式,一种是int16,另外一种方式是int32,现在一般我们储存的方式是int32。所以直接用eeglab里面loadcnt这个函数读取数据的时候,在默认情况下是用int16的方式读取的,所以这样读取原本是一小时的数据,读完之后计算一下似乎变成两小时,并且在读取的数据中有很多零存在。如果是这个问题,就需要在loadcnt这个函数中添加一个参数'dataformat','int32'。)


         第四部分:事件信息(这里就是打标了,在这里会有打标内容,打标所对应的时间点等)


  第五部分:其它(这块我还真没弄懂是用来做啥的,但可能和软件显示有一定的关系,比如坐标是上正下负还是上负下正,以及一些防盗版的信息。可能用neuroscan的都知道在外面流传着一个盗版的neuroscan,但用这个盗版的软件无法打开用正版软件收集的数据,其就是再这块有个放盗版的信息,只需要将这里稍微改一下,就可以用那个盗版的neuroscan打开正版收集的数据,为了人家版权,我也就不公开是在哪里改了。。。大家自重哈~)


2、EEG数据

对于EEG数据我不是特别清楚其构造,也没细致的去了解它,但如果没猜错和cnt的构造差不多,但可能在数据信息那块以及事件那块有所不同,如果有对此类数据感兴趣的同学可以参看eeglab函数库中一个叫loadeeg的函数。


3、AVG数据

AVG数据前两部分和CNT几乎一模一样


         第三部分:数据信息并且加简单的电极信息(在这里电极信息只有名称,并且这里数据的存储并不是用μV的格式存的,读取出来要做相应的变化,如果有问题可以翻函数去看看)


         第四部分:数据方差信息(这块可能是在软件中用于做点对点T检验,但一般不会显示在软件中)


         第五部分:其它(这里是真心不知道是啥,但全部都是0似乎也没问题,只要数据长度保证就没问题)



4

BP数据的组织方式

1、BP数据

在前面介绍,BP数据的存储都是以一个个的文件分开存,所以要提取一些信息要比Neuroscan方便很多。其中事件信息以及电极信息都可以通过用写字板打开直接获得,这里也就不多说了。EEG数据的储存也并不是恒定不变的,其储存格式,还有数据类型神马的都在vhdr文件中有,仔细阅读vhdr文件就能知道eeg数据是如何储存的。


5

Neuroscan数据的读取

1、CNT数据

在eeglab当中有专门读取cnt数据的函数,但可能不熟悉matlab的同学只能通过gui界面上的菜单来读取数据,这样不便于程序化处理数据,所以这里就介绍一下用程序读的方法。

函数:loadcnt

用法:cnt = loadcnt(file, varargin)


变量介绍:

cnt:这是一个结构体,结构体在前面没有详细的讲过,所以在这里顺带提一下,结构体你可以把它想成一个变量的集合,在这个结构体当中会有下面这些变量

cnt.header      cnt文件头信息,在这里可以看到很多配置的信息

cnt.electloc      cnt文件的电极信息

cnt.data        cnt文件的数据信息(数据就在这个里面)

cnt.tag         cnt的其它一些信息

file:文件名,如果数据文件在matlab当前的路径下,直接写文件名就好,如果不是要写明完整的路径


注意:这里一定要加'dataformat','int32'这个参数!!!否则读出来的数据会有问题。


2、EEG数据

我没怎么用函数读取过eeg数据,这个函数是在eeglab淘出来,这个函数不保证能正常工作,但大家可以尝试用一下,我这边也米有eeg数据,所以没办法尝试。


函数:loadeeg

用法:[signal, accept, typeeeg, rt, response, chan_names, pnts, ntrials,srate, xmin, xmax] = loadeeg( filename, chanlist, triallist, typerange, accepttype,rtrange, responsetype)


变量介绍:(这里我就直接粘贴了,有问题可以在下面问)

Inputs:

filename     - [string] InputNeuroscan .eeg file      

chanlist     - [integer array]Only import selected channels


  Ex: [3,4:10] {default: 'all'}


triallist    - [integer array]Only import selected trials {default: import all}


typerange    - [integer array]Only import trials of selected type


                 {default: import all}


accepttype   - [integer array]Only import trials with the selected


                 'accept' field values{default: import all}


rtrange      - [float array] [minmax] (ms) Only import trials with subject


                 reaction times in this range{default: import all}

responsetype - [integer array] Only import trials with selected


                 response type values {default:import all}


format       - ['short'|'int32'|'auto']data format. Neuroscan v4.3+ assume 32-bit data


                 while older versions assume16-bit. {default: 'auto' = Determine}


Outputs:


signal       - Output signal ofsize (trials, points)   

accept       - [1/0] vector of valuesfor the accept field (one per trial)

typeeeg      - [Integer] valuesfor the accept type (size 1,trials)

rt           - [float] values forthe accept rt (size trials)

response     - [Integer] valuesfor the accept response (size 1,trials)

chan_names   - ['string' array]channel names

pnts         - Number of timepoints per trial

ntrials      - Number of trials

srate        - Sampling rate (Hz)

xmin         - Trial start latency(ms)

xmax         - Trial end latency(ms)


3、AVG数据

函数:eeg_load_scan4_avg

用法:[f,fid] = eeg_load_scan4_avg(filename)


变量介绍:

f:这是一个结构体,里面包含了avg数据的所有内容,类似于读cnt的那个函数的输出变量,这个结构体里面包含

f.header        - general header parameters

f.electloc      - channel specific parameters

f.data.header   - small channel data header

f.data.samples  - channel data (not uV)

f.variance      - channel variance

f.tag           - scan4.1 file tags

fid: 文件的一个指针,这里基本没啥用

filename:文件名,和loadcnt当中的file一样。



6

BP数据的读取

1、BP数据

函数:pop_loadbv()

使用方法:


%  >> [EEG, com] = pop_loadbv; % pop-up window mode


%  >> [EEG, com] = pop_loadbv(path, hdrfile);


%  >> [EEG, com] = pop_loadbv(path, hdrfile, srange);


%  >> [EEG, com] = pop_loadbv(path, hdrfile, [], chans);


%  >> [EEG, com] = pop_loadbv(path, hdrfile, srange, chans);


其中最常用的是[EEG, com] = pop_loadbv(path, hdrfile);


这里面path是bp数据的存放目录(不包括文件名),hdrfile是文件名,不包括后缀


可以注意到这个函数前面会有pop字样,这类函数基本和gui界面有关,所以在这里如果不知道怎么使用这个函数,可以直接输入[EEG, com] = pop_loadbv,就会弹出对话框和你交互。



7

数据读取总结

上面是eeglab自带的读取数据的函数,私以为这些函数虽然用起来很好用,但由于做很多判断导致速度很慢,所以根据数据的类型自己写了几个比较方便使用的函数可以和大家分享一下:

读取neuroscan的CNT数据

这里有三个函数

chan = load_channel(filename) 用来读取cnt数据的电极信息


filename 是一个字符串,指cnt文件的文件名路径


chan是一个cell,存储所有电极的名称,顺序和后面读取的数据顺序一致

event = load_event(filename)   用来读取cnt数据的事件信息


filename是一个字符串,指cnt文件的文件名路径


event 是一个n*2的矩阵,第一列表示事件的标,第二列表示对应的数据点(这个数据点表示采的第几个点,和采样率有关系,比如采样率为1000,那么第234990个点就是从开始记录第234.99秒打的标)


读取BP数据

同样三个函数


chan = loadbv_chan(filename)或者[chan,hdr] = loadbv_chan(filename)


其中filename是BP的vhdr文件的路径,这个函数的用法和上面的不同是这里filename不要加后缀。


返回的chan和上面一样,并且这里可以多让它输出一个hdr的变量,这个变量是存储着一些信息,这些信息是用来后面读取data的

event = loadbv_event(filename)  读取BP数据的事件信息


返回的变量同load_event,但唯一区别是这里filename是vmrk的文件名,但不加后缀

data =loadbv_data(filename,hdr,srange,chans) 读取BP数据

用法同load_data ,但这里文件名是BP的eeg数据文件名,不加后缀,并且需要多加一个变量hdr,这个变量是通过loadbv_chan 获取的。srange是要输出数据的时间点,chans是要输出的电极指标

譬如:data=loadbv_data(‘sub-01’,hdr,[1,100],[1,3,5])


(编辑/陈锐   52brain公众号编辑部)






52brain,Connect Young Brains.

谈谈本文,如果想收获更多

请点击左下角“阅读原文”的原创帖中留下你的评论。

--52brain我爱脑科学网﹣﹣

专业、分享、真诚、民主


▼▼▼点击左下角“阅读原文”可以访问52brain原帖。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存