为什么不直接喂原始信号?
想象你递给朋友一段一小时的会议录音,然后问“他们到底决定了什么?”朋友得把整段都听完才能回答。一段原始脑电图窗口就像那段录音:每个通道有成千上万个采样点,大多是冗余的,还掺杂着伪迹,真正和你意图相关的只有极小一部分。
特征提取就是写摘要的过程。你不再保留每个采样点,而是计算出几个能抓住关键信息的数字:某种节律有多强,或者某个时刻出现了多大的波峰。分类器随后只处理这份简短的摘要——这更快、更稳定,也更容易从中学习。
频带功率特征
对于运动想象、稳态视觉诱发电位(SSVEP)这类基于节律的 BCI,有用的信息藏在某个通道、某个频带里集中了多少能量。这个量就是频带功率。当你想象移动左手时,对侧头部的μ 节律(约 8 至 13 赫兹)会下降;频带功率把这种下降变成解码器能读取的一个数字。
一个简单的做法:先用带通滤波器只保留你关心的频率,再测量信号摆动得有多厉害。带通后信号的方差就是其功率的一个干净替代,因为功率本质上就是平均的幅度平方。
import numpy as np
from scipy.signal import butter, filtfilt
# x: one channel of a short EEG window; fs: sampling rate (Hz)
def band_power(x, fs, lo=8, hi=13):
# design an 8-13 Hz bandpass (the mu band)
b, a = butter(4, [lo, hi], btype="band", fs=fs)
# filtfilt filters forward + backward (no phase shift)
xf = filtfilt(b, a, x)
# variance of the band = its power -> one number per window
return np.var(xf)事件相关电位特征
P300 以及其他事件相关电位(ERP)式 BCI 的工作方式不同。这里信号不是靠持续的节律功率讲故事,而是靠在刺激之后固定延迟处出现的一种波形来表达。比如 P300,就是在某个出乎意料或相关的目标闪过之后约 300 毫秒达到顶点的一个正向电压波峰。
因此 ERP 特征不是某个频带里的功率,而是在选定时刻测得的幅度,以刺激为时间起点。常见做法是把窗口对齐到每个刺激,然后在若干时间点(比如从 0 到 600 毫秒每隔 50 毫秒取一次)跨通道采集电压值。把这些值堆叠起来,就得到了你的特征向量。这种特征的“形状”是时间,而不是频率。
保持精简
把每个通道、每个频带、每个时间点的东西全塞进去,听起来很诱人。请克制。当特征很多、而校准数据只有几分钟时,分类器会开始记住那些碰巧和你的标签对上的噪声:它在训练时看起来很出色,一到实时使用就崩溃。这个陷阱叫过拟合,下一篇指南将专门讲它。
有两种应对方法。特征选择只保留真正承载意图的通道和频带,丢掉其余的。降维则把许多原始通道组合成少数几个有信息量的混合。对于运动想象,这与共空间模式(CSP)天然契合——它能在你计算频带功率之前,先学出最能区分两种心理状态的通道混合方式。