心外膜标测系统中实时采集与显示的实现
2011-01-26王彦磊孙莉倩刘梁杨翠微余建国
【作 者】王彦磊,孙莉倩,刘梁,杨翠微,余建国
复旦大学信息科学与工程学院电子工程系,200433
0 引言
房颤(Atrial Fibrillation, AF)是临床上最常见的复杂性心律失常。由复旦大学电子工程系心脏电生理与起搏实验室自主研发的128道心外膜电位标测系统可以在开胸状态下对心脏进行多位点同步探测,方便而准确地反映心电起源点和传播途径,为房颤的电生理机制研究打下很好的基础[1]。
心外膜标测系统的结构框图如图1所示,主要包括硬件部分和软件部分。硬件部分主要完成128道心电信号的放大、滤波和采集等,软件部分负责信号的采集控制、数据的处理及信号显示与分析。
图1 系统结构框图Fig.1 System Block Diagram
在实际的动物实验中,发现上一代的标测系统存在着一些缺陷,例如,通道间同步性不高;滚动显示不利于肉眼长时间观察信号变化;波形移动速度和信号的显示增益无法调节等。针对这些问题以及新购买的采集卡,本文作者重新设计了配套的标测软件。
新系统使用的采集卡是北京阿尔泰公司的USB2850,分辨率为16bits,转换速率最高可达500kHz,FIFO为8 kHz。系统单道采样频率为2 kHz,各通道间的采样间隔不大于0.2 ms。心外膜电位信号的带宽在3 Hz-600 Hz,心电信号波形移动速度典型值为100 mm/s。在软件操作界面的设计上,既要兼顾采集的实时性,保证采集卡缓存区不会溢出,又要考虑到软件的多线程操作和信号波形的同步刷屏显示。国内很多学者在相关领域做了相应研究[2-4]。针对原系统的改进要求,本文提出了相应的解决方案。
1 标测软件设计
1.1 双缓冲绘图技术
在绘制图形界面时,用到了图形图像编程技术中的基本技术:双缓冲(Double Buffering)。
MFC中刷新窗口图形时,会先擦除原来的图像,然后重新绘制。此时,如果刷新过快的话,颜色的反差就会导致图像的闪烁。而采用双缓冲绘图,可以有效地避免这一点。实现方法就是在内存中开辟一块跟要刷新窗口大小一致的离屏层(Off-Screen Display)缓存,先将刷新后图像绘制在离屏层中,然后用位块传送函数BitBlt将其复制到屏幕上即可[5]。
1.2 缓冲区的设计和数据抽取
本设计的亮点就在于两种缓冲区的设计:数据缓冲区和绘图缓冲区。
首先,采集来的数据可能没有立即被消耗掉,为此软件设计了多个缓冲队列,即二维数组ADBuffer[Count][dataLen],用来缓存不同时刻采集到的数据。Count即为缓冲队列的个数,dataLen为缓冲队列大小。Count的大小应该由计算机物理内存大小决定,过大可能导致内存不足,太小则起不到缓冲队列应有的作用。而dataLen的大小则同采集卡的FIFO有关。它需要在实验中不断探索,设计太大的话,就不能保证数据处理线程在一个周期里消耗完所有数据而导致图形的撕裂和抖动;太小的话,设备上数据很容易溢出。每次采集来的数据保存在下一个缓冲队列中。如果用完了Count个缓冲队列,则再次从第一个开始。这样的优点有两个方面:一是缓存了来不及处理的数据,二是如果堵塞过于严重而产生溢出,可以立即报警,容错性较高。
其次,标测系统总共有128路信号,不可能同时在屏幕上显示出来。考虑到在上下翻页或者刷新图像时,不至于出现波形断裂,本设计对128路信号在当前时刻的所有屏幕坐标值均使用缓存区做了存储工作,即二维数组OffScrrenBuffer[128][Resolution]。Resolution代表每路数据缓存的个数,在此将其设计为屏幕的左右分辨率,因为波形是从左到右满屏显示的,并且设置绘图的时候两个数据点之间相隔一个像素点来绘图。每次处理数据时,均需更新此缓冲区,而每次绘制信号波形读取的正好是此数组中的用于当前显示的某几路坐标值。
图2 缓冲区的定义和操作示意Fig.2 The de fi nition and operation of buffer
本软件连续采集和实时显示的思路,就是保证在设备缓冲区不溢出的前提下,从数据缓冲区中定量抽取数据,并将其处理转换为坐标值后写入绘图缓冲区的过程。
软件初始化时,分别开辟两块缓冲区。对于数据缓冲区的Count个缓冲队列,每个缓冲队列是由N个128 short int类型的数据块连续组成的一个一维数组,即。每次波形前进刷新屏幕的时候,需要从缓冲队列中抽取数据处理后填充进坐标缓冲区。图2(a)中Sample_Data代表实际抽取和用于显示的数据,而Drop_Data代表丢弃的数据。Sample_Data大小固定为128个数据,代表128道信号。而Drop_Data的大小和波形的显示品质密切相关,如果取的太小,起不到抽值显示的目的,波形过于稀疏;如果取得太大,则丢弃的数据太多,显示的波形与原信号相比就会产生较大畸变。在实际设计中,可以根据要求的心电信号的速度来计算此变量的值。假设不抽取数据,则对于其中任一路信号,波形速度为其中M为单道采集点数,DPI为屏幕DPI数值,25.4为每英寸毫米数,T为单道采样周期。此速度与100mm/s比较,即可得到Drop_Data的大小。
在绘图缓冲区的更新中,如图2(b),每处理一个缓冲队列的数据,128行数组均在相同位置进行更新。更新的元素个数Forward_Pix代表在显示器上波形即将前进的像素点个数。从上面分析可以看出,
1.3 波形速度和增益的调节
根据上面所说,数据抽取时丢弃点数Drop_Data可以根据波形速度要求计算得到;同理,通过调节Drop_Data的值也可以间接调节波形的移动速度。对信号显示增益的调节,则是对坐标缓冲区中的坐标赋予一定增益即可。
1.4 多线程设计
为了保证采集和显示的实时性,以及在软件运行的过程中实时地响应鼠标、键盘和图形操作,数据采集和数据处理包括绘制图形都是在子线程下进行的。图3显示了数据采集线程(ReadDataThread)和数据处理线程(ProcessDataThread)工作的大致流程图。
初始化完毕后,主线程启动ReadDataThread(以下简称RThread)和ProcessDataThread(以下简称PThread)两个子线程。两个线程之间使用内核对象Event通信[6],本文中为DrawEvent。为了保证数据采集的完整性和连续性,RThread是绝对的工作者线程,只负责数据的采集,而不能有图形界面等方面的操作。这样,线程才不会堵塞,数据才能不间断采集。而PThread则负责数据的处理、保存和显示等。
最初,PThread处于睡眠状态。当RThread采集一次数据完毕后,再用Win32 API函数SetEvent发送事件消息DrawEvent给PThread,使其恢复运行状态,迅速进行存储和显示。结合图2,在t时刻,RThread将采集来的长度为dataLen的数据放进第m个数据缓冲队列中,之后通过DrawEvent通知数据处理线程来消耗数据。PThread接收到DrawEvent消息后,抽取第m个数据缓冲队列中的数据,转换为坐标值后,按各通道依次将坐标值写入绘图缓冲区中。如图2(b),各通道的Data(t)位置的值均发生改变。之后采用双缓冲方式重新绘制图像,信号波形坐标值都在绘图缓冲区中,整体表现为波形前进一步。如果选择保存数据的话,会再将此缓冲队列的数据写入到文件中。
而在下一时刻t+1,新采集的数据存放在第m+1个缓冲队列中后,再次发送DrawEvent消息,触发PThread线程,此缓冲队列的数据被抽取后放入图2(b)中Data(t+1)的位置。其他数据位置的坐标值不变,这样就达到了刷屏显示的效果。
图3 数据采集线程和数据处理线程流程图Fig.3 The fl ow chart of read data thread and process data thread
2 测试结果
图 4 采集界面Fig.4 Sampling interface
标测软件运行环境是联想W500笔记本,CPU为P9600,主频2.66 GHz,内存1.93 GB。显卡是ATI Mobility FireGL V5700,分辨率为,场频为60 Hz,DPI为96,USB2.0接口。标测软件克服了先前暴露出的一些问题,能够在实时采集的同时,进行刷屏显示;波形移动速度,可在100 mm/s、50 mm/s和25 mm/s之间来回切换;能调节显示增益。图4中两图分别反映了两种速度下的采集界面,信号源是模拟心电信号发生器(两路)。由于条件限制,软件还没有在实际的动物实验中得到验证。
3 总结
本文介绍了一款同心外膜电位标测系统配套的标测软件的设计。该软件能完成多通道连续同步高精度的采集,并能实时的进行刷屏显示采集的信号。采集界面波形平滑,没有畸变,并能同步调节速度和增益,较好地达到了心外膜标测对软件的需求。
[1] 杨翠微. 基于心外膜标测技术的房颤表征方法及电生理机制研究 [D]. 复旦大学, 2008
[2] 邹人俊, 邹人钢. 一种基于DirectX的WindowsXP环境下波形全屏快速滚动显示技术[J]. 中国医疗器械杂志, 2007, 31(4): 267-270.
[3] 陆唯佳, 杨翠微, 方祖祥. 心外膜标测中的实时采集和滚动显示方案[J]. 生物医学工程学杂志, 2009, 26(5):1101-1105.
[4] 高宏亮, 王淑娟,翟国富, 等. 采用Visual C++实现的函数波形显示控件[J]. 电测与仪表, 2006, 12:62-65.
[5] 刘锐宁, 宋坤. Visual C++从入门到精通(第二版)[M]. 北京: 清华大学出版社, 2010
[6] Jim B, Robert W. Multithreading applications in Win32- The Complete Guide to Threads Win32[M]. USA: Addison Wesley.1996