在时间和空间上清理
想象你在嘈杂的咖啡馆里试图听清一位朋友说话。你可以做两件很不一样的事。第一,你可以只留意他们声音的音高,忽略空调的低沉轰鸣和咖啡机的高频嘶嘶声——这就是在时间上清理(按频率)。第二,你可以用双耳判断声音来自哪个方向并转过去——这就是在空间上清理(按位置)。
脑信号也是一样。时域滤波器只保留有用的频率范围,丢弃其余部分。空间滤波器则同时组合多个电极,锐化信号来自头皮何处的判断。二者互补,大多数脑电图(EEG)处理流程都会在任何解码之前同时应用这两者。
时域滤波器:带通与陷波
带通滤波器就像只放行特定年龄段客人的门卫:低于下限和高于上限的信号都被挡在门外。对于运动任务,你通常保留大约 8–30 赫兹,这覆盖了μ 节律和 β 频段——即你想象动作时会发生变化的节律。所有更慢(如漂移)或更快(如肌肉噪声)的成分都被剔除。
陷波滤波器在极窄的范围内做与带通相反的事:它移除某一个狭窄的频率。它的主要任务是消除来自市电的稳定嗡嗡声——世界许多地区是 50 赫兹,北美是 60 赫兹——这种声音会渗入每一次记录。把它想成专门针对那一个恼人音调的、非常精确的单一静音键。
from scipy.signal import butter, filtfilt # Design an 8-30 Hz bandpass (4th-order Butterworth). # fs is the sampling rate in Hz; here 250 Hz. fs = 250 b, a = butter(4, [8, 30], btype='band', fs=fs) # filtfilt runs the filter forward AND backward, # so the cleaned signal has zero phase delay. clean = filtfilt(b, a, raw_eeg) # raw_eeg: 1-D samples
空间滤波器:CAR 与拉普拉斯
有些噪声会同时击中每一个电极——一次咬牙、一道市电尖峰、参考电极的缓慢漂移。正因为它是共享的,你就可以估计它并把它减去。共平均参考(CAR)做的正是这件事:它对所有通道求平均以猜测共享部分,再从每个通道中减去这个平均值。留下来的,就是各个位置上真正不同的那一部分。
拉普拉斯滤波器更局部。它不是减去每个通道的平均,而是只减去某个电极最近邻居的平均。这就像锐化照片:它增强正发生在那一个电极正下方的活动,并抑制与周围共享的宽泛、模糊的活动。CAR 和拉普拉斯都能消除共享的噪声(伪迹)——CAR 去除全局共享的杂质,拉普拉斯去除局部共享的模糊。
CSP:学习最佳空间滤波器
CAR 和拉普拉斯是固定的配方——它们对所有人都用同样的权重。[[common-spatial-patterns|共空间模式(CSP)]]则从你的数据中学习电极权重。给定两个需要区分的状态——比如在运动想象中想象动左手还是动右手——CSP 会找到一种电极组合,使带功率(你所选频段中的能量)在一个状态下尽可能大、在另一个状态下尽可能小。
结果是一个专门为最大化这两个状态之间对比而调校的空间滤波器——远比一刀切的配方更具区分力。这种能力是有代价的:CSP 需要带标签的校准数据(你已经标注为「左」或「右」的记录)才能学习。没有标签,就没有 CSP。
# CSP, conceptually (pseudocode). # X1, X2: band-filtered trials for class 1 and class 2. C1 = average_covariance(X1) # how channels co-vary, class 1 C2 = average_covariance(X2) # how channels co-vary, class 2 # Solve a generalized eigenproblem: find weight # vectors W that maximize C1's variance while # minimizing C2's (and vice versa). W = generalized_eigenvectors(C1, C2) # Keep the most extreme filters (highest + lowest # eigenvalues); apply them to project new trials. features = log_band_power(W @ new_trial)