JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

滤波与空间滤波器

在任何[[brain-computer-interface|脑机接口]]能解码你的意图之前,原始信号都需要清理。学习承担主要工作的两种清理方式:挑选频段的时域滤波器,以及组合电极的空间滤波器。

在时间和空间上清理

想象你在嘈杂的咖啡馆里试图听清一位朋友说话。你可以做两件很不一样的事。第一,你可以只留意他们声音的音高,忽略空调的低沉轰鸣和咖啡机的高频嘶嘶声——这就是在时间上清理(按频率)。第二,你可以用双耳判断声音来自哪个方向并转过去——这就是在空间上清理(按位置)。

脑信号也是一样。时域滤波器只保留有用的频率范围,丢弃其余部分。空间滤波器则同时组合多个电极,锐化信号来自头皮何处的判断。二者互补,大多数脑电图(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
用 SciPy 实现 8–30 赫兹带通。使用 filtfilt(而非 lfilter)可避免信号在时间上发生偏移。

空间滤波器: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)
CSP 的本质:先求每个类别的协方差,再通过广义特征值问题得到能最好区分它们的滤波器。