欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 286|回复: 0

中位值滤波法与卡尔曼滤波法

[复制链接]
发表于 2022-11-28 09:33:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#define M  10
/***中位值滤波法***/
unsigned int MedianFiltering(u16 (ADC)(void))
{
    unsigned int value_buf[M];
    unsigned int count, i, j, temp;
    for( count = 0; count < M; count++ )
    {
        value_buf[count] = ADC();
    }
    for( j = 0; j < M - 1; j++ )
    {
        for( i = 0; i < M - j - 1; i++ )
        {
            if( value_buf > value_buf[i + 1] )
            {
                temp = value_buf;
                value_buf = value_buf[i + 1];
                value_buf[i + 1] = temp;
            }
        }
    }
    return value_buf[( M - 1 ) / 2];
}


/*
卡尔曼
    R值固定,Q值越大,代表越信任测量值,Q值无穷大,代表只用测量值。
             Q值越小,代表越信任模型预测值,Q值为0,代表只用模型预测值。
Q:过程噪声,Q增大,动态响应变快,收敛稳定性变坏

R:测量噪声,R增大,动态响应变慢,收敛稳定性变好
*/
//参数一
float  KalmanFiltering( float inData)
{
    static float prevData = 0;                                 //上一个数据
    static float p = 10, q = 0.009, r = 0.009, kGain = 0;      // q 控制误差 r 控制响应速度
    p = p + q;
    kGain = p / ( p + r );                                      //计算卡尔曼增益
    inData = prevData + ( kGain * ( inData - prevData ) );      //计算本次滤波估计值
    p = ( 1 - kGain ) * p;                                      //更新测量方差
    prevData = inData;
    return inData;                                             //返回估计值
}





蓝色线条:直接的AD值
绿色线条:中位值滤波
红色线条:中位值滤波+卡尔曼滤波



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

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2026-5-27 02:30

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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