在時間與空間上清理
想像你在嘈雜的咖啡館裡試圖聽清一位朋友說話。你可以做兩件很不一樣的事。第一,你可以只留意他們聲音的音高,忽略空調的低沉轟鳴和咖啡機的高頻嘶嘶聲——這就是在時間上清理(按頻率)。第二,你可以用雙耳判斷聲音來自哪個方向並轉過去——這就是在空間上清理(按位置)。
腦訊號也是一樣。時域濾波器只保留有用的頻率範圍,丟棄其餘部分。空間濾波器則同時組合多個電極,銳化訊號來自頭皮何處的判斷。兩者互補,大多數腦電圖(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)