首页
到顶部
到尾部
单片机毕业设计

基于C语言实现的心电图系统仿真

分享到
时间:2015/3/15 14:37:20  作者:  来源:  查看:237  评论:0
内容摘要:.infoad {FLOAT: left; MARGIN:3px; }基于C语言实现的心电图系统仿真   摘 要 心脏病仍然是威胁人类生命的主要疾病。心电图能为医生提供最直观的患者心脏的活动情况,因此心电图的分析是很有意义的。而热敏打印机凭借其优越的性能更是成...

基于C语言实现的心电图系统仿真   

摘 要

心脏病仍然是威胁人类生命的主要疾病。心电图能为医生提供最直观的患者心脏的活动情况,因此心电图的分析是很有意义的。而热敏打印机凭借其优越的性能更是成为心电图机输出设备的首选。

但是心电图机处于高速走纸状态下,热敏打印曲线不平滑、不清晰,阶越现象非常严重。针对这个问题,本文仔细研究了热敏打印机的工作原理,计算机图形学,平滑算法及有关液晶中动态波形显示等相关知识,介绍了实现改进算法的硬件电路组成,及相应的软件程序设计。在软件设计中,用C语言画图程序仿真来实现在计算机液晶屏幕上模拟实际热敏打印心电曲线的效果,改进的算法中通过增加相邻两个打印点间直线段的个数加粗曲线,来达到平滑整条曲线的目的。采用二叉树结构自适应地搜索每次打印直线段的起始点和终止点,简单方便。通过机电描笔式打印方式、液晶显示原理打印方式及改进后的平滑算法打印方式的三种仿真实现,及其相应的图形放大对比显示,可以看出用改进算法打印出来的心电曲线清晰、平滑,无论是低速16dot/mm(25mm/s)还是高速8dot/mm(50mm/s),阶越、“毛刺”现象都得到明显的改善。

关键词 热敏打印机,心电图,液晶显示,平滑算法,二叉树,C语言画图


第1章  绪论 1.1  课题背景

随着电子技术的发展,打印机已经广泛应用到各个领域,成为各种智能只能数字化仪器重要的地输出手段。热打印技术是通过控制热打印头发热体的加热和冷却,使打印介质受热变色或使燃料熔化/升华使介质着色而完成文字、图像输出的打印技术。热打印方式通常分为直接热敏、热转印和热升华3种方式。而应用直接热敏打印方式的热敏打印机凭借其体积小,重量轻,可靠性高,打印字符清晰,无噪声,走纸均匀的独特性能越来越受到青睐,更成为小型医疗仪器如心电图机的首选[1]

根据世界卫生组织的统计,心脏病是造成人类死亡的三大疾病之一,而且发病呈上升趋势,很多病人由于没能及时发现病变而延误了治疗而死于非命。在我国,随着人们物质生活水平不断提高,生活节奏不断加快,心脏病的发病率也在不断增加,因心血管疾病而死亡的人数占总人数的44%,可见心脏病已成为危害人类健康的多见病和常见病,因此社会对心脏病的诊断与治疗也比以往更加关注,提出了新的要求。在医学影像学领域,图像的记录为临床诊断提供了可靠的依据,心电图机作为一种常规的心电图手段,能够为医生提供最直观的心电波形,医生通过观察分析心电患者的心电波形图,就能对患者的病情做出比较准确的判断[2]

本次毕业设计的题目是基于热敏打印的心电曲线平滑算法的研究。就是针对心电图机处于高速走纸的状态下,热敏打印心电曲线不平滑,不清晰等问题作出的改进,应用平滑算法使得打印出的心电曲线更平滑清晰,阶跃,“毛刺”现象得到明显的改善,对于医生及时作出准确的诊断,提高工作效率是很有意义的。

1.2  国内外研究现状 1.2.1  取得的成果

心电曲线的打印输出最初是机电描笔式的打印方式,即通过电机检测心电信号,放大后直接纪录;而现在已发展成为热敏打印方式。实现心电曲线的热敏打印要解决两个关键问题:第一,如何将心电数据转换成打印数据;第二如何将打印数据连线后输出[3]。而第二个问题就是我现在要研究的。模拟机电描笔试打印方式打印一导联心电信号,首先利用指定的变换公式,把上位机传来的心电数据,转换到热敏纸上对应的位置,然后将这个打点位置寄存在打印数据缓存数组中,最后CPU从IO口把数据缓存数组中的数据传送到热振头中打印。这种方法在波峰变化剧烈时,会出现断点,影响医护人员观察、诊断;另外一种方法就是模拟液晶显示原理,将两个相邻的打印数据点用线连接起来。即对于一条心电曲线,显示数据点在起始列只显示一点;从第二个数据点开始,要在下一列显示上一数据点到此数据点之间的线段。在热敏打印纸上表现为将两数据点之间的点都加热。虽然波形的断续得到解决,但是波峰变化剧烈时,这种算法仍会出现阶越现象。

1.2.2  发展趋势

与液晶显示相类似,对于一个导联的心电信号,要实现心电图的打印,需要将相邻的两个心电数据用线连接起来,在热敏纸上表现为一条直线段。若在相邻两个心电数据点之间只连接有一条直线段,那么在走纸速度处较慢的情况下,打印P波和T波尚可,因为它们的峰值并不是很高,但是当打印速度加快的时候,在打印QRS波群时上述方法就会出现严重的阶越现象,而且心电曲线整体看来比较虚,不清晰。所以我们可以增加相邻两个心电数据点之间直线段的个数,每个直线段起始点与终止点的选取与上一时刻心电数据点位置以及下一时刻心电数据点位置有关,所有的直线段相连构成了整条心电曲线,这样导致整个曲线看起来变粗了,从而达到了曲线平滑的目的。

1.3  心电信号的特性

心电信号是人类最早研究并应用于医学临床的生物电信号之一,它比其他生物电信号更易于检测,并具有较直观的规律性。当前,心电信号的处理仍是生物医学界的重要研究对象之一。

1.3.1  心电信号的产生

心肌细胞的生物电变化是心电图的来源。正常人体内,由窦房结发出的一次兴奋,按一定的途径和过程,依次传向心房和心室,引起整个心脏的兴奋。因此,每一个心动周期中,心脏各部分兴奋过程出现的电变化的方向、途径、次序和时间上都有一定的规律。这种生物电变化通过心脏周围的导电组织和体液反映到身体表面上来,使身体各部为在每一心动周期中也都发生有规律的变化。把测量电机放置在人体表面的一定部位,记录出来的心脏电变化曲线即为临床常规心电图(electrocadiogram,简称ECG)。心电图反映心脏兴奋的产生、传导和恢复过程中的生物电变化[4]

1.3.2  典型心电波形

基于C语言实现的心电图系统仿真
 心电监测有多种导连方式,不同导连所得到的心电波形形态各异,人与人之间的个体差异也很大,但所有的心电波形都 可划分为一些共同的部分。如图1.1所示,典型的心电波形 是由P、Q、R、S、T、U波及 P-R间期、S-T段、Q-T间期等组成。

图1.1 典型心电波形
    心电波形中,P波代表心房肌激动过程中的电位变化,称为 心房激动波。正常 P波的宽度不超过0。11秒,幅度不超过2。5毫米(零敏度定在0毫米/毫伏)。Q、R、S三个波一般称为QRS波群,它代表全部心室肌初极过程的电位变化。整个QRS波群的宽度称为QRS时限,正常人最长不超过0.10秒。T波代表 心室肌复极时的电位。在以R波为主的心电图上,T波不应低于R波的十分之一。
  P-R间期是指从P波起点到QRS波群起点相隔的时间。P-R间期随着年龄的增加有增长的趋势,成人的正常范围在0.12秒到0.20秒之间。
  S-T段指的是从QRS波群的终点到T波起点的一段。正常人的S-T段的水平位置是接近基线的,与基线间的垂直距离一般不超过0.5毫米。
  Q-T间期是从QRS波群开始到T波终结相隔的时间,它代表心室肌除极和复极的全部过程。正常情况下,Q-T间期的时间不大于0.40秒。
  有时心电图可能出现U波,它代表心室肌激动的“激后电位”变化,正常人的U波是很小的[4]

1.4  本章小结

  本章主要讲述了本次毕业设计的题目:基于热敏打印的心电曲线平滑算法的研究的选题意义,应用平滑算法使得打印出的心电曲线更平滑清晰,使得医生能够及时作出准确的诊断。以及关于心电曲线的打印,国内外目前的发展现状,已经取得的成果、未来发展的趋势等。最后简单介绍了一下心电信号的特性及典型的心电波形、QRS波群等有关知识

第2章  硬件系统设计

2.1 电图机的发展历史及应用 2.1.1  心电图机的发展历史

心电图机作为一种常规的心电图手段,能够为医生提供最直观的心电波形。医生通过观察分析心电患者的心电波形,就能对患者的病情作出比较正确的判断。

自本世纪初Einthoven研究发明弦线型心电图描记器并从体表纪录心脏电活动以来,心电学发展历经百年。在这一百年中,心电图机经历了弦线式、电子管放大式、热笔直描式、墨水喷射式和数字化时代,在科研和国际国内学术交流中显示出它巨大的优势。

从最原始的单导联心电图到3~6导联同步心电图,是心电学发展史上的重大进步,而从6导联同步到数字化12导联同步心电图机,标志着心电学的发展已经进入到数字化、信息化、网络化的新时代。

在发达的欧美国家已经实现了12导心电图管理标准化。而我国大多仍在使用单导、3导、或6导心电图机,这种落后的记录方式是制约我国心电学发展的主要原因之一。所以,数字化12导同步逐步代替单导、3导或6导心电图机,这种落后的记录方式是制约我国心电学发展的主要原因之一。所以。数字化12导同步逐步替代单导、3导、或6导同步心电图机,将是今后心电学发展方向。

目前,国内一些医院已经开始引进12导心电图机,主要是向国外购买,因而成本比较高,不可能得到普及。近年来,国内一些厂家也开始研制并生产12导联心电图机,相对而言,比进口的要便宜的多,这对于心电图机在我国的普及是有重要意义的。

2.1.2  12导同步心电图的临床应用

和单导、3导、6导比较起来,12导同步心电图由于提供了更多的心电信息,因此在临床上具有更大的价值。其临床应用表现在:

1.有利于提高传导阻滞的检出率

2.测量P波与QT间期离散度

(1)离散度:使指同步纪录的12导心电图中,用测定的最宽P波时间减去最窄的P波时间的差值。正常值小于40ms。大于50ms时,提示心房内不同部分存在非均匀性电活动,能够引发房行快速心律失常包括房室早搏、房性心动过速、心房扑动或心房颤动,是用作表示心电图预测心房颤动的一项新指标。

(2)QT间期离散度:同步纪录的12导联心电图上最长QT间期与最短QT间期的差值,称为QT间期离散度(QTd),是近年来发展起来的,评价心室复极离散度的新指标。临床研究显示场QT间期综合症患者,心肌梗塞后又施性心动过速的患者,以及药物引发的心律失常的患者,其QTd增加,部分心律失常治疗有效者,其QTd转为正常。

3.游走心律的定位诊断,观察同步纪录的12导联心电图可以对游走心律作出定位诊断,方法优于单导联心电图,Ⅰ,Ⅱ,aVF,V3~V6导联P波发生大小的变化。

4.性心律失常的定位诊断,分析同步纪录的12导心电图,可以判断出房性P波的起源部位。

5.交界性心律失常的定位诊断,单导联心电图也可能对交界性心搏起源部位进行定位诊断,但不如12导同步心电图方便。

6.宽QRS波群的诊断与鉴别诊断。根据同步纪录的12导联上宽QRS波群特征,进一步推测出宽QRS起源部位以及类型。

7.有利于心电数据的建立。只有应用12导同步心电图机并建立起心电数据库,才能进行网上心电图会诊,并与国际接轨[4]

2.2  热敏打印机原理分析

热打印技术是通过控制热打印头发热体的加热和冷却,使打印介质受热变色或使燃料熔化/升华使介质着色

在便携式设备中经常要用到微型打印机。目前微型打印机一般有三种类型:针式、笔式和热式。针式打印机噪声大、寿命短、分辨率低;笔式打印机速度低、成本高、反辨率更低;热式打印机则被认为是最适合作便携式设备的打印设备。热式打印机又分为热敏式和热转印式两类。这两种打印机在走纸电机和字车电机驱动控制电路、热敏头驱动控制电路、接口电路等方面基本相同,所不同的仅是热敏式打印机用发热体直接使热敏纸变色产生印迹,而热转印打印机是利用热敏头上的发热体通过熔化热转印带上的油墨,再转印到普通打印纸上形成印迹。由于热敏式打印机具有结构简单、体积小、重量轻、噪声小、功耗低、印字质量高、价格便宜、运行成本较低以及实用可靠等一系列优点,已经越来越广泛的应用于各种便携式计算机系统和智能化设备中,成为首选便携式硬拷贝输出设备[5]

2.2.1 热敏打印机结构原理

热敏式打印机的关键部件是打印头。它包含许多微型发热原件,这些发热元件可采用集成电路工艺和光刻技术,通过物理化学办法在陶瓷基片上加工制成的,其表面涂有一层像玻璃一样的保护膜,用于防治发热元件的磨损。目前的工艺水平已将发热元件的密度做到了8点/mm(分辨率达200dpj) 、16点/mm,甚至更高。在打印速度低于100cps时,热敏头寿命可达1亿字符,或记录纸滑行30km的可靠性,热敏打印机所用的印纸不是普通纸,而是经过特殊处理的感热记录纸。这种记录纸是将两种混合成分材料涂复在纸上而成,基层纸上涂有一层几微米厚的白色感热生色层。在这个感热生色层上涂有无色燃料和特殊生色剂。为使他们能有效地附在纸上,在他们周围的空隙里还填充有粘合剂。感热生色层一经加热,生色剂立即熔化,并熔进无色燃料中,引起化学反应显出颜色,这个过程仅需几个毫秒即可完成。由于感热记录纸是受热后材料热熔引起化学反应而呈现颜色,如温度过高,新的合成物质被分解,颜色又会消失。另外,这种物质在光的长时间作用下也会自动分解。所以感热记录纸不能长期保存。虽然热敏打印纸对打印纸有特殊要求,但是这种记录纸价格并不贵,无需像针打那样经常要更换色带,因此,越来越多的智能化仪器仪表采用热敏打印机作为输出设备使用。

2.2.2  热敏打印机设计中需要注意的问题

\1.  为实现高品质的打印,在设计热敏打印机电路和控制程序时必须注意三个问题。

(1)常能量控制问题

常能量控制指的是打印头上每一个发热元件发出的热量要相同,且保持一个常量,否则打印出的字符颜色又深有浅,影响打印效果。发热元件每次发出的热量,除了与发热元件流过的电流的大小和持续时间有关外,还与其本身的余热(如果前次已经通电发热)有关。它的余热直接影响下一次发热元件传给打印机的热量,从而影响打印效果。因此,热敏打印机电路除了要检测环境温度外,还要记录每一个发热元件前一次状态,甚至前几次的通电发热的状态,以决定本次究竟要给出多大的热量(可以通过控制通电时间来确定)。打印速度越快,这个问题就越重要。

(2)大电流脉冲控制问题

由于打印时要同时激励的发热元件可能会很多,如一个分辨率为8点/mm,打印宽度为72mm的打印头,一点行上要排列8×72=576个发热元件。尽管每个发热元件只要几十毫安的电流,但若同时激励这些发热元件,总电流就很可观了,而且这种脉冲式的电流谐波份量及其丰富,会给其他电路带来很大的干扰,甚至使打印电路失控,烧毁打印头发热元件。因此,发热元件通电驱动程序要仔细考虑,一般可将每点行分成几段,以几段为一组同时发送,使电流变化比较平稳。

(3)处理时间和CPU速度问题

由于打印速度快,尽管每点行只需要几十个字节的数据。但必须在数毫秒之内完成这些数据的接受、处理、输出到打印头、常能量控制等一系列要求,故对CPU的速度就有很高的要求[5]

2.  使用热振头的一些注意事项:

热振头是一种比较“娇气”的电子元件,如下是个人使用心得,仅供参考.

(1)热振头的逻辑电压5V和工作电压24V一定要分先后,5V在先,24V在后,决不能颠倒顺序,决不能同时给电路加上,否则会烧毁热振头.

(2)当加热点数过多时(超过总点数的50%),切不可持续加热,这样会烧毁热振头.

以上两点非常重要,一定要注意!

(3)热振头移位数据寄存器数据率理论上可达2MHz,本测试程序由于硬件使用I\O口做为热振头数据寄存器的时钟输入端,因此目前时钟周期最小只能是1.4ms,要想加快数据传输率,可以试试SPI口,只是硬件还需改动。

(4)当传输完全部数据后,需时延,然后才可加锁存信号.

2.2.3  打印头电机驱动特性

当打印头运动到最左边时,机头上附加的一块小磁铁使一只干簧继电器吸合,当打印头从左往右运动时,该小磁铁离开干簧继电器,则其触点释放,干簧继电器触点容量典型值是50μA,此时最大接触电阻为5Ω,该干簧继电器触电最大电流为1mA(@5VDC).

当利用上蜡电阻获得该干簧继电器触点吸合或释放的信号用于检测打印头是否回复到起始位置(最左端)时,要注意触点的抖动对信号的影响,复位信号检测波形如图2.1所示。

基于C语言实现的心电图系统仿真
            图2.1复位信号检测波形

由图2.1可知,在开关切换时,约有2ms不稳定状态,因此检测电路或者从硬件上设置低通滤波电路,或者从软件上进行数字滤波,防止检测错误。

2.2.4. 发热元件驱动能量计算

热敏打印机是利用给发热元件通电发热时热敏纸起化学反应使之变色形成点迹,发热元件通过多大电流,该电流持续通过的时间,必须仔细选择。对于MTP401—G256打印头,当用高灵敏热敏纸打印时,其驱动发热元件的额定能量为2.3mJ,对于标准热敏打印纸则为2.5mJ。基于C语言实现的心电图系统仿真

基于C语言实现的心电图系统仿真
        图2.2发热元件驱动信号

驱动发热元件所需能量可通过一下公式计算:

基于C语言实现的心电图系统仿真

基于C语言实现的心电图系统仿真

式中,E——提供的能量(mJ);

V——柔性印刷电路(FPC)端电压 (V);

T——工作环境温度();

E0——额定能量(mJ);

V0——额定电压5V;

T0——常温24;

基于C语言实现的心电图系统仿真 基于C语言实现的心电图系统仿真

基于C语言实现的心电图系统仿真 式中,t——发热元件通电持续时间,也即 工作电流的脉宽(ms);

R——发热元件阻值,视具体型号的打印头而定,一般为14.4Ω~17.6Ω;

E——供给的能量(mJ);

V——柔性印刷电路的端电压(V);

图2.2为发热元件驱动脉冲时序图。

2.2.5. 定时信号

 打印头在运行过程中,用于控制发热元件通电时刻用定时信号同步。定时信号发生器相当于一个发电机,当打印机电机旋转时,即产生出正弦电压,经外部电路整形,使其形成方波脉冲串,用于打印定时控制。打印时序如图2.3 所示:

基于C语言实现的心电图系统仿真
         图2.3  打印开始时序图

2.3  基于77E58的高速行式热敏打印机控制板

热敏打印机根据其热敏元件的排列方式可以分为行式热敏(Thermal Line Dot System)和列式热敏(Thermal Serial Dot System)。列式热敏属于早期产品,目前主要应用于一些对打印速度要求不高的场合。行式热敏打印属于20世纪90年代技术,其打印速度比列式热敏快得多,目前最快速度已达到220mm/秒。

2.3.1  行式热敏打印的原理

行式热敏打印头(LTP2342)原理框图如图2.4所示。在一条长72 mm/的基体上均匀安装了576个发热元件。打印前将VF连到打印机电源,要打印的数据在时钟CLK的配合下由DAT端移到移位寄存器。当一个点行576位数据全部移到移位寄存器后,锁存端(LATCH)为低,将移位寄存器的数据锁存到锁存寄存器;然后再数据选通端(DST)产生低电平,此时根据输入的数据是1还是0决定发热元件是否发热,从而在热敏纸上产生要打印的点行。行式热敏打印头的控制信号时序图如图2.5所示。

基于C语言实现的心电图系统仿真
图2.4行式热敏打印头的原理框图

             

图2.5行式热敏打印头控制信号的时序图 基于C语言实现的心电图系统仿真

2.3.2  硬件设计

本打印机控制板的硬件总体框图如图2.6所示。整个电路主要有主控电路、走纸电机控制及打印头状态检测电路、打印头保护电路及头温测量电路组成。

主控电路由微处理器、IMP810复位芯片、62256静态存储器、29C040FLACH、XC9536CPLD、Max232串行接口芯片组成。控制板采用的是高速微处理器77E58, 77E58的时钟频率为40MHz,每个机器周期为4时钟周期。

将内存中的点行缓冲区的数据输出到打印头的移位寄存器中,可以有两种方式。一种使用外加移位寄存器,但这种方法会导致外围电路复杂;第二种可采用DSP控制其本身的串行同步口进行传送。本控制板直接采用单片机的I/O口线,用软件一位的方法,将要打印的字节数据转换为串行数据移到打印头的寄存器中。本控制板采用先进的控制方式,即利用行式热敏打印机的双缓冲寄存器结构,在给打印头加热时,CPU进行数据转换和数据传输。采用40 MHz的77E58,传送576个点数据(72字节)的时间小于打印头的加热时健(一般为1ms左右),故这种方法及接口简单又不影响打印速度[6]

基于C语言实现的心电图系统仿真
     图2.6 硬件总体框图

2.4  系统的硬件设计

本热敏打印单元的硬件原理框图如图1所示[7]。它主要由热敏打印头(W216-HPA)、步进电机和ARM7系列32位嵌入式处理芯片组成。采用高密度厚膜工艺制成W216-HPA内部含有1728个发热元件,这些发热元件由热敏打印头内部的1728位移位寄存器、锁存和开关晶体管等CMOS元件来控制,可在热敏纸上产生1728个点,对应的打印宽度是216mm,分辨率是8dot/mm,12个导联信号可同时打印,便于观察、诊断。热敏打印头采用串行数据输入方式,既遵循SPI口的通信协议,也可从控制芯片的通用I/O口直接获得打印数据。

步进电机采用二相四拍的感应子式步进电机。感应子式步进电机与传统的反应式步进电机相比,在转子加有永磁体,以提供软磁材料的工作点,而定子激磁只需提供变化的磁场而不必提供磁材料工作点的耗能,因此该电机效率高,电流小,发热低。因永磁体的存在,该电机具有较强的反电势,其自身阻尼作用比较好,使其在运转过程中比较平稳、噪音低、低频振动小。

基于C语言实现的心电图系统仿真
图1 热敏打印单元的硬件原理框图

本热敏打印单元采用PHILIPS公司的ARM7TDMI-S[6]处理器。其主要特性有64K静态RAM ,128K片内Flash程序存储器,具有JTAG和ISP两种调试程序的方式。Flash编程时间:1ms可编程512字节,扇区擦除和整片擦除只需400ms。SPI串行接口,CPU操作频率可达60MHz等。

2.5 打印控制模式

医疗仪器行业标准规定,心电图机在打印心电曲线的过程当中:心电图形分别率为8dot/mm(同热敏打印头);步进电机走纸速度为基于C语言实现的心电图系统仿真 8dots/mm(50mm/s)或者基于C语言实现的心电图系统仿真 16dots/mm(25mm/s)。在这种情况下,通过计算得到每打印一行,即步进电机每走一步所需要的时间是2.5ms,这个时间由单片机的定时器来严格控制。

从热敏打印头的方面看,控制时序是如下进行的:数据传送→数据锁存→打印头加热→走纸,然后开始下一行的传送和打印。数据锁存是瞬间完成的,它的时间可以忽略不计,故对一般的控制模式,打印头的主要时间分配入表1所示。若采用这种一般打印控制模式,那么打印一行所需要的时间包含三部分:W216-HPA的最低加热时间为2.2ms(25℃标准条件下);若热敏打印头的晶振频率为1MHz,那么单片机将1728个点全部传送给热敏打印头所需要的时间为1.7ms;还要再加上数据转换的时间,这大大超过了规定的2.5ms的打印时间。于是需要一种高速的打印控制模式[7],见表2。

表1 一般打印控制模式

打印第一行

打印第二行

数据

传送

打印头

加热

走纸

数据传送

打印头

加热

走纸

表2 高速打印控制模式

第1行打印

第2行打印

数据

传送

打印头加热

走纸

打印头加热

走纸

CPU进行第2行数据转换及数据传送。

CPU进行第3行数据转换及数据传达。

 

 高速的打印控制模式就是在热敏打印头加热一行数据的同时,进行下一行数据的传送和处理。对应的打印主程序流程图如图3所示。

基于C语言实现的心电图系统仿真

图3 热敏打印程序流程图

2.6  本章小结

本章主要介绍了系统的硬件电路知识。首先介绍了了心电图机的发展历史,数字化12导同步在临床应用上具有更大的价值,它逐步替代单导、3导、或6导同步心电图机是今后的发展方向。接下来又重点分析了热敏打印机的工作原理:它的结构原理、设计中需要注意的问题、驱动能量的计算及有关定时信号的内容等。在此基础上,又介绍了基于77E58的高速行式热敏打印机控制板的设计。最后给出了本热敏打印单元的硬件原理框图,及相应的打印控制模式。

第3章  液晶模块中动态平滑波形的实现

3.1 预处理

随着科学技术的发展,生活水平的不断提高,人们的期望值越来越高,希望许多电子产品,检测设备,各种监护仪器小型化,实用化。用微处理机代替系统机来实现同等功能的方法,既可以减少成本,又增加方便性和快捷性。在运用各种微处理器代替系统机实现各种运算和进行处理、显示时,运用液晶模块代替显示器也是必不可少的。在心电图的开发中,就可以运用液晶模块来显示心电波形。

在运用液晶模块的过程的中,通常会遇到对图形和各种参数同时显示的情况,特别是对静态界面,动态参数和图形的同时显示,无疑具有相当的难度。我们可以采用对采样数据进行插值,描点等方法将采样数据还原为图形,然后滚动采样数据和循环扫描显示数据。

在绘制图形前,需要将液晶和采样数据进行相应的预处理。为液晶显示控制的显示存储单元的地址及数据都落在液晶模块所容许的范围之内。具体措施是根据采样数据和液晶纵坐标的大小确定出归一化值,并将采样数据都除以归一化值调整为2的整数倍,然后采用数据右移的措施进行处理。

3.2  插值描点

经预处理后的采样数据(显示数据),不可能完全连续,反映液晶屏幕上就是一些离散的点,为了保证图形的连贯,这些离散点之间的间隔点也要绘制出,即不连续的采样数据间要进行插值。只有各点之间没有间隔点时,绘制出的曲线才是完整的曲线。点与点之间的间隔不同,插值的方法也不同。

3.2.1  横纵坐标双向插值

在横纵坐标都需要插值的情况下,我们选择横坐标值小(X0,Y0)的为起点坐标,另外一点(X1,Y1)为终点坐标,斜率K为 (Y1-Y0)/(X1-X0)。应用△X=X1-X0和△Y=Y1-Y0之间的关系, 在保证△X≥0的条件下将斜率K的取值分为四个范围,在每个范围内运用中点画线法及扩展的中点画线法的基本原理,画出相应的插入点。

1.  中点画线法

液晶屏上的图形是又像素点构成的,普通的画线方法只是对曲线轨迹按像素点的尺寸取整后描点而成,这就难免产生误差和锯齿,从而使得图形曲线很不平滑,尽管体高分辨率可以改善平滑行,但不能从根本上解决问题,而且增加了成本。我们来介绍一种画一个像素宽的直线的中点画线法。

基本原理:(为了讨论方便,假设直线斜率在[0,1]之间)入图所示,若直线在X方向上增加一个单位,则在Y方向上的增量只能在0,1之间。假设X坐标为XP的各像素点中,与直线最近者已确定为(XP,YP),用实心小圆表示。那么下一个与直线最近的像素只能是正右方的P1(XP+1,YP)或右上方的P2(XP+1,YP+1)两者之一,用空心小圆表示。再以M表示P1和P2的中点,既M=(XP+1,YP+0.5)。又设Q是理想直线与垂直直线X=XP+1的交点。显然,若M在Q的下方,则P2离直线近,应取为下一个像素,否则应取P1。这就是中点画线法的基本原理。

设直线的起点和终点分别为(X0,Y0)和(X1,Y1),斜率为 (Y1-Y0)/(X1-X0)。

直线方程为 (y-Y0)=(Y1-Y0)*(x-X0),

                  (X1-X0

化简得 (X1-X0)*y=(Y1-Y0)*x+(X1Y0-X0Y1)

令F(x,y)=(X1-X0)*y+(Y0-Y1)*x+(X0Y1-X1Y1)=0

即ax+by+c=0

a=Y0-Y1;  b=X1-X0;  c=X0Y1-X1Y0

对于直线上方的点,F(x,y)>0;而对于直线下方的点F(x,y)<0。因此,欲判断前述Q在M的上方还是下方,只要把M 代入F(x,y),并判断它的符号。

构造判别式d=F(M)=F(XP+1,YP+0.5)=a(XP+1)+b(YP+0.5)+c

d<0时,M在直线的下方(即在Q的下方),故应该取右上方的P2作为下一个元素。而当d>0时,则应取正右方的P1。当d=0时,二者一样合适,可以随便取一个。我们规定取正右方的P1

d是XP和YP的线形函数,可采用增量计算,提高运算效率。在 d≥0的情况下,取正右方象素P1,欲判断再下一个象素应取哪一个,应计算
d1=F(XP+2,YP+0.5)=a(XP+2)+b(YP+0.5)+c=d+a ,故d 的增量为 a
而如果d≤0,则取右上方象素 P2。要判断再下一个象素,要计算
d2=F(XP+2,YP+1.5)=a(XP+2)+b(YP+1.5)+c=d+a+b
故d的增量为 a+b
d 的初始值为多少呢?
第一个象素应取左端点(X0,Y0),相应的判别式值为 
d0=F(X0+1,Y0+0.5)=a(X0+1)+b(Y0+0.5)+c
  =aX0+bY0+c+a+0.5b
  =F(X0,Y0)+a+0.5b
F(X0,Y0)=0    d的初始值为 a+0.5b
我们使用的只是d的符号,并且 d的增量都是整数,只是其初始值包含小数。因此我们可以用 2d代替 d,摆脱小数。
2.  扩展的中点画线法

(1) 当两点间斜率大于0小于1时,可以将X和Y的数值互换,这时斜率是大于0小于1了,就可以利用上述中点画线法得到应该插入的点的坐标,只要在液晶屏幕上显示时,注意把X和Y的数值对换就可以了。

(2) 当两点间斜率大于-1小于等于0时,分析与3.2.1所述方法是类似的,但要注意,d<0时,M在直线的下方(即在Q的下方),故应该取正右方的P1作为下一个元素。而当d>0时,则应取右下方的P1。当d=0时,二者一样合适,可以随便取一个。我们规定取正右方的P1。再往下的分析就可以参照3.2.1进行了。

(3) 当两点间斜率为小于-1时,同样可以将X和Y的值对调,斜率就成为大于-1小于零了,就可以按照(2)的分析方法来分析。但是应该注意,当d>0时,应该取左上方的点;d≤0时,应该取正右方的点。在液晶屏幕上显示时,同样要把X和Y的数值对换。

3.2.2   纵(横)坐标插值

我们先采样数据为起点(Xs,Ys),另外一点为终点(Xe,Ye)。

(1)当△Y=Ye-Ys>0时,首先在(Xs,Ys)上描点,然后把新的描点坐标作为当前(Xs,Ys) 点,重复上述操作直到Ys=Ye-1,最后在(Xs+1,Ys)即(Xe,Ye)上描点。

(2)当△Y=Ye-Ys<0时,首先在(Xs,Ys)上描点,然后把新的描点坐标作为当前(Xs,Ys) 点,重复上述操作直到Ys=Ye。

流程图如图3.1所示。

如此以来,这两个不连续点之间的差值我们就可以近似补上了。

基于C语言实现的心电图系统仿真
  基于C语言实现的心电图系统仿真
     图3.1  纵坐标插值流程图

   横坐标的插值算法和纵坐标的插值算法是一样的,只要把横纵坐标的值互换一下就可以了。

3.3  数据移位与循环显示

显示的图形需实行滚动,即要求图形随时间由屏幕的右边向左边行进(滚动)。在滚动的过程中,由于新显示数据很少和当前的数据相同,因此必须熄灭当前数据对应像素上的点,同时点亮新显示数据对应象素上的点。这就要求在微处理器里建立一个存储片区,保留有用数据。当显示图形从液晶屏左边溢出后,保留的数据会被新数据自动覆盖。

在绘制第一屏图形时,液晶上没有点亮的点,可以直接将图形绘制在液晶上,同时将所有数据依次保存在各存储单元。当绘制好第一屏图形后,假设每次移动的数据长度为n,则应将构成初始图形的数据前移n个存储单元,同时补充n个新显示数据到移动后剩下的存储单元中。图2为没次移动位数据的示意图,图中x1~xn 为构成初始图形的数据,y1~yn为新显示数据。

  当数据移位后就应该对数据进行循环扫描,同时描点绘制出图形。绘制图形必须要进行两方面的工作:熄灭当前位上的点;根据新显示数据点亮相应的点。如图3所示,当绘制出第一屏图形后,将所有图形前移2位得到移动一次后的数据,此时补充了2个新显示数据y1和y2,由于新显示数据y1和y2极少于党前的2个新显示数据xn和xn-1相同,因此必须熄灭xn和xn-1对应的点,熄灭后应同时点亮y1和y2对应的点,同时熄灭xn-2和xn-3对应的点,点亮xn和xn-1对应的点,如此重复进行下去,当最后x1和x2溢出后整个图形向前移动了2个元素。然后进行第二次移动数据,按照同样的方式移动图形,整个图形就可以在液晶屏上滚动起来。

液晶的品种、型号很多,但是在应用中,其思路、方法大体相似,首先应将数据进行相应的处理,然后运用不用的作点规则绘制出图形,最后将图形移动就可以达到设计的目的。

3.4  本章小结

   本章主要讲述了如何在液晶屏幕上实现波形平滑、动态的显示,为本程序软件设计中模拟热敏打印心电曲线原理,在计算机显示器液晶屏幕上方针实现心电曲线平滑、动态的显示作准备。在绘制图形前,需要将采样数据根据相应的液晶特性进行相应的预处理。再对不连续的采样数据间进行插值来取得平滑的效果,根据相邻采样点间隔特点的不同可以分为横纵坐标双向插值和纵(横)坐标插值,中间还详细讲解了有关中点画线法的相关知识。最后介绍了如何实现动态显示的方法,基本方法是每次点移动后,熄灭先前位上的点;根据新显示数据点亮相应的点。

第4章  软件程序设计

4.1  对C语言画图函数的介绍

由于本程序是用C语言编写的,在液晶屏幕上模拟显示热敏打印心电曲线的平滑算法,因此我们首先需要了解一下有关C语言画图函数的知识。

(1).initgraph( )图形初始化函数

void initgraph(int *driver, int *mode , char *path);

参数path指向图形驱动程序所在的路径,例如path=“C:” 。若没有指定路径,就在当前目录下寻找。

(2)setbkcolor( )设置背景色函数

void setcolor(int color); color的值可以是RED,BLACK,GREEN等。

(3)setcolor( )设置画笔颜色函数

void setcolor(int color);

(4)getmaxx()返回当前图形模式下的最大x坐标

int getmaxx();

(5)getmaxy()返回当前图形模式下的最大y坐标

int getmaxy();

(6)getx(),gety()返回当前位置的x,y坐标

int getx(); int get y();

(7)moveto()将当前位置移动到指定坐标的位置

void moveto(int x,int y);

(8)putpixel()在图形模式下在屏幕上画一个象素点

void putpixel(int x,int y,int color);

例如putpixel(6,8,RED);就是在坐标为(6,8)的位置处用红色画一个点。

(9)line()在给定的两点之间画一条直线

void line(int startx,int starty,int endx,int endy);

(10)rectangle()画矩形函数

void rectangle(int left,int top,int right,int bottom)

其中(left, top)为矩形的左上角坐标,(right,bottom)为矩形的右下角坐标

(11)floodfill()填充一个有界区域范围。

void floodfill(int x,int y,int bordercolor) 用当前填充图样和填充颜色填充一个由特定边界颜色定义的有界封闭区域,(x,y)为指定填充区域中的某点

(12)fillpoly()画出一个多变形,并填充。

void fillpoly(int pointnum,int *points);含有pointnum对数值,其中每一对给出了多边形1个顶点的X值和Y值。

(13)setfillstyle()设置填充图样与颜色,以供floodfill(), fillpoly()函数填充

void setfillstyle(int pattern,int color);

(14)用户自定义填充图样函数void setfillpattern(char*pattern,int color)

pattern指向一个字符数组,该数组至少8个字节长,它定义了一个8(象素)*8(象素)的用户填充图样。

(15)delay()延时函数,终端执行一段时间(以毫秒计算)。

4.2  模拟机电描笔式心电图机打印方式

  在机电描笔式心电图机打印时,打印一导联心电信号,首先利用变换公式,把上位机传来的心电数据,转换到热敏纸上对应的位置,然后将这个打点位置寄存在打印数据缓存数组中,最后cpu从IO口把打印数据缓存组中的数据传送到热振头中打印。

在计算机显示器上模拟热敏打印机的打印效果,每一个像素点代表一个打印点,首先运用.initgraph( )图形初始化函数进行图形初始化,再用setbkcolor( )设置背景色函数把屏幕背景色设为白色,再用putpixel()画点函数在当前图形模式下将原始数据的第一个(x0,y0)显示在屏幕上,颜色为红色。根据液晶动态波形的显示原理,在显示下一个数据(x1,y1)时,首先将第一个数据纵坐标不变,横坐标向前移一个像素点,在它原来的位置上,将先前显示的点熄灭,即再调用一次刚才将它显示到屏幕上的putpixel()画点函数,只不过颜色变为背景色。这样以来,这一列上没有显示的点,就可以画出新的点了,即画出(x1,y1)。按照同样的方式,依次显示、移动、熄灭、显示,就可以实现动态的波形显示了。

如果觉得波形移动速度太快,可以加一个延时程序,例如在显示第M个图形时,先将前面的M-1个数据点按照前面所述的方法整体向前移动一位,再在开始列显示第M个数据,然后调用延时程序delay(),延时长短可由具体情况决定。本程序的延时时间为

由图1.1典型心电波形可知,心电曲线波形中很多部分都是水平基线,

由前面热敏打印机的工作原理,我们知道打印头发热元件每次发出的热量,除了与发热元件流过的电流的大小和持续时间有关外,还与其本身的余热(如果前次已经通电发热)有关。它的余热直接影响下一次发热元件传给打印机的热量,而发热体越热,热敏纸变色产生的印迹就会越黑,越粗。所以实际打印出的心电曲线,基线部分都是颜色较黑,线条较粗。为了在液晶屏幕上显示这个效果,本程序把基线统一加粗,即用上下相邻的两行来显示基线。

前面已经讲过,在实际操作中,热敏打印头打印标准:

Y轴:8点/毫米

X轴:基于C语言实现的心电图系统仿真 8dots/mm (50mm/s); 基于C语言实现的心电图系统仿真 16dots/mm (25mm/s);

为了满足如上条件,并且使得热振头有足够加热时间,测试程序选用8dot/mm(50mm/s),16dot/mm(25mm/s)(如果每毫米点数过多会占用热振头加热时间),在这种情况下,横轴每走一点需要的时间是2.5ms,这个时间是由定时器严格控制的。

在本程序模拟实现中,为了能够区别显示走纸速度为8dot/mm(50mm/s)和16dot/mm(25mm/s)的不同打印效果,本程序设计中,在单像素点模拟时,由于像素点已经是液晶屏幕上最小的单位,不能再分,针对8dot/mm的情况,采用的抽点显示的方法,第偶数个数据点才会被显示在屏幕上。模拟16dot/mm的情况就依次全部显示。这样就可以做到在相同的长度内,显示的点的个数为1:2。显示结果如下图所示。可以看出,走纸速度为50mm/s 下8dot/mm的情况下,当P、T和QRS波群的波峰变化剧烈时,单点打印就会出现断续现象,而且粗度不够。而由25mm/s下的16dot/mm的图,可以看出适当的增加打印点数会提高曲线的平滑度,虽然使得曲线平滑得到大大的改善,但波形振幅较高时,仍出现严重的阶越现象。

4.3  模拟液晶显示原理的打印算法

由热敏打印机工作原理可知,在高速打印控制模式下,在热敏打印头加热一行数据的同时,进行下一行数据的传送和处理。如此进行,热敏纸上的每一行都会有点被热振头加热变黑,在液晶屏上模拟显示出来就是心电图的横坐标是相邻的。由液晶模块中动态波形平滑的实现可知,

对于一导联心电信号,要实现心电图打印,必须将相连两个心电数据用线连接,即对于一条心电曲线,其实显示数据点在起始列只显示一点;从第二个数据点开始,要在下一列显示上一数据点到此数据点之间的线段。在热敏打印纸上表现为将两数据点之间的点都加热。

假设两位置之间的差值为N,第一个数据点的位置为基于C语言实现的心电图系统仿真 ,第二个数据点的位置为基于C语言实现的心电图系统仿真 ,在液晶屏幕上先显示第一点,如果第一点处于基线中,则加粗,即将它正下方的点也显示出来。如果第一点已显示完毕,要显示第二个点时,    若第二个点和第一个点纵坐标相同即第二个点也处于基线中,则也要将它和它下方的点同时显示出来。若第二个点和第一个点纵坐标不同,则在显示第二点的同时还要显示出它和第一点之间的连线,即将N个点全部显示。

基于C语言实现的心电图系统仿真
   见图所示。图中横轴为时间轴,t1-t11代表步进电机每走一步之间的时间间隔2.5ms;纵轴表示热敏打印头——背景虚线框表示不用加热的点,黑颜色的方块代表心电数据点,灰颜色的方块代表连线数据点。此种

图 一条直线段打印原理图

方法在相邻两个心电数据点之间只有一条直线段.

 在模拟波形动态显示时,先将第一个点横坐标向前移一位显示,再熄灭它在刚才所在列上显示的点,这时要在此列显示第二个点,同时还要在此列显示出两点之间的连线,即在此列要显示N个点。再次移动时,与此雷同,但要注意,在将第二个点向前移一位显示时,不仅要移动第二个点,还要将两点之间的连线一起移动,既N个点一起向前移动一位。然后将原来位置上这N个点全部熄灭,在此位置上显示第3个点及第3个点与第2个点之间的连线。也就是说,除了第一点直接显示、直接移动外、直接熄灭外,从第二个数据点开始,要在此列显示上一数据点到此数据点之间的N个点,在将这N个点整体向前移动一位,然后熄灭刚才那列上显示的这N个点,好显示下一列数据。需要注意的是数据点如果是处于基线上,就不仅要显示它本身,还要显示它正下方的点,而且在移动时它的加粗点会和它一起移动。如此这样重复,心电图形就可以在液晶屏幕上动态显示了。

如果感觉波形移动的速度太快,和4.2中的方法类似,可以加delay()延时函数来调节速度。

在此算法下,走纸速度为8dot/mm和16dot/mm的波形显示如图所示。

由图可以看出,应用此算法,在相邻两个心电数据点之间补充一条直线段的情况下,尽管显示波形比原始心电数据波形有所改进,在走纸速度处于16dot/mm的情况下,波形的断续得到解决,打印P波和T波也尚可,因为它们的峰值并不是很高,但是波峰变化剧烈时,这种算法仍会出现阶越现象。当打印速度加快到8dots/mm的时候,在打印QRS波群的时上述方法就会出现严重的断续,阶越现象,而且心电曲线整体看来比较虚,不清晰。

4.4  改进的心电曲线平滑算法

为了克服上述缺点,使打印单元能无失真的打印出上位机传来的心电数据,本程序又提出了一种改进算法。其主要思想是:

(1)增加相邻两个心电数据点之间直线段的个数,所有的直线段相连构成了整条心电曲线,这样导致整个曲线看起来变粗了,从而达到了曲线平滑的目的。

(2)打印机每次只打印的一个直线段,直线段由两部分组成:心电数据点和连线点。

(3)在热敏纸上表现为心电曲线的横轴和纵轴方向,至少要有一点加热

  在数据结构中,我们学习了二叉树的概念,二叉树是个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相关的被分别称为左子树和右子树的二叉树组成。

本次改进算法的具体实现采用二叉树的结构,自适应地搜索每条直线段的起始点和终止点,如图所示:

基于C语言实现的心电图系统仿真


         图     起始点终止点自适应搜索二叉树

设dot0、dot1和dot2分别表示相邻三个心电数据对应在热敏纸上的位置,其中dot1为本次要打印的心电数据点。delta1=dot0-dot1,deta1表示dot1与上一个心电数据点的差值,delta2=dot2-dot1, deta1表示dot1与下一个心电数据点的差值。 begin表示本次要打印的直线段所在列的起始纵坐标位置,end表示本次要打印的直线段所在列的终止纵坐标位置。begin与end的确定与dot0、dot1和dot2的数值大小有关,而且由差值deta1和deta2决定。这样看来,改进算法要打印一条直线段,不仅与上一时刻数据点位置有关,而且也取决于下一时刻的数据点位置,具有一定的自适应性。

ECG的基线是由相同纵坐标的点构成的直线段,那么搜索begin与end的判决门限就是1(也可以选其它的值,由直线段的点数决定)。由只要相邻两个心电数据点之间的距离超过1个点,就要增加连线点。

如图所示。图中横轴为时间轴,t1-t11代表步进电机每走一步之间的时间间隔2.5ms;纵轴表示热敏打印头——背景虚线框表示不用加热的点,黑颜色的方块代表心电数据点,灰颜色的方块代表连线数据点。此种方法在相邻两个心电数据点之间不止有一条直线段.

基于C语言实现的心电图系统仿真

         

                图5  多直线段打印原理图

在液晶屏幕上显示的原理也是如此,在显示某一数据点时,如果它处于基线中,就按照在前面讲述的方法加粗显示即可。如果没有处于基线中,就不仅要显示它本身,而且还要比较它和前面的点及后面的点的差值,按照改进算法,根据起始点终止点自适应搜索二叉树原理,来显示一条线段。模拟波形动态显示时,与4.3中讲述的方法类似,不同的是4.3中补加的直线段只是与它前面的一点有关系,而本算法不仅要比较它前面的点还要比较它后面的点。所以在移动时,要将直线段和本列要打印的原始数据点一起移动。

应用此算法后,模拟走纸速度为8dot/mm和16dot/mm的波形显示如图所示。

从图中可以看出,无论是模拟走纸速度为8dot/mm还是16dot/mm的波形显示,单点打印算法图形清晰、平滑,且图形的断续、阶跃现象得到明显的改善。尤其是当打印机处于高速走纸状态16dot/mm 时,由改进算法的得到的曲线不但QRS波群的阶越现象得到明显改善,而且P波,T波也变得平滑,曲线整体看来更清晰,更平滑。

4.5  本章小结

本章主要讲述了关于本次毕业设计的软件程序实现,基本思想是用C语言程序设计在计算机液晶屏上模拟热敏打印心电曲线及其平滑算法的实现。首先介绍了C语言函数库中相关的画图函数,然后分别模拟机电描笔式心电图机打印方式,液晶显示原理打印方式,及改进后的心电曲线平滑算法三种不同方法,在液晶屏幕上用C语言实现了仿真,并给出了走纸速度为8dot/mm和16dot/mm不同的显示结果。结果表明,改进后的平滑算法,通过增加相邻两个打印点间直线段的个数,加粗曲线,成功地解决心电图机处于高速走纸状态下,热敏打印曲线不平滑、不清晰等问题。使曲线整体看起来更清晰,更平滑。而且算法采用二叉树结构,自适应搜索每个直线段的起始点和终止点,简单方便。

第5章  软件程序设计的改进

5.1  放大显示

由于在液晶屏幕上单像素点太小,且是最小的单位不能再分割,不能比较清楚的显现改进的心电曲线平滑算法的优越性。为了使读者可以清楚地看出对比效果,本程序又把单打印点放大,即由四个像素点(2×2)来模拟显示一个打印点。再C语言画图函数中,就要用到rectangle()画矩形函数,用setcolor( )设置画笔颜色函数,例如绿色,即矩形的边框颜色,再由用户自定义填充图样函数 setfillpattern(char*pattern,int color)来设置填充矩形的图样和颜色。pattern指向一个字符数组,该数组至少8个字节长,它定义了一个8(象素)*8(象素)的用户自定义填充图样和颜色,我们将pattern定义为pattern={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};填充颜色设为红色,再用void floodfill(int x,int y,int bordercolor) 函数,用当前填充图样和填充颜色填充一个由特定边界颜色定义的有界封闭区域,(x,y)为指定矩形区域中的某点,bordercolor此矩形的边框颜色,在本程序中即为绿色。这样就可以得到用红色实填充的边框为绿色的矩形。

原来在用单像素点显示单打印点时,只要把经过归一化后的数值直接显示在屏幕上即可,但是在用一个矩形来显示单打印点时,单像素点的经过归一化的值与矩形的左上角坐标有关,例如在本程序中,屏幕上第n个像素点的坐标为(xn,yn),屏幕最左边初始显示的列的横坐标为1的劣,用来模拟热敏打印机的打印头。根据显示器液晶屏幕上的现实结果上下合适与否来设置纵坐标参考值为5,最后将标准参考值设为(1,5),则代表这个像素点的矩形的左上角坐标就是(1+( xn-1)*2,5+( yn-5)*2)。右下角点坐标就是坐上角点坐标的横、纵坐标都加2即可。这样矩形就可以画出来了。

5.2  模拟机电描笔式心电图的放大显示

在机电描笔式心电图机打印时,矩形显示与单像素点显示是类似的。只要将单像素点坐标变换为相应的矩形坐标。初始化图形函数和设置背景色都是一样的,接着用rectangle()画矩形函数在当前图形模式下将第一个矩形显示在屏幕上,边框颜色为绿色,填充颜色为红色。根据液晶动态波形的显示原理,在显示下一个矩形时,首先将第一个矩形纵坐标不变,横坐标整体向前移一个单位,即两个像素点,在它原来的位置上,将先前显示的矩形熄灭,即要再调用一次rectangle()画矩形函数,坐标参数还是它移动前的坐标,只不过将画笔颜色变为背景色——白色,这样矩形的边框就是白色的。将用户自定义填充图样函数 setfillpattern()中的填充颜色设置为白色,floodfill() 函数中的bordercolor——矩形的边框颜色这时已经变为白色了。这样以来,原来的矩形在屏幕上已经变成白色的边框,白色的填充色了,和背景色融为一体,我们已经看不到了。其实这次的画矩形函数其实应该称为擦除矩形函数。原来矩形对应的列上没有显示的矩形,就可以画出新的矩形了了,即画出第二个像素点对应的矩形。按照同样的方式,依次显示、移动、熄灭、显示,就可以实现动态的波形显示了。

如果觉得波形移动的速度太快,就可以加延时程序。例如在要显示第M个图形时,先将前面的M-1个矩形列按照前面所述的方法整体向前移动一单位矩形宽度,再在开始矩形列显示第M个矩形,然后调用延时程序delay(),延时长短可由具体情况决定。本程序的延时时间为

和单像素显示时一样,我们也需要把基线统一加粗,即用上下相邻的两行矩形来显示基线。即在显示基线的矩形时,除了要显示应该打印的数据点变换成的矩形以外,还要将加粗点也变换为矩形显示出来,这样才能模拟显示实际打印出的心电曲线,基线部分颜色较黑,线条较粗的特性。

在本程序放大模拟实现中,为了能够区别显示走纸速度为8dot/mm(50mm/s)和16dot/mm(25mm/s)的不同打印效果,我们在8dot/mm(50mm/s)下将一个(2×2)四像素点矩形来独立无重叠的显示一个打印点,而16dot/mm(25mm/s)的情况下,仍旧是这样用一个(2×2)四像素点矩形来表示一个打印点,不同的是显示在屏幕上时,每一个矩形的左边框的值仍旧和它对应的单像素的横坐标的值一样,由于矩形的宽度为两个像素点,所以矩形之间的显示是重叠的。这样在8dot/mm(50mm/s)的情况下显示8个点在屏幕上走过的距离和在16dot/mm(25mm/s)的情况下显示15个点在屏幕上走过的距离一样。这样在相同的距离下,打印的点数8dot/mm时与16dot/mm时的个数之比近似为1:2.就可以模拟在实际心电图打印时,走纸速度是8dot/mm(50mm/s)和16dot/mm(25mm/s)的情况下,在经过相同的距离下,打印点数之比为1:2。

需要注意的是在擦除矩形时,8dot/mm的情况和前面5.1所讲述的方法一样。但是由于在16dot/mm的情况下,每次移动都是向前移一个像素点,矩形之间的显示是重叠的,所以在擦除时,就不能将整个矩形全部擦除,只能擦除半个。即擦除时调用的rectangle()画矩形函数,应该设置为宽为一个像素点,长度为两个像素点。边框颜色、填充颜色不变还是为白色。填充图样也不变。

在液晶屏幕上模拟显示的结果如下图所示:。由放大显示可以更清晰地看出,16dot/mm的点数更密集,但是两者的断续,阶跃现象都非常明显,需要改进。

5.3  模拟液晶显示原理的心电图放大显示

于4.3节模拟液晶显示原理的打印算法相类似,要实现心电图打印,必须将相连两个心电数据用线连接,只不过此时的心电数据点是用矩形来表示的。即对于一条心电曲线,起始显示数据点在起始端用rectangle()画矩形函数来显示一个(2×2)四像素点矩形;如果原始数据点是基线上的点,则在它的正下方再显示一个(2×2)四像素点矩形。填充图样填充颜色和5.1时一样的。然后将这个矩形列整体向前移动一个单位(2个像素)来显示。再按照5.1中讲述的擦除矩形的方法,重新调用rectangle()画矩形函数,只不过这时的边框颜色是背景色,填充颜色也便为背景色了。这样就将起始矩形列上显示的矩形擦出了。屏幕的左侧横坐标为1的单位列是模拟热敏打印机的打印头,所以要显示第二个矩形时,照样要在此列来显示。如果第二个原始点仍旧在基线上,照样加粗显示。如果不在基线上,则不仅要显示原始点本身对应的矩形,还要在这一单位列显示上一原始数据点到此数据点之间的点对应的矩形。在显示器屏幕上表现为将两矩形之间的矩形段都显示出来。再次移动时与此类似,只是在移动第二列时,要把这一列矩形整体向前移动一单位。

在本程序的设计中,由于每次把屏幕上显示的矩形整体向前移动一单位系统所花费的时间已经达到要求,所以不必再加延时程序。

走纸速度为8dot/mm(50mm/s)和16dot/mm(25mm/s)的不同打印效果,仍旧体现在8dot/mm的情况下,矩形独立显示,无重叠,每次移动的单位列的宽度为两个像素宽,也就是一个矩形宽。而16dot/mm(25mm/s)的情况下,矩形的左边框的横坐标值和单像素点的横坐标值是相同的。每次移动的单位列的宽度为一个像素宽,即半个矩形宽,这样基线上16dot/mm(25mm/s)的矩形是重叠显示的。所以擦除时调用的rectangle()画矩形函数,应该设置为宽为一个像素点,长度为两个像素点。边框颜色、填充颜色不变还是为白色。填充图样也不变。

在显示器屏幕上的模拟显示结果如图所示:

由图可以看出,由矩形放大显示的波形比单像素显示的波形有很大改进,心电曲线更清晰,阶跃现象也更明显。16dot/mm(25mm/s)比8dot/mm(50mm/s)的情况要好一点,但是波峰变化剧烈时,这种算法仍会出现阶越现象,难以满足要求。

5.4  改进平滑算法的心电图的放大显示

 同4.4节类似,也是运用起始点终止点自适应搜索二叉树原理,改进算法要打印一条直线段,不仅与上一时刻数据点位置有关,而且也取决于下一时刻的数据点位置,不同的是不是把打印数据点直接显示在屏幕上,而是要把点变换为(2×2)四像素点矩形块。根据4.4节所讲述的原理,我们可以知道添加的打印点,只要在屏幕显示时,按照5.1讲述的画矩形方法将这些点变为相应的矩形即可。移动时,将所添加的这一列矩形和原始的矩形一起移动即可。

和5.3一样,走纸速度为8dot/mm(50mm/s)和16dot/mm(25mm/s)的不同打印效果,仍旧体现在8dot/mm的情况下,矩形独立显示,无重叠,每次移动的单位列的宽度为两个像素宽。而16dot/mm(25mm/s)的情况下,每次移动的单位列的宽度为一个像素宽,即半个矩形宽,这样基线上16dot/mm(25mm/s)的矩形是重叠显示的。所以在擦除时,调用的rectangle()画矩形函数,应该设置为宽为一个像素点,长度为两个像素点。边框颜色、填充颜色不变还是为白色。填充图样也不变。

在本算法中,由于每次把屏幕上显示的矩形整体向前移动一单位系统所花费的时间已经达到要求,所以不必再加延时程序。

在计算机显示器上显示的结果如下图所示,

由图可以看出,无论是走纸速度为16dot/mm(25mm/s)的低速还是8dot/mm(50mm/s)的高速,心电曲线的QRS波群的阶越现象都得到明显改善,而且P波,T波也变得更平滑,曲线整体看来更清晰,更平滑。

5.5  本章小结

本章是对上一章程序设计的改进。由于在显示器上像素点太小,用单像素点模拟热敏纸上的打印点,不能明显的地表现改进算法的优越性,所以在设计中,采用了放大显示,用(2×2)四像素点矩形块来模拟单打印数据点。分别仿真了机电描笔式心电图机打印方式,液晶显示原理打印方式,及改进后的心电曲线平滑算法三种不同方法的心电图打印的放大显示。通过放大后对比显示,可以更清晰地看到采用改进的平滑算法,打印出的心电曲线阶跃现象已经非常不明显,曲线整体更清晰,更平滑。


结论

经过一学期的学习和设计,整个毕业设计到此已经结束。在这段设计过程中,取得了一定的成绩;同时,由于时间关系,有一些内容并没有继续研究下去。下面,对这段时期以来的工作做一个总结。

我首先了解了关于热敏打印心电曲线国内外的研究现状,及心电信号的特性,心电图机的发展历史。重点学习了了热敏打印机的工作原理,热敏打印心电曲线系统的硬件组成,和液晶模块中动态波形的平滑显示。这都是为第四、五章所要设计的在液晶屏幕上模拟显示热敏打印心电曲线的软件程序及其改进算法作准备。

本程序设计先后通过模拟描笔式心电曲线打印算法,将原始数据点直接显示在屏幕上;模拟液晶显示原理的打印算法,将两个相邻点之间的直线段显示出来,直线段的终止点仅与上一时刻的数据点有关;及采用改进的平滑算法,增加相邻两个打印点间直线段的个数,加粗曲线,来解决心电图机处于高速走纸状态下,热敏打印曲线不平滑、不清晰等问题。改进的平滑算法采用二叉树结构,搜索每个直线段的起始点和终止点。每个直线段起始点与终止点的选取与上一时刻心电数据点位置以及下一时刻心电数据点位置有关,具有一定的自适应性。通过三种不同的算法相应的单像素点心电图波形动态显示及其用(2×2)四像素矩形块代表打印点来放大显示心电图曲线,可以看出,改进后的算法原理简单,易于实现,当走纸速度无论是低速16dot/mm(25mm/s)还是高速8dot/mm(50mm/s),心电曲线的QRS波群的阶越现象都得到明显改善,而且P波,T波也变得更平滑,曲线整体看起来更清晰,更平滑。

经过这一段时间的设计过程后,学到的东西很多,同时也发现自己还需要学习的东西也很多。尤其是对于热敏打印心电曲线的平滑算法问题,由一无所知到能够自己设计程序并在计算机液晶屏幕上仿真显示其中的内容。而且,通过这次仿真显示又加深学习了C语言的有关指示,尤其是C语言中有关画图函数的内容。这对以后的学习、工作也是很有用处的。


参考文献

[1] 刘风军 王明时.心电快速打印的研究及应用实例.医疗卫生装备,2005年第26卷11期

赵坤鹏.热打印技术的现状及产业发展. Information Recording Materivals ,2005 vol .6 

[2] 张国荣 曹彩宁 史斌宁.基于单片机的热敏打印机的设计和实现 .微电子学与计算机,2002年第9期微50-51-56

 [3] ]与超 李刚.基于热敏打印机的心电图型快速打印算法的研究及应用实例,电子技术应用,2004年第9期

 [4] ]李建峰.基于数字信号处理器的12通道心电图机的设计及分析方法的研究.重庆大学硕士学位论文

关红彦丁北生 黄玉玺 张力新.医学图象热敏打印系统的研究.中国图象图形学报,1998年6月第3卷

[5] 窦振中 汪立森.热敏微型打印机设计原理.电子计算机与外部设备,2000年3月第24卷第3期

李刚 高剑明 谌雅琴.基于ARM的十二导同步心电图机设计.电子产品世界, 2005.12期

[6] 张会生.基于77E58的高速行式热敏打印机控制板的研制.电子技术应用, 2004年第1期  37-39

[7

[8]与超 李刚.基于热敏打印机的心电图型快速打印算法的研究及应用实例,电子技术应用,2004年第9期

[9]罗乐 杨浩  何为.液晶模块应用中动态波形现实的软件实现.计算机应用,2003年12月第23卷

[10]

[11]刘静华 王永生.计算机绘图.国防工业出版社社

[12 孙家广.计算机图形学.清华大学出版社

[13]王晶界 胡平平.一种计算机平滑曲线的画法和快速算法.微处理机.1998年8月第3期

[14]段兴等.C语言使用程序设计100例.人民邮电出版社

[15]荆楠.基于热敏打印的心电曲线平滑算法的研究及实现.燕山大学


致谢

经过为期一个学期的不懈努力,终于成功的完成了毕业设计的全部内容,让我的大学生活成功的画上一个圆满的句号。在此,我相所有关心和帮助我的老师和同学致以最真诚的谢意!

本次毕业设计主要是在我的导师的认真指导下进行的。在此,衷心感谢他长期以来对我的学习和生活的关心、指导和帮助。他和我们年龄相仿,所以相处融洽。另外,他才华横溢,我非常的敬佩,在将来的学习和生活中,他将是我学习的榜样。

在此即将毕业之际,我衷心的感谢全体老师在这四年里对我学习和生活中的关怀与帮助!

衷心的感谢我的舍友们,你们给予了我大力帮助!


毕业设计(论文)成绩评定表

指导教师评语:

基于C语言实现的心电图系统仿真


成绩:        

指导教师签字:           

年    月    日

评阅人评语:

成绩:       

评阅人签字:             

年    月    日




客服QQ:496889925   电话15831080855
冀ICP备11001230号
Powered by OTCMS V2.3