毕业设计(论文)
}
{ 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页