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 的本質:先求每個類別的共變異數,再透過廣義特徵值問題得到能最好區分它們的濾波器。