【C#】【引用加原创】C#实现kalman滤波

最近为了项目,同事让我帮他做一个硬件版的kalman滤波器,实现对设备的kalman滤波,以验证他的理论算法。

犹豫了好几天,用dsp吧,我的kalman滤波算法比较简单,有点大材小用。刚好手里有一块arm调试版,也装了wince系统,就准备在.net环境下编一个kalman滤波器。

虽说学的是导航专业,对kalman滤波应该比较熟悉,可是当时学的就不好,所有学的东西都还给导师了。(导师您不会看到这篇文章吧!看来不能放在首页上!)

于是,只能在网上找一些相关资料。感觉现在变的懒了,总是喜欢在别人的代码上改来改去,不愿意去思考了。算了,反正就这么一次。罪过罪过!

国内的资料对于matlab的算法比较多了,网上随便down,但是基于C#的比较少,还好我的搜索能力不是很差,总算让我找到了相关资料。

引用博客的地址是:http://blog.csdn.net/csdnbao/archive/2009/09/24/4590519.aspx

文章把整个算法都写出来了,我也一起贴出来吧!

 

 

using System;
using System.Collections.Generic;
using System.Text;namespace SimTransfer
{public class KalmanFacade{#region inner classclass KalmanFilter{int MP;                     /* number of measurement vector dimensions */int DP;                     /* number of state vector dimensions */int CP;                     /* number of control vector dimensions */public Matrix state_pre;           /* predicted state (x'(k)):x(k)=A*x(k-1)+B*u(k) */public Matrix state_post;          /* corrected state (x(k)):x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) */public Matrix transition_matrix;   /* state transition matrix (A) */public Matrix control_matrix;      /* control matrix (B)(it is not used if there is no control)*/public Matrix measurement_matrix;  /* measurement matrix (H) */public Matrix process_noise_cov;   /* process noise covariance matrix (Q) */public Matrix measurement_noise_cov; /* measurement noise covariance matrix (R) */public Matrix error_cov_pre;       /* priori error estimate covariance matrix (P'(k)):P'(k)=A*P(k-1)*At + Q)*/Matrix gain;                /* Kalman gain matrix (K(k)):K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R)*/Matrix error_cov_post;      /* posteriori error estimate covariance matrix (P(k)):P(k)=(I-K(k)*H)*P'(k) */Matrix temp1;               /* temporary matrices */Matrix temp2;Matrix temp3;Matrix temp4;Matrix temp5;public KalmanFilter(){MP = 1;DP = 2;CP = 0;state_pre = new Matrix(DP, 1);state_pre.Zero();state_post = new Matrix(DP, 1);state_post.Zero();transition_matrix = new Matrix(DP, DP);transition_matrix.SetIdentity(1.0);transition_matrix[0, 1] = 1;process_noise_cov = new Matrix(DP, DP);process_noise_cov.SetIdentity(1.0);measurement_matrix = new Matrix(MP, DP);measurement_matrix.SetIdentity(1.0);measurement_noise_cov = new Matrix(MP, MP);measurement_noise_cov.SetIdentity(1.0);error_cov_pre = new Matrix(DP, DP);error_cov_post = new Matrix(DP, DP);error_cov_post.SetIdentity(1);gain = new Matrix(DP, MP);if (CP > 0){control_matrix = new Matrix(DP, CP);control_matrix.Zero();}//temp1 = new Matrix(DP, DP);temp2 = new Matrix(MP, DP);temp3 = new Matrix(MP, MP);temp4 = new Matrix(MP, DP);temp5 = new Matrix(MP, 1);}public Matrix Predict(){state_pre = transition_matrix.Multiply(state_post);//if (CP>0)//{//    control_matrix//}temp1 = transition_matrix.Multiply(error_cov_post);Matrix at = transition_matrix.Transpose();error_cov_pre = temp1.Multiply(at).Add(process_noise_cov);Matrix result = new Matrix(state_pre);return result;}public Matrix Correct(Matrix measurement){temp2 = measurement_matrix.Multiply(error_cov_pre);Matrix ht = measurement_matrix.Transpose();temp3 = temp2.Multiply(ht).Add(measurement_noise_cov);temp3.InvertSsgj();temp4 = temp3.Multiply(temp2);gain = temp4.Transpose();temp5 = measurement.Subtract(measurement_matrix.Multiply(state_pre));state_post = gain.Multiply(temp5).Add(state_pre);error_cov_post = error_cov_pre.Subtract(gain.Multiply(temp2));Matrix result = new Matrix(state_post);return result;}public Matrix AutoPredict(Matrix measurement){Matrix result = Predict();Correct(measurement);return result;}}#endregionpublic KalmanFacade(int valueItem){if (valueItem<=0){throw new Exception("not enough value items!");}kmfilter = new KalmanFilter[valueItem];Random rand = new Random(1001);for (int i = 0; i < valueItem; i++ ){kmfilter[i] = new KalmanFilter();kmfilter[i].state_post[0, 0] = rand.Next(10);kmfilter[i].state_post[1, 0] = rand.Next(10);//kmfilter[i].process_noise_cov.SetIdentity(1e-5);kmfilter[i].measurement_noise_cov.SetIdentity(1e-1);}}private KalmanFilter[] kmfilter = null; public bool GetValue(double[] inValue, ref double[] outValue){if (inValue.Length != kmfilter.Length || outValue.Length != kmfilter.Length){return false;}Matrix[] measures = new Matrix[kmfilter.Length];for (int i = 0; i < kmfilter.Length; i++ ){measures[i] = new Matrix();measures[i][0, 0] = inValue[i];outValue[i] = kmfilter[i].AutoPredict(measures[i])[0, 0];}return true;}}}//==========test=============SimTransfer.KalmanFacade kalman = new SimTransfer.KalmanFacade(1);Random rand = new Random(1001);System.IO.StreamWriter dataFile = new System.IO.StreamWriter("D:\\test.csv");for (int x = 0; x < 2000; x++ ){double y = 100 * Math.Sin((2.0 * Math.PI / (float)200) * x);double noise = 20 * Math.Sin((40.0 * Math.PI / (float)200) * x) + 40 * (rand.NextDouble() - 0.5);double[] z_k = new double[1];z_k[0] = y + noise;double[] y_k = new double[1];kalman.GetValue(z_k, ref y_k);dataFile.WriteLine(y.ToString()  + "," + z_k[0].ToString()  + "," + y_k[0].ToString());}dataFile.Close();MessageBox.Show("OK!");

 

源码是很详细,但是注释比较少,看来我还得把程序翻译一遍!

这两天把注释重新写一下!!!

还有一个就是Matrix的类库。

转载于:https://www.cnblogs.com/MobileBo/archive/2010/09/07/1820831.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件开发底层知识修炼】五 gcc-C语言编译器

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录1、GCC与gcc2、gcc的幕后工作3、实用的gcc选项3.1、预处理选项-解决宏错误3.2、-S参数-辅助编写汇编程序的好方法3.3、获取系统头文件路径3.4…

思维模型分享

思维模型1.思维建模1.1 模型的用途1.2构建模型的3种方法1.3多样性预测定理1.4分类模型1.5 变差模型1.5.1 解释变差的百分比1.6 模型误差分解定理1.7 多模型思维1.8 对人类行为建模1.8.1 理性行为者模式2.模型思维2.1 正态分布2.2中心极限定理2.2.1 平方根法则2.2.2 检验显著性2…

认识再次提高。

今天晚上开会&#xff0c;又主动请缨拿回一个不可能完成的任务。 又是冒进了&#xff0c;最近对自己的认识又提升了一个高度&#xff1a;我发现我如果不给自己压力就会活得很无聊很无聊。 没有压力就没有动力&#xff0c;用我身上&#xff0c;太合适了。 比如&#xff0c;签合同…

在工程中最常用的 vim使用技巧

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 文章目录1、vim编辑常用快捷键2、文件索引…

动态规划过程

动态规划过程应用背包问题&#xff1a;分享一下 有一个背包&#xff0c;容量是4磅&#xff0c;现有如下产品 1)要求达到的目标为装入的背包的总价值最大&#xff0c;并且要求重量不能超出 2&#xff09; 要求转入的物品不能重复 思路分析&#xff1a;算法其实是模型建立的过程 …

Know more about RAC GES STATISTICS

GES 全称为Global Enqueue Services是RAC中重要的全局队列锁服务&#xff0c;V$GES_STATISTICS 动态性能视图汇聚了主要的GES STATISTICS 统计信息。为了更好地理解GES STATISTICS &#xff0c;我们可以通过下表理解这些统计项的含义&#xff1a; V$GES_STATISTICS Reference…

【剑指offer - C++/Java】5、用两个栈实现队列

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 牛客网题目链接&#xff1a;用两个栈实现队列 文章目录1、题目分析2、代码Java代码&#xff1a;C代码3、总结题目描述&#xff1a; 用两个栈来实现一…

【剑指offer - C++/Java】6、旋转数组的最小数字

题目链接&#xff1a;旋转数组的最小数字 文章目录1、题目描述2、题目分析3、代码3.1 Java代码3.2、C代码4、总结1、题目描述 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转&#xff0c;输出旋转数组的最小…

求一个有限长度字符串 最长的有序可重复字符串长度

求一个有限长度字符串 最长的有序可重复子串package acm;/*** author qxl*/ public class SequenceCharMax {/*** 输入一可重复的整数数组&#xff0c;求最长升序数组长度** 比如&#xff1a;* 输入&#xff1a;[1, 2, 3, 4]* 输出&#xff1a;4* 输入&#xff1a;[1, 5, 2, 3,…

发消息给非windows窗体程序

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; var WM_SHUTDOWN_THREADS: Cardinal; //无符号32位 type TForm1 class(TForm) Button1: TButton; Button2: TButton; Memo1: TMem…

设计模式-责任链模型

责任链模式场景: OA审批系统 CEO 审批项目 经费 500万<x ≤\leq≤ 1000万总监 审批的经费 300万 < x ≤\leq≤ 500万总监秘书 审批的经费 100万< x ≤\leq≤ 300万研发经理 审批的经费 50万 <x ≤\leq≤ 100万 传统方式 是 (接收到请求后&#xff0c;根据相应金额&…

【OS学习笔记】三 计算机的启动过程

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章迈进了汇编的大门&#xff0c;点击链接查看上一篇文章&#xff1a;汇编语言和汇编软件 上一篇文章大概学会以下内容&#xff1a; 了解汇编…

sm115

sm115 sm115 for firefox 作者: clowwindy版本: 0.4安装地址: https://addons.mozilla.org/zh-CN/firefox/addon/235279/ 使用说明: Firefox安装本扩展后&#xff0c;115在高峰时段也会直接显示下载链接&#xff0c;不需要使用优蛋。 点击“继续提取”按钮&#xff0c;可以再…

从zip中读取文件 合并到指定的文件中

从zip中读取文件 合并到指定的文件中引入 commons-io 版本可以选择更高的版本 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>具体代码如下&#xff1a;…

【OS学习笔记】四 什么是虚拟机

虚拟机是软件 对于第一次听说虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;的人来说&#xff0c;可能以为还要再花钱买一台计算机&#xff0c;这恐怕是他们最担心的。所谓虚拟机&#xff0c;就是在你的计算机上再虚拟出另一台计算机来。这台虚拟出来的计算机&…

TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])

TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快&#xff0c;接收方可能会来不及接收&#xff0c;这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快&#xff0c;要让接收方来得及接收。 利用滑动窗口机制可以很方便地在TCP连接上实现…

英语词源记忆法

英语词源记忆法后续持续更新中

【OS学习笔记】五 VirtualBox的下载、安装和配置

上一篇文章学习了&#xff1a;计算机的启动过程&#xff08;点击链接查看上一篇文章&#xff09; 今天来接着上一篇文章&#xff0c;解决我们学习中的实验环境问题。 参考&#xff1a;X86汇编语言-从实模式到保护模式。作者李忠。纯学习笔记。如有侵权请联系我删除 1、下载O…

iframe透明

<iframe allowtransparency"true" src"A.html"></iframe> A.html body { background-color:transparent; } 转载于:https://www.cnblogs.com/mattins/archive/2010/10/13/1850098.html

spring体系思维导图

spring体系思维导图1. spring 思维导图2. springboot 思维导图3. springcloud 思维导图之前整理的&#xff0c;后续持续更新中1. spring 思维导图 2. springboot 思维导图 3. springcloud 思维导图