王野
摘 要:Matlab是功能強(qiáng)大的工程計(jì)算和數(shù)據(jù)分析軟件,VC++是面向?qū)ο蟮目焖匍_(kāi)發(fā)工具,PCAuto組態(tài)軟件是面向監(jiān)控與數(shù)據(jù)采集(Supervisory Control and Data Acquisition, SCADA)的軟件平臺(tái)工具。三者結(jié)合,可以取長(zhǎng)補(bǔ)短,能開(kāi)發(fā)出處理復(fù)雜矩陣運(yùn)算且界面友好、滿足工程領(lǐng)域需要的應(yīng)用軟件。本文探討了三者混合編程的詳細(xì)實(shí)現(xiàn)過(guò)程,通過(guò)一個(gè)Kalman濾波實(shí)例,說(shuō)明了實(shí)現(xiàn)混合編程方法的過(guò)程和實(shí)用性。
關(guān)鍵詞:Kalman濾波;VC++;Matlab;PCAuto;混合編程
1 引言
濾波問(wèn)題是如何從被噪聲污染的觀測(cè)信號(hào)中過(guò)濾噪聲,盡可能消除或減小噪聲影響,求未知真實(shí)信號(hào)或系統(tǒng)狀態(tài)的最優(yōu)估計(jì)。由于信號(hào)和噪聲往往是多維非平穩(wěn)隨機(jī)過(guò)程,因此1960年初Kalman[1,2]用時(shí)域上的狀態(tài)空間方法提出了Kalman濾波理論,提出了便于計(jì)算機(jī)上遞推實(shí)現(xiàn)的Kalman濾波算法,解決了多維非平穩(wěn)隨機(jī)信號(hào)的濾波問(wèn)題。我們基于Kalman濾波算法用Matlab實(shí)現(xiàn)仿真,通過(guò)VC將Matlab與組態(tài)軟件進(jìn)行互聯(lián),最終通過(guò)組態(tài)軟件來(lái)實(shí)現(xiàn)Kalman濾波器。
2 理論依據(jù)
考慮用如下?tīng)顟B(tài)空間模型描寫(xiě)的動(dòng)態(tài)系統(tǒng)
其中t為離散時(shí)間,系統(tǒng)在時(shí)刻t的狀態(tài)為x(t)∈Rn,y(t)∈Rm為對(duì)狀態(tài)的觀測(cè)信號(hào),方差為Q的輸入白噪聲w(t)∈Rr,方差為R的觀測(cè)白噪聲v(t)∈Rm,且w(t)和v(t)不相關(guān)。?椎,,H分別為已知的適當(dāng)維矩陣。由[1,2]我們易知該系統(tǒng)的最優(yōu)狀態(tài)濾波方程組為:
3 用Matlab實(shí)現(xiàn)Kalman濾波器仿真
在系統(tǒng)(1)和(2)中取?椎= 0.9 0-0.5 0.2,?祝=12,H=[1 1],Q=0.81, R=1?;贙alman濾波原理(3)-(8), 通過(guò)Matlab在計(jì)算機(jī)上實(shí)現(xiàn)Kalman濾波器的仿真。
具體m文件源代碼如下:
for i=1:bushu
[x1(:,i+1)]=mult(fai,x(:,i));
[wa]=mult(tao,w(i));
[x(:,i+1)]=add(x1(:,i+1),wa);
[hx]=mult(H,x(:,i+1));
[y(i)]=add(hx,v(i));
[xjian(:,i+1),p]=kkmm(n,fai,tao,H,Q,R,p,xjian(:,i),y(i));
End
其中,調(diào)用了mult(),add(),kkmm()這三個(gè)函數(shù),這些都是預(yù)先編寫(xiě)好的。kkmm.m是整個(gè)程序的主要部分,即Kalman濾波算法。運(yùn)行結(jié)果如圖1和圖2所示,其中實(shí)現(xiàn)表示真實(shí)狀態(tài),虛線表示估計(jì)狀態(tài)。
4 VC++與Matlab混合編程的應(yīng)用
VC++[3]具有很多的優(yōu)點(diǎn),但對(duì)于一些比較復(fù)雜的工程計(jì)算程序,編寫(xiě)起來(lái)比較困難。Matlab語(yǔ)言是一種高級(jí)矩陣語(yǔ)言,對(duì)于一些復(fù)雜的運(yùn)算有直接的函數(shù)可以調(diào)用,提高了編程的效率。
4.1 應(yīng)用實(shí)例(Kalman濾波器)
建立一個(gè)基于對(duì)話框的MFC應(yīng)用程序Kalman,通過(guò)制作一個(gè)曲線控件[3],可以清楚地看到xi(t)和 i(t|t)走勢(shì)。
其中,使用了WM_TIMER響應(yīng)函數(shù)。運(yùn)行結(jié)果如圖3所示,其中黃線表示真實(shí)狀態(tài)x(t)紅線表示估計(jì)狀態(tài) (t|t)。
5 實(shí)現(xiàn)VC++與組態(tài)軟件的數(shù)據(jù)通訊
建立一個(gè)基于對(duì)話框的MFC程序VMP,按照本文4.2節(jié)提到的方法,將Kalman濾波器添加到當(dāng)
前工程中。其中響應(yīng)函數(shù)CVMPDlg::OnTimer(UINT nIDEvent)的主要源代碼如下:
for(int i = 0;i { CString strTagPar,strVal; XEstrTagPars.GetSubStr(i,strTagPar); pTagPars[i].vt = VT_BSTR; pTagPars[i].bstrVal = strTagPar.AllocSysString(); XEstrVals.GetSubStr(i,strVal); pVals[i].vt = VT_BSTR; pVals[i].bstrVal = strVal.AllocSysString();} m_pDbCom->SetStringData(iTagParCount,pTagPars,pVals); for (i = 0; i < iTagParCount; i++) { SysFreeString(pTagPars[i].bstrVal); SysFreeString(pVals[i].bstrVal);} delete pTagPars; delete pVals; 然后(t|t)可以通過(guò)上述源代碼進(jìn)行數(shù)據(jù)傳遞,將數(shù)據(jù)從Matlab通過(guò)VC++傳到組態(tài)軟件當(dāng)中去。 6 結(jié)論 通過(guò)上述方法,可以將Kalman濾波器應(yīng)用到現(xiàn)場(chǎng)中,廣泛應(yīng)用在信號(hào)處理、通信、目標(biāo)跟蹤和控制等領(lǐng)域。VC++是Matlab與組態(tài)軟件結(jié)合的橋梁,從而擴(kuò)大了Matlab的應(yīng)用范圍。因此如何在特定的情況下使用最好的實(shí)現(xiàn)方法非常重要,隨著數(shù)據(jù)接口的進(jìn)一步改善,混合編程將在工程應(yīng)用中發(fā)揮其越來(lái)越重大的作用。 參考文獻(xiàn) [1]Kalman R E. A New Approach to Linear Filtering and Predictioning Problems.Trans.ASME,J.Basic Eng.,1960,82D:34-45. [2]鄧自立,王欣,高媛.建模與估計(jì)(第二版)[M].北京:科學(xué)出版社,2016. [3]王東華,李櫻.VisualC++6.0從入門(mén)到精通[M].北京:人民郵電出版社,2016. [4]江澤林,劉維.實(shí)戰(zhàn)MATLAB文件與數(shù)據(jù)接口技術(shù)[M].北京:北京航空航天大學(xué)出版社,2014. [5]張瓊瓊,馬躍,王志成.組態(tài)式人機(jī)界面編輯與仿真技術(shù)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2015(04),26-31. [6]鄧云偉,杜衛(wèi)星,楊光玲.基于組態(tài)軟件和FP23智能儀表的溫度監(jiān)控系統(tǒng)設(shè)計(jì)[J].價(jià)值工程.2013(20),208-210.