一、Chart与Visual C++的结合的背景
Chart软件同时具有传统记录仪的简易和数字记录仪的分析功能,目前广泛应用于生命科学等专业研究领域。Chart软件虽然具有强大易用性,但仍存在很多不足之处。首先,它在批量处理实验数据方面功能较弱。其次,读取数据的精确度依赖于计算机硬件配置。第三,读取数据的精确度在不同的操作者之间存在个体差异。在处理呼吸动力学研究实验数据时,针对上述情况,本课题借用了现代计算机软件技术来解决Chart软件在处理医学海量信息中存在的不足。
在软件编程环境的选择上,我们选择了Microsoft公司的Visual C++ 6.0。要实现Chart与Visual C++相结合来处理医学数据的功能,首先必须解决两个软件之间的数据接口问题。经参考Chart软件的相关帮助文档可知,Chart软件中的数据可以通过菜单按一定的衰减比率存储到文本文件中,而Visual C++编程环境提供文本文件的访问功能,能从指定的文本文件中读取数据,同时编程通过相应的算法对数据进行处理,并将处理的结果输入到文件中,因此基于数据文件交换可以作为Chart与Visual C++共同协调工作的数据交换方式。
二、实现方法
由于Chart和Visual C++两个不同软件之间的协调工作是以文本类型数据文件为基础实现的,所以文本类型数据文件的生成是一个基础的重要的工作。在成功生成了文本类型数据文件后,就需要对文件中的数据进行处理,此时需要建立数据处理算法,通过编程将算法植入数据分析软件中,从而得到处理结果。
由上可知,数据分析软件的实现需要如下三部分工作:数据文件的生成、数据处理算法的建立和编程软件实现。
(一)数据文件的生成
选定欲读取数值的数据段,将Windows格式波形文件保存为文本文件。(见图1)。Chart有Windows和Macintosh两个版本,若实验数据是以Macintosh格式保存,则需先转换成Windows格式。
图1 数据格式转换过程截图
(二) 数据处理算法的建立
数据处理算法的主要工作目的是通过计算得到每个周期中各个通道数据的平均值或最大值,所以算法必须要包括两个功能部分:周期区的确定和特征值(最大值或平均值)的计算。
1 周期区的确定
图2为某条件下实验数据的一部分,每个周期的起点为数据图像中各个上升沿的
初始点,如图中的A点,而周期的终点为起点后相应周期时间后的点,因此周期块的确定关键在于起点的寻求。
对于一个上升沿的寻求,我们可以通过判断一段时间内数据的变化趋势来的得到。在给定的时间内,这些数据从低水平开始单调上升,则表明一个上升沿已经开始,同时第一数据所在的时刻就是这个上升沿的起点。但是这个处理方法明显只能在理想状态下运用,不适合实际的实验数据。在实际采集到的数据中,存在着很多干扰,这样就会有如下情况发生:在上升沿数据段,数据整体趋势是上升的,但在很多小区域数据可能处于一种混乱的规律中,或是振荡,或是单调上升,或是单调下降。针对这种情况我们采用了如下“扬长避短”的处理方法:
所谓“扬长”就是对长时间段的单调发展予以肯定和保留,而“避短”则是对于短时间内数据非单调上升的变化规律予以质疑和否定,“扬长”与“避短”的有效结合,解决了小范围内干扰问题,从而实现起点的最优寻求。
找到了上升沿的起点,周期块的确定就比较容易了。在Chart进行数据采集时,会有一个采集速率V,一般我们设定为1000,即每秒钟采集1000个数据,在进行数据存储时,需要设定一个参数—-衰减率R(reduction),假定M为存储后数据一秒钟内的个数,则M=V/R,所以两个连续数据间隔时间为1/M秒。如果已知数据周期为T,则需要处理的周期块为上升沿起点到起点后T*M个数据。
2 特征值计算
依照课题研究的需要,计算得到每个周期块的两个特征值:平均值和最大值。在成功确定了周期块后,特征值的计算就相对简单了。
3 编程实现
作为当前主流的计算机编程软件Visual C++ 6.0,不仅具备有C++所有功能,同时其图形化编程环境让编写程序更加方便、快捷。根据数据处理流程,将软件实现分为三个部分:源数据文件读取、算法实现和结果输出。
(1)源数据文件读取
在标准c里面,所有的文件读写操作都要通过文件指针进行,即FILE * fp, 对于文件模式是二进制还是文本模式,每种处理方法都是一样的,比如采用fscanf、fprintf 打开读写二进制文本还是文本模式文本,其效果是一样的。在对文件进行操作前需要打开文件,fopen(filename,文件使用方式)提供这个功能,与之对应,在结束文件操作后,应该关闭文件,则需要调用fopen(filename)函数。打开文件的程序段如下:
FILE *fp_data = fopen("data.txt","r");
if(fp_data==NULL)
{
AfxMessageBox("数据文件打开错误,请检查!n提示:文件名为data;存储路径为该软件所在目录!");
return;
}
AfxMessageBox("成功打开数据文件!");
其中,data.txt为源数据文件名,"r"表示以只读方式打开文件,避免误操作对文件数据的破坏,在执行fopen函数打开文件后需要对执行结果进行处理,当文件指针fp_data为空NULL时,表明文件打开错误,则提醒用户“数据文件打开错误,请检查!提示:文件名为data;存储路径为该软件所在目录!”,同时程序将中断运行,在用户检查问题并解决问题后,再重新启动程序,如果弹出"成功打开数据文件!"信息,则表明数据库文件已经成功打开,可以进行下一步工作了。 关闭文件的程序段如下:
fclose(fp_data);
以三通道数据为例,读取文件数据程序段如下:
fscanf(fp_data,"%f %f %fn",&list1_data,&list2_data,&list3_data);
如果打开文件后,是第一次执行上述fscanf程序段,则代码执行后list1_data、list1_data和list1_data三变量中分别存储的是第一时刻各通道的数据。循环执行fscanf函数直到将所有数据读取完毕。
(2 )算法实现
算法程序实现包括两个部分:周期块的确定和特征值的计算,限于篇幅只给出特征值计算的程序段。
result =0;
3 )结果输出
为了方便对计算结果的分析处理,我们把结果输出到了文本文件中,这样不仅可以与源数据进行对应,同时方便拷贝到excel中进行处理。程序段如下:
FILE *fp_result = fopen("result.txt","w");
三、结果与分析讨论
(一) 软件运行界面
图3为数据处理软件ChartHelper运行界面,简洁,便于操作。ChartHelper提供与用户的接口,包括第一通道高水平平均值、第一通道低水平平均值、吸气时间(周期)、通道设定,对于前三个参数的设定,用户可以在对应的输入框中输入相应的数值,值得注意的是吸气时间的单位为毫秒,而通道的设置稍微复杂一些。
在“请选取总通道数目”字样右边有一个下拉框,鼠标点击下拉框右边的下拉箭头,将出现2~10的通道选择,用户可以根据实际情况选择相应的通道数,然后鼠标点击右边的“设置通道”按钮,则激活相应通道数的通道设置接口C2-10,同时相应通道下面的下拉框的状态将由不可编辑变为可编辑设定,如图4所示,鼠标点击需要设定通道的下拉箭头,则出现两个选择“A”和“M”,A表示该通道求取的特征值为平均值,M表示该通道求取的特征值为最大值,这样可设置各个通道的特征值类型。
在设置好所有接口参数后,点击“参数设置”按钮进行参数设置,同时启动数据处理程序,此时状态栏将显示当前软件运行的状态,在计算过程中,状态栏将显示“软件运算中,请等待...”,当计算结束后状态栏将显示“运算已结束,请进行数据存储操作!”,此时用户可以关闭程序,按照软件下方的提示,打开软件所在目录下的结果文件“result.txt”,进行下一步的结果存储和分析。
(二)计算结果分析
在呼吸动力学实验所得数据中,随机选取20个呼吸周期,分别用手工操作鼠标选取波形读取数据和借助于Charthelper软件批量选取波形读取肺内压Palv最大值和呼吸机送气流量F平均值,用两组间配对t 检验比较两种数据读取方法所得结果差异,以 P<0.05为具有显著性差异。手工法和软件批量法两种方法读取所得的Palv最大值完全一致,均为34.59±0.15 cm H2O (P<0.05),F的平均值略有差异,所得结果分别为458.9±3.6 mL和459.6±4.3 mL(P >0.05),两组间差异无显著性。
(三)结论和展望
依照本课题需求所开发的数据处理软件ChartHelper有效地解决了人工处理数据的种种弊端,节省数据处理时间,加快时间进度,同时大大降低了因人为因素干扰所带来的误差率,是处理有关医学研究海量数据的实用工具。