MIT-BIH数据的读取,以及各文件的作用

WFDB读取心电数据(针对MIT-BIH)

100.hea文件样式

100 2 360 650000
100.dat 212 200 11 1024 995 -22131 0 MLII
100.dat 212 200 11 1024 1011 20052 0 V5
# 69 M 1085 1629 x1
# Aldomet, Inderal

分别表示的意义:

100(文件名) 2(通道数/导联数 MLII和V5两路导联信号组成) 360(采样率是360Hz) 650000(每路信号长度为650000个采样点)
100.dat(信号存储在100.dat文件中) 
212(信号以212格式存储,针对两个信号的数据库记录,每三个字节(24bit=6个16进制的数字)存储两个数据(两路信号分别占一个)) 
200(表示每个信号的增益都是每200ADC units/mV) 
11(ADC的分辨率是11位) 
1024(ADC的零值为1024) 
995/1011(不同信号的第一采样点的值) 
-22131/20052(65万个采样点的校验数) 
0(表示输入和输出可以以任意尺寸的块来执行) 
MLII/V5(信号描述字段,表示信号采自那个导联)

100.dat文件是数据文件,存储格式有Format8、Format16、Format16、Format80、Format212、Format310等八种数据,心律失常数据库一般采用212格式进行存储。

“ 212 ” 格式是针对两个信号的数据库记录,这两个信号的数据交替存储,每三个字节存储两个数据。这两个数据分别采样自信号 0 和信号 1 ,信号 0 的采样数据取自第一字节对 (16 位 ) 的最低 12 位,信号 1 的采样数据由第一字节对的剩余 4 位(作为组成信号 1 采样数据的 12 位的高 4 位)和下一字节的 8 位(作为组成信号 1 采样数据的 12 位的低 8 位)共同组成。以 100.dat 为例。

按照 “212 ”的格式,从第一字节读起,每三个字节( 24 位)表示两个值,第一组为 “E3 33 F 3 ” , 两个值则分别为 0x3E3 和 0x3F3 转换为十进制分别为 995 和 1011 ,代表的信号幅度分别为 4.975mv ( 995/200 ,值 / 增益)和 5.055mv ,这两个值分别是两个信号的第一采样点,后面依此类推,分别表示了两个信号的采样值。

100.atr文件是注释文件。记录了心电专家对相应的心电信号的诊断信息,主要有两种格式: MIT 格式和 AHA 格式。

MIT 格式是一种紧凑型格式,每一注释的长度占用偶数个字节空间,多数情况下是占用两个字节,多用于在线的注释文件;

而 AHA 格式的每一注释占用 16 个字节的空间,多用于交换文件的情况。心律失常数据库采用的 MIT 格式。

从文件中的第一字节不为 0 可以判断该文件是以 MIT 格式存储的。从第一字节开始按照 MIT 格式进行分析,首先读出 16 位值 0x7012 ,其高 6 位的值为 0x 1C ( 十进制 28) ,低 10 位的值为 0x12 ,该类型代码为 28 ,代表意义是节律变化,发生时间在 0.05 秒( 18/360Hz );接着读出后面的 16 位值 0xFC03 ,其高 6 为的值为 0x 3F (十进制 63 ),低 10 位的值为 0x03 ,该类型代码为 63 ,代表的意义是在该 16 位值后附加了 3 个(低 10 位值代表的数)字节的辅助信息,若字节个数为奇数,则再附加一个字节的空值,在本例中就是 “28 4E 00 00 ” ;然后再从下一字节读 16 位值 0x043B ,其高 6 位的值为 1 ,低 10 位的值为 0x3B (十进制 59 ),该类型码 1 代表正常心搏,发生时间为 0.213 秒(( 18+59 ) /360Hz );依次类推即可读出所有的注释,当读到的 16 位值为 0 时,就表示到了文件尾。

另,当高 6 位为十进制 59 时,读取之后第 3 个 16 位的高 6 位,作为类型代码,读取之后第二个 16 位 + 第一个 16 位 *2^16 ,作为发生时间;

高 6 位为十进制 60 , 61 , 62 时,继续读下一个 16 位。

采用 WFDB 转换的 AHA 数据库 atr 注释,第一个字节为 0 ,其读取方式同 MIT 格式一致,可采用相同的方式读取

    # 读取心电信号文件
    # sampfrom: 设置读取心电信号的 起始位置,sampfrom=0表示从0开始读取,默认从0开始
    # sampto:设置读取心电信号的 结束位置,sampto = 1500表示从1500出结束,默认读到文件末尾
    # channel_names:设置设置读取心电信号名字,必须是列表,channel_names=['MLII']表示读取MLII导联线
    # channels:设置读取第几个心电信号,必须是列表,channels=[0, 3]表示读取第0和第3个信号,注意信号数不确定
    record = wfdb.rdrecord('../ecg_data/102', sampfrom=0, sampto = 1500) # 读取所有通道信号
    # record = wfdb.rdrecord('../ecg_data/203', sampfrom=0, sampto = 1500,channel_names=['MLII']) # 仅仅读取“MLII”信号
    record = wfdb.rdrecord('../ecg_data/101', sampfrom=0, sampto=3500, channels=[0]) # 仅仅读取第0个信号(MLII)
    print(type(record)) # 查看record类型
    print(dir(record)) # 查看类中的方法和属性
    print(record.p_signal) # 获得心电导联线信号,本文获得是MLII和V1信号数据
    print(record.n_sig) # 查看导联线条数
    print(record.sig_name) # 查看信号名称(列表),本文导联线名称['MLII', 'V1']
    print(record.fs) # 查看采用率
    
    # 读取注解文件
    # sampfrom: 设置读取心电信号的 起始位置,sampfrom=0表示从0开始读取,默认从0开始
    # sampto:设置读取心电信号的 结束位置,sampto = 1500表示从1500出结束,默认读到文件末尾
    print(type(annotation)) # 查看annotation类型
    print(dir(annotation))# 查看类中的方法和属性
    print(annotation.sample) # 标注每一个心拍的R波的尖锋位置,与心电信号对应
    # annotation.symbol  #标注每一个心拍的类型N,L,R等等
    print(annotation.ann_len) # 被标注的数量
    print(annotation.record_name) # 被标注的文件名
    print(wfdb.show_ann_labels()) # 查看心拍的类型
posted @ 2020-12-07 22:36  lijiahaoAA  阅读(3330)  评论(0编辑  收藏  举报