a往南向北 2019-01-16 20:39:20  11340  收藏 111

分类专栏: C语言嵌入式 文章标签: 卡尔曼滤波 C代码

卡尔曼滤波理论很容易就可以在MATLAB软件环境下实现,但是,实际的硬件板子上还是需要C语言,当然可以自动代码生成,还有一种就是直接手动编写C语言。

1.前言

在google上搜索卡尔曼滤波,很容易找到以下这个帖子:http://blog.csdn.net/lanbing510/article/details/8828109

帖子最后用matlab实现了kalman,然后博主的前面一些帖子也有详细转载相关贴子,自己也给出了一些源代码,例如转载的这篇卡尔曼滤波器通俗介绍:https://blog.csdn.net/weixin_38451800/article/details/85462129

2.卡尔曼滤波的C语言

网上很多的是关于多维kalman实现。参照网上的一些代码,本文实现了一个一维地滤波,对于有C语言基础的同学来讲,理解起来应该很容易了。

百度百科里面有这个帖子:http://wenku.baidu.com/view/8523cb6eaf1ffc4ffe47ac24.html

讲解的是一维kalman滤波器,但是最后printf出来的都是分立的值,看不出来什么。参考那段代码,改写成了下面这段代码,在labwindows里面绘制了一段曲线,效果就很直观了:

/*-------------------------------------------------------------------------------------------------------------*/

void KalmanFilter(unsigned int ResrcDataCnt,const double *ResrcData,double *FilterOutput,double ProcessNiose_Q,double MeasureNoise_R,double InitialPrediction)

{

unsigned int i;

double R = MeasureNoise_R;

double Q = ProcessNiose_Q;

double x_last = *ResrcData;

double x_mid = x_last;

double x_now;

double p_last = InitialPrediction;

double p_mid ;

double p_now;

double kg;

for(i=0;i

{

x_mid=x_last; //x_last=x(k-1|k-1),x_mid=x(k|k-1)

p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声

kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声

x_now=x_mid+kg*(*(ResrcData+i)-x_mid);//估计出的最优值

p_now=(1-kg)*p_mid;//最优值对应的covariance

*(FilterOutput + i)  = x_now;

p_last = p_now; //更新covariance值

x_last = x_now; //更新系统状态值

}

}

/*-------------------------------------------------------------------------------------------------------------*/

参考上面的代码,优化了一下之后(运行在STM32上):

/*-------------------------------------------------------------------------------------------------------------*/

/*

Q:过程噪声,Q增大,动态响应变快,收敛稳定性变坏

R:测量噪声,R增大,动态响应变慢,收敛稳定性变好

*/

double KalmanFilter(const double ResrcData,

double ProcessNiose_Q,double MeasureNoise_R,double InitialPrediction)

{

double R = MeasureNoise_R;

double Q = ProcessNiose_Q;

static        double x_last;

double x_mid = x_last;

double x_now;

static        double p_last;

double p_mid ;

double p_now;

double kg;

x_mid=x_last; //x_last=x(k-1|k-1),x_mid=x(k|k-1)

p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声

kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声

x_now=x_mid+kg*(ResrcData-x_mid);//估计出的最优值

p_now=(1-kg)*p_mid;//最优值对应的covariance

p_last = p_now; //更新covariance值

x_last = x_now; //更新系统状态值

return x_now;

}

/*-------------------------------------------------------------------------------------------------------------*/

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

3.接下来,是另外一个版本的单维卡尔曼滤波的C语言源代码:

#include "stdio.h"

#include "stdlib.h"

#include "math.h"

double frand()

{ return 2*((rand()/(double)RAND_MAX) - 0.5); // 随机噪声}

void main()

{ float x_last=0;

float p_last=0.02;

float Q=0.018;

float R=0.542;

float kg;

float x_mid;

float x_now;

float p_mid;

float p_now;

float z_real=0.56;//0.56

float z_measure;

float sumerror_kalman=0;

float sumerror_measure=0;

int i;

x_last=z_real+frand()*0.03;

x_mid=x_last;

for(i=0;i<20;i++)

{ x_mid=x_last;                                     //x_last=x(k-1|k-1),x_mid=x(k|k-1)

p_mid=p_last+Q;                                     //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q= 噪声

kg=p_mid/(p_mid+R);                                 //kg 为kalman filter ,R为噪声

z_measure=z_real+frand()*0.03;                      // 测量值

x_now=x_mid+kg*(z_measure-x_mid);                   // 估计出的最优值

p_now=(1-kg)*p_mid;                                 // 最优值对应的covariance

printf("Real position: %6.3f \n",z_real);           // 显示真值

printf("Mesaured position: %6.3f [diff:%.3f]\n",z_measure,fabs(z_real-z_measure));

// 显示测量值以及真值与测量值之间的误差

printf("Kalman position: %6.3f [diff:%.3f]\n",x_now,fabs(z_real - x_now));  // 显示kalman 估计值以及真值和卡尔曼估计值的误差

sumerror_kalman += fabs(z_real - x_now);            //kalman 估计值的累积误差

sumerror_measure += fabs(z_real-z_measure);         // 真值与测量值的累积误差

p_last = p_now;                                     // 更新covariance 值

x_last = x_now;                                     // 更新系统状态值

}

printf(" 总体测量误差 : %f\n",sumerror_measure);     // 输出测量累积误差

printf(" 总体卡尔曼滤波误差: %f\n",sumerror_kalman);  // 输出kalman 累积误差

printf(" 卡尔曼误差所占比例: %d%% \n",100-(int)((sumerror_kalman/sumerror_measure)*100));

——————————————————————————————————————————

部分内容转载自:https://www.amobbs.com/thread-5571611-1-1.html 和https://wenku.baidu.com/view/8523cb6eaf1ffc4ffe47ac24.html

卡尔曼滤波算法c语言stm32,卡尔曼滤波算法及C语言实现_源代码相关推荐

  1. 卡尔曼滤波算法及c语言代码,卡尔曼滤波算法及C语言代码

    卡尔曼滤波算法及C语言代码 卡尔曼滤波简介及其算法实现代码 卡尔曼滤波算法实现代码(C,C++分别实现) 卡尔曼滤波器简介 近来发现有些问题很多人都很感兴趣.所以在这里希望能尽自己能力跟大家讨论一些力 ...

  2. 滤波算法(四)—— 卡尔曼滤波算法

    一.算法介绍 卡尔曼滤波是一个神奇的滤波算法,应用非常广泛,它是一种结合先验经验.测量更新的状态估计算法. 1.状态估计 首先,对于一个我们关心的物理量,我们假设它符合下面的规律 其中,为该物理量本周 ...

  3. R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比

    R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型.并评估模型在测试集和训练集上的分类效果(accuray.F1.偏差Deviance):Bagging算法与随机森林对比 ...

  4. R语言使用apriori算法进行关联规则挖掘实战:关联规则概念、频繁项集、支持度(support)、置信度(confidence)、提升度(lift)、apriori算法

    R语言使用apriori算法进行关联规则挖掘实战:关联规则概念.频繁项集.支持度(support).置信度(confidence).提升度(lift).apriori算法 目录

  5. R语言基于机器学习算法进行特征筛选(Feature Selection)

    R语言基于机器学习算法进行特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(featu ...

  6. 输入法按照选字频率排序的C语言程序算法,算法与数据结构之选择排序(C语言)...

    #include #include void SelectSort(int *a,int n);//预声明要调用的函数 int main(void) { int k; int x[]={,,,,,,, ...

  7. 教你一步一步用C语言实现sift算法、上

    原文:http://blog.csdn.net/v_july_v/article/details/6245939 引言:     在我写的关于sift算法的前倆篇文章里头,已经对sift算法有了初步的 ...

  8. 【计算理论】计算复杂性 ( 阶段总结 | 计算理论内容概览 | 计算问题的有效性 | 语言与算法模型 | 可计算性与可判定性 | 可判定性与有效性 | 语言分类 ) ★

    文章目录 一.计算理论内容概览 二.计算问题的 有效性 三.语言 与 算法模型 四.可计算性 与 可判定性 五.可判定性 与 有效性 六.语言分类 一.计算理论内容概览 计算理论分为 形式语言与自动机 ...

  9. C语言实现PID算法:位置式PID和增量式PID

    原创者微信公众号 PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛. 大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID ...

最新文章

  1. Visual Studio Remote Debugger(for 2005/2008) .net远程调试转
  2. QIIME 2教程. 26为QIIME 2开发新插件DevelopingPlugin(2021.2)
  3. MongoDB或CouchDB - 适合生产? [关闭]
  4. Azure SQL 数据库引入了新的服务级别
  5. MySQL数据库备份和还原的常用命令
  6. python TypeError can only concatenate tuple not str to tuple
  7. 耗时1周!精选22G超超超适合产品经理的《数据分析》学习资源,抓紧保存!限时2天删除~...
  8. Serverless 实战 —— 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
  9. HTTP家族详细讲解
  10. 【以太坊开发】发币指南--基础篇
  11. PLC通讯智能网关-不用PLC编程,实现西门子PLC与罗克韦尔(AB)PLC之间数据通讯
  12. 八、管道弯头中流体混合流动与传热
  13. 快速生成 Mac App icns图标
  14. Python3.8 新特性:f-strings调试
  15. Android 软件开发时用到的一些有用软件列表
  16. 瑞萨RAe2studio快速上手视频笔记 一、瑞萨RAe2studio介绍
  17. 花花世界迷人眼,没有实力别赛脸,做Python实力派(万字精华,初学者,收藏必备!!!)
  18. api日常总结:前端常用js函数和CSS常用技巧
  19. SQL注入系列之环境搭建(一)----ASP+ACCESS注入环境搭建
  20. C++:使用高斯-勒让德正交估计柯西主值 (CPV) 某些奇异积分(附完整源码)

热门文章

  1. php 商场收银收费系统,使用的策略模式
  2. [译] React Native vs. Cordova、PhoneGap、Ionic,等等
  3. 猫猫学IOS(二十四)UI之注册案例
  4. 《构建高可用Linux服务器》样书
  5. linux主辅DNS的搭配
  6. 泛型Generics
  7. visual studio code 调试ROS的插件
  8. es安装ik后报错无法启动 read write
  9. jstack可以定位到线程堆栈
  10. [译]ava 设计模式之享元