目录

1.脑电信号的特性与预处理

2.深度学习模型的核心架构与原理

2.1 运动想象识别

2.2 情绪识别

2.3 P300电位识别

3.MATLAB简要程序


       脑电信号(Electroencephalogram, EEG)是中枢神经系统活动产生的微弱电信号,通过头皮电极采集,包含人体认知、情感、运动意图等生理信息。基于深度学习的脑电信号内容识别算法,旨在通过深度学习模型自动提取EEG中的关键特征,实现对目标内容(如运动意图、情绪状态、视觉刺激响应等)的精准识别。相比传统机器学习(依赖手工特征提取),深度学习凭借端到端学习自动特征挖掘能力,显著提升了复杂脑电信号的识别性能。

1.脑电信号的特性与预处理

脑电信号的识别性能首先依赖于对其固有特性的处理。EEG具有以下核心特点:

低信噪比:信号幅度仅1-100μV,易受工频干扰(50Hz/60Hz)、肌电(EMG)、眼电(EOG)等噪声污染;

非平稳性:信号统计特性随时间变化(如任务状态切换时);

高维度与稀疏性:多电极采集导致维度高(通常32-256通道),但有效信息可能集中在少数通道;

个体差异:不同被试的EEG波形差异显著,同一被试不同时段的信号也存在变异。

2.深度学习模型的核心架构与原理

       脑电信号的内容识别本质是时空特征建模:空间上,不同电极对应大脑不同区域的活动(如运动区对应C3/C4通道);时间上,信号随任务进程动态变化(如运动想象中β波衰减、μ波抑制)。深度学习模型通过层级结构逐步提取从低级(如局部波动)到高级(如任务相关模式)的特征,核心架构包括卷积神经网络(CNN)、循环神经网络(RNN)、Transformer及其混合模型。

     基于深度学习的EEG内容识别已在脑机接口(BCI)、神经疾病诊断等领域广泛应用:

2.1 运动想象识别

任务:识别用户“左/右手”,“上下肢”等运动意图,用于助残设备控制。

模型选择:CNN-LSTM(捕捉μ/β波的时空变化),在公开数据集BCI Competition IV 2a上,分类准确率可达85%-90%(传统方法约70%-75%)。

运动想象的脑电特征主要与感觉运动皮层(中央前回、中央后回)的节律活动相关,具体表现为事件相关去同步(ERD)事件相关同步(ERS)

ERD:当想象肢体运动时,感觉运动皮层的μ节律(8-13Hz)和β节律(13-30Hz)的能量会短暂降低(去同步),这是运动准备或执行的标志;

ERS:运动想象结束后,μ和β节律的能量会回升(同步)。

例如,想象左手运动时,右侧感觉运动皮层会出现ERD;想象右手运动时,左侧皮层会出现 ERD,这种单侧化特征是识别的关键。

2.2 情绪识别

任务:基于EEG识别“高兴 / 悲伤”“唤醒度/效价”等情绪状态,用于心理评估。

模型选择:Transformer(建模全脑协同活动),在数据集DEAP上,效价分类准确率可达 80%-85%。

情绪相关的脑电活动具有显著的脑区特异性:

1.前额叶皮层:与效价(Valence)相关(左前额叶活跃对应积极情绪,右前额叶对应消极);

2.颞叶、顶叶:与唤醒度(Arousal)相关(高频β节律增强对应高唤醒);

3.边缘系统(如杏仁核):参与情绪的产生与调节,其活动可通过头皮EEG间接反映。

情绪的EEG特征包括:

1.频域:θ波(4-8Hz,前额叶,与情绪加工相关)、α波(8-13Hz,枕叶,低唤醒时增强)、β波(13-30Hz,高唤醒时增强);

2.时域:事件相关电位(ERP)的潜伏期和振幅变化(如情绪图片诱发的P2、N2成分)。

2.3 P300电位识别

识别视觉/听觉刺激诱发的P300波(事件相关电位,约300ms出现),用于拼写器(如“字符输入”)。

模型选择:CNN(捕捉P300的局部时间峰值),在数据集BCI Competition III P300上,字符识别准确率可达95%以上。

P300的产生与大脑的“工作记忆更新” 和 “注意力分配” 相关:

认知机制:当靶刺激出现时,大脑需要更新对刺激序列的预期,该过程激活顶叶-颞叶-前额叶网络,产生P300;

波形特征:潜伏期约300-600ms,振幅约5-20μV,在顶叶中央(Pz 电极)最显著;

信噪比:P300淹没在自发EEG中,需通过多次叠加平均(通常30-100次)提取。


1.信号特性:单次P300信噪比极低(SNR≈-10dB),依赖时间叠加增强信号;

2.刺激范式:Oddball范式(靶刺激占比10%-20%,非靶刺激占80%-90%),如字符拼写系统(P300-Speller)中,闪烁的目标字符为靶刺激;

3.常用数据集:BCI Competition III dataset II(P300-Speller数据)、ERN dataset。

3.MATLAB简要程序

%% 脑电信号识别MATLAB程序
% 功能:基于深度学习的运动想象EEG信号分类
%% 1. 数据准备
% 加载公开数据集(如BCI Competition IV 2a)
load('BCI_Competition_IV_2a.mat'); % 假设数据已下载并包含train_data, train_labels

% 数据预处理
fs = 250; % 采样率(Hz)
bandpass_range = [8 30]; % 带通滤波范围(Hz),对应μ和β节律

% 初始化存储变量
num_subjects = size(train_data, 1);
num_trials = size(train_data, 2);
num_channels = size(train_data{1,1}, 1);
num_samples = size(train_data{1,1}, 2);

% 预处理所有数据
preprocessed_data = cell(num_subjects, num_trials);

for s = 1:num_subjects
    for t = 1:num_trials
        % 带通滤波
        filtered_data = bandpass(train_data{s,t}, bandpass_range, fs);
        
        % 标准化
        mean_val = mean(filtered_data, 2);
        std_val = std(filtered_data, 0, 2);
        preprocessed_data{s,t} = (filtered_data - mean_val) ./ (std_val + eps);
    end
end

%% 2. 特征提取与数据集构建
% 使用小波变换提取时频特征
wavelet_name = 'db4'; % Daubechies小波
decomposition_level = 5;
frequency_bands = {[0 4], [4 8], [8 13], [13 30], [30 45]}; % δ, θ, α, β, γ

features = zeros(num_subjects, num_trials, num_channels, length(frequency_bands));

for s = 1:num_subjects
    for t = 1:num_trials
        data = preprocessed_data{s,t};
        
        % 对每个通道进行小波分解
        for c = 1:num_channels
            % 小波分解
            [cA, cD] = wavedec(data(c,:), decomposition_level, wavelet_name);
            
            % 计算各频带能量
            for b = 1:length(frequency_bands)
                % 根据频带选择对应的系数
                switch b
                    case 1 % δ波
                        coeffs = cA;
                    otherwise % θ, α, β, γ波
                        coeffs = cD{decomposition_level - b + 2};
                end
                
                % 计算能量
                energy = sum(coeffs.^2) / length(coeffs);
                features(s, t, c, b) = energy;
            end
        end
    end
end

%% 3. 构建深度学习模型
% 这里使用深度卷积神经网络(CNN)
% 模型设计参考: https://doi.org/10.1109/TNSRE.2017.2771112

% 定义输入层
inputSize = [num_channels, num_samples, 1]; % 输入维度
inputLayer = imageInputLayer(inputSize, 'Normalization', 'none');

% 定义网络架构
layers = [
    inputLayer
    
    % 空间特征提取
    convolution2dLayer([1 25], 20, 'Stride', [1 1], 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
    
    % 时空特征提取
    convolution2dLayer([num_channels 1], 20, 'Stride', [1 1], 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer([1 5], 'Stride', [1 5])
    
    % 时间特征提取
    convolution2dLayer([1 10], 40, 'Stride', [1 1], 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer([1 2], 'Stride', [1 2])
    
    flattenLayer
    
    % 全连接层和分类器
    fullyConnectedLayer(100)
    batchNormalizationLayer
    reluLayer
    dropoutLayer(0.5)
    fullyConnectedLayer(numel(unique(train_labels)))
    softmaxLayer
    classificationLayer];

% 设置训练参数
options = trainingOptions('sgdm', ...
    'MaxEpochs', 50, ...
    'MiniBatchSize', 32, ...
    'Shuffle', 'every-epoch', ...
    'ValidationData', validationData, ...
    'ValidationFrequency', 30, ...
    'Verbose', false, ...
    'Plots', 'training-progress');

%% 4. 模型训练与评估
% 为演示目的,仅使用一个受试者的数据
subject_idx = 1;
X = zeros(num_trials, num_channels, num_samples, 1);
Y = categorical(train_labels(subject_idx, :));

% 准备训练数据
for t = 1:num_trials
    X(t,:,:,1) = preprocessed_data{subject_idx, t};
end

% 划分训练集和验证集
cv = cvpartition(Y, 'HoldOut', 0.2);
idxTrain = training(cv);
idxVal = test(cv);

XTrain = X(idxTrain,:,:,:);
YTrain = Y(idxTrain);
XVal = X(idxVal,:,:,:);
YVal = Y(idxVal);

% 创建数据存储
trainData = imageDatastore(single(XTrain), 'Labels', YTrain);
validationData = imageDatastore(single(XVal), 'Labels', YVal);

% 训练模型
net = trainNetwork(trainData, layers, options);

%% 5. 模型评估
% 在验证集上评估模型
YPred = classify(net, validationData);
accuracy = mean(YPred == YVal);
fprintf('验证集准确率: %.2f%%\n', accuracy*100);

% 绘制混淆矩阵
cm = confusionchart(YVal, YPred);
cm.Title = '运动想象分类混淆矩阵';
cm.RowSummary = 'row-normalized';
cm.ColumnSummary = 'column-normalized';

%% 6. 可视化特征
% 选择一个样本进行特征可视化
sample_idx = 1;
sample_data = preprocessed_data{subject_idx, sample_idx};
sample_label = train_labels(subject_idx, sample_idx);

% 绘制原始EEG信号
figure;
plot((0:num_samples-1)/fs, sample_data');
title(sprintf('受试者 %d, 样本 %d, 标签: %d', subject_idx, sample_idx, sample_label));
xlabel('时间 (s)');
ylabel('幅度 (μV)');
legend(arrayfun(@(x) sprintf('通道 %d', x), 1:num_channels, 'UniformOutput', false));

% 绘制小波分解的时频特征
figure;
for c = 1:3 % 仅显示前3个通道
    subplot(3,1,c);
    spectrogram(sample_data(c,:), hamming(128), 120, 128, fs, 'yaxis');
    title(sprintf('通道 %d 的时频图', c));
end

%% 7. 模型保存
save('eeg_mi_model.mat', 'net', 'fs', 'bandpass_range', 'wavelet_name');

更多推荐