微型电脑应用
MICROCOMPUTER APPLICATIONS
2000　Vol.16　No.1　P.31-33



Windows环境下生物信号处理系统的软件设计
李晓春　李旭光　谢定　元秀华　吴承德
摘　要：介绍Windows环境下生物信号数据采集与分析系统的软件设计方法。
关键词：Windows　生物信号处理　编程
Abstract：This paper introduces the software design method ology of data acquisition and analysis systems of biological signals in the Wind ows environment.
Keywords：Windows　biologic signal processing　programming▲
　　生命系统是一个受多因数调节的开放系统，对于生命活动的研究也是多方面的、综合的。计算机技术的飞速发展，使得各种数字信号处理技术能够方便地应用于生命科学研究的各个领域。但是，以前的生物信号分析系统的软件设计大都建立在DOS环境上。DOS的界面特性差，单任务的方式也不太适合于生物体多信号、多角度的、集成化的综合分析。Windows具有多任务的图形用户界面、交互的工作方式、图形设备接口(GDI)、数据动态交换功能)DDE)及动态链接库(DLL)的支持等优点，这些优点使得人们逐渐地舍弃DOS，进入Windows界面。Windows多任务处理方式适合于医学信号的多通道采集多角度综合分析。目前一些先进的医疗仪器设备也纷纷从DOS环境向Windows环境转换。因此基于Windows环境下的信号采样与分析是医学研究和医疗仪器研制的大趋势。作者成功开发了基于Windows平台的生物信号数字处理系统，本文将介绍该系统的组成及其较件设计方法。
一、硬件的组成
　　硬件的组成如图1所示：

图1 硬件系统框图
　　人体生理信息从物理学的角度看主要包括生物电信息、磁信息、压力、振动、速度、流量、温度等。根据检测信息的不同，选用不同的传感器将生物信号转化为电信号。不同传感器的信号通过不同的通道进行采集。在Windows的多任务管理方式下，这种硬件系统的设置能够方便地实现对于生物对象多部位、多信号的同时采集，这对于生命运动的综合研究具有重要意义。
　　系统的主机为586兼容机，Windows98操作系统，32M内存，3.2G的硬盘，此外还插入了一个ISA总线的16路12位A/D高速转换板，输入电压范围：0～±5V，I/O地址可设定。使用时由软件完成对多路信号的分时采集。采集的数据可显示为图形并存于硬盘，供Windows下的集成分析系统进行分析处理。
二、软件设计
　　软件系统以C+Builder3作为开发工具进行编程。C++ Builder3是1998年Borland公司推出的全新的、可视的、面向对象的C++集成开发系统［1］。它使用了完整的面向对象的编程方式，把Windows编程的回调、句柄处理等复杂过程放在一个不可见的覆盖物下，而对象的认定、类的设计和类的封装都由系统自身完成。它支持C、Pascal、Borland C++、Visual C++和汇编等多种语言，支持Microsoft的OLE技术、COM、DCOM标准。它的集成开发环境提供了可视的设计环境，这大大方便了程序编制。
　　由于Windows本身不提供对I/O端口的控制函数，各语言关于硬件端口的控制函数如VC的inp()、outp()函数，Turbo C的inportb()、outportb()函数等，它们仅支持DOS调用，不支持Windows。Windows环境下数据的采集只能通过Windows间接地调用其他支持I/O接口的语言函数来实现。因此Windows环境下的数据采集只能采用混合编程的方法［2］、［3］。值得庆幸的是C++ Builder支持多种语言和OLE技术，内含dcc32.exe和tasm.exc编译器［4］，可编译C、Pascal、汇编等语言。
　　信号处理系统的主要工作内容包括三大部分：数据采集、数据预处理、数据分析及文件管理，它们统一在Windows平台的主界面下。
　　1.数据采集
　　Windows下的数据采集大致可通过动态链接库、汇编语言嵌套、OLE技术等几种办法来实现。考虑到对数据采集的高速、高效要求，以及Windows发送采集命令后、消息列队等待处理造成不精确定时等因数，我们采用了OLE技术［5］。Windows发出采集命令后，直接调用DOS环境下的采集程序，连续地采集一段时间，将采集的数据及时绘图显示并保存。为此，在DOS环境下用Turbe C编制了数据采集程序。设转换卡基地址为300H；启动A/D转换的口地址为301H，低电平信号表示启动转换；转换是否完成的查询口地址为302H，数据为1表示转换完成，否则继续查询；转换完成后，用口地址303H读取12位数据中的高8位，口地址304H读取低4位。首先在DOS环境下，利用Turbo C编制数据采集程序。
　　参考程序如下［6］
int adin(int channel)
　　｛
　　int a,b,data;
　　outportb(0x300,channel);//打开通道
　　outportb(0x301,0);//启动转换卡
　　begin:
　　　a=inportb(0x302);//读转换状态
　　　a=a&0x01；
　　　if(a!=0)goto begin;
　　　else
　　　　｛a=inportb(0x303);//读数据高8位
　　　　b=inportb(0x304);//读数据低4位
　　　　data=a*16+(b&0xf0)/16
　　　　return(data);
　　　｝
　　｝
#include "graphics.h"
#include<process.h>
#include<stdlib.h>
main()
　　｛
　　int m,n,y,i,channel;
　　float da;
　　static int ad［640］;
　　int graphdriver=DETECT,graphmode;
　　initgraph(&graphdriver,&graphmode,"");
　　if(graphdriver==VGA)n=480,m=2;
　　else n=199,m=1;
printf("%s","请输入A/D转换通道(0-15)；")；
scanf("%d,&channel);
do
　　｛for(i=1<640;i++)
　　｛da=adin(channel);
　　y=n-(int)(da*n/4095);
　　putpixel(i,ad［i］,0);
　　ad［i］=y;
　　putpixel(i,y,m);
　　｝;
　｝while(!kbhit());
closegraph();
｝
　　以上程序在Turbe C中编译、连接生成应用文件。在C++Builder的主界面窗口TForm1上布置容器服务器控件TOleContainer1,双击控件，出现“插入对象”对话框，单选“从文件创建”，在出现的文件编辑框中输入DOS环境下的采集数据程序文件名，即建立了OLE对象的链接。然后建立数据采集按件并编写调用OLE对象的代码：
void-fastcall TForml::N3Click(TObject*Sender)
｛
//：N3是与“采集开始”对应的菜单条
OleContainer1->DoVerb(0);
｝
　　这时在Windows界面下单击“采集开始”菜单条，系统就会调用采集程序进行数据采集，并绘制图形。由于OLE技术的特点，OLE对象一旦调用，系统即进入DOS环境，并停止响应其他Windows消息，直到调用结束返回主界面。因此，OLE技术下数据的采集是高速、高效的，不存在Windows环境下多个消息列队影响数据采集的问题。
　　2.数据分析
　　数据分析前需要对数据进行预处理，如根据信号的特点选择合适的数字滤波方法进行滤波处理。处理后的数据可以进行各种常规分析，如时域分析、各种谱分析及泛图分析、分维分析、混沌分析等等(限于篇幅，具体的分析方法从略)。
　　整个处理系统设计为多文档窗口模式(MDI)，主菜单置于父窗口下，每一种分析方法自成一体，设立子窗口。为减少内存的占用，子窗口只在调用时才动态地生成，分析过程在子窗口内完成，处理完后关闭子窗口并立即释放内存。对于分析子窗口，根据分析方法的需要设立子菜单，系统运行时动态地实现菜单融合，即在任何子窗口下都可以实现主菜单的所有功能。这样使用者就能交互地利用多种方法进行综合分析。内存允许的化，也可以同时进行多种分析。分析所需的数据通过文件和数组在不同模块间实现传递。分析的结果显示在文本框或绘图板上，可保存，可打印输出。由于C++Builder支持多种语言，以前用C、Pascal、汇编语言编写的分析程序，只要将变量和函数改变得符合C++Builder的方式，就可以方便地移植过来，大大减少编程时间。Windows面向对象的编程方式，使得各分析方法既独立又浑然一体，新的分析方法也可方便地纳入系统。
　　在C++builder中某分析方法的具体调用过程如下：
//先创建分析1子窗口
void-fastcall TForml::N8Click(TObject*Sender)
｛
Analysis1Form=new TAnalysis1Form(this);//TAnalysis1Form是窗口类
｝
//以下建立分析过程……………………………
void-fastcall TAnalysis1Form::N12Click(TObject*Sender)
｛
此处插入分析过程代码；//分析过程中用到的函数应有相应的库支持或在头函数中声明
｝
//分析完后，并闭子窗口，并闭窗口时触发FormClose事件，释放内存，返回主界面
void-fastcall TAnalysis1Form1::FormClose(TObject*Sender,TCloseAction&Action)=｛
Action=caFree；
｝
三、系统界面与应用
　　本处理系统是在Windows98操作系统上，利用C++Builder3集成工具开发，最后生成独立的应用系统。C++Builder3面向对象的可视化编程降低了系统的开发难度。大量的代码重用提高了开发效率。处理系统界面友好、操作直观方便、交互式工作方式。图2是系统的主界面。

图2　系统主界面
　　“文件”菜单下设打开…、关闭、保存、打印机设置…、打印等功能，主要完成文件的管理和打印工作。
　　“数据采集”项下设通道选择…、采样频率和时间…、采集开始、采集结束等功能，各菜单项的功能是自解释的。按下“采集开始”后，Windows立即调用数据采集程序。
　　“预处理”项下设滤波方法、加窗等功能。
　　“数据分析”项下设立各种分析方法的菜单控制条，由菜单条控制进入各种分析窗口。
　　作者用该系统对人体指端脉搏波和呼吸波进行了检测与分析，在保证硬件配置的情况下，进行适时采集、数据处理和曲线绘制，结果令人满意。为了全面地了解生物对象，目前提出了多传感器融合技术［7］，生物信号的分析越来越走向综合，Windows正是适合于综合分析的平台，开发Windows环境下的数据处理系统势在必行。■
作者单位：李晓春 (湖南医科大学物理教研室 长沙 410078)
参考文献：
［1］徐新华编著　C++Builder3编程指南　北京　人民邮电出版社　1998年
［2］黄华江等　基于Windows平台的测控软件设计　微型机与应用　1999年　第6期P45-48
［3］熊友辉等　用VB开发热分析仪采集控制和分析处理系统软件　微型电脑应用　1998年　第1期P36-38
［4］吴继生　C++Builder与汇编语言混合编程及端口操作函数扩展方法　电脑编程技巧与维护　1998年第11期P9
［5］Kate Gregory著，康博创作室译　Visual C++5开发使用手册　北京　机械工业出版社　1998年
收稿日期：1999-08-02
