EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 552|回复: 1

[转帖] 卡尔曼滤波算法程序,输入随机数,Q和R自己选

[复制链接]

111

主题

1

回帖

356

E币

助理工程师

Rank: 3Rank: 3

积分
224
发表于 2019-1-10 17:13:43 | 显示全部楼层 |阅读模式
  1. 卡尔曼滤波算法,自己,输入为随机数,Q和R要自己选
  2. 主函数:

  3. #include "kalman.h"

  4. #include "stdio.h"

  5. #include "stdlib.h"

  6. void main(void)
  7. {


  8.         KalmanCountData k;
  9.         //定义一个卡尔曼运算结构体
  10.         Kalman_Filter_Init(&k);
  11.         //讲运算变量初始化
  12.         int n;        
  13.         int a;
  14.         srand((unsigned)time(NULL)); // 初始化随机种子,使rand()产生的随机数每次不一样
  15.            for(a = 0;a<1000;a++)
  16.         //测试1000次
  17.         {
  18.                 //m,n为1到100的随机数
  19.                
  20.                 n = 1+ rand() %100;
  21.                 //卡尔曼滤波,传递2个测量值以及运算结构体
  22.       
  23.         Kalman_Filter(&k,n);

  24.                 //打印结果
  25.                 printf("第%d次迭代\n  输入:%d, 输出滤波值为:%f\r\n",a+1,n,k.Filter_Value);
  26.       
  27.         }
  28. }
  29. kalman.h:
  30. typedef struct                    //定义结构体
  31. {
  32.         float                                Filter_Value;                 //K-1时刻的系滤波值
  33.         float                                A;                           //系统参数,一维模型中通常选为1
  34.         float                                H;                          //系统测量参数,一维模型选择为1
  35.         float                                Kg;                        //卡尔曼增益
  36.         float                                Q;                           //过程噪声偏差
  37.         float                                 R;                          //测量噪声偏差
  38.         float                                 P;                      //估计误差协方差     
  39. } KalmanCountData;

  40. void Kalman_Filter_Init(KalmanCountData * Kalman_Struct)             //卡尔曼滤波器初始化
  41. {
  42.     Kalman_Struct->A = 1;
  43.     Kalman_Struct->H = 1;
  44.     Kalman_Struct->P = 3;                //后验状态估计值方差的初始值
  45.     Kalman_Struct->Q = 0.1;               //过程噪声偏差,实验测的 ,要填的!
  46.     Kalman_Struct->R = 10;                 //测量噪声偏差,要填的!
  47.     Kalman_Struct->Filter_Value = 0;                   //初始化设置k-1时刻的系统滤波后的值为0
  48. }
  49. double Kalman_Filter(KalmanCountData* Kalman_Struct, double Last_Measurement){
  50.     double PredictValue = Kalman_Struct->Filter_Value*Kalman_Struct->A;     //先验估计的预测值
  51.     Kalman_Struct->P = Kalman_Struct->A*Kalman_Struct->P*Kalman_Struct->A+Kalman_Struct->Q; //求协方差
  52.     double prevalve = Kalman_Struct->Filter_Value;  //记录上一次(k-1)的值
  53.     Kalman_Struct->Kg = Kalman_Struct->P*Kalman_Struct->H/(Kalman_Struct->H*Kalman_Struct->P*Kalman_Struct->H + Kalman_Struct->R);
  54.     /*
  55.         卡尔曼增益Kg = P(k|k-1) H’ / (H P(k|k-1) H’ + R)
  56.     */
  57.     Kalman_Struct->Filter_Value = PredictValue + (Last_Measurement-PredictValue) * Kalman_Struct->Kg;
  58.     /*
  59.         修正结果,更新预测值;X(k|k) =  X(k|k-1) + (Z(k) - H* X(k|k-1)) * Kg
  60.     */
  61.     Kalman_Struct->P = (1 - Kalman_Struct->Kg * Kalman_Struct->H) * Kalman_Struct->P;
  62.     //更新后验估计的协方差,P(k|k) = (1 - Kg * H) * P(k|k-1)
  63.     return Kalman_Struct->Filter_Value;
  64. }
复制代码

Kalman.zip

89.46 KB, 下载次数: 0, 下载积分: E币 -5 元

积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-19 13:51 , Processed in 0.043692 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表