心电信号模拟采集软件报告.docx
- 文档编号:11732219
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:14
- 大小:234.99KB
心电信号模拟采集软件报告.docx
《心电信号模拟采集软件报告.docx》由会员分享,可在线阅读,更多相关《心电信号模拟采集软件报告.docx(14页珍藏版)》请在冰豆网上搜索。
心电信号模拟采集软件报告
心电信号模拟采集
目录
1.实验目的3
2.实验内容3
3.功能描述3
4.实验步骤3
4.1创建对话框3
4.2.编辑对话框5
4.2.1参数设置5
4.2.2曲线显示8
4.2.3打印11
5.总结与感悟14
1.实验目的
使用MFC进行编程,并掌握编程的技巧。
2.实验内容
用MFC向导创建一个对话框应用程序,实现参数的保存、显示曲线图以及打印等功能。
●使用C++语言实现
●使用VS2010集成开发环境开发
●使用MFC应用程序开发框架
3.功能描述
●首先确定放大器的参数、数据卡采集频率设置:
放大倍数选择50,100,200,500,1000,2000,5000.
高通截止频率选择:
0.01,0.05,0.1,0.5,1,5,10,30,100Hz。
低通截止频率选择:
10,30,100,200,500,1000Hz。
数据卡采集频率设置:
100,200,500,1000,2000,5000,10000byte/s。
设置好后,将设计好后的数据保存到某个文件中。
●缺乏数据采集卡,拟采用已有心电数据文件,打开并读入,然后在屏幕上显示,并且打印波形,写入到xps文件中。
4.实验步骤
●基本功能描述
打开exe文件,在参数设置一栏中,选择所需要的参数,然后点击保存,即会弹出窗口选择所要保存得位置。
点击显示图形按钮,就会在图形上把数据读进去,并显示曲线图。
点击打印按钮,即进入打印的的界面,开始打印曲线图。
●设计思路
1.对需要用到的变量进行初始化,并对控件添加变量,设置变量值。
2.选择相应的按钮之后就响应相应的消息处理函数,实现相对应的功能。
●软件设计
4.1创建对话框
创建一个MFCAppWizard[exe]工程,命名为“PrintDemo”,如图1所示,并创建对话框,如图2所示。
创建成功后,系统自动生成的对话框,如图3所示。
图1
图2
图3
4.2.编辑对话框
在对话框中添加4个ComboBox控件,7个StaticText,3个Button控件,1个tchart控件,并把对话框的Caption改为“心电信号模拟采集软件”。
界面如图4下:
图4
4.2.1参数设置
在参数设置中,添加控件GroupBox,并设置标题为参数设置,即把放大器倍数、高通滤波器频率、低通滤波器频率、数据采集卡频率放到控件GroupBox中,这样会给人感觉比较规整。
设置好之后,在ComboBox的属性Data中添加所要设置的参数,各个数字之间以“;”隔开,属性如图5所示,这样在控件中将会按行排序。
修改各个控件的ID号,并对其添加变量,如图6所示,在程序初始化中,我把各个参数的第一个参数设置为默认参数,这样在运行时,就直接出现第一个参数,其产生的效果如图7所示。
在参数保存中,我选择的保存方式是.txt文档的形式,为了让保存的数据更加清晰明了,我在每一个数据之前都添加了一个注释。
也就是说保存之后,可以使客户一眼就能看出代表的什么意思,如图8所示。
图5
图6
图7
图8
为了是实现上述的运行之后显示第一个参数,在初始化函数中,添加的程序为:
((CComboBox*)GetDlgItem(IDC_HighFilter_COMBO))->SetCurSel(0);
((CComboBox*)GetDlgItem(IDC_Amplifier_COMBO))->SetCurSel(0);
((CComboBox*)GetDlgItem(IDC_Data_COMBO))->SetCurSel(0);
((CComboBox*)GetDlgItem(IDC_LowFilter_COMBO))->SetCurSel(0);
在参数保存按钮中,添加的程序为:
CFileDialogFileDlg(false,".txt","",OFN_CREATEPROMPT,"文本文件
(*.txt)|*.txt");
if(IDOK==FileDlg.DoModal())
{
CStringstrName=FileDlg.GetPathName();
GetDlgItem(IDC_Amplifier_COMBO)->GetWindowText(m_comboamplifier);
GetDlgItem(IDC_HighFilter_COMBO)->GetWindowText(m_combohighfilter);
GetDlgItem(IDC_LowFilter_COMBO)->GetWindowText(m_combolowfilter);
GetDlgItem(IDC_Data_COMBO)->GetWindowText(m_combodata);
CStringstrEdit=m_comboamplifier;
CStringstrEdit1=m_combohighfilter;
CStringstrEdit2=m_combolowfilter;
CStringstrEdit3=m_combodata;
FILE*pflOut;
pflOut=fopen(strName,"wb");
if(pflOut==NULL)
{
MessageBox(_T("文件创建失败"));
}
fputs("放大器参数:
"+strEdit+"",pflOut);//写¡ä文?
件t内¨²容¨Y。
¡ê
fputs("高通滤波器参数:
"+strEdit1+"",pflOut);
fputs("低通滤波器参数:
+strEdit2+"",pflOut);
fputs("数据采集频率:
"+strEdit3+"",pflOut);
fclose(pflOut);//关?
闭À?
文?
件t指?
针?
。
¡ê
AfxMessageBox(_T("参数保存成功|"));
}
else
{
;
}
4.2.2曲线显示
在显示曲线图时,我选择的是通过添加控件Teechart5,由于tchart控件功能比较强大,双击控件即可进入修改控件中的参数的界面,点击添加曲线图,选择fastline,并对轴进行修改,添加横轴纵轴标签,如图9所示。
还可以自动实现曲线图的放大、缩小,曲线图的形状、视图状态、拖拉、显示数据等功能,并对其进行设置,即把数据传到曲线图中。
在这里我将会展示两种曲线图,分别如图10,11所示。
图10是显示部分数据,这里的曲线图比较直观,可以很快的观察到曲线图的变化。
图11显示的曲线图是把所有的数据都传了进去,并且横轴坐标时间是以秒计算的。
图12是曲线图放大部分,图13是显示的曲线图下移部分。
图9
图10
图11
图12
图13
显示曲线图部分的代码程序如下所示:
ifstreamifs("samples.txt");
CStringstrLine(_T(""));
stringstrText("");
LPCTSTRszToken(_T(""));
intcurPos=0;
intnIndex=0;
vector
intnCount=0;
while(getline(ifs,strText))
{
curPos=0;
strLine.Trim(_T(""));
nIndex=0;
if(strTpare("")!
=0)
{
stringstr1=strText.substr(2,2);
stringstr2=strText.substr(5,3);
stringstr3=strText.substr(10);
chartime[10];
itoa(atoi(str1.c_str())*1000+atoi(str2.c_str()),time,10);
strings_time(time);
Nodetemp(strtod(s_time.c_str(),NULL),atof(str3.c_str()));
myNodeList.push_back(temp);
}
nCount++;
}
CSeriessertDemo=(CSeries)m_tchart.Series(0);
sertDemo.Clear();
for(inti=0;i { sertDemo.AddXY(myNodeList[i].GetTime(),myNodeList[i].GetVolt(),NULL,NULL); } 4.2.3打印 打印部分,添加打印预览窗口,并设置相对应的变量,代码如下所示: LRESULTCPrintDemoDlg: : OnPrintWindow(WPARAMwParam,LPARAMlParam) { CRectrectWnd; BITMAPbmGraphy; CBitmapbitmapTemp,*pOldBmpGraphy; CDC*pGraphyDC=newCDC; CDC*pDC=GetDC(); CDC*pPrintDC=(CDC*)wParam; CPrintInfo*pInfo=(CPrintInfo*)lParam; m_bitmapPrint.GetBitmap(&bmGraphy); pGraphyDC->CreateCompatibleDC(pDC); pOldBmpGraphy=pGraphyDC->SelectObject(&m_bitmapPrint); pPrintDC->StretchBlt(pInfo->m_rectDraw.left,pInfo->m_rectDraw.top,pInfo->m_rectDraw.Width(),pInfo->m_rectDraw.Height(),pGraphyDC,0,0,bmGraphy.bmWidth,bmGraphy.bmHeight,SRCCOPY); pGraphyDC->SelectObject(pOldBmpGraphy); ReleaseDC(pGraphyDC); deletepGraphyDC; return1; } 添加获取窗口曲线函数,获得窗口位图。 程序如下所示: voidCPrintDemoDlg: : GetWindowGraph() { CRectrectWnd; CBitmap*pOldBitmap; CDC*pDC=GetDC(); CDC*pMemDC=newCDC; GetWindowRect(rectWnd); m_bitmapPrint.DeleteObject(); m_bitmapPrint.CreateCompatibleBitmap(pDC,rectWnd.Width(),rectWnd.Height()); pMemDC->CreateCompatibleDC(pDC); pOldBitmap=pMemDC->SelectObject(&m_bitmapPrint); PrintWindow(pMemDC,0); pMemDC->SelectObject(pOldBitmap); ReleaseDC(pMemDC); deletepMemDC; } 添加C++头文件PrintFrame.cpp,以及在类CPrintFrame中添加函数名为DoPrintView,OnDestroy,DoPrint。 在DoPrintView函数的程序为: voidCPrintFrame: : DoPrintView() { if(m_pPrintView! =NULL) { m_pPrintView->ShowWindow(SW_SHOW); SetActiveView(m_pPrintView); } SetIcon(m_pMainDlg->GetIcon(FALSE),FALSE); SetIcon(m_pMainDlg->GetIcon(TRUE),TRUE); ShowWindow(SW_MAXIMIZE); m_pMainDlg->ShowWindow(SW_HIDE); CWinApp*pApp=AfxGetApp(); pApp->m_pMainWnd=this; m_pPrintView->OnFilePrintPreview(); } 在OnDestroy的函数程序为: voidCPrintFrame: : OnDestroy() { if(m_pPrintView! =NULL) m_pPrintView->DestroyWindow(); CFrameWnd: : OnDestroy(); } 在DoPrint函数的程序为: voidCPrintFrame: : DoPrint() { if(m_pPrintView==NULL) { AfxMessageBox(_T("打䨰印®? 设¦¨¨备À? 初? 始º? 化¡¥失º¡ì败㨹! ê? ")); return; } m_pPrintView->SendMessage(WM_COMMAND,ID_FILE_PRINT); } 添加类PrintView,如下: classCPreviewPrint: publicCPreviewView { DECLARE_DYNCREATE(CPreviewPrint) } 添加类PrieviewPrint,设置变量如下: classCPreviewPrint: publicCPreviewView { DECLARE_DYNCREATE(CPreviewPrint) BOOLm_bIsCloseFrame; public: CPreviewPrint(); virtual~CPreviewPrint(); public: virtualvoidOnDraw(CDC*pDC); #ifdef_DEBUG virtualvoidAssertValid()const; #ifndef_WIN32_WCE virtualvoidDump(CDumpContext&dc)const; #endif #endif afx_msgvoidOnPreviewClose(); afx_msgvoidOnPreviewPrint(); protected: DECLARE_MESSAGE_MAP() }; 双击打印按钮的程序为: voidCPrintDemoDlg: : OnBnClickedButtonPrintview() { m_pPrintFrame=newCPrintFrame(this); GetWindowGraph(); m_pPrintFrame->DoPrintView(); } 打印界面如图14所示: 图14. 5.总结与感悟 本次实验课是我第一次触碰C++,及MFC。 完成此次编程的过程中感触良多,最开始虽然上了实验课,但其实脑袋里还是一团浆糊,拿到最后的编程作业时,不知从何入手,于是决定先不管作业,去图书馆借了本C++的书,看了点语法和例程,心有对C++有了大概的认识,关键点个人感觉就是抽象出类来。 对类进行编程。 通过MFC编写心电模拟采集软件,加深了对类的理解,C++的运用,而且在调试过程中遇到的问题也学会了如何去解决。 虽然走了很多弯路,完成的功能也不够强大,但我学到了很多。 最后在绘图程序上进行绘图时候,感觉这些天的努力值了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电信号 模拟 采集 软件 报告