基于MATLAB的脑电(EEG)数据预处理与深入处理,结合EEGLAB、FieldTrip等工具箱实现


一、环境配置与数据导入

% 安装必要工具箱(需提前下载)
% EEGLAB: https://eeglab.org/
% FieldTrip: https://www.fieldtriptoolbox.org/
% RIDE Toolbox: http://cns.hkbu.edu.hk/RIDE.htm

% 启动EEGLAB
eeglab;

% 导入数据(支持EDF、BrainVision Analyzer等格式)
[EEG, ~] = pop_biosig('your_data.set'); % 替换为实际文件路径
EEG = eeg_checkset(EEG); % 数据完整性检查

二、预处理流程

1. 通道定位与重参考
% 加载标准电极位置(10-5系统)
eeglab('options', 'channellocations', 'standard-10-5-cap385.elp');

% 重参考至双侧乳突平均
EEG = pop_reref(EEG, {'TP9','TP10'}, 'refloc', {'TP9','TP10'});
2. 滤波与去噪
% 带通滤波(0.5-40Hz)
EEG = pop_eegfiltnew(EEG, 0.5, 40, 128, 'fir1', 0);

% 50Hz陷波滤波
EEG = pop_eegfiltnew(EEG, 48, 52, 128, 'fir1', 0);

% ICA去除伪迹(眨眼、肌电)
[EEG, ~] = pop_runica(EEG, 'extended', 1, 'interupt', 'on');
% 手动识别伪影成分(如成分1为眨眼)
EEG = pop_subcomp(EEG, [1], 0);
3. 分段与基线校正
% 根据事件标记分段(事件代码为100)
EEG = pop_epoch(EEG, {100}, [-0.2 1.0], 'epochinfo', 'yes');

% 基线校正(刺激前200ms)
EEG = pop_rmbase(EEG, [-0.2 0]);
4. 坏导检测与插值
% 基于LOF算法检测坏导(需安装NEAR工具箱)
EEG = pop_selectbad(EEG, 'method', 'lof', 'threshold', 1.5);

% 球面插值修复
EEG = pop_interp(EEG, EEG.chanlocs, 'spherical');

三、深入处理与特征提取

1. RIDE时间分解(认知成分分离)
% 加载RIDE工具箱
addpath(genpath('RIDE_path'));

% 配置分解参数
cfg = struct();
cfg.comp.name = {'S','C','R'}; % S:刺激相关, C:中央成分, R:反应相关
cfg.comp.latency = [0 Inf]; % R成分延迟至反应时间

% 执行分解
[EEG_RIDE, ~] = RIDE(EEG, cfg);

% 提取单试次成分
EEG_RIDE = move3(EEG_RIDE);
2. 时频分析(小波变换)
% 计算事件相关谱扰动(ERSP)
[ersp, itc, times, freqs] = pop_ersp(EEG, 0.5, 40, 128, 0, 1.0, 'method', 'wavelet', 'wavelet', 5);

% 可视化
figure;
contourf(times, freqs, squeeze(mean(ersp,1)), 'LineColor', 'none');
colorbar; title('ERSP Time-Frequency Plot');
3. 功能连接分析(相位锁定值)
% 计算通道间相位锁定值(PLV)
[plv_matrix, ~] = pop_ft_connectivityanalysis(EEG, 'method', 'pli', 'pli_type', 'pli2_unbiased');

% 绘制功能连接网络
figure;
imagesc(plv_matrix);
title('Phase Locking Value Network');

四、机器学习分类(示例:运动想象任务)

% 加载LIBSVM工具箱
addpath(genpath('LIBSVM_path'));

% 准备特征与标签
features = [EEG.data(:,:,1)]; % 选择特定通道特征
labels = EEG.event.latency > 0.5; % 假设0.5s后为运动想象

% 数据标准化
features = zscore(features);

% 10折交叉验证
cv = cvpartition(labels, 'KFold', 10);
acc = zeros(cv.NumTestSets,1);

for i = 1:cv.NumTestSets
    trainIdx = cv.training(i);
    testIdx = cv.test(i);
    
    model = svmtrain(labels(trainIdx), features(trainIdx,:), '-t 2 -c 1 -g 0.1');
    [~, ~, ~, acc(i)] = svmpredict(labels(testIdx), features(testIdx,:), model);
end

disp(['平均分类准确率: ', num2str(mean(acc)*100, '%.2f') '%']);

参考代码 脑电数据的预处理和深入的处理 www.youwenfan.com/contentcsn/96020.html

五、可视化与结果分析

1. 时域波形与地形图
% 绘制原始信号与去噪对比
figure;
subplot(2,1,1);
plot(EEG.times, EEG.data(1,:));
title('原始信号');

subplot(2,1,2);
plot(EEG.times, EEG.data(1,:) - mean(EEG.data(1,:)(@ref)));
title('去基线信号');

% 生成电极地形图
topoplot(squeeze(mean(EEG.data,3)), EEG.chanlocs);
2. 统计检验(ANOVA)
% 比较不同条件下的功率差异
[p, tbl, stats] = anova1(squeeze(mean(ersp,1)), labels);

六、扩展应用场景

  1. 睡眠研究:结合睡眠分期算法,分析慢波(0.5-4Hz)与纺锤波(12-16Hz)
  2. 癫痫检测:基于形态学滤波识别棘慢波
  3. 脑机接口:使用CSP算法提取运动想象特征
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐