為什麼不直接餵原始訊號?
想像你遞給朋友一段一小時的會議錄音,然後問「他們到底決定了什麼?」朋友得把整段都聽完才能回答。一段原始腦電圖窗口就像那段錄音:每個通道有成千上萬個取樣點,大多是冗餘的,還摻雜著偽訊,真正和你意圖相關的只有極小一部分。
特徵提取就是寫摘要的過程。你不再保留每個取樣點,而是計算出幾個能抓住關鍵資訊的數字:某種節律有多強,或者某個時刻出現了多大的波峰。分類器隨後只處理這份簡短的摘要——這更快、更穩定,也更容易從中學習。
頻帶功率特徵
對於運動想像、穩態視覺誘發電位(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)天然契合——它能在你計算頻帶功率之前,先學出最能區分兩種心理狀態的通道混合方式。