本教程為腦機學習者Rose原創(轉載請聯系作者授權)發表於公眾號:腦機接口社區(微信號:Brain_Computer).QQ交流群:903290195
MNE-python讀取.edf文件
EDF,全稱是 European Data Format,是一種標准文件格式,用於交換和存儲醫療時間序列。
該格式文件能夠存儲多通道的數據,允許每個信號擁有不同的采樣頻率。
在內部,它包括標題和一個或多個數據記錄。標題包含一些一般信息(患者標識,開始時間......等等)以及每個信號的技術規格(校准,采樣率,過濾,......等等),編碼為 ASCII 字符。數據記錄包含小端 16 位整數的樣本。因此,EDF 也是多導睡眠圖(PSG)錄音的流行格式。
案例
python讀取edf文件,可以通過mne實現
方法原型:
方法原型:
mne.io.read_raw_edf(input_fname,
montage='deprecated',
eog=None,
misc=None,
stim_channel='auto',
exclude=(),
preload=False,
verbose=None)
"""
input_fname:edf文件存放地址
montage='deprecated':已棄用
eog:通道名稱或應指定為EOG通道的索引列表。值應對應於文件中的電極。默認為無。
misc:通道名稱或應指定為MISC通道的索引列表。值應對應於文件中的電極。默認為無。
stim_channel:默認為"auto",這意味着將名為“status”或“trigger”(不區分大小寫)的通道設置為STIM。
如果為str(或str列表),則所有與名稱匹配的通道均設置為STIM;
如果為int(或int列表),則將對應於索引的通道設置為STIM。
exclude:要排除的頻道名稱。這在讀取具有不同采樣率的數據時會有所幫助,以避免不必要的重采樣。
preload:如果為True,則數據將被預加載到內存中(這樣可以加快數據的索引);
如果preload是字符串,則該字符串為數據存放在硬盤中的路徑地址(速度較慢,需要較少的內存)。
"""
讀取edf文件:Affaf Ikram 20121020 1839.L1.edf
第一步:導入工具包
from mne.io import concatenate_raws, read_raw_edf
import matplotlib.pyplot as plt
import mne
第二步:加載本地edf文件
raw=read_raw_edf("Affaf Ikram 20121020 1839.L1.edf",preload=False)
第三步:獲取原始數據中事件
查看原始edf文件中保存的event id以及events
events_from_annot, event_dict = mne.events_from_annotations(raw)
print(event_dict)
print(events_from_annot)
如上圖可以發現,事件ID有1,2,3,4,5,6
每個ID對應着注釋:['TRSP', 'bgin', 'fix+', 'resp', 'stm+', 'stm-']
共有517個事件
第四步:根據事件ID獲取對應事件
下面只選取事件ID為5和6的所對應的事件
custom_mapping = {'stm+':5, 'stm-': 6}
(events_from_annot,
event_dict) = mne.events_from_annotations(raw, event_id=custom_mapping)
print(event_dict)
print(events_from_annot)
第五步:繪制事件圖
fig = mne.viz.plot_events(events_from_annot, sfreq=raw.info['sfreq'],
first_samp=raw.first_samp, event_id=event_dict)
fig.subplots_adjust(right=0.7)
epochs = mne.Epochs(raw, events=events_from_annot,
event_id=event_dict)
epochs.plot_image()
"""
獲取采樣頻率sfreq
知識點:
“采樣頻率,也稱為采樣速度或者采樣率,定義了每秒從連續信號中提取並組成離散信號的采樣個數,它用赫茲(Hz)來表示。
采樣頻率的倒數是采樣周期或者叫作采樣時間,它是采樣之間的時間間隔。
通俗的講采樣頻率是指計算機每秒鍾采集多少個信號樣本。”
"""
sfreq=raw.info['sfreq']
"""
獲取索引為m到n的樣本,每個樣本從第k次到第h次.
data,times=raw[m:n,k:h]
其中data為索引為m到n的樣本,每個樣本從第k次到第h次.
times是以第k次采樣的時間作為開始時間,第h次采樣時的時間為結束時間的時間數組。
"""
data,times=raw[:3,int(sfreq*1):int(sfreq*3)]
plt.plot(times,data.T)
plt.title("Sample channels")
腦機學習者Rose筆記分享,QQ交流群:903290195
更多分享,請關注公眾號