陶 峰,史學(xué)濤,付 峰,劉銳崗,尤富生,董秀珍
多媒體定時(shí)器在EIT數(shù)據(jù)采集精度評(píng)價(jià)中的應(yīng)用
陶 峰,史學(xué)濤,付 峰,劉銳崗,尤富生,董秀珍
目的:實(shí)現(xiàn)電阻抗斷層成像(EIT)高精度數(shù)據(jù)采集系統(tǒng)性能評(píng)價(jià)軟件中的數(shù)據(jù)快速采集和存儲(chǔ)功能。方法:分析比較了Timer和多媒體2種Windows定時(shí)器,基于Visual C++分別編程實(shí)現(xiàn)了EIT數(shù)據(jù)采集系統(tǒng)性能評(píng)價(jià)軟件并比較了結(jié)果。結(jié)果:2種定時(shí)器均可以完成對EIT數(shù)據(jù)的采集、顯示、存放和簡單處理功能,但是多媒體定時(shí)器的定時(shí)精度更高,能夠更準(zhǔn)確而有效地完成上述任務(wù)。結(jié)論:多媒體定時(shí)器穩(wěn)定可靠,可以滿足一般情況下的高精度定時(shí)要求。
Windows定時(shí)器;數(shù)據(jù)采集;Visual C++
AbstractObjectiveTo realize fast data acquisition and storage in the performance evaluation software of high-precision data acquisition system of electrical impedance tomography(EIT).MethodsTwo kinds of Windows timer were compared and the performance evaluation software of EIT data acquisition system was realized respectively based on Visual C++.Results Both two timers were able to complete the tasks about EIT data,such as acquisition,display,storage and simple processing.However,multimedia timer,whose timing accuracy was higher,was able to complete all the above tasks precisely and effectively.ConclusionMultimedia timer is reliable and can meet the general requirements of high precision timing.[Chinese Medical Equipment Journal,2011,32(2):1-3]
Key wordsWindows timer;data acquisition;Visual C++
電阻抗斷層成像 (electrical impedance tomography,EIT)是新一代無創(chuàng)醫(yī)學(xué)成像技術(shù),其基本原理是根據(jù)人體內(nèi)不同組織在不同的生理、病理狀態(tài)下具有不同的電阻(導(dǎo))率,通過各種方法給人體施加小的安全驅(qū)動(dòng)電流(電壓),在體外測量相應(yīng)電壓(電流)信號(hào)以重建人體內(nèi)部的電阻率分布或其變化的圖像[1]。與傳統(tǒng)成像手段(CT、MRI等)相比,EIT 具有自身優(yōu)勢[2]:一方面,現(xiàn)有成像設(shè)備如CT等體積大、成本高、操作復(fù)雜甚至對人體有創(chuàng),而EIT恰恰具有無創(chuàng)、低成本以及功能成像的特點(diǎn);另一方面,現(xiàn)有成像設(shè)備無法對患者進(jìn)行長時(shí)間連續(xù)性成像檢查,從而不能對持續(xù)性或遲發(fā)性出血這一類疾病做出及時(shí)診斷,而EIT則可以進(jìn)行連續(xù)的床旁監(jiān)護(hù),進(jìn)而達(dá)到對具有這種傾向的患者進(jìn)行早期檢測的目的。因此,作為一種輔助成像手段,EIT展現(xiàn)出良好的臨床應(yīng)用前景。
第四軍醫(yī)大學(xué)的EIT課題組已成功研制了能夠初步應(yīng)用于臨床的EIT圖像監(jiān)護(hù)系統(tǒng)。從EIT的原理可以知道,連續(xù)穩(wěn)定高速采集電壓(電流)信號(hào)是準(zhǔn)確重建圖像的前提。在改進(jìn)和完善現(xiàn)有EIT系統(tǒng)的過程中,需要對其性能——如數(shù)據(jù)采集的精度和穩(wěn)定性等做出評(píng)估,因此需要編寫相對獨(dú)立的測試軟件完成對相關(guān)指標(biāo)的測試工作,包括對EIT數(shù)據(jù)的采集、顯示、存放和簡單處理。在這一過程中,為了保證采樣信號(hào)的準(zhǔn)確性,采樣時(shí)間的精確度十分關(guān)鍵。
目前的信號(hào)處理軟件大多基于Windows平臺(tái)編寫。Windows操作系統(tǒng)的普及應(yīng)用,尤其是可視化開發(fā)軟件Visual C++的出現(xiàn),為軟件開發(fā)提供了強(qiáng)大的圖形界面功能,使得對數(shù)據(jù)采集進(jìn)行圖形化處理更為方便,開發(fā)出來的應(yīng)用程序具有良好的人機(jī)交互功能[3]。Windows環(huán)境下有不同類型的定時(shí)器,本研究擬通過對比選擇最佳的采樣控制定時(shí)器,以達(dá)到最佳的采樣速度。
Timer是Visual C++提供的一個(gè)普通的定時(shí)器,屬于秒級(jí)精度的定時(shí)器。使用函數(shù)SetTimer()設(shè)定一個(gè)時(shí)間間隔之后,Windows系統(tǒng)將每隔該時(shí)間間隔發(fā)送一條WM_TIMER消息,從而實(shí)現(xiàn)應(yīng)用程序的定時(shí)處理。Timer實(shí)現(xiàn)定時(shí)操作非常方便,但它有2大缺陷:定時(shí)精度差和消息優(yōu)先權(quán)低[4]。首先,由函數(shù)SetTimer()設(shè)定的時(shí)間間隔被轉(zhuǎn)換為IRQ 0請求中斷的次數(shù),CPU以18.2 Hz的頻率響應(yīng)中斷,周期為54.945 ms[5],也就是說應(yīng)用程序每秒最多接收18個(gè)消息。其次,Windows系統(tǒng)是基于消息機(jī)制的系統(tǒng),任何事件的執(zhí)行都是通過發(fā)送和接收消息來完成的[6]。WM_TIMER消息的優(yōu)先權(quán)太低,只有在除WM_PAINT消息之外的所有消息被處理完之后,它才能得到處理。因此,Timer控件可以用于一般的定時(shí),但不能實(shí)現(xiàn)高精度的定時(shí)任務(wù)。
多媒體定時(shí)器屬于毫秒級(jí)精度的定時(shí)器。它不依賴于消息機(jī)制,而是用函數(shù)TimeSetEvent()產(chǎn)生一個(gè)獨(dú)立的線程,在一定的中斷次數(shù)達(dá)到后,直接調(diào)用預(yù)先設(shè)置好的回調(diào)函數(shù)進(jìn)行處理,不必等到應(yīng)用程序的消息隊(duì)列為空,從而切實(shí)保障了定時(shí)中斷得到實(shí)時(shí)響應(yīng),使其定時(shí)精度可達(dá)1 ms[7]。利用多媒體計(jì)時(shí)器可以很精確地讀出系統(tǒng)的當(dāng)前時(shí)間,并且能夠在非常精確的時(shí)間間隔內(nèi)完成既定的功能。因此,多媒體定時(shí)器完全可以滿足本軟件的要求。
本軟件的編寫是在Microsoft Visual Studio 2008環(huán)境下基于對話框類(CDialog)完成的。整個(gè)軟件(工程名為SYMS)的主要功能包括電阻抗的數(shù)據(jù)采集、保存,一維曲線的實(shí)時(shí)顯示以及停止采集后獲取特定范圍內(nèi)數(shù)據(jù)的簡單統(tǒng)計(jì)信息。為了比較結(jié)果,分別采用Timer控件和多媒體定時(shí)器實(shí)現(xiàn)了軟件的數(shù)據(jù)采集和讀寫功能。
作者單位:710032 西安 第四軍醫(yī)大學(xué)生物醫(yī)學(xué)工程學(xué)院(陶 峰、史學(xué)濤、付 峰、劉銳崗、尤富生、董秀珍)
首先,在頭文件里添加afx_msg void OnTimer(UNIT_PTR nIDEvent);然后,在.cpp文件中的消息映射部分添加ON_WM_TIMER();最后,由3個(gè)函數(shù)來完整的實(shí)現(xiàn)既定功能。
在MFC中SetTimer被封裝在CWnd類中,函數(shù)原形如下:UNIT_PTR SetTimer (UINT_PTR nIDEvent,UINT uElapse,void(CALLBACK*(lpfnTimer)(HWND,UINT,UINT_PTR,DWORD))其中,nIDEvent為定時(shí)器ID,多個(gè)定時(shí)器時(shí),可以通過該ID判斷是哪個(gè)定時(shí)器;uElapse為時(shí)間間隔,單位為ms;lpfnTimer為應(yīng)用程序所提供的處理WM_TIMER消息的回調(diào)函數(shù)的地址,若該參數(shù)為NULL,則使用系統(tǒng)默認(rèn)的回調(diào)函數(shù)即OnTimer函數(shù)。
本軟件中,在 “開始”按鈕的響應(yīng)函數(shù)void CSYMSDlg::OnBnClickedButtonStart()中添加如下語句:
SetTimer(1,1000/m_uSampleFreq,NULL),其中 m_uSampleFreq為采樣頻率。這樣即完成了定時(shí)器的設(shè)置。
此函數(shù)為系統(tǒng)默認(rèn)的回調(diào)函數(shù),在該函數(shù)中添加代碼,完成數(shù)據(jù)的采集、讀寫和保存。函數(shù)形式如下:

SetTimer定時(shí)器是系統(tǒng)資源,使用完畢應(yīng)及時(shí)用KillTimer銷毀。Cwnd類中的函數(shù)原型如下:
BOOL KillTimer(UINT_PTR nIDEvent)
其中nIDEvent為SetTimer函數(shù)中的定時(shí)器ID。
本軟件中,在 “停止”按鈕的響應(yīng)函數(shù)void CSYMSDlg::OnBnClickedButtonStop()中添加如下語句:
KillTimer(1);
這樣就完成了定時(shí)器的銷毀。
多媒體定時(shí)器的使用比Timer控件復(fù)雜一些,流程圖如圖1所示。

圖1 使用多媒體定時(shí)器的程序流程圖
首先,應(yīng)該在.cpp文件的開頭添加如下語句:
#include “mmsystem.h”
#pragma comment(lib,“winmm”)
然后,通過以下一系列函數(shù)實(shí)現(xiàn)所要求的功能。
通過該函數(shù)得到系統(tǒng)的最大和最小分辨率,單位為ms,多媒體定時(shí)器設(shè)置的分辨率應(yīng)該在此范圍內(nèi)。函數(shù)原型如下:
MMRESULT timeGetDevCaps(LPTIMECAPS ptc,UINT cbtc)
其中,ptc為指向TIMECAPS結(jié)構(gòu)體的指針,其成員變量wPeriodMin和wPeriodMax給出了系統(tǒng)的最小和最大分辨率,單位為ms;cbtc為TIMECAPS結(jié)構(gòu)的字節(jié)數(shù)。
本軟件中該函數(shù)位于自定義的定時(shí)器創(chuàng)建函數(shù)Create-Timer中,與函數(shù)timeBeginPeriod配合使用(該函數(shù)用于設(shè)定程序的最小分辨率),具體語句如下:

通過該函數(shù)啟動(dòng)定時(shí)器事件,函數(shù)原型如下:
MMRESULT timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,DWORD_PTR dwUser,UINT fuEvent)
其中,uDelay為事件觸發(fā)間隔,單位為ms;uResolution為程序所需的最小分辨率;lpTimeProc為指向回調(diào)函數(shù)的指針,定時(shí)調(diào)用;dwUser為用戶提供的回調(diào)數(shù)據(jù),傳遞給lpTimeProc;fuEvent為事件觸發(fā)方式,可以設(shè)定為TIME_ONESHOT(僅觸發(fā)一次)或者TIME_PERIODIC(每隔一段時(shí)間觸發(fā)一次)。
本軟件中,該函數(shù)位于自定義的定時(shí)器創(chuàng)建函數(shù)Create-Timer中,具體語句如下:
timerID=timeSetEvent(timePeriod,wTimeRes,(LPTIMECALLBACK)TimerHandler,(DWORD)this,TIME_PERIODIC)
return timerID;
其中,timePeriod為自定義的時(shí)間間隔,也就是采樣頻率的倒數(shù);TimerHandler為回調(diào)函數(shù)名稱。
回調(diào)函數(shù)是一個(gè)中斷服務(wù)程序,由開發(fā)者自己編寫,當(dāng)?shù)竭_(dá)事件觸發(fā)間隔時(shí)被調(diào)用。該函數(shù)為Windows API類型的函數(shù),不能將其定義為某個(gè)具體類的成員。當(dāng)需要調(diào)用MFC類中某個(gè)具體的成員函數(shù)時(shí),需要先獲取這個(gè)類的指針?;卣{(diào)函數(shù)的原型如下:
void CALLBACK TimeProc(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2)
其中,dwUser為開發(fā)者自定義參數(shù),其余參數(shù)均未使用。在回 調(diào) 函 數(shù) 中 ,除 PostMessage、timeGettime、timeSetEvent、time KillEvent等少數(shù)幾個(gè)函數(shù)外,不能調(diào)用其他系統(tǒng)定義的函數(shù)。在回調(diào)函數(shù)內(nèi)的語句應(yīng)當(dāng)盡量簡單,不要在回調(diào)函數(shù)內(nèi)做一些耗時(shí)的操作[8]。可通過用戶自定義消息的方法處理定時(shí)器事件(在本軟件中就是數(shù)據(jù)的采集和讀寫),而在回調(diào)函數(shù)中使用函數(shù)PostMessage發(fā)送用戶自定義消息。
首先,在類(本軟件中為CSYMSDlg)的頭文件中定義用戶消息,如下:
#Define MY_TIMER WM_USER+101
然后,在頭文件的AFX_MSG模塊中說明消息處理函數(shù),如下:
afx_msg LRESULT OnMyTimer(WPARAM wParam,LPARAM lParam);
最后,在.cpp文件中的消息映射部分使用ON_MESSAGE宏進(jìn)行消息映射,如下:
ON_MESSAGE(MY_TIMER,OnMyTimer)本軟件中回調(diào)函數(shù)的具體語句如下:

關(guān)于自定義消息處理函數(shù)的編寫需要注意的是:函數(shù)定義中均要求返回LRESULT,如果返回值不需要處理,可直接返回0;如果該消息需要返回特殊值,就根據(jù)程序的需要返回相應(yīng)的值。在本軟件的自定義消息處理函數(shù)中,完成的工作是數(shù)據(jù)的采集和讀寫,不需要處理返回值,故具體語句如下:

定時(shí)器的任務(wù)完成后應(yīng)及時(shí)刪除,否則占用太多的內(nèi)存會(huì)導(dǎo)致系統(tǒng)越來越慢。這2個(gè)函數(shù)分別刪除定時(shí)器的句柄和分辨率。函數(shù)原型分別如下:
MMRESULT timeKillEvent(UINT uTimerID);
MMRESULT timeEndPeriod(UINT uPeriod);
其中,uTimerID為timeSetEvent函數(shù)返回的定時(shí)器句柄,u-Period為timeBeginPeriod函數(shù)設(shè)定的定時(shí)器分辨率。本軟件中在自定義的DestroyTimer函數(shù)中實(shí)現(xiàn)對多媒體定時(shí)器的刪除,具體語句如下:

被測試EIT系統(tǒng)采用16電極,對向驅(qū)動(dòng)模式,激勵(lì)電流為354 μA或884 μA(有效值)。軟件提供了可供用戶選擇的激勵(lì)及測量方式,并對電極工作情況和所采得的數(shù)據(jù)進(jìn)行了實(shí)時(shí)顯示。為使用戶對數(shù)據(jù)的細(xì)節(jié)及整體趨勢有所了解,軟件還提供了實(shí)時(shí)曲線的移動(dòng)和縮放功能。此外,軟件還為用戶提供了停止采集后由用戶所選擇的范圍內(nèi)數(shù)據(jù)的簡單統(tǒng)計(jì)功能。軟件界面如圖2所示。

圖2 軟件界面一覽
利用2種Windows定時(shí)器均成功實(shí)現(xiàn)了對數(shù)據(jù)的采集與實(shí)時(shí)顯示及存儲(chǔ)功能。但是經(jīng)測試發(fā)現(xiàn),利用Timer控件實(shí)現(xiàn)的軟件每秒最多采集130個(gè)數(shù)據(jù)。即使利用SetTimer函數(shù)將采樣頻率設(shè)定為更高,采樣的實(shí)際頻率均為130Hz;還可以觀察到,當(dāng)頻率設(shè)定為高于130Hz時(shí),在采樣過程中幀數(shù)的顯示不穩(wěn)定,這意味著每次Timer函數(shù)的觸發(fā)時(shí)間不完全一致。而利用多媒體定時(shí)器所實(shí)現(xiàn)軟件的實(shí)際采樣頻率最高為250Hz,若設(shè)定更高的采樣頻率會(huì)造成死機(jī)。
使用多媒體定時(shí)器的注意事項(xiàng)之一是任務(wù)處理的時(shí)間不能大于周期間隔的時(shí)間。本軟件中,多媒體定時(shí)器完成的任務(wù)包括數(shù)據(jù)的采集和讀寫,因此,如果設(shè)定過高的頻率就造成觸發(fā)間隔小于一次數(shù)據(jù)的采集讀寫周期,從而導(dǎo)致死機(jī)。可以從以下2方面來進(jìn)一步提高本測試軟件的采樣頻率:一方面,采用專門的采樣芯片以減少一次采樣的時(shí)間;另一方面,可以從軟件上進(jìn)行改進(jìn),例如可以先將采集的數(shù)據(jù)存在內(nèi)存中,達(dá)到一定量后再一次性寫入硬盤。據(jù)文獻(xiàn)報(bào)道[4],可以用多媒體定時(shí)器實(shí)現(xiàn)300Hz左右的采樣頻率。
[1]董秀珍.生物電阻抗成像研究的現(xiàn)狀與挑戰(zhàn)[J].中國生物醫(yī)學(xué)工程年報(bào),2008,27(5):641-643.
[2]史學(xué)濤,霍旭陽,尤富生,等.顱內(nèi)出血電阻抗成像系統(tǒng)及初步動(dòng)物實(shí)驗(yàn)[J].航天醫(yī)學(xué)與醫(yī)學(xué)工程,2007,20(1):24-27.
[3]鄭存紅,胡榮強(qiáng),趙瑞峰.用Visual C++實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)采集[J].計(jì)算機(jī)應(yīng)用研究,2002,22(4):103-106.
[4]文治洪,胡文東,李曉京,等.多媒體計(jì)時(shí)器在醫(yī)學(xué)信號(hào)采集中的應(yīng)用[J].醫(yī)療衛(wèi)生裝備,2008,29(9):356-359.
[5]王偉,徐國華.多媒體定時(shí)器在工業(yè)控制中的應(yīng)用[J].微型機(jī)與應(yīng)用,2001,20(12):8-12.
[6]高偉,關(guān)宏偉.Windows環(huán)境下串口數(shù)據(jù)的高速實(shí)時(shí)采集[J].哈爾濱師范大學(xué)自然科學(xué)學(xué)報(bào),2003,19(6):53-56.
[7]常發(fā)亮,劉靜.多線程下多媒體定時(shí)器在快速數(shù)據(jù)采集中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2003,23(S1):177-181.
[8]周鳴籟,邵雷.Windows環(huán)境下精確定時(shí)的實(shí)現(xiàn)[J].微計(jì)算機(jī)應(yīng)用,2001,22(5):311-314.
(收稿:2010-08-20)
Application of Multimedia Timer in Evaluation of Precision of EIT Data Acquisition
TAO Feng,SHI Xue-tao,FU Feng,LIU Rui-gang,YOU Fu-sheng,DONG Xiu-zhen
(Department of Biomedical Engineering,the Fourth Military Medical University,Xi'an 710032,China)
TP311.131
A
1003-8868(2011)02-0001-03
國家自然科學(xué)基金重點(diǎn)項(xiàng)目(50937005);國家科技支撐計(jì)劃項(xiàng)目(2006BAI03A14)
陶峰(1985-),男,陜西西安人,碩士研究生,主要研究方向?yàn)殡娮杩钩上袼惴ǖ母倪M(jìn),E-mail:mailtotf@stu.xjtu.edu.cn;董秀珍(1945-),女,河北豐潤人,教授,博士研究生導(dǎo)師,本刊編委,主要從事生物醫(yī)學(xué)工程及生物醫(yī)學(xué)成像新技術(shù)方面的研究。
董秀珍,E-mail:dongyang@fmmu.edu.cn