C#实现一阶卡尔曼滤波算法的示例代码

//FilterKalman.cs

namespace FusionFiltering
{

    public class FilterKalman
    {
        private double A = 1;
        private double B = 0;
        private double H = 1;

        private double R;
        private double Q;

        private double cov = double.NaN;
        private double x = double.NaN;

        public FilterKalman(double R, double Q, double A, double B, double H)
        {
            this.R = R;  //过程噪声
            this.Q = Q;  //测量噪声

            this.A = A;  //状态转移矩阵
            this.B = B;  //控制矩阵  u为控制向量
            this.H = H;  //将估计范围与单位转化为与系统变量(或者说测量值)一致的范围与单位

            this.cov = double.NaN;
            this.x = double.NaN; // estimated signal without noise
        }

        public FilterKalman(double R, double Q)
        {
            this.R = R;
            this.Q = Q;
        }

        public double filter(double measurement, double u)
        {
            if (double.IsNaN(this.x)) {
                this.x = (1 / this.H) * measurement;
                this.cov = (1 / this.H) * this.Q * (1 / this.H);
            } else {
                double predX = (this.A * this.x) + (this.B * u);
                double predCov = ((this.A * this.cov) * this.A) + this.Q;

                // Kalman gain
                double K = predCov * this.H * (1 / ((this.H * predCov * this.H) + this.Q));

                // Correction
                this.x = predX + K * (measurement - (this.H * predX));
                this.cov = predCov - (K * this.H * predCov);
            }
            return this.x;
        }

        public double filter(double measurement)
        {
            double u = 0;
            if (double.IsNaN(this.x)) {
                this.x = (1 / this.H) * measurement;
                this.cov = (1 / this.H) * this.Q * (1 / this.H);
            } else {
                double predX = (this.A * this.x) + (this.B * u);
                double predCov = ((this.A * this.cov) * this.A) + this.R;

                // Kalman gain
                double K = predCov * this.H * (1 / ((this.H * predCov * this.H) + this.Q));

                // Correction
                this.x = predX + K * (measurement - (this.H * predX));
                this.cov = predCov - (K * this.H * predCov);
            }
            return this.x;
        }

        public double lastMeasurement()
        {
            return this.x;
        }

        public void setMeasurementNoise(double noise)
        {
            this.Q = noise;
        }

        public void setProcessNoise(double noise)
        {
            this.R = noise;
        }
    }
}
//ProgramTestData.cs

using System;
using System.Linq;

namespace FusionFiltering
{
    public class ProgramTest
    {
        /// <summary>
        /// kalman滤波测试1
        /// </summary>
        [System.Diagnostics.Conditional("DEBUG")]
        public static void TestKalmanFilter1()
        {
            Console.WriteLine("FilterKalman Usage");

            FilterKalman test = new FilterKalman(0.008, 0.1);
            double[] testData = { 66, 64, 63, 63, 63, 66, 65, 67, 58 };
            foreach (var x in testData) {
                Console.WriteLine("Input data: {0:#,##0.00}, Filtered data:{1:#,##0.000}", x, test.filter(x));
            }
        }

        /// <summary>
        /// Example Usage with controlled input
        /// </summary>
        [System.Diagnostics.Conditional("DEBUG")]
        public static void TestKalmanFilterWithControlled()
        {
            Console.WriteLine("FilterKalman Usage with controlled input");

            FilterKalman test = new FilterKalman(0.008, 0.1, 1, 1, 1);
            double[] testData = { 66, 64, 63, 63, 63, 66, 65, 67, 58 };
            double u = 0.2;
            foreach (var x in testData) {
                Console.WriteLine("Input data: {0:#,##0.00}, Filtered data:{1:#,##0.000}", x, test.filter(x, u));
            }

        }
    }
}
//Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FusionFiltering;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            ProgramTest.TestKalmanFilter1();
            Console.ReadKey();
            Console.WriteLine();
            ProgramTest.TestKalmanFilterWithControlled();
            Console.ReadKey();

        }
}
}

效果:

以上就是C#实现一阶卡尔曼滤波算法的示例代码的详细内容,更多关于C#实现一阶卡尔曼滤波算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android顶栏定时推送消息

    在用安卓设备时,经常会应用到弹出推送消息.下面在此把我之前写的推送代码分享给大家,供大家参考,有不同见解的朋友欢迎提出,共同学习进步! 最近搜索看这个的朋友比较多.这个也只是单独的内置推送.时时推送与服务器关联 我们可以用SDK云推送来实现我们所需的需求.相关介绍内容.往下移! 首先XML <!-- 安卓推送服务 --> <service android:name=".MessageService" android:enabled="true" a

  • 利用Python将每日一句定时推送至微信的实现方法

    前言 前几天在网上看到一篇文章<教你用微信每天给女票说晚安>,感觉很神奇的样子,随后研究了一下,构思的确是巧妙.好,那就开始动工吧!服务器有了,Python环境有了,IDE打开了...然而...然而...我意识到了一个非常严重的问题...没有女朋友 (T_T)... 微信开发已经活跃了很长时间了,在微信开发中有一个神奇的接口它叫模板消息接口,它可以根据用户的openid从服务端给用户推送自定义的模板消息,正因如此,我们可以利用这个特征在服务器端随时向用户推送消息(前提是该用户关注了该公众号).

  • C# 调用exe传参,并获取打印值的实例

    调用方法: string baseName = System.IO.Directory.GetCurrentDirectory(); // baseName+"/" // string fileName = @"C:\Users\59930\Desktop\20170605\WindowsFormsApp1\WindowsFormsApp1\WindowsFormsApp1\bin\x86\Debug\WindowsFormsApp1.exe"; string fi

  • 如何实现定时推送的具体方案

    详细内容 详细内容大概分为4个部分,1.应用场景 2.遇到问题 3.设计 4.实现 5.运行效果 1.应用场景 需要定时推送数据,且轻量化的实现. 2.遇到问题 如果启动一个定时器去定时轮询 (1)轮询效率比较低 (2)每次扫库,已经被执行过记录,仍然会被扫描(只是不会出现在结果集中),会做重复工作 (3)时效性不够好,如果每小时轮询一次,最差的情况下会有时间误差 如何利用"延时消息",对于每个任务只触发一次,保证效率的同时保证实时性,是今天要讨论的问题. 3.设计 高效延时消息,包含

  • python给微信好友定时推送消息的示例

    如下所示: from __future__ import unicode_literals from threading import Timer from wxpy import * import requests #bot = Bot() #bot = Bot(console_qr=2,cache_path="botoo.pkl")#这里的二维码是用像素的形式打印出来!,如果你在win环境上运行,替换为 bot=Bot() bot = Bot(cache_path=True) de

  • C#实现一阶卡尔曼滤波算法的示例代码

    //FilterKalman.cs namespace FusionFiltering { public class FilterKalman { private double A = 1; private double B = 0; private double H = 1; private double R; private double Q; private double cov = double.NaN; private double x = double.NaN; public Fil

  • Java实现8种排序算法的示例代码

    冒泡排序 O(n2) 两个数比较大小,较大的数下沉,较小的数冒起来. public static void bubbleSort(int[] a) { //临时变量 int temp; //i是循环次数,也是冒泡的结果位置下标,5个数组循环5次 for (int i = 0; i < a.length; i++) { //从最后向前面两两对比,j是比较中下标大的值 for (int j = a.length - 1; j > i; j--) { //让小的数字排在前面 if (a[j] <

  • JAVA用递归实现全排列算法的示例代码

    求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现. 首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件.以[1, 2]为例 首先展示一下主要代码(完整代码在后面),然后简述 //对数组array从索引为start到最后的元素进行全排列 public void perm(int[]array,int start) { if(start==array.length) { //出口条件 for(int i=0;i<array.length;i

  • c# 实现KMP算法的示例代码

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息.KMP算法的时间复杂度O(m+n) . 实现方式就不再这里献丑了,网上很多讲解,此处只是记录下c#实现的代码. public class KMP { public

  • python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后会将次大的元素移到最大元素的左边,每次内层循环结束都会将一个元素排好序. def bubble_sort(arr): length = len(arr) for i in range(length): for j in range(length - i - 1): if arr[j] > arr[j

  • Python实现七大查找算法的示例代码

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素.     查找表(Search Table):由同一类型的数据元素构成的集合     关键字(Key):数据元素中某个数据项的值,又称为键值     主键(Primary Key):可唯一的标识某个数据元素或记录的关键字 查找表按照操作方式可分为:         1.静态查找表(Static Search Table):只做查找操作的查找表.它的主要操作是:         ①

  • Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找)

    目录 1.查找概述 2.顺序查找 3.二分查找 3.1 二分查找概述 3.2 二分查找实现 4.插值查找 4.1 插值查找概述 4.2 插值查找实现 5.斐波那契查找 5.1 斐波那契查找概述 5.2 斐波那契查找实现 5.3 总结 1.查找概述 查找表: 所有需要被查的数据所在的集合,我们给它一个统称叫查找表.查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合. 查找(Searching): 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录).

  • Python和Matlab实现蝙蝠算法的示例代码

    目录 1前言 2 蝙蝠算法原理细讲 3 详细步骤 4Python实现 4.1代码 4.2结果 5Matlab实现 5.1 代码 5.2 结果 5.3 展望 1 前言 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法,是一种搜索全局最优解的有效方法.该算法基于迭代优化,初始化为一组随机解,然后迭代搜寻最优解,且在最优解周围通过随机飞行产生局部新解,加强局部搜索速度.该算法具有实现简单.参数少等特点. 该算法主要用于目标函数寻优,基于蝙蝠种群利用产生的声波搜索猎物和控制飞行方向的特征来实现

  • C#实现抢红包算法的示例代码

    目录 二倍均值法(公平版) 线段切割法(手速版) 二倍均值法(公平版) 发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 1.所有人抢到金额之和等于红包金额,不能超过,也不能少于. 2.每个人至少抢到一分钱. 3.要保证所有人抢到金额的几率相等. 假设剩余红包金额为M,剩余人数为N,那么有如下公式: 每次抢到的金额 = 随机区间 (0, M / N × 2) 这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平.举个例子: 假设有10个人,红包总额100元

  • Java实现雪花算法的示例代码

    一.介绍 SnowFlow算法是Twitter推出的分布式id生成算法,主要核心思想就是利用64bit的long类型的数字作为全局的id.在分布式系统中经常应用到,并且,在id中加入了时间戳的概念,基本上保持不重复,并且持续一种向上增加的方式. 在这64bit中,其中``第一个bit是不用的,然后用其中的41个bit作为毫秒数,用10bit作为工作机器id,12bit`作为序列号.具体如下图所示: 第一个部分:0,这个是个符号位,因为在二进制中第一个bit如果是1的话,那么都是负数,但是我们生成

随机推荐