毕业设计(论文)
图 1-1 一个良好的心电波形图
P波 心房除极时的电位变化
P-R间期 心房开始除极至心室开始除极的时间 QRS波群 全部心室除极时的电位变化 S-T段 心室复极时的电位变化(早期) T波 心室复极时的电位变化(晚期) Q-T间期 心室除极与复极的总时间
(2)导联的定义:将两电极置于人体的任意两点与心电图机相连,可描记出心电图,电极与心电图机链接的线路,称作心电图的导联。
1.2 心电数据文件存储格式简介
通过对MIT-BIH 心律失常数据库中数据的直接识读,使我们能更灵活地使用这些数据,并可以对其进行二次开发。一个完整的心电记录由三部分组成:
(1)头文件[.hea],以ASCII码的形式存储,文件中存储了病历中患者的基本信息、用药情况以及一些信号标准;
(2)数据文件[.dat],按二进制存储,每三个字节存储两个数,分别表示两导波形在某一时间点的电压值,一个数12bit,存储绘制两导波形的数据;
(3)注释文件[.art],按二进制存储,表示在特定时间点处专家标注的诊断标记; 如图1-2所示为三个文件之间的关系:
头文件.hea 数据文件.dat注释文件.atr 病例记录 第2页 共30页
毕业设计(论文)
图1-2 数据库中病例记录的组成框图
2 MIT-BIH心律失常心电图分析软件整体设计
开发这款软件可以作为研究心律失常的一个模型软件,通过这款软件可以浏览经典的48条MIT-BIH心律失常病例的两导心电波形。通过与专家标记的比对方便我们学习了解各种常见心律失常类型的波形形态,
软件负责管理指定路径中存储的心电数据和专家诊断标记,数据库系统中维护着每一条病历的相关信息,方便用户对所有数据、信息等进行查阅、维护等工作。
MIT-BIH 心律失常数据库心电图显示软件运行于Windows XP/ SP2或更高版本操作系统之上,代码的编写采用C++语言,使用MFC作为程序开发框架、使用ADO组件操作Access 数据库,对48条心律失常病例进行维护管理。
2.1 软件主要功能
1.导入病历:
将原始病历数据导入软件(把源文件复制到软件指定的文件夹中),同时将病历的信息以及专家分析结果的统计信息保存到数据库中。 2.病历管理:
采用列表的方式显示已导入的病历,提供对病历及信息的查询、回顾、删除等功能。
3.病历回顾:
浏览心电波形、并且显示对应的专家分析诊断结果,可调整波形的走速与增益,并可通过选择心律失常类型定位到指定时间。 4.设置功能:
用户可对文字、波形、心电图背景格、定标信号等指定颜色。
2.2 程序流程图
如图2-1所示,为软件的程序流程图,描述了软件的整体执行过程。
第3页 共30页
毕业设计(论文)
开始 初始化获取软件的执行路径 N 增加新 病例 Y 导入文件 根目录的Heart文件夹病例回顾 读取hea头 文件 得到病例信读到文件尾 Y N 读取数据文件 添加到数据库中 点击水平滚动条触发刷新 显示波形 设置nPos的值 nPos=m_nHScrollPos 显示专家标记 读取专家标记 文件 得到常见类型心律失常的统计信息 结束 图2-1 MIT-BIH心律失常心电图分析软件程序流程图
第4页 共30页
毕业设计(论文)
3 头文件的识读
头文件是由一行或多行ASCII字符码组成,至少包含一个记录行,通常还包括信号技术规范行,片段技术规范行(对于多片段数据记录)和信息注释行。
每条病历都对应一个头文件,头文件中包含了该条病历中患者的一些基本信息,包含患者的性别、年龄、用药情况等,以及采集信号时候的一些信号规范,比如采样频率、采集信号时的导联编号、信号电压基值等有效信息。在这款软件中根据功能方面的要求读取文件提取有效信息。将病历的部分相关信息保存至数据库以及利用提供的一些信号规范绘制波形。
3.1 头文件信息存储格式
记录行中从左到右依次记录了信号的名称、片段数(可选,对多片段记录,且与名称之间以“/”分隔)、信号数量、采样频率、计数频率(可选)、计数基值(可选,与计数频率配合使用且以圆括号而非空格分隔)、每信号采样数、采样开始时间(可选)、采样开始日期(可选),这些字段之间除前面指明的之外都是以空格分隔。
紧跟记录行的是信号技术规范行,该行主要包含了存储信号的文件名、存储格式、ADC增益、基线值、ADC分辨率、ADC零值、信号初始值等字段。片段技术规范行主要包括记录名称和每信号的采样数两个字段,该行只有在多片段记录的头文件中才有。 信息注释行一般在文件的最后,每行的开头以“#”开始,内容一般是说明患者的简单情况。
下面以编号100的头文件100.hea为例说明,文件的内容如下:
100 2 360 650000 0:0:0 0/0/0
100.dat 212 200 l1 1024 995 -22131 0 MLII 100.dat 212 200 11 1024 1011 20052 0 V5 # 69 M 1085 1629 x1 # Aldoment.Inderal
该头文件的第一行为记录行,指出该记录为一个包含两个采样率为360HZ的信号,每一信号的长度为65万个采样点,采样开始时间和日期没有记录。后面紧跟的两行为信号技术规范说明行,从中可以看出,两个信号都包含在文件100.dat中,每一信号都是以12位的位压缩格式(即“212”格式)进行存储的,两个信号的增益都是每200ADC
第5页 共30页
毕业设计(论文)
units/mv,ADC的分辨率为11位。ADC零值为1024,在这里基线值没有明确给出,但可以认为它等于ADC零值1024。两个信号的第一采样点的值分别为995和1011(可以看出这他们都略低于0V),65万个采样点的校验数分别为-22131和20052,输入输出可以以任何尺寸的块来执行,因为文件内容说明了这两个信号的该值都为0,信号描述字段说明了这两个信号分别采自MLII导联和V5导联。文件的最后两行包含了注释字符串,其中第一行说明了患者的性别和年龄以及记录数据,第二行列出了患者的用药情况。
3.2 读取头文件信息
因为每一个病历文件都是由三个基本文件组成的,一条完整的病历信息的获取需要同时读取对应的三个文件。当导入绘制波形的文件(.dat)文件的同时对该文件的后缀名做处理,比如当导入100.dat时,经过处理同时导入了100.hea和100.atr文件。具体实现方法如下代码所示:
int n_dot = Dsource.Find(\
CString beforedot = Dsource.Left(n_dot);
Hsource = beforedot + \
m_Hdest = MyApp->m_savepath + dlg.GetFileTitle() + \
通过WinHex软件查看可以了解到48条病历中的每一个.hea文件虽然存储的内容不相同,但是在文件中存储相同信息的位置顺序是相同的。比如说文件中第一个有效数据固定表示了病历的编号,这就方便了我们对文件的读取。把读取出的有用信息依次存放入一个结构体中。方便使用并且把结构体中的数据存入数据库中。读取头文件信息的代码及部分注释信息如下所示:
ReadHea(CString Path)//读头文件 {
CFile hfile;//定义一个文件类hfile
CString info[25];//定义一个数组,存放读取出来的病例信息 int m = 0;
char pbuf[500];//接收读取出的字节数据 CString str; CString single;
CString tempinfo;
memset(pbuf,0,sizeof(pbuf));//初始化字符数组
if (hfile.Open(m_Hdest,CFile::modeReadWrite) == NULL) {
return;//如果不能打开指定文件,就返回 } else
第6页 共30页