逆元装置 ▍ INVERSION

丽·芙

CONSTRUCT — LIV
▍
意识海深度 · 回廊稳定
逆元装置 · 待机中
指挥官链接 · 未认证

EEG脑电解码入门:从信号预处理到分类算法

公開日: 2025-04-15 00:00 1008文字 6 min read

この投稿は「日本語」では表示できません。元の投稿を表示しています。
以运动想象EEG信号为例,系统介绍脑电信号的预处理、特征提取与分类方法。

引言

脑电图(EEG)是一种非侵入性地记录大脑皮层电活动的方法。通过在头皮上放置多个电极,我们可以获取毫秒级别的神经活动数据。运动想象(Motor Imagery)EEG 是 BCI(脑机接口)领域最经典的研究范式之一——被试想象自己左侧或右侧肢体运动时,大脑的感觉运动皮层会产生特定的节律变化。

EEG 信号的三大挑战

EEG 信号有三个致命问题:

  1. 信噪比极低。脑电信号在微伏级(μV),而眨眼(EOG)、肌肉活动(EMG)、电源线干扰(50Hz)的幅度可能数倍于此。
  2. 非平稳性。同一个被试在不同时间的脑电特征可能完全不同,甚至同一次实验内的信号也会随时间漂移。
  3. 空间分辨率低。电极之间的信号存在容量传导效应(volume conduction),单个电极记录的信号实际上是多个脑区的混合。

预处理流程

带通滤波

运动想象相关的大脑节律主要集中在 μ 节律(8-12Hz)和 β 节律(13-30Hz)。我们使用 Butterworth 带通滤波器:

from scipy.signal import butter, filtfilt

def bandpass_filter(data, lowcut, highcut, fs, order=5):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    return filtfilt(b, a, data)

filtered_data = bandpass_filter(raw_eeg, 8, 30, fs=250)

ICA 去除伪迹

ICA(独立成分分析)可以将混合信号分解为统计独立的成分,从而识别并去除眨眼、肌肉活动等伪迹:

from sklearn.decomposition import FastICA

ica = FastICA(n_components=n_channels, random_state=42)
sources = ica.fit_transform(filtered_data.T).T

# 识别并置零眼电成分(通常位于额头电极权重最高的成分)

# 重构信号 = mixing_matrix × cleaned_sources
cleaned_data = ica.mixing_ @ cleaned_sources

特征提取:CSP

共空间模式(CSP)是运动想象 BCI 中最经典的特征提取方法。它的核心思想是寻找一组空间滤波器,最大化两类信号的方差差异。

from sklearn.covariance import EmpiricalCovariance

# 计算两类试验的协方差矩阵均值
R1 = np.mean([np.cov(trial1) for trial1 in class1_trials], axis=0)
R2 = np.mean([np.cov(trial2) for trial2 in class2_trials], axis=0)

# 广义特征分解
eigvals, eigvecs = scipy.linalg.eigh(R1, R1 + R2)

# 取最大和最小特征值对应的特征向量
W_csp = np.hstack([eigvecs[:, :m], eigvecs[:, -m:]])

# 特征:滤波后信号的 log-variance
features = np.log(np.var(W_csp.T @ trial, axis=1))

CSP 提取的特征具有良好的可分性,尤其适合二分类运动想象任务。

分类方法对比

在 PhysioNet EEG Motor Movement/Imagery 数据集上的实验结果:

方法特征分类器准确率
基线功率谱密度SVM62.3%
改进CSP(3对滤波器)SVM78.1%
深度原始信号EEGNet83.5%
SOTAFBCSP(滤波器组CSP)SVM85.2%

深度学习:EEGNet

EEGNet 是专门为 EEG 设计的轻量级 CNN,包含深度可分离卷积和逐点卷积:

class EEGNet(nn.Module):
    def __init__(self, n_channels, n_classes):
        super().__init__()
        # 时间卷积 + 空间卷积
        self.block1 = nn.Sequential(
            nn.Conv2d(1, F1, (1, kernel_size), padding='same'),
            nn.Conv2d(F1, F1 * D, (n_channels, 1), groups=F1),
            nn.BatchNorm2d(F1 * D),
            nn.ELU(),
            nn.AvgPool2d((1, 4))
        )
        # 可分离卷积
        self.block2 = nn.Sequential(
            nn.Conv2d(F1 * D, F2, (1, 16), groups=F1 * D),
            nn.Conv2d(F2, F2, (1, 1)),
            nn.BatchNorm2d(F2),
            nn.ELU(),
            nn.AvgPool2d((1, 8))
        )
        self.classifier = nn.Linear(F2 * t, n_classes)

EEGNet 之所以有效,是因为它的设计充分利用了 EEG 信号的两个结构先验:时间维度的卷积可以捕获节律信息,空间维度的深度可分离卷积可以学习通道之间的相关性。

前景与挑战

肌肉信号识别已经非常成熟(肌电假肢的准确率可达 95%+),但脑电的准确率天花板仍在 80%-90% 之间。这是因为头骨和硬脑膜就像一道厚重的雾,大脑皮层发出的微弱电信号传到头皮时已经高度模糊。

但随着新型传感器(干电极、微针阵列)和算法的进步,以及 Transformer 在时序建模上的强大能力,BCI 领域正处在一个令人兴奋的拐点。