接口控制設(shè)備位移:從視覺閃爍到實(shí)時(shí)指令全流程解析)
簡介面向腦機(jī)接口與EEG信號(hào)處理學(xué)習(xí)者這是一份基于穩(wěn)態(tài)視覺誘發(fā)電位SSVEP實(shí)現(xiàn)設(shè)備位移控制的Python項(xiàng)目資源。項(xiàng)目融合人工智能分類算法與OpenBCI硬件利用Psychopy呈現(xiàn)4種不同頻率6.6Hz、7.5Hz、8.57Hz、10Hz的視覺刺激并以60Hz刷新率屏幕驅(qū)動(dòng)實(shí)驗(yàn)為BCI范式設(shè)計(jì)與實(shí)時(shí)系統(tǒng)落地提供了可復(fù)現(xiàn)的代碼與數(shù)據(jù)采集方案。壓縮包共4個(gè)文件包含md格式的README說明、py格式的算法腳本、ipynb格式的OpenBCI數(shù)據(jù)處理與MNE分析筆記以及png刺激圖片樣例整體僅492KB結(jié)構(gòu)精簡、便于快速上手。目前已有182人學(xué)習(xí)適合希望入門SSVEP-BCI、掌握EEG分類流程或開展低成本腦機(jī)接口實(shí)驗(yàn)的開發(fā)者參考。通過閱讀腳本與notebook可了解從視覺刺激編碼、腦電信號(hào)記錄到模式分類的完整鏈路并在此基礎(chǔ)上擴(kuò)展實(shí)時(shí)控制功能。1. SSVEP腦機(jī)接口控制設(shè)備位移視覺閃爍如何變成一路移動(dòng)指令要把一輛輪式小車在房間里挪到指定位置給它裝一個(gè)穩(wěn)態(tài)視覺刺激SSVEP腦機(jī)接口整個(gè)鏈路短得驚人屏幕上幾個(gè)按固定頻率閃爍的方塊操作者把注意力放到其中一個(gè)上大腦枕區(qū)就會(huì)產(chǎn)生同頻率的誘發(fā)電位識(shí)別這段腦電“看哪里”就變成“往哪走”。這是目前腦機(jī)接口里離產(chǎn)品化最近的控制方式之一——不需要訓(xùn)練動(dòng)作想象、不會(huì)像P300那樣逐字符憋速度。適合誰做準(zhǔn)備搭第一套實(shí)時(shí)腦機(jī)接口原型的研究生、做無障礙設(shè)備樣機(jī)的工程師以及手里有腦機(jī)接口數(shù)據(jù)集、想從離線轉(zhuǎn)到在線識(shí)別的算法團(tuán)隊(duì)。不過先說一個(gè)反直覺結(jié)論這套系統(tǒng)的可靠性大半不由算法決定而是由刺激屏刷新率和電極貼合質(zhì)量決定。2. 刺激信號(hào)與采集SSVEP位移控制的地基出錯(cuò)率比算法高得多刺激端和采集端決定了這套系統(tǒng)的下限。很多人拿到開源代碼先調(diào)分類器發(fā)現(xiàn)準(zhǔn)確率卡在70%上不去換特征、換模型也救不回來——大概率是前面兩個(gè)物理環(huán)節(jié)出了問題。這一章把前半段講透為什么位移控制場景應(yīng)該選SSVEP刺激屏幕上每個(gè)方塊的頻率到底怎么定電極戴在哪、怎么接才不會(huì)把信號(hào)做成噪聲。2.1 為什么位移控制優(yōu)先選SSVEP和運(yùn)動(dòng)想象、P300擺在一起比腦機(jī)接口里能用來控制設(shè)備的候選范式常見就三樣運(yùn)動(dòng)想象、P300、SSVEP。運(yùn)動(dòng)想象讓用戶想象左手或右手運(yùn)動(dòng)調(diào)制感覺運(yùn)動(dòng)皮層的μ節(jié)律好處是不需要外部刺激但普通用戶要訓(xùn)練一到兩周才能穩(wěn)定輸出而且腦狀態(tài)波動(dòng)大上一分鐘還順手、下一分鐘就不出指令。P300靠小概率事件的誘發(fā)響應(yīng)準(zhǔn)確率高但每出一個(gè)指令平均要疊加很多次刺激速度上不去適合字符拼寫不適合控制一臺(tái)需要連續(xù)轉(zhuǎn)向的設(shè)備。位移控制真正要的是三件事指令切換快、可以連續(xù)輸出、新用戶上手快。SSVEP恰好都滿足視覺刺激一旦穩(wěn)定枕區(qū)信號(hào)的頻率就跟刺激頻率鎖在一起不需要積累幾十次試次一個(gè)1秒左右的窗口就能出一次決策四個(gè)指令就放四個(gè)不同頻率的方塊盯哪個(gè)就出哪個(gè)。常見做法是把四個(gè)頻塊按上、下、左、右擺成十字布局刺激頻率各不同這樣方向映射直觀用戶不用記。邊界條件也得分清楚SSVEP要求屏幕一直亮著、用戶能主動(dòng)注視目標(biāo)閉眼休息時(shí)系統(tǒng)沒有輸入另外視覺閃爍對(duì)光敏性癲癇人群有誘發(fā)風(fēng)險(xiǎn)實(shí)驗(yàn)前要做健康篩查這一點(diǎn)在往產(chǎn)品走時(shí)尤其不能跳過。2.2 刺激端參數(shù)屏幕刷新率決定可用頻率先把這張表算清楚刺激頻率不是隨便填的。常見顯示器刷新率是60Hz或100Hz刺激方塊的亮暗翻轉(zhuǎn)必須按“整數(shù)幀周期”來變。比如60Hz屏幕上要出一個(gè)7.5Hz的閃爍意味著一個(gè)周期持續(xù)8幀亮度按每8幀翻轉(zhuǎn)一次如果你設(shè)了9.3Hz每周期折合6.45幀那么有的周期7幀、有的周期6幀相位一直在漂視覺皮層收到的不是穩(wěn)定頻率調(diào)制CCA算到天上去也識(shí)別不好。下表是我在60Hz屏上常用的候選頻率組核心邏輯是“60除以頻率必須是整數(shù)”候選頻率Hz每周期幀數(shù)60Hz屏0.8s窗口內(nèi)周期數(shù)實(shí)際表現(xiàn)7.586低頻響應(yīng)強(qiáng)閃爍感明顯盯久容易累8.5776.9四指令組里的常用檔位1068均衡適合做默認(rèn)頻率1259.6響應(yīng)略弱但疲勞感低15412部分個(gè)體響應(yīng)弱慎用相鄰頻率間隔至少要1Hz以上太近了CCA得分難分開。若你的屏幕是100Hz刷新率可選的頻率就是5、6.67、10、12.5、20這一類。我一般會(huì)拿一個(gè)光電二極管貼在屏幕上實(shí)測實(shí)際刷新率因?yàn)椴簧亠@示器標(biāo)稱60Hz實(shí)際是59.94Hz差了這一點(diǎn)長時(shí)間運(yùn)行時(shí)相位積累會(huì)讓刺激質(zhì)量悄悄劣化。刺激塊本身也有講究每個(gè)方塊邊長不小于5度視角四周留出足夠間距避免余光串?dāng)_背景亮度和方塊對(duì)比度盡量均勻免得用戶盯著某一塊時(shí)瞳孔大小變化影響視覺輸入。整套刺激用黑底白塊或黑白反轉(zhuǎn)都行關(guān)鍵是所有塊用同一個(gè)刷新機(jī)制驅(qū)動(dòng)不要在程序里用定時(shí)器去軟件翻轉(zhuǎn)否則幀同步問題會(huì)把前面的頻率設(shè)計(jì)全毀了。2.3 采集端配置Oz、O1、O2三個(gè)導(dǎo)聯(lián)參考電極和接地一個(gè)都別省SSVEP信號(hào)最明顯的位置在枕區(qū)對(duì)應(yīng)國際10-20系統(tǒng)的Oz、O1、O2做位移控制最少取這三個(gè)通道就夠想再穩(wěn)一些可以加Pz。采樣率不需要高250Hz已經(jīng)足夠因?yàn)槌S么碳ゎl率都在15Hz以下奈奎斯特頻率有幾十倍余量真正要關(guān)心的是工頻干擾國內(nèi)50Hz如果硬件沒有陷波算法端必須做帶阻否則CCA相關(guān)度會(huì)被周期性噪聲頂上去。參考電極我習(xí)慣放在耳垂或乳突接地電極遠(yuǎn)離電機(jī)驅(qū)動(dòng)器。做設(shè)備位移控制時(shí)有一個(gè)經(jīng)常翻車的細(xì)節(jié)驅(qū)動(dòng)電機(jī)或運(yùn)動(dòng)平臺(tái)的PWM信號(hào)會(huì)通過電源地串進(jìn)腦電放大器表現(xiàn)就是識(shí)別率在電機(jī)一轉(zhuǎn)起來就掉。解決起來不玄放大器與驅(qū)動(dòng)器分開供電參考線和地線不要和電機(jī)線綁在一起走。電極阻抗要壓到5kΩ以下。這個(gè)步驟比很多調(diào)參都重要——SSVEP本身的信號(hào)幅度只有幾微伏到幾十微伏頭皮阻抗高了信號(hào)全部衰減在皮膚上后續(xù)濾波做得再干凈也無濟(jì)于事。上線調(diào)試前先花一分鐘看一眼每個(gè)通道的波形如果某通道基線漂移明顯或50Hz成分大先處理電極再跑識(shí)別別急著動(dòng)閾值。3. 頻率識(shí)別與指令決策從枕區(qū)腦電到設(shè)備位移的最小閉環(huán)前半段物理鏈路穩(wěn)定之后剩下的就是典型信號(hào)處理流程濾波、滑窗、特征提取、決策、輸出。SSVEP識(shí)別的標(biāo)準(zhǔn)工具是CCA典型相關(guān)分析不是深度學(xué)習(xí)也不是FFT峰值搜索。原因很簡單CCA不需要大量訓(xùn)練數(shù)據(jù)計(jì)算量小實(shí)時(shí)性好而且把多通道信息聯(lián)合起來用對(duì)噪聲有天然抑制。這一章從原理講到代碼再給出一個(gè)可以在真機(jī)上跑的決策循環(huán)。3.1 CCA原理與代碼EEG和參考信號(hào)找最大相關(guān)CCA做的事可以這樣理解把三個(gè)導(dǎo)聯(lián)的EEG線性組合成一個(gè)“主信號(hào)”同時(shí)把每個(gè)候選頻率對(duì)應(yīng)的參考信號(hào)也線性組合成另一個(gè)信號(hào)然后調(diào)整組合權(quán)重讓這兩個(gè)信號(hào)的相關(guān)系數(shù)最大。SSVEP腦電如果真帶著某個(gè)頻率的能量它和該頻率參考信號(hào)的相關(guān)系數(shù)就會(huì)顯著高于其他頻率。參考信號(hào)是人工構(gòu)造的不需要從訓(xùn)練集里學(xué)。對(duì)頻率f用sin和cos構(gòu)成基波再疊加諧波常見做法是取到3次諧波import numpy as np from scipy.linalg import sqrtm def make_reference(freq, fs, win_len, n_harmonics3): 為頻率 freq 構(gòu)造 CCA 參考信號(hào)。 用 sin/cos 對(duì)構(gòu)成含到 n_harmonics 次諧波。 t np.arange(win_len) / fs refs [] for h in range(1, n_harmonics 1): refs.append(np.sin(2 * np.pi * h * freq * t)) refs.append(np.cos(2 * np.pi * h * freq * t)) return np.asarray(refs) # 形狀 (n_harmonics * 2, win_len) def cca_score(X, Y, reg1e-6): CCA 核心X 是 EEG通道數(shù) × 樣本數(shù)Y 是參考信號(hào)。 返回投影后兩組信號(hào)的最大相關(guān)系數(shù)。 Cxx X X.T reg * np.eye(X.shape[0]) Cyy Y Y.T reg * np.eye(Y.shape[0]) Cxy X Y.T Cyx Cxy.T inv_sqrt_Cxx np.linalg.inv(sqrtm(Cxx)) inv_sqrt_Cyy np.linalg.inv(sqrtm(Cyy)) W inv_sqrt_Cxx Cxy inv_sqrt_Cyy inv_sqrt_Cyy Cyx inv_sqrt_Cxx return float(np.sqrt(np.clip(np.max(np.linalg.eigvalsh(W)), 0, None)))代碼里做了兩步關(guān)鍵操作先對(duì)EEG通道協(xié)方差和參考信號(hào)協(xié)方差做矩陣平方根求逆把兩邊白化然后構(gòu)造一個(gè)特征值問題最大特征值的平方根就是最大典型相關(guān)系數(shù)。reg1e-6是防止協(xié)方差矩陣奇異時(shí)除零三通道數(shù)據(jù)正常情況下沒問題但如果某個(gè)導(dǎo)聯(lián)脫落信號(hào)變成常量這個(gè)正則化能避免直接崩潰。諧波數(shù)n_harmonics取3是經(jīng)驗(yàn)值多數(shù)SSVEP能量集中在基波但不少人的二次、三次諧波也肉眼可見參考信號(hào)帶諧波能提升這類被試的識(shí)別率反過來如果窗口短、噪聲大諧波加多了反而引入無關(guān)維度。所以實(shí)際調(diào)試時(shí)我會(huì)先離線試2和3兩種情況取準(zhǔn)確率高的一組。還要提醒一句CCA至少需要兩個(gè)通道才有意義。如果你只接了一個(gè)導(dǎo)聯(lián)協(xié)方差矩陣退化成一維CCA會(huì)退化成普通相關(guān)不如直接做FFT找峰值。位移控制最少用三導(dǎo)聯(lián)這也是我把它定為“基線配置”的原因。3.2 實(shí)時(shí)決策參數(shù)滑動(dòng)窗口、絕對(duì)閾值與相對(duì)余量在線識(shí)別不是每來一個(gè)樣本就判一次而是維護(hù)一個(gè)固定長度的數(shù)據(jù)窗口窗口長度直接決定頻率分辨率。1秒的窗口對(duì)7.5Hz來說包含7個(gè)以上完整周期CCA已經(jīng)能給出穩(wěn)定得分窗口越長得分越穩(wěn)但命令延遲越明顯。我一般默認(rèn)取1s再按實(shí)際表現(xiàn)往0.8s或1.5s調(diào)。窗口內(nèi)加了新數(shù)據(jù)后統(tǒng)一送進(jìn)classify_window函數(shù)決策不能只看最高頻率還要看它與第二高分的差距否則兩個(gè)頻率得分接近時(shí)指令會(huì)在方向之間抖FREQS [7.5, 8.57, 10, 12] # 60Hz屏選出的四個(gè)刺激頻率 DIRECTIONS [UP, DOWN, LEFT, RIGHT] THRESH_ABS 0.35 # 絕對(duì)相關(guān)下限低于它一律不算數(shù) THRESH_MARGIN 0.08 # 最高分與第二高分的相對(duì)余量 def classify_window(buf): 把一段 EEG 窗口變成一條設(shè)備指令 rho [cca_score(buf, make_reference(f, fs, buf.shape[1])) for f in FREQS] idx_best int(np.argmax(rho)) rho_sorted sorted(rho, reverseTrue) margin rho_sorted[0] - rho_sorted[1] if rho_sorted[0] THRESH_ABS and margin THRESH_MARGIN: return DIRECTIONS[idx_best] return HOLDTHRESH_ABS是絕對(duì)值門檻用戶注意力離開刺激塊、閉上眼睛或者思想走神時(shí)所有頻率的得分都會(huì)掉下來這時(shí)候系統(tǒng)不應(yīng)該輸出任何位移指令。THRESH_MARGIN是相對(duì)余量四個(gè)頻率里最高分和第二高分差值不夠大說明當(dāng)前窗口特征不夠清晰寧可保持不動(dòng)。主循環(huán)里用環(huán)形緩沖吸收新數(shù)據(jù)buffer np.zeros((n_ch, fs * WIN_SEC)) # WIN_SEC 默認(rèn) 1.0 while running: chunk get_increment() # 每 100ms 取一段新數(shù)據(jù) buffer np.roll(buffer, -chunk.shape[1], axis1) buffer[:, -chunk.shape[1]:] chunk cmd classify_window(buffer) if cmd ! HOLD: device.send(cmd) # 輸出給電機(jī)或運(yùn)動(dòng)平臺(tái)np.roll把最舊的數(shù)據(jù)移到尾部再被新數(shù)據(jù)覆蓋等價(jià)于丟棄舊數(shù)據(jù)、保留最新的固定時(shí)長窗口。這個(gè)循環(huán)跑起來后100ms 輸出一次決策整個(gè)閉環(huán)的復(fù)雜度才真正暴露出來指令平滑、誤動(dòng)規(guī)避、個(gè)體差異都在后面等著。3.3 先用腦機(jī)接口數(shù)據(jù)集離線驗(yàn)證再連真機(jī)我不建議一上來就把EEG放大器直接連小車。正確順序是先找一個(gè)公開的SSVEP腦機(jī)接口數(shù)據(jù)集離線確認(rèn)算法和參數(shù)靠譜再上真機(jī)調(diào)時(shí)序。公開的SSVEP數(shù)據(jù)集里清華大學(xué)發(fā)布的大規(guī)模SSVEP數(shù)據(jù)集覆蓋幾十個(gè)被試、多導(dǎo)聯(lián)和不同頻段帶官方頻率標(biāo)簽適合做離線準(zhǔn)確率摸底此外還有一些四分類的SSVEP公開數(shù)據(jù)可以拿來直接切窗驗(yàn)證。選數(shù)據(jù)集的底線是刺激頻率和trial標(biāo)注必須明確不然你連正確標(biāo)簽都沒有。離線代碼很短核心就是復(fù)用cca_scoredef offline_infer(trial_x, fs, win_sec, freqs): 對(duì)單個(gè) trial 做頻率識(shí)別返回預(yù)測頻率 win_samples int(fs * win_sec) x trial_x[:, :win_samples] # 只取刺激開始后的窗口 rho [cca_score(x, make_reference(f, fs, win_samples)) for f in freqs] return freqs[int(np.argmax(rho))] # 假設(shè) dataset 是[(EEG_trial, 頻率標(biāo)簽), ...]的列表 preds [offline_infer(x, fs, WIN_SEC, FREQS) for x, _ in dataset] labels [label for _, label in dataset] acc sum(1 for p, t in zip(preds, labels) if p t) / len(labels)準(zhǔn)確率之外算一下信息傳輸率更公平。ITR的標(biāo)準(zhǔn)公式是ITR(bits/min) (60 / T) * [ log2(N) p*log2(p) (1-p)*log2((1-p)/(N-1)) ]其中N是指令數(shù)p是準(zhǔn)確率T是每個(gè)指令平均耗時(shí)分鐘。離線評(píng)估時(shí)T習(xí)慣上取窗口長度加0.5s的提示切換開銷。當(dāng)p1時(shí)公式里第二項(xiàng)會(huì)算到log0代碼里記得給參數(shù)加一個(gè)極小值保護(hù)。ITR適合對(duì)比不同窗口長度和諧波數(shù)但位移控制真正要盯的還不只是這個(gè)數(shù)字下一章的坑大多在ITR看不見的地方。4. SSVEP位移控制常見問題與避坑排查5個(gè)高頻故障排雷下面這些坑是我和身邊同行在搭建位移控制時(shí)反復(fù)踩過的按出現(xiàn)頻率排序。你能在動(dòng)手前看完至少省兩周調(diào)試時(shí)間。每一條都按“現(xiàn)象、原因、解決”拆開寫遇到問題可以直接對(duì)號(hào)入座。4.1 用了9.3Hz刺激怎么調(diào)都沒有穩(wěn)定誘發(fā)現(xiàn)象屏幕上9.3Hz方塊明明在閃但CCA得分在四個(gè)頻率之間亂跳閉眼和睜眼的波形看不出明顯差異功率譜里找不到對(duì)應(yīng)頻峰。原因60Hz屏幕下9.3Hz對(duì)應(yīng)的幀數(shù)是6.45不是整數(shù)。屏幕只能按整幀翻轉(zhuǎn)亮度實(shí)際閃光頻率要么是60/610Hz要么是60/78.57Hz永遠(yuǎn)落不到9.3Hz上。刺激相位每個(gè)周期都在漂移視覺皮層接收到的不是穩(wěn)定調(diào)制自然誘發(fā)不出干凈的SSVEP。解決先把可用頻率表算死。60Hz屏就用7.5、8.57、10、12、15這一組然后拿示波器或光電二極管實(shí)測屏幕真實(shí)刷新率很多顯示器標(biāo)稱60Hz實(shí)際是59.94Hz雖然差異小但長時(shí)間疊加會(huì)污染刺激相位。頻率設(shè)對(duì)了這個(gè)問題通常立刻消失不用碰算法。4.2 6Hz和12Hz同時(shí)出現(xiàn)高頻指令總被低頻搶走現(xiàn)象刺激組里同時(shí)放了6Hz和12Hz12Hz正確率只有三四成許多12Hz的trial被識(shí)別成6Hz。單獨(dú)測試12Hz時(shí)又沒問題。原因這是諧波重疊。CCA參考信號(hào)本身含二次、三次諧波6Hz參考信號(hào)里的二次諧波正好是12Hz當(dāng)被試注視12Hz方塊時(shí)腦電里的12Hz能量會(huì)和6Hz參考的高階分量算出一個(gè)不低的相關(guān)系數(shù)兩個(gè)指令的得分被黏在一起。解決選頻率組之前先做一次諧波碰撞檢查任意兩個(gè)候選頻率的比值不要接近整數(shù)倍尤其是2倍關(guān)系。6和12要拆開換成7.5和12就可以同樣7.5和15也不能同時(shí)出現(xiàn)。原則是頻率間距拉開但彼此不構(gòu)成整數(shù)倍。4.3 眨眼一次指令就斷一次現(xiàn)象用戶眨眼瞬間當(dāng)前窗口的CCA得分整體掉下來本該觸發(fā)的命令變成HOLD或者更糟的是誤觸發(fā)了另一方向。操作者反饋“我眨了下眼它就走歪了”。原因眨眼偽跡幅值可以到100至300μV而SSVEP信號(hào)只有幾微伏到幾十微伏一個(gè)大幅度瞬態(tài)落在窗口里會(huì)把協(xié)方差矩陣的特征結(jié)構(gòu)整個(gè)帶偏。解決在線處理時(shí)加幅度拒斥任何通道任一樣本超過±80μV就丟棄這個(gè)窗口不給它進(jìn)CCA。這個(gè)判斷必須在特征提取之前做代碼就三行if np.max(np.abs(buffer)) 80e-6: cmd HOLD # 本窗口被眨眼/運(yùn)動(dòng)偽跡污染不識(shí)別 else: cmd classify_window(buffer)代價(jià)是眨眼期間少輸出一次指令但換來的是穩(wěn)定。真實(shí)場景里還要給操作者安排定時(shí)休息別讓人為了不眨眼硬撐撐不住時(shí)系統(tǒng)表現(xiàn)只會(huì)更糟。4.4 滑動(dòng)窗口越長越準(zhǔn)小車卻像卡頓現(xiàn)象把窗口從1s加到2s離線準(zhǔn)確率從85%漲到95%但真機(jī)上車速反應(yīng)明顯遲鈍經(jīng)常走到一半停在原地操作手感很差。原因準(zhǔn)確率漲是正常的但決策延遲也跟著漲。糟糕的是很多實(shí)現(xiàn)用不重疊窗口窗口長度2s時(shí)同一個(gè)方向指令要2秒才能更新一次用戶感覺系統(tǒng)“卡死了”。位移控制真正難受的不是分類錯(cuò)而是指令來得不夠及時(shí)。解決把不重疊窗口改成高重疊滑窗每100ms往前挪一次指令更新率從0.5Hz提到10Hz同時(shí)引入確認(rèn)機(jī)制連續(xù)兩次決策一致才真正輸出新指令防止邊界抖動(dòng)。這樣既保留了長窗口的高準(zhǔn)確率又讓輸出變得平滑。位移控制的安全準(zhǔn)則是寧可多保持不要亂動(dòng)。4.5 換個(gè)人就不行個(gè)體差異不是玄學(xué)是基線不同現(xiàn)象被試A的準(zhǔn)確率穩(wěn)定在85%以上被試B戴上同一套設(shè)備只有50%而且B的失敗頻率往往集中在某個(gè)特定方向。原因枕區(qū)信號(hào)強(qiáng)度、頭皮厚度、電極貼合、諧波分布都存在個(gè)體差異。有人基波最強(qiáng)有人二次諧波幾乎和基波一樣大還有人注視時(shí)會(huì)不自主眨眼把中等幅度的偽跡混進(jìn)有效窗口。用固定閾值套所有人一定會(huì)有人在閾值邊緣反復(fù)試探。解決上線前做兩分鐘快速校準(zhǔn)讓被試依次注視每個(gè)頻塊每個(gè)頻率記錄3秒用這3秒切出若干小窗算CCA得分取每個(gè)頻率得分的中位數(shù)作為個(gè)人基線然后把絕對(duì)閾值設(shè)成“基線中位數(shù)×0.75”。這樣做之后B類被試的系統(tǒng)才從碰運(yùn)氣變成可復(fù)現(xiàn)。另外可以離線對(duì)比n_harmonics1、2、3三種設(shè)置選那個(gè)讓該被試準(zhǔn)確率最高的值。5. 在線滑窗、個(gè)體校準(zhǔn)與安全鎖存把這套系統(tǒng)調(diào)到能放心用準(zhǔn)確率做到90%只是第一步真正能長時(shí)間握著用的系統(tǒng)還要解決輸出連續(xù)性、延遲可測和防誤動(dòng)。這一章給三個(gè)我后來一直沿用的落地手法。5.1 滑窗更新率與真實(shí)延遲測量重疊滑窗讓輸出更新率從窗口倒數(shù)的級(jí)別提升到每100ms一次但有效決策延遲并沒有等量下降。一個(gè)窗口從頭到尾整段包含信息系統(tǒng)必須等窗口填滿才能判斷所以理論延遲大約等于窗口長度的一半。要測真實(shí)延遲方法是在屏幕角落放一個(gè)光電二極管記錄刺激切換時(shí)刻同時(shí)記錄設(shè)備端編碼器開始運(yùn)動(dòng)的時(shí)刻兩者相減就是端到端延遲。常見可接受范圍是1.2s以內(nèi)如果超標(biāo)優(yōu)先縮短窗口而不是調(diào)分類器。5.2 兩分鐘個(gè)體校準(zhǔn)把個(gè)體差異前置處理我每次換新被試都先跑一遍快速校準(zhǔn)屏幕上依次提示每個(gè)頻塊被試注視3秒重復(fù)兩遍程序?qū)崟r(shí)算出每個(gè)頻率的CCA得分中位數(shù)和方差?;谶@個(gè)基線把THRESH_ABS改成個(gè)人值THRESH_MARGIN也可以按基線波動(dòng)范圍適當(dāng)縮放。校準(zhǔn)過程還會(huì)順帶暴露電極問題——如果某個(gè)通道在校準(zhǔn)中得分明顯偏低或漂移大先重貼電極再繼續(xù)避免后面帶著壞通道調(diào)一圈參數(shù)。5.3 防誤動(dòng)安全鎖存和急停位移控制設(shè)備不能一有指令就執(zhí)行。我給每個(gè)方向加一個(gè)鎖存器連續(xù)5次決策一致才真正輸出5次按100ms一次算大約是0.5s代價(jià)是增加一點(diǎn)延遲換來的是一串自然抖動(dòng)里不會(huì)夾帶誤動(dòng)。代碼如下STABLE_TICKS 5 # 連續(xù)5次一致才輸出 stable_cmd None ticks 0 while running: cmd classify_window(buffer) if cmd stable_cmd: ticks 1 else: stable_cmd, ticks cmd, 0 if ticks STABLE_TICKS: device.send(stable_cmd)還需要一個(gè)急停邏輯連續(xù)超過1s沒有出現(xiàn)任何高相關(guān)指令系統(tǒng)應(yīng)判定操作者注意力脫開自動(dòng)剎車并進(jìn)入待機(jī)而不是保持最后一條指令繼續(xù)執(zhí)行。做設(shè)備位移控制安全聯(lián)鎖和指令平滑一樣重要。我第一次做整套SSVEP位移控制時(shí)把精力全花在把準(zhǔn)確率從90%推到96%上后來才發(fā)現(xiàn)真正難的是連續(xù)決策的平穩(wěn)性指令抖動(dòng)、端到端延遲、換被試后的參數(shù)漂移。吃過虧之后才改出這整套做法——先讓延遲可測、讓誤動(dòng)有鎖存、讓參數(shù)可校準(zhǔn)再回頭調(diào)分類器會(huì)快得多。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取