?

基于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合作推出區塊鏈工具包
愛的長度
一種激光/無線電復合引信信號處理技術
長度單位
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合