MIT-BIH心律失常心电图分析软件 - 毕业论文
更新时间:2024-01-12 17:14:01 阅读量: 教育文库 文档下载
毕业设计说明书(论文)
作 者: 学 号: 系 : 专 业: 题 目:
指导者:
(姓 名) (专业技术职务)
评阅者:
(姓 名) (专业技术职务)
2011 年 6 月 10 日
毕业设计(论文)中文摘要
MIT-BIH心律失常心电图分析软件 摘要: MIT-BIH 心律失常数据库是目前国际上公认的可作为标准的心律失常分析数据库之一。开始执行软件,需要导入外部数据文件,同时把病例信息保存至数据库,方便以后对病例信息的管理。想要绘制波形并且显示专家标记,可以通过读取自定义格式的二进制文件,获取心电两导波形数据以及专家在特定时间点标注的标记,实现对应波形与相关专家标记的同步,以及方便用户分析两导心电波形并且与专家做的标记相比对,了解各种心律失常类型的典型波形形态。至于对心律失常类型定位,浏览波形的同时,可以选择任意一种该病例中存在的心律失常类型,根据所选择的心律失常类型发生的时间顺序依次定位,定位显示出对应的心电波形。最后如果想对病例信息后台管理,可以借助数据库,实现病例中患者信息以及心律失常类型发生次数的统计,并且实现对病例的波形回顾、查询、删除等功能。 关键词: MIT-BIH 心律失常 两通道心电数据 专家诊断标记 MFC Access 毕业设计(论文)外文摘要
Title MIT-BIH of Arryhthmia Database Analysis Software Abstract The MIT-BIH Arryhthmia Database (MIT) is one of the international recognized databases as the standard arrhythmia analysis. Import the files into the software:It need import external data files,meanwhile save the case information into the database, and it is convenient to manage of the cases.Draw the wave and the expert marks:Through reading the defined format binary files, get two guide waveforms and the expert of masks in the specific time . The user analysis with the two guide ECG waveform and the experts mark. Our analysis results compared to the expert masks. Understand all kinds of arrhythmia types of waveform .Fix the arrhythmia type: While browsing the waveform, can choose any kind of the existing arrhythmia types in the case, according to the chosen arrhythmia type occurrence of time positioning, show the corresponding ECG waveform.Manage the case informations with the help of the database: While we import the cases, can also read the case information with the help of the database manage , realize cases patients information and common arrhythmia types of happen times of statistics. And it can realize some functions,such as the review of the waveform , inquiry case, and delete case. Keywords: MIT-BIH Arryhthmia Database two-channel ambulatory excerpts marks MFC Access
1 引言 ................................................................ 1 1.1 心电知识简介 ...................................................... 1 1.2 心电数据文件存储格式简介 .......................................... 2 2 MIT-BIH心律失常心电图分析软件整体设计............................... 3 2.1 软件主要功能 ...................................................... 3 2.2 程序流程图 ........................................................ 3 3 头文件的识读 ........................................................ 5 3.1 头文件信息存储格式 ................................................ 5 3.2 读取头文件信息 .................................................... 6 4 波形文件的识读...................................................... 8 4.1 绘制波形的主要技术指标 ............................................ 8 4.2 读取波形数据文件 .................................................. 9 4.3 绘制波形的实现过程 ............................................... 10 5 专家标记文件的识读 ................................................. 15 5.1 专家标记文件的读取 ............................................... 15 5.2 专家标记文件的显示 ............................................... 18 5.3 心律失常类型时间定位 ............................................. 22 6 病例信息管理 ....................................................... 23 6.1 打开数据库 ....................................................... 23 6.2 数据管理的主要功能 ............................................... 23 6.3 数据库中字段的设置 ............................................... 26 7 系统测试 ........................................................... 26 7.1 系统测试内容 ..................................................... 27 7.2 测试结果 ......................................................... 27 结 论 ................................................................ 28 参 考 文 献 ........................................................... 29 致 谢 ................................................................ 30
目 次
毕业设计(论文)
1 引言
目前世界上公认的心电数据库有三个,分别是美国麻省理工学院提供的MIT-BIH心电数据库,和美国心脏学会提供的AHA以及欧洲的ST-T心电数据库。其中MIT-BIH数据库近几年应用比较广泛。为了方便研究,该数据库的所有者也将越来越多的数据放到了互联网上。该数据库中的数据是通过录制在磁带上的模拟信号通过模数(A/D)转换后的数字信号。在存储时为了减少文件长度节省空间,采用了自定义的格式,无法使用通用的方法去读取这些数据,因此在一些网站上出现了读取该文件的工具软件和库函数,使用这些工具或函数就可以获取所有的数据。但是如果每次都是用这些工具软件或者库函数,不仅会增加程序的复杂度,而且使用也不灵活。我们完全可以根据文件的格式读出数据,可以灵活的使用这些心电数据。
该数据库中包含48条病历数据,每条病历均为30分钟两通道心电数据,包含全程(30分钟)专家诊断标记。
MIT-BIH 数据库近年来在心电图产品认证、心电图教学等方面应用比较广泛,尤其是IEC60601-2-47、AAMI EC57等标准中明确规定使用该数据库作为设备(软件)心律失常自动分析功能的性能测试数据库。
1.1 心电知识简介
(1)心电图:心脏的电激动过程影响着全身各部,使体表的不同部位发生了电位差,按照心脏激动的时间顺序,将此体表电位的变化记录下来,形成一条连续曲线,即为心电图。英文为electrocardiogram,简写为ECG。
在正常情况下,每次心动周期在心电图上均可出现相应的一组波形。如图1-1所示。
第1页 共30页
毕业设计(论文)
图 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页
毕业设计(论文)
}
{ hfile.Read(pbuf,sizeof(pbuf));//按字节读取文件
char *hp;
hp = &pbuf[0];
for (int k = 0;k<=sizeof(pbuf);k++) {
if (m == 25) { }
if ((int)*hp == 10||(int)*hp == 13) { }
hp++;
break;
if (*hp != ' '&&(int)*hp != 10&&(int)*hp != 13) { tempinfo = tempinfo + (CString)(*hp); } else {
info[m] = tempinfo; //把读取出的信息存放到数组中 tempinfo = \m++;
} hp++;
} }
m_case.m_ID = info[0];//把病历信息存放到结构体中 m_case.m_dao0 = info[12]; m_case.m_dao1 = info[21]; m_case.m_Name = info[13]; if (info[24] == \{ m_case.m_Sex = \女\} else {
m_case.m_Sex = \男\}
m_case.m_Age = atoi(info[23]);
hfile.Close();//关闭打开的文件,否则第二次导入文件会发生内存溢出错误
第7页 共30页
毕业设计(论文)
4 波形文件的识读
MIT-BIH 数据库中的数据存储格式有Format 8、Format16、Format 80、Format 212、Format 310等8种,具体到某一数据文件的存储格式已在相应的头文件中说明,在每一种格式中都是将来自两个或多个信号采样得到的数据交替存储。在这里仅介绍心律失常数据文件应用最多的Format 212格式的存储方法。格式212是针对两个信号的数据库记录,这两个信号(为了方便起见,我们设定为信号0和信号1)的采样数据进行交替存储,每三个字节存储两个数据,这两个数据分别采样自信号0和信号1,信号0的采样数据取自第一字节对(共16位)的最低12位,信号1的采样数据由第一字节对的剩余4位(作为组成信号1采样数据的12位的高4位)和下一字节的8位(作为组成信号1采样数据的12位的低8位)共同组成。两个信号的所有数据都按照这种方法连续存储。 如图4-1所示显示了100.dat的十六进制内容的一个片段。
图 4-1 数据文件100.dat的十六进制显示(片段)
按照“212”的存储格式,从第一字节读起,每三个字节(24位)表示两个值,第一组为“E3 33 F3”,两个值则分别为Ox3E3和0x3F3,转换为十进制分别为995和1011,代表的信号幅度分别为4.975mv(计算过程:读出的数据/信号的增益值)和5.055mv,这两个值分别是两个信号的第一个采样点,后面依此类推,分别表示了两个信号的采样值。
4.1 绘制波形的主要技术指标
采样频率:信号的采样率(该软件的采样频率为360HZ);
走速 (走纸速度):屏幕上1mm约等于4个像素点,以标准走速25mm/s为例,每秒钟在屏幕上显示100个像素点,小于信号采集时的360个点。所以绘制波形的时候需要隔点(360/100)读取原始的采样数据用于绘制波形(25mm/s、50mm/s)。
第8页 共30页
毕业设计(论文)
增益 (灵敏度):(5mm/mV、10mm/mV、20mm/mV)绘制波形的时候根据增益值得出波形在垂直方向上的增量。
由于走速的设置要求我们隔点读取数据,在软件中标准走速为25mm/s的时候隔点数目为3.6,这就需要把存储波形数据的数组下标定义成浮点类型,把误差降低到最低。
4.2 读取波形数据文件
绘制波形的数据量很大,每个波形文件中每导波形存储了650000个像素数据,由于外部显示设备的宽度限制,不可能一次显示出所有波形文件,所以在软件中每次只处理足够显示一屏的数据量,这就要求我们读取波形文件的时候根据走速设置每次读取一定量的数据,借助滚动条显示下一时间段的波形时,再读取文件处理该时间段的波形数据。具体实现代码如下所示:
ReadDat(CString Path)//读数据文件 {
m_0 = 0; m_1 = 0;
CFile dfile;
if(dfile.Open(Path,CFile::modeReadWrite|CFile::typeBinary) == NULL) {
return; } int filelongth = dfile.GetLength();
unsigned char * pbuf=(unsigned char*)malloc(filelongth*sizeof(unsigned char));
int *mydata = (int*)malloc(filelongth*sizeof(int));
dfile.Read(pbuf,filelongth); CSyssetDlg dlg;
for(float i = m_nHScrollPos*(m_set.m_v*4)*(360/(m_set.m_v*4))*3;i
<
(m_nHScrollPos*m_set.m_v*4*(360/(m_set.m_v*4))+m_widthwave*(360/(m_set.m_v*4)))*3-1 && i <(filelongth); i = i++)//i表示文件中从0开始的字节的标号,每次只处理可以显示一屏的数据
{
mydata[(int)i] = pbuf[(int)i];//按字节读取文件
}
for (float j = m_nHScrollPos*(m_set.m_v*4)*(360/(m_set.m_v*4))*3+1;j <
(m_nHScrollPos*m_set.m_v*4*(360/(m_set.m_v*4))+m_widthwave*(360/(m_set.m_v*4)))*3-2 && j <=(filelongth); j = j++)//j表示移动读数据移动指针的位置
第9页 共30页
毕业设计(论文)
}
{ int m = 15&mydata[(int)j];
int x0 = m*256+mydata[(int)j-1]; j++;
m_data0[m_0] = (float)x0/200-(float)5.120;//得到第一导波形的画波数据 m_0++; int n = 240&mydata[(int)j-1]; n = n>>4;
int x1 = n*256+mydata[(int)j];
j++;
m_data1[m_1] = (float)x1/200-(float)5.120;//得到第二导波形的画波数据
m_1++; }
dfile.Close(); free(pbuf); free(mydata);
4.3 绘制波形的实现过程
实现连续波形显示,连续波形绘制主要思想是,利用MoveTo和LineTo这两个函数,当画完一个新点后,要将这个新点的坐标记录下来,作为下一次画线的起点,这样就解决了连续绘制波形。
绘制波形的代码如下所示:
DrawWave(CDC* pDC)//画波形 {
CSyssetDlg dlg;
CPen pen3;
pen3.CreatePen(PS_COSMETIC, 2, m_set.m_wavecolor);//创建波形画笔 int startx = 40; int endx = startx;
int endy; int endy1;
int top0 = 250-m_nVScrollPos;
int top1 = 450-m_nVScrollPos;
m_widthwave = 100*(int)((pDC->GetDeviceCaps(HORZRES) - 44)/100);
for (float fi = 0;fi 间是一秒 { int i = (int)fi; if (i == 0) 第10页 共30页 毕业设计(论文) { if (m_data0[0]>0) { //得到 endy = top0 - abs((int)((m_data0[0]*m_set.m_up*4))); 第一道波形位置点的纵坐标值 } } else { endy = top0 + abs((int)((m_data0[0]*m_set.m_up*4))); } pDC->MoveTo(startx,endy); continue; else { if (m_data0[i]>0) { } else { endy = top0 + abs((int)((m_data0[i]*m_set.m_up*4))); } pDC->SelectObject(&pen3); endy = top0 - abs((int)((m_data0[i]*m_set.m_up*4))); pDC->LineTo(endx,endy); } endx = endx++; } endx = startx;//第一导波形输出完后把end_x的坐标设置成初始值 for (float fii = 0;fii< m_1;fii = fii+(360/(m_set.m_v*4))) { int ii = (int)fii; if (ii == 0) { if (m_data1[0]>0) { endy1 = top1 - abs((int)((m_data1[0]*m_set.m_up*4))); } else { endy1 = top1 + abs((int)((m_data1[0]*m_set.m_up*4))); } pDC->MoveTo(startx,endy1);//心电数据中的第一个点做为起点 第11页 共30页 毕业设计(论文) } } continue; } else { if (m_data1[ii]>0) { endy1 = top1 - abs((int)((m_data1[ii]*m_set.m_up*4))); } else { endy1 = top1 + abs((int)((m_data1[ii]*m_set.m_up*4))); } pDC->LineTo(endx,endy1); } endx = endx++; 图 4-2 100.dat的两导波形片段 如图4-2所示的波形的采样频率为360HZ,走速为标准走速25mm/s,增益值为5mm/mV。背景格中每一个大格约为20个像素(5mm)。 4.3.1 采用滚动条控制显示特定时间段的波形 每一个病例信息文件都是由大量的像素点组成,由于屏幕的显示宽度是有限的,不可能一次显示出所有的波形文件,所以通过在视图中加入水平滚动条来控制波形的显示,设置滑块在水平滚动条上的位置表示波形的时间,运行程序时调节滑块的位置,可以显示不同时间段的波形。如图4-3所示为滚动条的调节过程: 第12页 共30页 毕业设计(论文) 设置水平滚动条 的nPos的值 根据nPos的值和m_v计算显示一屏波形需要读取的字节根据m_v隔点取值绘制心电两导波形 nPos的值改变 图4-3 绘制波形的过程(“nPos”为滑块在水平滚动条上的位置,“m_v”为波形的走速) 设置水平滚动条的代码如下所示: void CHeart_viewView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)//水平滚动条 { int nMin = 0; int nMax = 0; GetScrollRange(SB_HORZ, &nMin, &nMax); switch(nSBCode) { case SB_LEFT: m_nHScrollPos = max(m_nHScrollPos - 1, nMin); break; case SB_RIGHT: m_nHScrollPos = min(m_nHScrollPos + 1, nMax); break; case SB_LINELEFT: m_nHScrollPos = max(m_nHScrollPos - 1, nMin); break; case SB_LINERIGHT: m_nHScrollPos = min(m_nHScrollPos + 1, nMax); break; case SB_PAGELEFT: m_nHScrollPos = max(m_nHScrollPos - 1, nMin); break; case SB_PAGERIGHT: m_nHScrollPos = min(m_nHScrollPos + 1, nMax); break; case SB_THUMBTRACK: } m_nHScrollPos = nPos; break; return; default: SetScrollPos(SB_HORZ,m_nHScrollPos,TRUE); Invalidate(0); 第13页 共30页 毕业设计(论文) } CView::OnHScroll(nSBCode, nPos, pScrollBar); void CHeart_viewView::SetHScrollPos()//设置数值 { } SCROLLINFO si; si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nPage = 1; si.nMax = 1805; si.nPos = m_nHScrollPos; SetScrollInfo(SB_HORZ,&si,TRUE); 4.3.2 解决屏幕闪烁现象 滚动条可以很好的解决波形的显示,通过调节水平滑块可以方便快速的查看特定时间段的波形,但同样也带来了一个显示效果上的问题,由于大量GDI绘图,快速移动滑块的时候会造成屏幕的闪烁现象。解决这一问题采用了双缓冲技术。 双缓冲技术:大量GDI绘图操作(含有擦除操作)直接输出到屏幕DC时,造成屏幕闪烁。解决办法:创建并使用后台DC进行绘制操作,然后将后台DC中的内容一次拷贝(贴图)到屏幕DC上,即双缓冲技术。相关实现代码如下图所示: MemDC = new CDC; MemBitmap = new CBitmap; MemDC->CreateCompatibleDC(pDC); CRect rc; GetClientRect(&rc); MemBitmap->CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); CBitmap *pOldBit = MemDC->SelectObject(MemBitmap); MemDC->FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,255,255)); CHeart_viewDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); MemDC->SetBkMode(TRANSPARENT); MemDC->SetTextColor(m_set.m_textcolor); DrawWave(MemDC); pDC->BitBlt(0,0,rc.Width(),rc.Height(),MemDC,0,0,SRCCOPY); MemDC->DeleteDC(); MemBitmap->DeleteObject(); 第14页 共30页 毕业设计(论文) 5 专家标记文件的识读 注释文件记录了心电专家对相应心电信号的诊断信息,主要有两种格式:MIT格式和AHA格式。MIT格式是一种紧簇型格式,每一注释的长度占用偶数个字节的空间,多数情况下是占用两个字节,多用于在线的注释文件;而AHA格式的每一注释占用16个字节的空间,多用于交换文件的情况。在这里简要说明一下常用的MIT格式的存储方式,每一注释单元的前两个字节的第一个字节为最低有效位,16位中的最高6位表示了注释类型代码,剩余的10位说明了该注释点的发生时间或为辅助信息,若为发生时间,其值为该注释点到前一注释点的间隔(对于第一个注释点为从记录的开始到该点的间隔),若为辅助信息则说明了附加信息的长度。这两种格式的在文件中的区分决定于前两个字节的值,判断是MIT格式还是AHA格式的条件是:若文件的第一字节不为0或第二字节等于“[”(0x5B)或“]”(0x5D),则该文件是以MIT格式存储的,否则是按AHA格式存储的。 5.1 专家标记文件的读取 下面以记录100的注释文件100.atr为例进行说明,图5-1显示了100.atr的十六进制内容的一个片段。 图 5-1 注释文件100.atr的十六进制显示(片段) 从第一字节开始按照MIT格式进行分析,首先读出16位值0x7012,其高6位的值为0x1C(十进制28),10位的值为0x12,该类型代码为28,代表意义是节律变化,发生时间在0.05秒(18/360Hz);接着读出后面的16位值0xFC03,其高6位的值为0x3F(十进制63),低10位的值为0x03,该类型代码为63,代表的意义是在该16位值后附加了3个(低10位值代表的数)字节的辅助信息,若字节个数为奇数,则再附加一个字节的空值, 第15页 共30页 毕业设计(论文) 在本例中就是“28 00 00 4E”;然后再从下一字节读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位。读取专家标记文件的实现过程如下所示: int *mode; int *t; int *f; int *sumt; int v = 1; int s; CFile fatr; CString mask; if (fatr.Open(m_Adest,CFile::modeReadWrite|CFile::typeBinary) == NULL) { return; } else { int filelongth = fatr.GetLength(); unsigned char *pbuf = (unsigned char*)malloc(filelongth*sizeof(unsigned char));//从脚标为0的开始存 mode = (int*)malloc(filelongth*sizeof(int)); t = (int*)malloc(filelongth*sizeof(int)); f = (int*)malloc(filelongth*sizeof(int)); sumt = (int*)malloc(filelongth*sizeof(int)); fatr.Read(pbuf,filelongth); int q = 0; int u = 0; sumt[0] = 0; if (pbuf[0] != 0 || pbuf[1] == 91 || pbuf[1] == 93) { for ( int k = 0;k < filelongth - 2;)//k是指向低字节的变量 { int aa = pbuf[k+1]&252;//读取数据码的过程 mode[v-1] = aa>>2; if (mode[v-1] > 0 && mode[v-1] <= 41) { int cc = ((pbuf[k+1]&3)<<8) + pbuf[k]; 第16页 共30页 毕业设计(论文) sumt[v] = sumt[v-1] + cc;//获取时间点信息 v++; q++; k = k + 2; continue; } if (mode[v-1] == 59) { int low_8 = pbuf[k+2]; int heigt_8 = pbuf[k+3]<<8;//左移8位 int first = ((low_8 + heigt_8)*2)^16; low_8 = pbuf[k+4]; heigt_8 = pbuf[k+5]<<8; int second = low_8 + heigt_8; t[q] = first + second;//计算时间 sumt[v] = sumt[v-1] + t[q];//获取时间点信息 v++; q++; k = k + 6;//需要获取时间 continue; } if (mode[v-1] == 60||mode[v-1] == 61||mode[v-1] == 62) { k = k + 2;//不获取时间 continue; } if (mode[v-1] == 63) {//需要计算辅助信息 int dd = ((pbuf[k+1]&3)<<8) + pbuf[k]; if (dd%2 != 0) { k = k + dd + 3; } else { } k = k + dd + 2; u++; continue; } } s = v - 1; int i = 0;//时间定位相关 memset(m_fix,0,sizeof(m_fix)); 第17页 共30页 毕业设计(论文) } } for(v = 1;v <= s;v++) { } if (mode[v-1] == m_fixmode && m_fixflag == 1) { } m_fix[i] = (int)(sumt[v]/360); m_fixi = i;//记录存在的时间点的个数 i++; else { } return; 5.2 专家标记文件的显示 每一屏波形有固定的时间间隔,但是对应的每一屏标记信号并没有固定的时间间隔,也不存在发生的时间规律,但是需要与波形文件在时间上达到同步。所以在处理专家标记文件的时候采用的筛选标记的方法,在特定时间段中筛选出符合条件的标记文件,具体代码如下所示: for (v = 1;v <= s;v++) { int maskt; if (m_set.m_v == 25) { maskt = (int)(m_widthwave/(m_set.m_v*4) + 0.5);//计算一屏的显示时间 } else { maskt = (int)(m_widthwave/(m_set.m_v*4) + 0.5); } if (sumt[v] >= (m_nHScrollPos)*360 && sumt[v] <= (maskt + m_nHScrollPos)*360) { switch(mode[v-1]) { case 1: mask = \case 2: mask = \case 3: mask = \case 4: mask = \ 第18页 共30页 毕业设计(论文) } case 5: mask = \case 6: mask = \case 7: mask = \case 8: mask = \case 9: mask = \case 10: mask = \case 11: mask = \case 12: mask = \case 13: mask = \case 14: mask = \case 16: mask = \case 18: mask = \case 19: mask = \case 20: mask = \case 22: mask = \case 23: mask = \case 24: mask = \case 25: mask = \case 26: mask = \case 27: mask = \case 28: mask = \case 29: mask = \case 30: mask = \case 31: mask = \case 32: mask = \case 33: mask = \case 34: mask = \case 35: mask = \case 37: mask = \case 38: mask = \case 39: mask = \case 40: mask = \case 41: mask = \ 如图5-2所示为波形文件与专家标记同步后的效果图: 第19页 共30页 毕业设计(论文) 图 5-2 记录100的波形及注释内容(片段)(“N”表示正常心博,“A”表示房性早博) 5.2.1 定义专家标记文件 代码数值 0 1 2 3 4 5 6 7 8 9 10 注释代码 N L R a V F J A S E No TQRS Normal beat Left bundle branch block beat Right bundle branch block beat Aberrated atrial premature beat Premature ventricular contraction Fusuion of ventricular and normal beat Nodal (junctional) premature beat Atrial premature beat Premature or ectopic supraventricular beat Ventricular escape beat 说明 表 5.1 心律失常类型代码 第20页 共30页 毕业设计(论文) 续表 5.1 心律失常类型代码 代码数值 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 注释代码 j / Q ~ | s T * D \= p B ^ t + u ? ! [ 说明 Nodal (junctional) escape beat Paced beat Unclassifiable beat Signal quality change Not specified Isolated QRS-like artifact Not specified ST change T-wave change Systole Diastole Comment annotation Measurement annotation P-wave peak Left or right bundle branch block Non-conducted pacer spike T-wave peak Rythm change U-wave peak Learning Ventricular flutter wave Start of ventricular flutter/fibrillation 第21页 共30页 毕业设计(论文) 续表 5.1 心律失常类型代码 代码数值 33 34 35 36 37 38 39 40 41 注释代码 ] e n x f ( ) r 说明 End of ventricular flutter/fibrillation Atrial escape beat Supraventricular espace beat Not specified Non-conducted P-wave (blocked APB) Fusion of paced and normal beat Waveform onset, PQ junction(begin of QRS) Waveform end, JPT(J point, end of QRS) R-on-T premature ventricular contraction 5.3 心律失常类型时间定位 心电数据包括大约30分钟的心电波形数据以及全程的专家诊断标记。在绘制的大量波形中要想能够快速的查看某一特定心律失常类型,需要设置心律失常时间定位功能,浏览某一病例波形的同时,可以选择该病例信息中存在的心律失常类型,按照该心律失常类型发生时间的先后顺序,依次定位到对应的时间点,而且可以准确的定位到当前心律失常类型的上一个或者下一个发生的时间点,并且显示该心律失常类型对应的心电波形。 如图5-3所示为选择心律失常类型的定位模块。 第22页 共30页 毕业设计(论文) 图 5-3 心律失常类型定位 6 病例信息管理 在软件中导入源文件后,同时把病历的基本信息以及专家诊断标记的统计信息保存至Access数据库中。在MFC开发框架中,引入了对数据库操作的类文件,使软件中对数据库的操作更加方便。 6.1 打开数据库 每次对数据库进行操作时都需要打开数据库,在软件中引入了对数据库封装的类文件,该文件中几乎包括了对数据库操作的所有类。 在软件中打开数据库建立结果集的操作代码如下所示: CADODatabase db; if(db.Open(\Source=\ { CADORecordset rs(&db); } 6.2 数据管理的主要功能 后台数据库的管理主要包括以下几个部分: 查询:根据唯一标识病例的病例编号查询数据库中的病例记录; 第23页 共30页 毕业设计(论文) 浏览全部:可以显示数据库中所有的记录; 删除:选择某一条病例记录,删除数据库中对应的记录和软件中该病例对应的数据文件(.dat .hea .atr文件); 清空记录:删除数据库中的所有记录以及软件指定目录中保存的数据文件; 回顾波形:选择一条记录,可以查看该记录对应的波形和专家诊断信息; 如下为实现查询功能的代码: void CDlgDB::OnBUTfind() //查找 { UpdateData(1); if (m_strfind != \ { CADODatabase db; if(db.Open(\Source=\ { CADORecordset rs(&db); CString mydelete; CString name,sex; int age,a,v,f,l,r; mydelete.Format(\rs.Open(mydelete,1); m_conlist.DeleteAllItems(); while(!rs.IsEof()) { rs.GetFieldValue(\rs.GetFieldValue(\rs.GetFieldValue(\rs.GetFieldValue(\rs.GetFieldValue(\rs.GetFieldValue(\rs.GetFieldValue(\ rs.GetFieldValue(\ CString strage,stra,strv,strf,strl,strr; strage.Format(\m_conlist.InsertItem(0,name); stra.Format(\strv.Format(\strf.Format(\strl.Format(\strr.Format(\ m_conlist.SetItemText(0,1,sex); 第24页 共30页 毕业设计(论文) } } m_conlist.SetItemText(0,2,strage); m_conlist.SetItemText(0,3,stra); m_conlist.SetItemText(0,4,strv); m_conlist.SetItemText(0,5,strf); m_conlist.SetItemText(0,6,strl); m_conlist.SetItemText(0,7,strr); rs.MoveNext(); } rs.Close(); db.Close(); else { MessageBox(\请输入文件编号!\ } } 如图6-1所示为病例信息管理模块的主要功能: 图 6-1 数据库管理模块 第25页 共30页 毕业设计(论文) 6.3 数据库中字段的设置 数据库中存储了病例中患者的基本信息,方便软件对病例的管理以及通过患 者的个体信息观察对应的心电两导波形。 如表6.2所示,数据库中字段值的设置。数据库中存储病例的信息,以及常见心律失常类型的专家标记的统计信息。 表 6.2 数据库中字段设置 字段名称 ID Sex Age A V F L R 数据类型 文本 文本 数字 数字 数字 数字 数字 数字 说明 病历编号(主键) 患者的性别 患者的年龄 统计房性早搏的次数 统计室性期前收缩的次数 统计心室融合心跳的次数 统计左束支传导阻滞的次数 统计右束支传导阻滞的次数 图 6-2 数据库中存储的部分病例信息数据 7 系统测试 软件的测试贯穿在了编写软件的整个过程中,软件中每增加一处新的功能代码及模块都需要进行测试,保证增加的代码及模块不会引入新的错误,成功后才能进行下 第26页 共30页 毕业设计(论文) 一步代码的编写。及时的发现错误并更正,修改错误的时间越晚付出的代价越高,养成良好的编写代码的习惯。通过在编写代码的过程中不断进行的测试,才可以提高系统的稳定性。在软件编写完成的时候需要进行整体模块的测试。 7.1 系统测试内容 在软件中主要从以下几方面测试系统: 1. 导入.dat文件后,其余两个相关文件是否可以同时导入软件指定的文件夹中; 2. 导入新病例后,浏览波形时波形的显示以及时间是否正确; 3. 波形与专家标记在全程心电记录中是否可以正确的相对应; 4. 最后需要观察两导波形在末尾的时候是否可以正常显示,在最后一个波形处专家 标记是否可以正常显示; 5. 浏览某一病例的波形,选择病例中存在的一种心律失常类型,是否可以正确定位; 6. 当浏览某一病例的波形时,选择该病例中不存在的一种心律失常类型时,软件是 否可以提示用户该类型不存在; 7. 打开历史病例列表时,对历史病例的一些操作,比如删除了该病例在数据库中的 记录的同时,是否同时删除了该病例在软件中的对应文件; 8. 查询历史记录的时候,当查询条件为空或不存在的时候系统是否可以提示用户,并 且仍可以正常运行; 9. 回顾波形时是否可以正确显示所选择的波形文件; 10. 测试系统参数的设置,软件每次运行时是否可以保存上次的系统参数,对.ini文 件的读取和写入是否正确; 11. 需要对48条病例,逐条进行以上操作的测试; 7.2 测试结果 前十项所述功能均正常,但对48条病例逐条测试的时候仍存在问题,编号220的病例文件不能显示专家标记。读取注释文件按MIT格式读取的,不能读取AHA格式的数据,了解MIT和AHA两种格式后,在WinHex软件中查看,编号为220病例的注释文件,是按照AHA格式存储的。软件中只读取MIT格式的文件,所以220对应的三个文件可以导入到软件根目录文件夹中,但220的病例信息不能保存到数据库中,仍有待于继续改善。 第27页 共30页 毕业设计(论文) 结 论 软件通过分析MIT-BIH心电数据文件,使用户可以很好的观察各种常见的心律失常类型的波形形态。并且可以通过后台的数据库管理病例信息,用户可以对导入的文件进行查询、删除等操作。这款软件可以算是一个心电分析软件的简单模型,通过查看波形分析出的结果与专家标记的比对,可以帮助初学者学习认识各种心律失常类型对应的心电图形形态。 软件仍存在许多需要改进的地方,首先在软件的代码编写过程中,在成员变量的设置上还有待进一步完善,代码中成员变量的数目没能降到最低,降低了软件模块的耦合度,软件的模块化思想体现的不明确。 软件的设计仍有很大的局限性,软件只是可以读取MIT格式的专家标记文件,软件不可以分析其他格式的心电波形文件,距离作为一款实际应用软件还有很大的差距。在软件模型的后台数据库设计中,也仍有需要进一步改进的地方,因为在这款软件中只是分析48条病例信息,病例信息数目不多,所以在设置查询条件的时候只设置了按照病例编号进行查询,通过改进应设置可以按照不同的查询条件进行搜索。所以需要从各个方面继续提高软件的质量。 第28页 共30页 毕业设计(论文) 参 考 文 献 1 陈志泊,王春玲.面向对象的程序设计语言 C++.第1版.北京:人民邮电出版社,2004 2 赛奎春.VC++经验技巧宝典.北京:人民邮电出版社,2007 3 明日科技,宋坤,刘锐宁,李伟明.北京:人民邮电出版社,2007 4 宋喜国 ,邓亲恺. MIT-BIH心率失常数据库的识读及应用:广东:重点科技计划项目“社区无线医疗监护系统的研究开发”,2004 5 姚领田.精通MFC程序设计.第1版.北京:人民邮电出版社,2006 6 候俊杰.深入浅出MFC.第2版.武汉:华中科技大学出版社,2008 7 侯其峰,李晓华,李莎.Visual C++ 数据库通用模块开发与系统移植.第1版.北京:清华大学出版社,2007 8 张海藩.软件工程导论.第5版.北京:清华大学出版社,2008 9 阎强,管栋梁.简明心电图手册.第1版.武汉:人民卫生出版社,2001 10于明等编著,Visual C++程序设计教程,海洋出版社,2001 11 郑人杰主编,软件工程,清华大学出版,1999 12 王育坚等编著,Visual C++程序基础教程,北京邮电大学出版社,2000 13 李光明主编,Visual C++6.0经典实例大制作,中国人事出版社,2001 14陈光明主编,实用Visual C++编程大全,西安电子科技大学出版社,2000 15[美]Beck Zaratian著,Visual C++6.0Programmer’s Guide,北京希望电脑公司,1998 第29页 共30页 毕业设计(论文) 致 谢 临近毕业,非常感谢学校老师的栽培,在以后的工作和生活中,学生一定会铭记老师的辛勤教导。也感谢大学期间在我身边的每一个同学,在学习和生活中我们一起成长,携手走过了这段珍贵的大学时光。同时也非常感谢公司的同事们,在实习的时候给我提供了很多帮助,在以后的工作中我会加倍努力,和他们并肩工作,一起奋斗。 第30页 共30页
正在阅读:
MIT-BIH心律失常心电图分析软件 - 毕业论文01-12
大学语文(东南大学大学语文课程期末总结)11-23
科学试卷分析02-17
2018年塑料包装材料企业公司组织架构图职能部门及工作职责12-25
2013年人大办公室工作总结05-22
2019七年级数学上册 4.3 角 4.3.2 角的比较与运算学案(无答案)(新版)新人教版09-17
给物业的整改告知函-终稿05-05
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 心律失常
- 心电图
- 分析软件
- 毕业论文
- MIT
- BIH
- 722型分光光度计期间核查作业指导书
- 医学影像超声诊断三基试题(附答案)
- 江苏英汉翻译自考 章节习题详解
- 海盗分宝石
- 安徽省皖江区域示范高中2016届高三摸底联考语文试题(解析版)
- 卫生学习题集
- 孕妇 德语词汇
- 监理公司绩效考核制度
- 画图程序 - 漂亮花边
- 心情短语之行政事业单位全面预算管理中存在的问题及建议
- 2018届浙江省普通高校招生选考科目模拟考试地理试题(一)(解析版)
- 北京市朝阳区人民政府办公室- 通州区
- Iphone4最真实最详细的感受 6000字巨作
- 2018年中国宾馆酒店现状分析及市场前景预测(目录) - 图文
- 电子科技大学模电模拟电路实验报告
- 10工业废水处理系统调试方案
- 武汉市2016届高中毕业生四月调研测试(文综+答案) - 图文
- confluence,jira,crowd的集成(openldap认证)
- 2017年山东省泰安市高考生物一模试卷解析版
- 氢化反应釜发生物理爆炸的事故后果模拟分析