徐 林
(韓山師范學(xué)院計算機科學(xué)與工程系,廣東潮州 521041)
目前,我國每年心源性猝死超過50萬例.據(jù)專家介紹,當(dāng)病人出現(xiàn)昏迷時,及時開展心肺復(fù)蘇(Cardiopulmonary Resuscitation,CPR)急救,可有效挽救生命.為此,我們利用數(shù)學(xué)建模的方法,基于Matlab中的Simulink建立了心肺復(fù)蘇術(shù)仿真模型[1,2].利用仿真模型研究心肺復(fù)蘇術(shù),可以避免臨床試驗中因各種外在因素的影響,諸如心肺復(fù)蘇實施的最佳時刻、受治患者的身體狀況、臨床試驗樣本的選取等等,而造成的不確定性結(jié)果.同時,實驗者可以通過設(shè)置不同的外力作用的參數(shù)值,模擬仿真各種心肺復(fù)蘇術(shù)下血流動力學(xué)效果,例如標(biāo)準(zhǔn)心肺復(fù)蘇術(shù)(Standard CPR,S-CPR)、主動按壓放松心肺復(fù)蘇術(shù)(Active Compression Decompression CPR,ACD-CPR)等,還可仿真中山醫(yī)科大學(xué)袁衡新等人提出的新型雙泵復(fù)蘇術(shù)(ACD-CPR coupled with Enhanced External Counter-pulsation and Inspiratory Impedance Threshold Valve,AEI-CPR).這為心肺復(fù)蘇術(shù)的研究開辟了一個新的研究領(lǐng)域.
但是,Simulink創(chuàng)建的仿真模型是基于模塊化的,其中各種參數(shù)的設(shè)置必須在模塊內(nèi)進行修改,可讀性較差.因此,利用Matlab中的對象設(shè)計編輯器,創(chuàng)建了仿真模型的GUI界面,可使實驗者較為直觀地設(shè)置心肺復(fù)蘇術(shù)中的各外力作用參數(shù),并可方便地運行該模型獲得仿真結(jié)果.仿真結(jié)果包括心肺復(fù)蘇術(shù)下血流動學(xué)效果的幾個主要的生理參數(shù):胸主動脈壓、右房壓、冠脈灌注壓和頸部血流量.
Simulink是Matlab最重要的組件之一,它提供了一個動態(tài)系統(tǒng)建模、仿真和綜合分析的集成環(huán)境.在該環(huán)境中,無需大量書寫程序,而只需要通過簡單直觀的鼠標(biāo)操作,就可構(gòu)造出復(fù)雜的系統(tǒng).
基于生理解剖學(xué)、血流動力學(xué)和心肺復(fù)蘇術(shù)的基本原理,利用Matlab中的Simulink建立了心肺復(fù)蘇術(shù)仿真模型,如圖1所示.
圖1 Simulink下的心肺復(fù)蘇術(shù)仿真模型
圖1 中左邊部分為人體血液循環(huán)系統(tǒng)模型,用來仿真心肺復(fù)蘇術(shù)下人體血流動力學(xué)的效果,其中各矩形框分別表示了人體的各生理部分,模型運行后可以通過這些子模塊獲得相關(guān)生理參數(shù)的動態(tài)變化值.圖1中橢圓1所標(biāo)識的模塊為心臟模塊,該模塊中的具體內(nèi)容如圖2所示.
圖1中右邊部分為心肺復(fù)蘇術(shù)外力作用的耦合模型,用來仿真心肺復(fù)蘇術(shù)的外力作用,其中各矩形框分別表示了作用于人體不同部分(如胸部、下肢等)的外力作用效果.圖1中橢圓2所標(biāo)識的模塊為胸部作用力模塊,該模塊中的具體內(nèi)容如圖3所示.
在Simulink中,要改變模塊中的參數(shù)值如胸部按壓力,必須進入對應(yīng)的模塊進行修改.而如圖2和圖3所示,心肺復(fù)蘇術(shù)仿真模型非常復(fù)雜,使得對Simulink的環(huán)境不熟悉的實驗人員無法快速了解該數(shù)學(xué)模型的運行機制.因此,利用Matlab的GUI功能,設(shè)計實現(xiàn)了可視化的模型操作界面,使只關(guān)心雙泵復(fù)蘇術(shù)血流動力學(xué)效果的實驗人員可以很便捷地修改心肺復(fù)蘇術(shù)外力作用的各個控制參數(shù),并對該作用下所產(chǎn)生的血流動力學(xué)效果進行研究分析,而不需要了解該仿真模型在Simulink環(huán)境下實際的運行方式,極大地方便了課題組跨專業(yè)成員之間對相關(guān)問題的討論.
圖2 人體血液循環(huán)系統(tǒng)模型中心臟模塊
圖3 心肺復(fù)蘇術(shù)外力作用耦合模型中的胸部按壓力模塊
作為強大的科學(xué)計算軟件,Matlab也提供了GUI的設(shè)計與開發(fā)功能.Matlab中的基本圖形用戶界面對象分為3類:用戶界面控件對象(uicontrol)、下拉式菜單對象(uimenu)和內(nèi)容式菜單對象(uicontextmenu).利用上述對象,進行周密的組織、設(shè)計,就可以設(shè)計出一個界面良好、操作簡便、功能強大的圖形用戶界面[3].
在Matlab命令窗口內(nèi),選擇File主菜單的New子菜單,會看到一個GUI的二級子菜單,單擊它,就會顯示GUI的程序設(shè)計模板,如圖4所示.
Matlab為GUI設(shè)計一共準(zhǔn)備了4種模板,根據(jù)設(shè)計的需要,選擇“Blank GUI(Default)”,就會打開一個空白的對象設(shè)計編輯器,如圖5所示.在圖的左邊,Matlab提供了設(shè)計界面所需的各種控件對象.在本界面中主要用到的控件對象有:Push Button()、Edit Text()、Static Text()和Axes坐標(biāo)軸對象().
根據(jù)仿真模型的運行需求,設(shè)計的仿真模型的GUI界面如圖6所示.圖6中的左方是5個Axes坐標(biāo)軸對象,用來顯示運行仿真模型后幾個主要的生理參數(shù)值的動態(tài)變化結(jié)果,包括:外作用力的按壓波形、胸主動脈壓、右房壓、冠脈灌注壓和頸部血流量.圖6中的右上方是一組Static Text控件和EditText控件對,Static Text控件對象用來為用戶顯示提示信息,并在對應(yīng)的信息后面添加EditText控件對象,用來接收用戶輸入的心肺復(fù)蘇術(shù)外力作用的控制參數(shù)數(shù)據(jù).用戶可輸入的心肺復(fù)蘇術(shù)外力作用控制參數(shù)包括:按壓頻率、胸部按壓力、胸部上提力、下肢按壓力,對下肢實施序貫式加壓的時刻,胸部按壓與下肢按壓時間的比例.圖6的右下方有兩個Push Button控件對象,點擊“Run Module”按鈕,將運行仿真模型.點擊“Exit”按鈕,將退出本界面程序.
根據(jù)圖6的仿真模型GUI界面的設(shè)計,當(dāng)用戶點擊“Run Module”按鈕時,系統(tǒng)將接受用戶在EditText中輸入的外作用力控制參數(shù)值,并利用這些參數(shù)值運行仿真模型,最后將運行結(jié)果顯示在左方的Axes坐標(biāo)軸對象中.以上這些操作,需要在“Run Module”按鈕的回調(diào)函數(shù)(Callback)中完成,具體的代碼實現(xiàn)如下.
圖4 GUI設(shè)計模板界面
圖5 對象設(shè)計編輯器中的Blank GUI模板界面
圖6 仿真模型的GUI界面
第一步,獲取用戶在EditText控件對象中輸入的各控制參數(shù)的數(shù)值.Matlab GUI中的所有控件使用同一個handles結(jié)構(gòu)體,handles結(jié)構(gòu)體中保存了圖形窗口中所有對象的句柄,因此可以使用handles.ControlName獲取或設(shè)置某個對象的屬性.例如,若將用來輸入按壓頻率的Edit Text控件命名為txt-Freq,則要獲取該控件中用戶輸入的數(shù)據(jù),可使用語句get(handles.txtFreq,'String'),其中g(shù)et函數(shù)的作用是從指定的控件對象中獲取相關(guān)的信息,handles.txtFreq為要獲取信息的控件的名字,而參數(shù)‘String’則為指定控件的String屬性,用戶在該控件中輸入的數(shù)據(jù)就保存在該屬性中.因為從Edit Text控件中獲取的數(shù)據(jù)都為字符型的,所以還需要用str2num()函數(shù)將字符型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù).獲得的數(shù)據(jù)保存在指定的變量中,如“f_c=str2num(get(handles.txtFreq,’String’);”.
第二步,將獲得的用戶輸入的控制參數(shù)值存放到Matlab的base空間中,以便Simulink仿真模型可以使用.在Matlab中,函數(shù)運行所使用的空間是與Matlab的base空間相獨立的,默認(rèn)情況下函數(shù)中所定義的變量為局部變量,而仿真模型運行所需要的數(shù)據(jù)都是由base空間讀取的,因此,必須將讀取的控制參數(shù)值由函數(shù)的運行空間存放到base空間中.例如,若將按壓頻率的值存放到base空間中,則使用語句“assignin('base','f_c',f_c);”.其中,第一個參數(shù)’base’指明要存放的空間的名字,第二個參數(shù)’f_c’為要在指定的base空間中保存該數(shù)據(jù)的變量的名字,第三個參數(shù)f_c則為本函數(shù)中保存按壓頻率的變量名.
第三步,運行Simulink仿真模型.若所建仿真模型的名字為MyCPRModule.mdl,則使用語句為“sim('MyCPRModule.mdl');”.其中sim()函數(shù)的作用就是運行指定的simulink仿真模型.
第四步,Simulink仿真模型運行結(jié)束后,將所得到的運行結(jié)果在GUI界面左方的Axes坐標(biāo)軸對象中顯示出來.這一步的操作主要是通過plot()函數(shù)來實現(xiàn)的.例如,要顯示胸主動脈壓可使用如下語句來完成:
%在指定的Axes對象中顯示波形,橫軸為time,縱軸為Pao(即胸主動脈壓)
plot(handles.axePao,time,Pao) ;
%因為模型運行后得到的數(shù)據(jù)量較大,且數(shù)據(jù)是隨時間循環(huán)的,所以只截取其中的一部分?jǐn)?shù)據(jù)即可.Xlim()函數(shù)的作用是在Axes中顯示指定范圍的數(shù)據(jù).
xlim(handles.axePao,[45,45+t_c*2]);
%grid()函數(shù)的作用是指定Axes中是否顯示表格,參數(shù)'on'就表示顯示
grid(handles.axePao,'on');
%ylabel()函數(shù)的作用是顯示縱軸的標(biāo)簽
ylabel(handles.axePao,'Pao');
完成了上述編程任務(wù),就可以運行GUI界面了.首先,分別在Edit Text控件中輸入指定的控制參數(shù)值,然后點擊“Run Module”按鈕,Simulink仿真模型將在后臺完成運行,運行完成后,指定的運行結(jié)果就會在Axes坐標(biāo)軸對象中分別顯示出來.運行結(jié)果如圖7所示.
[1]WU X M,ZHANG Y R,XU L,et al.The Computer Model in View of Hemodynamic Effects of Electro Ventilation Double Pump CPR.Peng Y.,Weng X.H..APCMBE 2008[C].United States:Springer,2008:562-566.
[2]ZHANG Y R,WU X M,XU L,etal.The Hemodynamic Effects Analysis ofthe New CPR Technique-Electro Ventilation Double Pump CPR:Studies in the Computer Model.ICBBE2008[C].United States:IEEE,2008:1761-1764.
[3]阮沈勇,王永利,桑群芳.MATLAB程序設(shè)計[M].北京:電子工業(yè)出版社.2004:7.
[4]黃永安,馬路,劉慧敏.MATLAB 7.0/Simulink 6.0建模仿真開發(fā)與高級工程應(yīng)用[M].北京:清華大學(xué)出版社,2006:5.
圖7 simulink仿真模型的GUI界面運行結(jié)果