基于Matlab、VC++与PCAuto组态软件混合编程方法的Kalman滤波器实现

2018-06-11 09:31王野
科学与财富 2018年11期

王野

摘 要:Matlab是功能强大的工程计算和数据分析软件,VC++是面向对象的快速开发工具,PCAuto组态软件是面向监控与数据采集(Supervisory Control and Data Acquisition, SCADA)的软件平台工具。三者结合,可以取长补短,能开发出处理复杂矩阵运算且界面友好、满足工程领域需要的应用软件。本文探讨了三者混合编程的详细实现过程,通过一个Kalman滤波实例,说明了实现混合编程方法的过程和实用性。

关键词:Kalman滤波;VC++;Matlab;PCAuto;混合编程

1 引言

滤波问题是如何从被噪声污染的观测信号中过滤噪声,尽可能消除或减小噪声影响,求未知真实信号或系统状态的最优估计。由于信号和噪声往往是多维非平稳随机过程,因此1960年初Kalman[1,2]用时域上的状态空间方法提出了Kalman滤波理论,提出了便于计算机上递推实现的Kalman滤波算法,解决了多维非平稳随机信号的滤波问题。我们基于Kalman滤波算法用Matlab实现仿真,通过VC将Matlab与组态软件进行互联,最终通过组态软件来实现Kalman滤波器。

2 理论依据

考虑用如下状态空间模型描写的动态系统

其中t为离散时间,系统在时刻t的状态为x(t)∈Rn,y(t)∈Rm为对状态的观测信号,方差为Q的输入白噪声w(t)∈Rr,方差为R的观测白噪声v(t)∈Rm,且w(t)和v(t)不相关。?椎,,H分别为已知的适当维矩阵。由[1,2]我们易知该系统的最优状态滤波方程组为:

3 用Matlab实现Kalman滤波器仿真

在系统(1)和(2)中取?椎= 0.9 0-0.5 0.2,?祝=12,H=[1 1],Q=0.81, R=1。基于Kalman滤波原理(3)-(8), 通过Matlab在计算机上实现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

其中,调用了mult(),add(),kkmm()这三个函数,这些都是预先编写好的。kkmm.m是整个程序的主要部分,即Kalman滤波算法。运行结果如图1和图2所示,其中实现表示真实状态,虚线表示估计状态。

4 VC++与Matlab混合编程的应用

VC++[3]具有很多的优点,但对于一些比较复杂的工程计算程序,编写起来比较困难。Matlab语言是一种高级矩阵语言,对于一些复杂的运算有直接的函数可以调用,提高了编程的效率。

4.1 应用实例(Kalman滤波器)

建立一个基于对话框的MFC应用程序Kalman,通过制作一个曲线控件[3],可以清楚地看到xi(t)和 i(t|t)走势。

其中,使用了WM_TIMER响应函数。运行结果如图3所示,其中黄线表示真实状态x(t)红线表示估计状态 (t|t)。

5 实现VC++与组态软件的数据通讯

建立一个基于对话框的MFC程序VMP,按照本文4.2节提到的方法,将Kalman滤波器添加到当

前工程中。其中响应函数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)可以通过上述源代码进行数据传递,将数据从Matlab通过VC++传到组态软件当中去。

6 结论

通过上述方法,可以将Kalman滤波器应用到现场中,广泛应用在信号处理、通信、目标跟踪和控制等领域。VC++是Matlab与组态软件结合的桥梁,从而扩大了Matlab的应用范围。因此如何在特定的情况下使用最好的实现方法非常重要,随着数据接口的进一步改善,混合编程将在工程应用中发挥其越来越重大的作用。

参考文献

[1]Kalman R E. A New Approach to Linear Filtering and Predictioning Problems.Trans.ASME,J.Basic Eng.,1960,82D:34-45.

[2]邓自立,王欣,高媛.建模与估计(第二版)[M].北京:科学出版社,2016.

[3]王东华,李樱.VisualC++6.0从入门到精通[M].北京:人民邮电出版社,2016.

[4]江泽林,刘维.实战MATLAB文件與数据接口技术[M].北京:北京航空航天大学出版社,2014.

[5]张琼琼,马跃,王志成.组态式人机界面编辑与仿真技术[J].计算机系统应用,2015(04),26-31.

[6]邓云伟,杜卫星,杨光玲.基于组态软件和FP23智能仪表的温度监控系统设计[J].价值工程.2013(20),208-210.