⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kalman.cpp

📁 kalman滤波
💻 CPP
字号:
#include "cv.h"#include "highgui.h"#include <math.h>
#include "time.h"#include "stdio.h"
#define QQ 1 //噪声协方差
#define RR 1
#define PP 2 //先验误差相关矩阵
#define TF 256  //模拟长度
#define  PN 100  //粒子数目
int main(int argc, char** argv){    /* A matrix data */
	FILE *pfile;
	int i,j;
	double xtmp,ytmp;
	int src[256];
	double preArr[256];
	double F,P,H,K;
	for (i=0;i<256;i++)
	{
  		src[i]=-1;
		preArr[i]=-1;
	}
	double xhat=0.1;
// 	pfile=fopen("histo1.txt","r");
	pfile=fopen("histbaboongray.txt","r");

	for (i=0;i<256;i++)
	{
		fscanf(pfile,"%d ",&src[i]);
	}
	fclose(pfile);
	for (i=0;i<256;i++)
	{
		printf("%d  \n",src[i]);
	}


	for (i=0;i<TF-1;i++)
	{
// 		srand( (unsigned)time( NULL ) );
		int a=rand()%10000;
		double b=(double)a/10000.0;
		xtmp=src[i]+sqrt(QQ)*b;

		a=rand()%10000;
		b=(double)a/10000.0;
		ytmp=pow(xtmp,2)/20+sqrt(RR)*b;

		F=0.5+25*(1-pow(xhat,2))/pow(1+pow(xhat,2),2);
		P=F*P*F+QQ;
		H=xhat/10;
		K=P*H/(H*P*H+RR);
		xhat=0.5*xhat+25*xhat/(1+pow(xhat,2));
		xhat=xhat+K*(ytmp-pow(xhat,2)/20);
		P=(1-K*H)*P;
		preArr[i]=xhat;
	}

	for (i=0;i<256;i++)
	{
		printf("%d  %.2f \n",src[i],preArr[i]);
	}
	pfile=fopen("saved.txt","w");
	for (i=0;i<256;i++)
	{
		fprintf(pfile,"%d  %.2f\n",src[i],preArr[i]);
	}
	fclose(pfile);    return 0;}// /*	pfile=fopen("histo1.txt","wr");
//     const float A[] = { 1, 1, 0, 1 };
// 
//     IplImage* img = cvCreateImage( cvSize(500,500), 8, 3 );
//     CvKalman* kalman = cvCreateKalman( 2, 1, 0 );//状态向量维数,观测向量维数,控制向量维数
//     /* state is (phi, delta_phi) - angle and angle increment */
//     CvMat* state = cvCreateMat( 2, 1, CV_32FC1 );//2行1列,32位浮点型
//     CvMat* process_noise = cvCreateMat( 2, 1, CV_32FC1 );
//     /* only phi (angle) is measured */
//     CvMat* measurement = cvCreateMat( 1, 1, CV_32FC1 );
//     
// 	CvRandState rng; //产生随机向量的结构数组: Array of structures to generate random vectors
// 	//初始化随机数生成器状态;
//     int code = -1;
// 
//     cvRandInit( &rng, 0, 2, -2, CV_RAND_UNI );//均匀分布随机矩阵,虚参数,之后再调整
// 
//     cvZero( measurement );
//     cvNamedWindow( "Kalman", 1 );
// 
//     for(;;)
//     {
//         cvRandSetRange( &rng, 0, 0.1, 0 );//deviation ,average point brightness, initial all the dimension
//         rng.disttype = CV_RAND_NORMAL;//分布
// 
//         cvRand( &rng, state );
// 
//         memcpy( kalman->transition_matrix->data.fl, A, sizeof(A));//状态转移矩阵,拷贝A中的数据到状态转移矩阵中
//         cvSetIdentity( kalman->measurement_matrix, cvRealScalar(1) );//测量矩阵为单位阵
//         cvSetIdentity( kalman->process_noise_cov, cvRealScalar(1e-5) );//过程噪声相关矩阵
//         cvSetIdentity( kalman->measurement_noise_cov, cvRealScalar(1e-1) );//测量噪声矩阵
//         cvSetIdentity( kalman->error_cov_post, cvRealScalar(1));//误差相关系数矩阵
//         /*
// 
// 			  SetIdentity
// 			初始化带尺度的单位矩阵 
// 
// 			void cvSetIdentity( CvArr* mat, CvScalar value=cvRealScalar(1) );
// 			mat 
// 			待初始化的矩阵 (不一定是方阵)。 
// 			value 
// 			赋值给对角线元素的值。 
// 			函数 cvSetIdentity 初始化带尺度的单位矩阵: 
// 
// 			arr(i,j)=value 如果 i=j, 
// 			否则为 0 
// 
// 		*/	
// 		/* choose random initial state */
//         cvRand( &rng, kalman->state_post );//KALMAN状态阵
// 
//         rng.disttype = CV_RAND_NORMAL;
// 
//         for(;;)
//         {
//             #define calc_point(angle)                                      \
//                 cvPoint( cvRound(img->width/2 + img->width/3*cos(angle)),  \
//                          cvRound(img->height/2 - img->width/3*sin(angle)))
// 
//             float state_angle = state->data.fl[0];
//             CvPoint state_pt = calc_point(state_angle);
// 
//             /* predict point position */
//             const CvMat* prediction = cvKalmanPredict( kalman, 0 );
//             float predict_angle = prediction->data.fl[0];
//             CvPoint predict_pt = calc_point(predict_angle);
//             float measurement_angle;
//             CvPoint measurement_pt;
// 
// 			cvRandSetRange( &rng, 0, 
// 							sqrt(kalman->measurement_noise_cov->data.fl[0]), 0 );
// 							cvRand( &rng, measurement );
// 
//             /* generate measurement */
// 			cvMatMulAdd( kalman->measurement_matrix, 
// 						state, measurement, measurement );
// 
//             measurement_angle = measurement->data.fl[0];
//             measurement_pt = calc_point(measurement_angle);
// 
//             /* plot points */
//             #define draw_cross( center, color, d )                                 \
//                 cvLine( img, cvPoint( center.x - d, center.y - d ),                \
//                              cvPoint( center.x + d, center.y + d ), color, 1, 0 ); \
//                 cvLine( img, cvPoint( center.x + d, center.y - d ),                \
//                              cvPoint( center.x - d, center.y + d ), color, 1, 0 )
// 
//             cvZero( img );
//             draw_cross( state_pt, CV_RGB(255,255,255), 3 );
//             draw_cross( measurement_pt, CV_RGB(255,0,0), 3 );
//             draw_cross( predict_pt, CV_RGB(0,255,0), 3 );
//             cvLine( img, state_pt, predict_pt, CV_RGB(255,255,0), 3, 0 );
// 
// //             /* adjust Kalman filter state */
//             cvKalmanCorrect( kalman, measurement );
// 
//             cvRandSetRange( &rng, 0, sqrt(kalman->process_noise_cov->data.fl[0]), 0 );
//             cvRand( &rng, process_noise );
//             cvMatMulAdd( kalman->transition_matrix, state, process_noise, state );
// 
//             cvShowImage( "Kalman", img );
//             code = cvWaitKey( 0 );
// 
// //             if( code > 0 )
// //                 break;
//         }
//         if( code == 27 ) 
//             break;
//     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -