2129|1

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

测试卡尔曼滤波器(Kalman Filter) [复制链接]

真实的温度测试数据,通过加热棒加热一盆水测得的真实数据,X轴是时间秒,Y轴是温度:

1)滤波前

2)滤波后(p=10, q=0.0001, r=0.05, kGain=0;)

2)滤波后(p=10, q=0.00001, r=1, kGain=0;),Y轴放大10倍并取整

相关C语言代码:

 

#define LINE 1024

static float prevData=0; 
static float p=10, q=0.0001, r=0.05, kGain=0;

float kalmanFilter(float inData) 
{

    p = p+q; 
    kGain = p/(p+r);

    inData = prevData+(kGain*(inData-prevData)); 
    p = (1-kGain)*p;

    prevData = inData;

    return inData; 
}

char *ReadData(FILE *fp, char *buf) 
{ 
    return fgets(buf, LINE, fp); 
}

int main() 
{ 
    FILE *fp, *fp2; 
    char *p, *buf; 
    size_t len = 0; 
    ssize_t read; 
    float inData[1000]; 
    float outData[1000]; 
    uint32_t i,cnt=0;

    fp = fopen("d2.txt", "r"); 
    if (fp==NULL) 
        exit(1); 

    buf = (char*)malloc(LINE*sizeof(char)); 
    p=ReadData(fp, buf);

    while(p) { 
        inData[cnt]=atof(p); 
        cnt++; 
        p=ReadData(fp,buf); 
    }

    fclose(fp);

    for(i=0;i<cnt;i++)
        outData=kalmanFilter(inData); 
    }

    fp2 = fopen("d3.txt", "w"); 
    for(i=0;i<cnt;i++)
        fprintf(fp2, "%f\n",outData); 
    } 
    fclose(fp2);

}

 

matlab代码:

 

d2 = load('d2.txt'); 
plot(d2); 

prevData=0.0; 
p=10; 
q=0.0001; 
r=0.05; 
kGain=0; 
outData=[];

for i=1:length(d2) 
p=p+q; 
kGain=p/(p+r); 
temp=d2(i); 
temp=prevData+(kGain*(temp-prevData)); 
p=(1-kGain)*p; 
prevData=temp; 
outData(i)=temp; 
end

plot(outData);

 

说明:d2.txt存放的是输入的数据,每行一个。d3是输出的数据。

 

r参数调整滤波后的曲线与实测曲线的相近程度,r越小越接近。

q参数调滤波后的曲线平滑程度,q越小越平滑。

最新回复

学习了,多谢   详情 回复 发表于 2020-1-14 09:12
 
点赞 关注(1)

回复
举报

203

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

学习了,多谢

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表