前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >适用于平滑的ADC滤波函数(卡尔曼滤波)

适用于平滑的ADC滤波函数(卡尔曼滤波)

作者头像
用户11186929
发布2024-07-01 12:28:29
550
发布2024-07-01 12:28:29
举报
文章被收录于专栏:技术干货技术干货
代码语言:javascript
复制
int KalmanFilter(uint16_t data)
{
    //上一个ADC的值
    static uint16_t prevdata = 0;
    //q表示误差,r表示响应速度,参数根据自身需求进行调整
    static float p = 10 , q = 0.001,r = 0.001,kGain = 0;
    
    p = p + q;
    kGain = p / ( p + r);
    data = prevdata + (kGain * (data - prevdata    ));
    p = (1 - kGain) * p;
    prevdata = data;
    
    return data;
    
}

        在卡尔曼滤波器中,p 代表估计误差的协方差,它反映了我们对当前估计值的不确定度。p 的初始值设定依赖于你对系统初始状态不确定性的了解。初始值 p = 10 是根据经验或特定应用场景设定的一个值,它表示开始时对估计值的不确定性程度。在这个简化版的卡尔曼滤波器中,q 代表了预测噪声的协方差,它衡量了预测步骤中引入的不确定性;而 r 代表了观测噪声的协方差,它衡量了观测值本身的不确定性。

        假设我现在输入以下几个数值进行比较,4094, 4092, 4093(4095为满ADC值)

1.对第一个值4094进行滤波处理

初始时,prevdata = 0p = 10q = 0.001r = 0.001

  • 计算 kGainkGain = p / (p + r) = 10 / (10 + 0.001) ≈ 0.999
  • 更新估计值:data = prevdata + (kGain * (4094 - prevdata)) = 0 + (0.999 * 4094) ≈ 4093
  • 更新 pp = (1 - kGain) * p = (1 - 0.999) * 10 ≈ 0.1
  • 更新 prevdataprevdata = data ≈ 4093

2.对第二个值4092继续滤波处理   

  • 计算 kGainkGain = p / (p + r) = 0.1 / (0.1 + 0.001) ≈ 0.990
  • 更新估计值:data = prevdata + (kGain * (4092 - prevdata)) ≈ 4093 + (0.990 * (4092 - 4093)) ≈ 4091
  • 更新 pp ≈ 0.01
  • 更新 prevdataprevdata ≈ 4091

3.对第三个值4093滤波处理

  • 计算 kGainkGain ≈ p /(p + r)
  • 更新估计值:data ≈ prevdata + (kGain * (4093 - prevdata))
  • 更新 pp 的值会进一步减小
  • 更新 prevdataprevdata 将被更新为新的估计值

 每次迭代都会更新 p,使得滤波器对新的观测值更加信任,并逐渐减小对初始估计值的不确定度。因此,随着迭代次数的增加,kGain 会逐渐减小,滤波器对新观测值的反应也会逐渐变得平滑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档