KelmanFilter.c 856 B

123456789101112131415161718192021222324252627282930313233
  1. #include "KelmanFilter.h"
  2. float KelmanFilter_1Dimension(float InputData, bool ResetFlag)
  3. {
  4. static float x_est = 0.0f; // 状态估计(平滑后的 cy)
  5. static float P = 1.0f; // 估计不确定性
  6. static float Q = 1e-3f; // 过程噪声
  7. static float R = 1e-1f; // 测量噪声
  8. static bool initialized = false;
  9. /* 初始化或重置 */
  10. if (!initialized || ResetFlag)
  11. {
  12. x_est = InputData;
  13. P = 1.0f;
  14. Q = 1e-3f;
  15. R = 1e-1f;
  16. initialized = true;
  17. return x_est;
  18. }
  19. /* 预测*/
  20. float x_pred = x_est; // 假设距离不变
  21. float P_pred = P + Q; // 不确定性增加
  22. /* 更新*/
  23. float K = P_pred / (P_pred + R); // 卡尔曼增益
  24. x_est = x_pred + K * (InputData - x_pred);
  25. P = (1.0f - K) * P_pred;
  26. return x_est;
  27. }