[其它应用] 卡尔曼滤波代码案例

[复制链接]
 楼主| 小小蚂蚁举千斤 发表于 2025-6-24 12:53 | 显示全部楼层 |阅读模式
代码示例:
kalman.c



  1. #include <stdio.h>
  2. #include <math.h>

  3. typedef struct {
  4.     float x;    // 状态估计值
  5.     float P;    // 估计误差协方差
  6.     float Q;    // 过程噪声协方差
  7.     float R;    // 测量噪声协方差
  8.     float K;    // 卡尔曼增益
  9. } KalmanFilter;

  10. // 初始化滤波器
  11. KalmanFilter kalman_init(float x_init, float P_init, float Q, float R) {
  12.     KalmanFilter kf;
  13.     kf.x = x_init;
  14.     kf.P = P_init;
  15.     kf.Q = Q;
  16.     kf.R = R;
  17.     return kf;
  18. }

  19. // 预测步骤
  20. void kalman_predict(KalmanFilter* kf) {
  21.     kf->x = kf->x;          // 状态预测(假设系统为恒定模型)
  22.     kf->P += kf->Q;         // 协方差预测
  23. }

  24. // 更新步骤
  25. void kalman_update(KalmanFilter* kf, float z) {
  26.     kf->K = kf->P / (kf->P + kf->R);    // 计算卡尔曼增益
  27.     kf->x += kf->K * (z - kf->x);       // 状态更新
  28.     kf->P *= (1 - kf->K);               // 协方差更新
  29. }

  30. /* 使用示例:
  31. KalmanFilter kf = kalman_init(0, 1, 0.1, 0.1);
  32. while(1) {
  33.     kalman_predict(&kf);
  34.     float measurement = get_sensor_data();
  35.     kalman_update(&kf, measurement);
  36. }
  37. */

nowboy 发表于 2025-6-24 18:33 | 显示全部楼层
这个适合什么数据?
szt1993 发表于 2025-6-25 19:53 | 显示全部楼层
nowboy 发表于 2025-6-24 18:33
这个适合什么数据?

一些相关的数据采集,如连续ADC等变化的数据
AdaMaYun 发表于 2025-6-25 23:05 | 显示全部楼层
非常实用的程序代码
OKAKAKO 发表于 2025-6-26 17:11 | 显示全部楼层
代码原理深入分析一下
小夏天的大西瓜 发表于 2025-6-27 14:19 | 显示全部楼层
非常实用的案例程序
星辰大海不退缩 发表于 2025-6-27 16:30 | 显示全部楼层
非常实用的滤波程序
抱素 发表于 2025-6-27 18:41 | 显示全部楼层
卡尔曼滤波需要先基于系统模型预测状态与协方差,再结合测量值计算卡尔曼增益,最后融合预测与测量更新状态。需根据具体应用场景(如目标跟踪、传感器融合)调整状态转移矩阵 (F)、过程噪声 (Q)、测量矩阵 (H) 和测量噪声 (R) 等参数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

2536

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部