手把手教你腦電波採集及信號處理分析
關鍵詞:EEG數字信號處理,FFT, EDF格式轉換
注意:該文章旨在讓一個人在沒有太多基礎的情況下,一步一步的了解腦電信號的採集,處理流程。由於本人非專業演算法人士,其中可能有諸多錯誤,歡迎指正。該思路可同樣適用於其他信號的分析處理。
有問題可以留言也可以發郵件eegdiy@aliyun.com。歡迎關注本賬號。
分兩個PART,第一個講採集,第二個講處理。
Part one:
腦電,心電,肌電,眼電等,都是身體上兩點的電壓差,和我們測電池的電壓本質上沒有區別。
隨便在頭上兩個位置放兩個電極,一正一負,放大uV信號(其他腦電信號特徵,如頻段,干擾源等感興趣可自行百度),測量其電勢差。
但我們通常需要加一個右腿驅動電極,比如在乳突,這是為什麼呢?先用專業的話:
共模輸入電壓會影響輸入差分對的偏置點。由於輸入電路固有的不匹配,偏置點的改變會引起輸入失調典雅的改變,進而引起輸出電壓的改變。不要心裡MMP,這就說人話。請看下面這張圖:以心電為例,腦電原理一樣。
假設共模干擾是圖中的A,有用的ECG信號為B,則我們很有可能採到的是A+B,所以我們要把A抵消掉,反饋到身體上一個負A的信號。這樣我們抑制了大部分的共模信號,就得到B了。
右腿驅動詳細電路及模擬:參考TI Matthew Hann 的文章:(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)
http://www.cnblogs.com/myohao/p/8538685.html
另外附上採集電路的框圖:
附開源電路圖:
這個電路難者不會,會者不難。搞演算法的可以不做了解。實在想自己做,可以去買專門腦電模塊,名字我就不說了,廣告嫌疑。我當時買的幾十塊錢一片,挺劃來。
Part two:
採集完的數據保存下來,形成資料庫。
以下放上外國人研究常用的資料庫
(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)
http://www.cnblogs.com/myohao/p/8538740.html
生理信號數據常用的格式為edf,而matlab常用的是mat,txt。
假設聰明的你已經在資料庫里下載了edf格式的數據。不妨先了解下EDF格式具體內容:
HEADER RECORD
8 ascii : 數據格式的版本
80 ascii : 被試ID80 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:
(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)
http://cn.mathworks.com/matlabcentral/fileexchange/31900-edfread
下載代碼,命令行運行結果如下:
符合翻譯的Header的格式。
幀頭之後就是數據了。
這裡原始數據我用了網上的另一個代碼:因為他支持的格式更全,支持edf,rec轉mat。
用的是 Alois Schloegl 的腳本。(點擊下載源碼)
https://files.cnblogs.com/files/myohao/edfsample.zip
直接運行代碼取變數S的前三列,即EDF數據前三通道的腦電數據,畫出結果如下:
將工作區的變數S右鍵,數據另存為導出為txt。好了有了我們最熟悉的txt格式,接下來選出想分析的通道(列)進行分析就可以了。
接下來我們跑個簡單的演算法:FFT分析睡眠數據,我們提取出不同的節律,也就是不同的頻段,進行功率譜估計。
以下是四種節律:
α/阿爾法腦波(ALPHA)在大腦中有時出現,有時消失,它並不總是存在。例如,在深睡情況下沒有α波;如果一個人在激動狀態下,或恐懼,憤怒時,大腦中也沒有α腦波。α腦波在初睡或初醒時出現(即半睡半醒時),此時身體處於放鬆狀態,並有自覺的警覺意識。
δ/德爾塔腦波(DELTA)只在深睡時出現。
θ/西塔腦波(THETA)在淺睡時出現。
β/貝塔腦波(BETA)在清醒時出現,伴有需努力能夠達到的注意力集中。
不懂傅里葉變換原理的先來這裡:最通俗的講解傳送門:
(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)
https://zhuanlan.zhihu.com/p/19759362
Matlab下FFT實現代碼實例:
(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)
https://cn.mathworks.com/help/matlab/ref/fft.html?searchHighlight=FFT&s_tid=doc_srchtitle
有了FFT的函數,在主函數中調用,分割不同頻率,分割不同時間,就得到需要的圖片了。比如,我想得到10s-150s的θ/西塔腦波(THETA)值。部分源碼在這:
(溫馨提醒:為保證後續閱讀,手機用戶長按鬆開拷貝地址到瀏覽器打開為宜)
http://www.cnblogs.com/myohao/p/8539001.html
測試結果如下
符合截取區間。
完。
結語:從信號特點到分析,再到採集,再到大量資料庫的使用,再到簡單的一個演算法DEMO。算是把生理信號的一個流程給寫的差不多了。你大概清楚了嗎?
需要交流請發郵件eegdiy@aliyun.com。
推薦閱讀: