標籤:

手把手教你腦電波採集及信號處理分析

關鍵詞:EEG數字信號處理,FFT, EDF格式轉換

注意:該文章旨在讓一個人在沒有太多基礎的情況下,一步一步的了解腦電信號的採集,處理流程。由於本人非專業演算法人士,其中可能有諸多錯誤,歡迎指正。該思路可同樣適用於其他信號的分析處理。

有問題可以留言也可以發郵件eegdiy@aliyun.com。歡迎關注本賬號。

分兩個PART,第一個講採集,第二個講處理。

Part one:

腦電,心電,肌電,眼電等,都是身體上兩點的電壓差,和我們測電池的電壓本質上沒有區別。

隨便在頭上兩個位置放兩個電極,一正一負,放大uV信號(其他腦電信號特徵,如頻段,干擾源等感興趣可自行百度),測量其電勢差。

但我們通常需要加一個右腿驅動電極,比如在乳突,這是為什麼呢?先用專業的話:

共模輸入電壓會影響輸入差分對的偏置點。由於輸入電路固有的不匹配,偏置點的改變會引起輸入失調典雅的改變,進而引起輸出電壓的改變。不要心裡MMP,這就說人話。請看下面這張圖:以心電為例,腦電原理一樣。

假設共模干擾是圖中的A,有用的ECG信號為B,則我們很有可能採到的是A+B,所以我們要把A抵消掉,反饋到身體上一個負A的信號。這樣我們抑制了大部分的共模信號,就得到B了。

右腿驅動詳細電路及模擬:參考TI Matthew Hann 的文章:(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)

cnblogs.com/myohao/p/85

另外附上採集電路的框圖:

附開源電路圖:

這個電路難者不會,會者不難。搞演算法的可以不做了解。實在想自己做,可以去買專門腦電模塊,名字我就不說了,廣告嫌疑。我當時買的幾十塊錢一片,挺劃來。

Part two:

採集完的數據保存下來,形成資料庫。

以下放上外國人研究常用的資料庫

(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)

cnblogs.com/myohao/p/85

生理信號數據常用的格式為edf,而matlab常用的是mat,txt。

假設聰明的你已經在資料庫里下載了edf格式的數據。不妨先了解下EDF格式具體內容:

HEADER RECORD

8 ascii : 數據格式的版本

80 ascii : 被試ID

80 ascii : 數據記錄編號

8 ascii : 開始記錄的日期 (dd.mm.yy)

8 ascii : 開始記錄的時間 (hh.mm.ss)

8 ascii : 頭比特數

44 ascii :保留給EDF+

8 ascii : 初始值-1,結束時被賦其他值

8 ascii : 數據持續記錄時間,s

4 ascii : 記錄幾種信號種類

ns * 16 ascii : 電極位置,體溫等信息

ns * 80 ascii : 電極信息

ns * 8 ascii : ns * 幅值單位信息

ns * 8 ascii : ns * physical minimum (e.g. -500 or 34)

ns * 8 ascii : ns * physical maximum (e.g. 500 or 40)

ns * 8 ascii : ns * digital minimum (e.g. -2048)

ns * 8 ascii : ns * digital maximum (e.g. 2047)

ns * 80 ascii : 濾波器參數

ns * 8 ascii : 採樣率

ns * 32 ascii : 採集信號類型

DATA RECORD

nr of samples[1] * integer : first signal in the data record

nr of samples[2] * integer : second signal

..

nr of samples[ns] * integer : last signal

我們將matlab官方提供的讀edf頭文件的腳本跑一下:看看是否像如上格式

「edfRead 」 version 2.10 (7.44 KB) by Brett Shoelson:

(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)

cn.mathworks.com/matlab

下載代碼,命令行運行結果如下:

符合翻譯的Header的格式。

幀頭之後就是數據了。

這裡原始數據我用了網上的另一個代碼:因為他支持的格式更全,支持edf,rec轉mat。

用的是 Alois Schloegl 的腳本。(點擊下載源碼)

files.cnblogs.com/files

直接運行代碼取變數S的前三列,即EDF數據前三通道的腦電數據,畫出結果如下:

將工作區的變數S右鍵,數據另存為導出為txt。好了有了我們最熟悉的txt格式,接下來選出想分析的通道(列)進行分析就可以了。

接下來我們跑個簡單的演算法:FFT分析睡眠數據,我們提取出不同的節律,也就是不同的頻段,進行功率譜估計。

以下是四種節律:

α/阿爾法腦波(ALPHA)在大腦中有時出現,有時消失,它並不總是存在。例如,在深睡情況下沒有α波;如果一個人在激動狀態下,或恐懼,憤怒時,大腦中也沒有α腦波。α腦波在初睡或初醒時出現(即半睡半醒時),此時身體處於放鬆狀態,並有自覺的警覺意識。

δ/德爾塔腦波(DELTA)只在深睡時出現。

θ/西塔腦波(THETA)在淺睡時出現。

β/貝塔腦波(BETA)在清醒時出現,伴有需努力能夠達到的注意力集中。

不懂傅里葉變換原理的先來這裡:最通俗的講解傳送門:

(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)

zhuanlan.zhihu.com/p/19

Matlab下FFT實現代碼實例:

(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)

cn.mathworks.com/help/m

有了FFT的函數,在主函數中調用,分割不同頻率,分割不同時間,就得到需要的圖片了。比如,我想得到10s-150s的θ/西塔腦波(THETA)值。部分源碼在這:

(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)

cnblogs.com/myohao/p/85

測試結果如下

符合截取區間。

完。

結語:從信號特點到分析,再到採集,再到大量資料庫的使用,再到簡單的一個演算法DEMO。算是把生理信號的一個流程給寫的差不多了。你大概清楚了嗎?

需要交流請發郵件eegdiy@aliyun.com。


推薦閱讀:

TAG:EEG | 大腦 | BCI |