칼만필터_2 kalman filter_2

링크에 코드 설명 포함

int main()
{ 

   float  i, x, x_next, P, P_next, K, Q, R, z;



   //초기화 
   P = 1;                                //P는 예측공분산 매트릭스
   Q = 1.0/100000.0;                //Q는 예측노이즈 공분산
   R = 0.1*0.1;                        //R은 측정노이즈 공분산
   x = 0.0;                              //x는 예측상태출력값



   printf("x:%x, z:%x", x,z);  

   for(i=0;i<20000;i++)                //2만번 반복하고 끝내자.
   {

       x_next = x;                               //x를 갱신
       P_next = P + Q;                        //다음상태 P= 현재P +  예측노이즈 공분산Q
       K = P_next / ( P_next + R );       //K는 칼만게인이다.  이것은 R(측정노이즈 공분산)값과 예측노이즈가 영향준다.

       z = -0.37727 + normal(0.1);       //z는 측정잡음으로 정규분포의 산포0.1을 가진 랜덤값이다..
       x = x_next + K * ( z - x_next );    //현상태값x은 칼만게인K과  측정잡음z 및 과거상태x에 영향받는다. 
       P = ( 1 - K ) * P_next;               //예측공분산P는 칼만게인K과  이전상태P



       printf("x:%x, z:%x", x,z);         //출력은  x값인 현재예측상태값이다. z는 측정잡음
   }
   return 0;
}


float normal( float  std_dev )  
{

    float uni_rand,sum,mean,nor_rand;
    int i,j,n=12;
    sum=0;
    mean = (float)random(32000)/32000;    //평균
    for( j=0; j<12; j++)
    {

          uni_rand=(float)random(32000)/32000;
          sum=sum+ uni_rand;
     }
     nor_rand=mean+ std_dev*((sum-n/2)/(sqrt((float)n/12)));
     return(nor_rand);
}

results matching ""

    No results matching ""