Matlab绘制运动想象ERD/ERS分析法图像

前言

   绘制Pfurtscheller等人提出的ERD/ERS分析方法[1],该分析在论文中比较常用,因此有必要学习一下如何绘制其图形。

1.步骤

  1. 对脑电信号进行带通滤波 ,频带范围为ERD/ERS现象出现的特征频带;

  2. 计算滤波后的脑电信号每个样本点的平方

  3. 对同类运动想象下的脑电信号做叠加平均

  4. 将得到的平均曲线采用滑动时间窗进行平滑处理

  5. 应用公式(1-1)

    在这里插入图片描述

其中,A为进行运动想象时的EEG,R是进行想象动作前该频段在参考时间内的能量值。

2.数据

   数据用的是BCIcompetition2002二分类MI数据(到我的博客资源就可以下载),x_train为需要绘制ERD/ERS的EEG数据,其维度为[1152 x 3 x 140],即128Hz采样率 x 9s数据(9 x 128=1152),3通道,140trials,其中第1通道对应C3电极,第3通道对应C4电极。而y_train为x_train对应的标签(标签中的1,2分别对应左MI和右MI)。
其电极位置和MI范式说明如下:
在这里插入图片描述
文件结构和数据结构如下:
在这里插入图片描述

3.代码

3.1 plotERDERS.m

%function:plot ERP waveform,author:mao,date:2020-11-24
function plotERDERS(datar1,labelr1,lower,higher,sampleRate,butterOrder,smoothPara)
%input datar1:3维度事件段EEG数据 数据格式[样本点 通道 trials]
%     labelr1:datar1对应的标签
%       lower:带通滤波参数
%      higher:带通滤波参数
%  sampleRate:采样率
% butterOrder:滤波阶数
%  smoothPara:平滑系数
%
%output figure:ERD/ERS图像
dataleft=[];                               %左手MI
dataright=[];                              %右手MI
dataThree=[];                              
k=1;
n=1;
m=1;
for i=1:size(datar1,3)                     %按标签提取tirlas
    if labelr1(i)==1 %L
        dataleft(:,:,k)=datar1(:,:,i);
        k=k+1;
    elseif labelr1(i)==2 %R
        dataright(:,:,n)=datar1(:,:,i);
        n=n+1;
    else
        dataThree(:,:,m)=datar1(:,:,i);
        m=m+1;
    end
end
plotERP(dataleft,lower,higher,sampleRate,butterOrder,smoothPara);                       %左手MI ERD/ERS
title('left hand movement');
plotERP(dataright,lower,higher,sampleRate,butterOrder,smoothPara);                      %右手MI ERD/ERS
title('right hand movement');

3.2 plotERP.m

function plotERP(data,lower,higher,sampleRate,butterOrder,smoothPara)
R_start=1;    %参考时间段R的开始时间
R_end=2;      %参考时间段R的结束时间
%% 频带滤波     
[simplepoint,ch,trials]=size(data); 
for i=1:trials                        %step1:bandpass
    filter_tmp=filter_param(data(:,:,i),lower,higher,sampleRate,butterOrder);
    data(:,:,i)=filter_tmp;
end
%%
C3=0; 
C4=0;
data=permute(data,[1 3 2]);       
data=data.^2;                         %step2:Squaring

for i=1:size(data,2)      %叠加
    C3=C3+data(:,i,1);  %ch1
    C4=C4+data(:,i,3);  %ch3
end
C3=C3/trials;                         %step3: Averaging over N triasl
C4=C4/trials;

C3=smooth(C3,smoothPara);             %step4: smoothing
C4=smooth(C4,smoothPara);

C3mean=C3(sampleRate*R_start:sampleRate*R_end-1);                  
C4mean=C4(sampleRate*R_start:sampleRate*R_end-1);

C3m=0;
C4m=0;
for i=1:sampleRate
    C3m=C3m+C3mean(i);
    C4m=C4m+C4mean(i);
end
C3m=C3m/sampleRate;
C4m=C4m/sampleRate;
C3=((C3-C3m)/C3m)*1;                   %step5:A-R/R*100%               
C4=((C4-C4m)/C4m)*1;


figure;                                  
plot(C3,'r','LineWidth',2);
hold on
plot(C4,'b','LineWidth',2);
legend('C3','C4');
xlim(gca,[0 1152]);
set(gca,'XTick',[0 128 256 384 512 640 768 896 1024 1152],'XTickLabel',...
    {'0','1','2','3','4','5','6','7','8','9'});

3.3 filter_param.m

%% 对数据进行滤波
%输入:data 待滤波EEG数据
%   low        高通滤波参数设置
%   high        低通滤波参数设置
%   sampleRate          采样率
%   filterorder  butterworth滤波器阶数
%返回:filterdata       滤波后EEG数据
function filterdata=filter_param(data,low,high,sampleRate,filterorder)
%% 设置滤波参数
 filtercutoff = [low*2/sampleRate high*2/sampleRate];  %带通频率filtercutoff
[filterParamB, filterParamA] = butter(filterorder,filtercutoff); %butter(param1,param2):param1为butterworth滤波器阶数,param2为带通频率
 filterdata= filter( filterParamB, filterParamA, data);

结果

命令行调用函数运行

plotERDERS(x_train,y_train,8,12,128,6,80); 

   下图为左右手运动想象时的ERD/ERS图像,其中运动想象时间为3-9s(下图中虚线即为MI任务提示开始时间)。
   plotERDRES.m中的输入参数会影响ERDERS绘制出来的形状,虽然参数不同细节有所不同,但曲线大体趋向还是相似的。
在这里插入图片描述

最后

   步骤中的R的值我是取了进行想象前的1-2 s内这一段时间的1s数据(对应plotERP.m中的R_start=1以及R_end=2),然后对这1s数据取平均,不知道这样做是否合理。下图中的阴影部分为论文中的R。
在这里插入图片描述
参考文献:
[1] Pfurtscheller G, Lopes da Silva FH. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology, 1999, 110: 1842~1857.

  • 20
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,针对你的问题,我们可以使用MATLAB中的fft和mean函数来求解平均功率谱,并观察ERD/ERS现象。具体实现步骤如下: 1. 首先,我们需要读入数据,可以使用MATLAB中的load函数,假设读入的数据存储在变量left_data中。 2. 然后,我们需要选定第一维度第一列,可以使用MATLAB中的冒号操作符,即left_data(:,1,:),表示选取第一维度所有数据,第二维度第一列,第三维度所有数据。 3. 接下来,我们针对12次数据,对第三维度数据求平均功率谱。具体实现方式如下: ```matlab % 获取数据维度 [n1, n2, n3] = size(left_data); % 初始化功率谱矩阵 power = zeros(n1, n3); % 计算每一次数据的功率谱,并求平均 for i = 1:n2 % 选取当前数据 data = left_data(:,i,:); % 计算功率谱 P = abs(fft(data).^2)/n3; P = P(:,1:n3/2+1); P(2:end-1,:) = 2*P(2:end-1,:); % 累加功率谱 power = power + P; end % 求平均功率谱 power = power/n2; ``` 在上述代码中,我们使用了MATLAB中的fft函数来计算功率谱,然后对结果进行了相应的处理,最后累加得到了所有数据的功率谱,最终求出平均功率谱。 4. 最后,我们可以观察ERD/ERS现象。具体实现方式如下: ```matlab % 获取频率范围 fs = 1000; % 假设采样频率为1000Hz f = linspace(0, fs/2, n3/2+1); % 计算ERD/ERS baseline = mean(power(:,f<20), 2); % 假设基线频率范围为[0,20]Hz ERS = power ./ baseline - 1; % 绘制ERD/ERS图像 imagesc(ERS'); colormap(hot) colorbar ``` 在上述代码中,我们首先获取了频率范围,然后计算了基线功率谱,接着计算ERD/ERS,并最终绘制图像。 以上就是MATLAB代码和思路,希望能够帮到你!
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值