python讀取.edf文件


本教程為腦機學習者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
更多分享,請關注公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM