MIT-BIH心律失常心电图分析软件 - 毕业论文(4)

2019-09-01 13:08

毕业设计(论文)

}

}

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页


MIT-BIH心律失常心电图分析软件 - 毕业论文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Iphone4最真实最详细的感受 6000字巨作

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: