www.pudn.com > 人体步态跟踪识别bate版.rar > KalmanFilter.h
// KalmanFilter.h: interface for the CKalmanFilter class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_KALMANFILTER_H__B171A58C_CD61_47C1_9C80_20925D1C3368__INCLUDED_)
#define AFX_KALMANFILTER_H__B171A58C_CD61_47C1_9C80_20925D1C3368__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/*
* kalman滤波器模型为
* X'=AX+W W ~ Q X[x,y,z,Vx,Vy,Vz,ax,ay,az,ex,ey,ez]
* Z =HX+V V ~ R Z[x,y,z]
* y[k]=y[k-1]+Vy[k-1]+1/2ay[k-1]
* Vy[k]=Vy[k-1]+ay[k-1]
* ay=ay=const
* y的曲线为y=k^2
* ay=2
* ey=const
* Usage: CKFToolBox *kf=new CKFToolBox;
* kf->SetInitialXP();
* kf->GetFilteredState();
*/
class CKalmanFilter
{
public:
void ImageMatch(double* XOUT);//图像匹配找到精确位置点
void InitialXP(double *X0, double *P0);
//得到状态估计值
void GetFilteredState(double *XOUT,double *ZIN);
//估计均方误差
void GetP();
//一步预测均方误差
void GetPPRE();
//得到滤波器增益
void GetGainK();
//得到预测值供外部使用
//得到下一个状态的预测值
void GetNextState(double *XOUT);
//矩阵复制运算
void MatrixCpy(double *dest, double *src, int count);
//矩阵赋值
void MatrixSet(double *dest, double c, int count);
CKalmanFilter();
virtual ~CKalmanFilter();
private:
//矩阵求转置
void MatrixInversion(double * Matrix,int iDim);
//矩阵相乘运算
void MatrixMultiplication(double *Matrix1,int iRow1,int iCol1, double *Matrix2,int iRow2,int iCol2,double *MatrixOut);
//矩阵相减
void MatrixSubtraction(double *Matrix1,double *Matrix2,int iRow,int iCol);
//矩阵相加
void MatrixAddition(double *Matrix1,double *Matrix2,int iRow,int iCol);
//矩阵求逆
void MatrixTranversion(double *Matrix,int iRow,int iCol,double *MatrixOut);
//初始化观测矩阵G
void InitializeMatricG();
//初始化状态转移矩阵F
void InitializeMatricF(double timeinterval);
//初始化增益K
void InitializeGainK();
//初始化X,P的预测值
void InitializeXPPre();
//初始化噪声协方差
void InitializeNoiseCorr();
//初始化观测矩阵H
void InitializeH();
private:
double X[DIMENSION]; //n维状态矢量 估计值
double XPRE[DIMENSION]; //n维状态矢量 预测值
double P[DIMENSION*DIMENSION]; //n*n维协方差阵 估计值
double PPRE[DIMENSION*DIMENSION]; //n*n维协方差阵 预测值
double K[DIMENSION*DIMENSIONOUT]; //n*m维滤波器增益矩阵
double Q[DIMENSIONOUT*DIMENSIONOUT]; //n*n维状态噪声矩阵
double R[DIMENSIONOUT*DIMENSIONOUT]; //m*m维观测噪声矩阵
double I[DIMENSION*DIMENSION]; //单位阵
double m_G_Matric[DIMENSION*DIMENSIONOUT]; //m*n维观测矩阵
double m_F_Matric[DIMENSION*DIMENSION]; //n*n维状态转移矩阵
double m_H_Matric[DIMENSIONOUT*DIMENSION]; //m*n维观测矩阵
double m_TimeInterval; //时间间隔
CPoint m_CurrentPoint; //当前要预测的点坐标
};
#endif // !defined(AFX_KALMANFILTER_H__B171A58C_CD61_47C1_9C80_20925D1C3368__INCLUDED_)