基于Java的医学信号处理工具包的开发

2012-03-24 07:23谢海源上海交通大学医学院附属新华医院上海市200092
中国医疗器械杂志 2012年5期
关键词:工具包信号处理长度

谢海源上海交通大学医学院附属新华医院,上海市,200092

基于Java的医学信号处理工具包的开发

【作者】谢海源上海交通大学医学院附属新华医院,上海市,200092

根据医学信号的特点,开发了用于处理医学信号的软件工具包。工具包采用纯Java语言编写,内容涉及基本数字信号处理、随机信号处理等多个方面。工具包功能方法均经过测试,程序健壮性较好。工具包功能说明详细,方法调用简便,具有很好的实用性。

Java;医学信号;数字信号处理

生物医学信号是人体在生命过程中不断地发出的物理的、化学的及生物的信息,如体表心电(ECG)信号、脑电(EEG)、体温、血压、潮气量等。生物医学信号具有信号弱、噪声强、频率范围一般较低、随机性强等特点。生物医学信号处理是生物医学工程学的一个重要研究领域,也是近年来迅速发展的数字信号处理技术的一个重要的应用方面。正是由于数字信号处理技术和生物医学工程的紧密结合,才使得我们在生物医学信号特征的检测、提取及临床应用上有了新的手段,因而也帮助我们加深了对人体自身的认识。

可直接用于信号处理的软件有著名的Mathworks公司的Matlab,该软件功能强大,但一般在台式电脑应用较多。其他用于信号处理的软件大都根据实际需要由工程人员自行开发,如采用C语言编写的信号处理程序也很常见。Java作为一种常用的结构优异的计算机编程语言,现成用于进行信号处理的程序却非常少见。所以,如果能采用Java语言开发一套专用于处理医学信号的软件工具包,不论是在教学还是在实际开发工作中,都是非常有益处的。此外,Java语言具有天生的跨平台性质和可移植性强的特点,可适用于不同的操作系统环境。特别是在移动终端设备蓬勃发展的今天,硬件配置已经非常强大,操作系统出现了WindowsPhone、android、Symbian等多元竞争的局面,采用Java语言设计的程序更有其用武之地。

将数字信号处理与Java语言结合在一起,作者开发了一套适用于医学信号处理的软件开发工具包。软件包的所有程序方法采用纯Java语言编写,没有采用将Matlab或是C语言的现成程序转换成Java的方式,虽然工作量很大,但保证了程序的运行效率,避免了转换过程中的一些不可预测的问题。以下是对软件工具包一些重要属性的描述(涉及的变换和算法的原理这里不做说明,请参考相关资料)。

1 软件工具包基本结构

软件工具包采用Java1.7版本,在NetBeans IDE 6.8平台进行开发。工具包涉及的信号处理内容较为广泛,包含了确定信号、随机信号的变换;信号的处理滤波;采样率变换;功率谱估计等多方面。软件包共设计了7个类(见图1所示),每个类下有若干方法(见图2)。其中,辅助类三个,分别用于复数运算、矩阵运算和常用窗函数生成;一个信号变换类,包含信号变换方法,如FFT、DFT、DCT、STFT、Wigner-Ville分布等;一个系统分析类,包含卷积、相关、AR模型、维纳滤波器、卡尔曼滤波器等;一个小波运算类和一个自适应滤波器类。设计时,对每个程序方法的实现进行了详细描述,编辑了Javadoc文档,便于理解和调用。

图1 软件包结构(Javadoc)Fig 1 Software structure (Javadoc)

图2 SigConvFun类下的部分函数Fig 2 Function in Class SigConvFun

2 软件方法的准确性和健壮性

程序的正确性和健壮性是至关重要的,所以每个方法设计完成后都经过了实际测试。

软件包中的大部分方法都与Matlab的计算值进行了比较,个别方法与手工计算结果进行比较,保证程序运行结果的准确性。

这里以DFT、FFT的测试程序为例,验证程序的准确性。设计测试程序(假设一段复信号:x={1+4i, 5+3i, 8+3i, 5+9i, 2+6i, 6+4i, 2+3i, 7+4i},信号长度N=8):

//初始化信号序列

double[][] x=new double[8][2];

x[0][0]=1; x[0][1]=4; //序列附值

x[1][0]=5; x[1][1]=3;

x[2][0]=8; x[2][1]=3;

x[3][0]=5; x[3][1]=9;

x[4][0]=2; x[4][1]=6;

x[5][0]=6; x[5][1]=4;

x[6][0]=2; x[6][1]=3;

x[7][0]=7; x[7][1]=4;

//进行fft运算

double[][] y2=SigConvFun.FFT2(x);

int N=x.length;

for(int k=0;k<N;k++){ //进行DFT运算

double[] y1=SigConvFun.DFT(x,k); //打印测试值

System.out.println("DFT:"+y1[0]+""+y1[1]+"FFT:"+y2[ k][0]+""+y2[k][1]);

}

图3 由Java测试的DFT结果Fig 3 Results of DFT tested by Java

图4 由Java测试的FFT结果Fig 4 Results of FFT tested by Java

图5 由Matlab计算的FFT结果Fig 5 Results of FFT tested by Matlab

通过图3、图4与图5的比较,Java的DFT、FFT算法和Matlab的FFT算法计算的结果是吻合的,唯一的区别是每一组数之间存在的一点微小误差。这是由于在Java程序设计时,设置的数据类型是double型变量,比Matlab的数据长度要长,而两个Java程序之间的误差是由于机器数表示的精度问题导致的,这都是正常的。

在程序的健壮性方面,也以FFT为例说明。FFT根据算法的特点,序列的长度不是随意截取的,长度N应等于2n,n为整数。因此,工具包针对FFT设计了两个重载方法。

方法1 public static double[][]

IFFT2(double[][] x),该方法的输入变量x为任意长度。程序根据x的长度,自动补0,使新序列长度:x.length≤N≤2n,且2n-1≤x.length。

方法2 public static double[][]

IFFT2(double[][] x, int N),该方法由用户自行设定N的长度,Javadoc中强调了N输入的要求。

考虑到程序运行的效率问题,方法设计时未采用Try-Catch块。需要强调一点的是,使用该工具包的用户应具有信号处理理论基础。

3 软件方法的应用性

工具包的设计除去FTF(快速横向滤波器)外,均采用了静态方法。类下的方法不需要先通过构造方法生成对象,调用时只需直接调用静态方法即可。

程序运行的效率是一个重要的方面。Java容器类很多,有数组、List、Map、Set等,有些容器类如ArrayList类,会以牺牲效率来换取序列长度的可伸缩性,所以工具包的信号序列都是采用数组实现的。因为大部分的信号序列长度根据输入序列的长度是可预知的,选择数组能有效提高程序运行效率。

工具包的设计初衷是应用于医学信号。如前所述,医学信号如心电、脑电、呼吸等都是强背景噪声下获得的微弱信号,大多都是随机信号,甚至是非平稳的。所以,工具包的设计不能仅仅局限于基本的信号处理方法,更多的应该加入随机信号的处理工具,如适用于平稳随机信号的Wiener滤波器,处理非平稳信号的自适应滤波器和STFT等。

心电信号是医学信号处理的一个热点。心电信号频率一般在0.05 Hz -100 Hz。采用普通的频率选择滤波器可以很好的滤除100 Hz以上的高频噪声,但是对于100 Hz之内的随机噪声就显得无能为力,这就需要借助更为有效的一些处理方式。以下是采用Java程序设计的小波工具(图6、图7、图8和图9方法选择Daubechies小波,p=6)对一段三个心动周期的心电信号进行的降噪处理的测试。

图6 原始信号Fig 6 Original signal

图7 一次分解的轮廓Fig 7 Rough sketch after first decomposition

图8 一次分解的细节Fig 8 Details after first decomposition

图9 重构信号Fig 9 Reconstructed signal

可见图7 的信号比图6的信号更为平滑,小波工具在信号降噪方面起到了一定的作用。若对信号加以更优化处理,降噪性能可进一步提高。

4 软件包的完备性和扩展性

医学信号的处理需要用到的理论和算法比较广泛,导致7个类下的方法(不包含private方法)共计有74个之多,涵盖面比较广泛,常规的算法和变换都有其对应的程序方法。但也并非所有的算法都写成了程序,这是经过筛选的。如在频谱估计的模型中,选择了更为易用的AR模型,因为从数学逼近的角度来讲,AR、MA和ARMA模型是可以互相转换的,而且AR模型对应于求解一组线性方程,而MA模型和ARMA模型对应于非线性方程组。在自适应滤波器的设计上,选择了性能相对较好的FTF自适应算法,它与递归的RLS算法相比,计算量下降;与LMS算法相比,仍保持了收敛速度快的优点,并且收敛速度对观察值的相关性不敏感。采样率变换方法综合了抽取和内插过程,一步到位。

从图1可以发现,Java工程下的一个包,名为BasicDSP,这只是工程中的一个包;另外还有一个包,名为ExtendDSP。这个包目前是一个空包,包内没有任何类和方法,这是用于扩展的。在今后的工作实践中,一定会需要设计到一些特定功能的算法,将这些特定功能的算法放置在ExtendDSP包中,作为工具包的扩展功能。从某种意义上说,工具包并不是一个定型的产品,可根据需要随时进行扩充。

Java程序语言在医学信号处理上的应用不多,以开发包的形式集成更是少见。开发这套医学信号处理工具包,基于两方面的考虑。首先是满足临床工程工作中对于医学信号处理工具的需求;其次是满足学生学习和交流信号处理方法的需求。这套工具包的编写由作者个人完成,其中一定会存在不少的局限性,在实践工作中,还需要不断完善和提高。Java是开源的,这套工具包将在网上发布,供同行们共同探讨。

[1] 汪源源. 现代信号处理理论和方法[M]. 上海: 复旦大学出版社, 2003

[2] 胡光锐. 信号与系统[M]. 上海: 上海交通大学出版社, 2009

[3] John G.Proakis, Dimitris G. Manolakis.Digital Signal Processing[M].USA, Pearson Education, 2007

[4] Y. Daniel Liang. Introduction to java Programming[M]. USA, Pearson Education, 2004

[5] Bruce Eckel.Thinking in Java[M]. USA, Pearson Education, 2005

[6] 王蒙. MATLAB7辅助信号处理技术与应用[M]. 北京: 电子工业出版社, 2005

[7] 郭晶, 孙伟娟. 小波分析理论与MATLAB7实现[M]. 北京: 电子工业出版社, 2005

A Biomedical Signal Processing Toolkit Programmed by Java

【Writers 】Xie Haiyuan
Xinhua Hospital Affiliated to Shanghai Jiaotong University School of Medicine, Shanghai, 200092

Java, biomedical signal, DSP

R318.04

A

10.3969/j.issn.1671-7104.2012.05.008

1671-7104(2012)05-0342-03

2012-05-23

谢海源,E-mail: shsmuxie@163.com

【 Abstract 】According to the biomedical signal characteristics, a new biomedical signal processing toolkit is developed. The toolkit is programmed by Java. It is used in basic digital signal processing, random signal processing and etc. All the methods in toolkit has been tested, the program is robust. The feature of the toolkit is detailed explained, easy use and good practicability.

猜你喜欢
工具包信号处理长度
专题征稿启事
——信号处理
MATLAB在数字信号处理中的应用
慢性病健康工具包研究进展
绳子的长度怎么算
1米的长度
基于MATLAB的语音信号处理
谷歌云与Digital Asset合作推出区块链工具包
爱的长度
一种激光/无线电复合引信信号处理技术
长度单位