C语言实现简单卡尔曼滤波

article/2025/10/27 22:36:45

https://www.bilibili.com/video/BV1ez4y1X7eR

DR.CAN讲的真的很好

卡尔曼滤波的步骤

步骤说明
Step 1计算卡尔曼增益
Step 2更新本次迭代的估计值
Step 3更新本次迭代的估计误差

具体请看上面DR.CAN的视频

代码

参数说明
x_mea测量值
x_est估计值
e_mea固有的测量误差,取决于测量工具的精度,假设测量工具量程是2000/%2,测量误差就是2000*2%=40
e_est估计误差,每次进行估计后需要更新
Kk卡尔曼增益

大致过程:设定初始值启动卡尔曼滤波,启动完成后开始迭代,代码中初始化与第一个迭代就是卡尔曼滤波的启动过程

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define Kk_calc(x,y)    (x)/(x+y)struct KalmanFilter {float x_mea; // measure value, instead of random numberfloat x_est; // estimate valuefloat e_mea; // measure offset, can not be removedfloat e_est; // estimate offsetfloat Kk; // Karlman Gain
};float RandomNumGenerator(int base, int range)
{float k = 0.0;float randomNum = 0.0;k = 2 * range * 10;randomNum = rand() % (int)k;k = base - range + (randomNum / 10);return k;
}void BoostRandomNumGenerator() {srand((unsigned)time(NULL));
}void Kalman_Init(KalmanFilter* kalmanFilter, float FirstMeaValue, float E_mea, float FirstEstValue, float E_est) {kalmanFilter->x_est = FirstEstValue;kalmanFilter->x_mea = FirstMeaValue;kalmanFilter->e_est = E_est;kalmanFilter->e_mea = E_mea;kalmanFilter->Kk = Kk_calc(kalmanFilter->e_est, kalmanFilter->e_mea);
}void Kalman_Update(KalmanFilter* kalmanFilter, float newMeaValue) {float temp = kalmanFilter->e_est;kalmanFilter->x_est = kalmanFilter->x_est + kalmanFilter->Kk * (newMeaValue - kalmanFilter->x_est);kalmanFilter->x_mea = newMeaValue;kalmanFilter->Kk = Kk_calc(kalmanFilter->e_est, kalmanFilter->e_mea);kalmanFilter->e_est = (1 - kalmanFilter->Kk) * temp;
}int main()
{KalmanFilter k;BoostRandomNumGenerator();Kalman_Init(&k, 51.0, 3.0, 40, 5);for (int i = 0; i < 10; i++){// Ten iterationsKalman_Update(&k, RandomNumGenerator(50, 3));printf("%.3f | %.3f\n",k.x_mea,k.x_est);}return 0;
}

运行效果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/84NO2ouR.shtml

相关文章

C语言实现双边滤波

参考博文 看不懂公式的先去看参考博文 一个3*3窗口的代码 /**双边法滤波 3*3窗口 *参数 data[][COL] 图像数据 *参数 row 图像数据行数 *参数 varD 空域核d的标准差 *参数 varR 值域核r的标准差 *需要引用头文件math.h *typedef unsi…

数字图像处理,读懂频域处理的“傅里叶变换”

转载自&#xff1a;https://blog.csdn.net/ebowtang/article/details/39004979 以下部分文字资料整合于网络&#xff0c;本文仅供自己学习用&#xff01; 这是一幅很绝的一维傅里叶变换动态图 一&#xff0c;读懂傅里叶变换 一个信号能表示成傅里叶级数的形式是有条件的&…

傅立叶变换和拉普拉斯变换

欧拉公式 证明过程如下 首先是泰勒展开 参考cosX和sinX的泰勒展开可以证明这个问题。 还有下面这个号称宇宙最美公式 “自然底数e&#xff0c;自然数1和0&#xff0c;虚数i还有圆周率pi&#xff0c;它是这么简洁&#xff0c;这么美丽啊&#xff01;” 傅立叶级数 傅立叶在…

Little’s Law 利特尔法则

1 A simple definition: Little’s Law states that the long-term average number of customers in a stable system L L L is equal to the long-term average effective arrival rate, λ \lambda λ, multiplied by the average time a customer spends in the system, …

勒让德符号的说明及作用

Legendre符号的用途 一、 二次剩余 勒让德符号的提出的意义是判断一个数是否是模n的二次剩余&#xff0c;所以研究勒让德符号之前应该了解一下二次剩余。 存在x使x的平方与a MOD (p)就称a为模p的二次剩余&#xff0c;其中p为素数&#xff0c;a>0且a<p。 通过勒让…

奈奎斯特准则的简洁证明

一般而言&#xff0c;发送滤波器和接收滤波器的冲激响应相同且关于原点对称&#xff0c;有用信号事实上经过了这两个滤波器&#xff0c;所以等效滤波器为&#xff1a; 为使无符号间干扰&#xff0c; 应满足&#xff1a; 奈奎斯特准则指出上式等价于&#xff1a; 其中 表示的傅里…

蒙蒂霍尔悖论

贝叶斯与频率主义对蒙蒂霍尔问题的解 在定义概率时&#xff0c;通常有两种思想流派&#xff1a;贝叶斯主义和频率主义。前者将概率视为我们对事件发生的信念程度&#xff0c;而后者则将其视为事件发生的相对频率。这篇文章介绍了使用贝叶斯和频率主义方法来解决著名的蒙蒂霍尔问…

信号 信号的线性放大

信号 1.信号 信号是信息的载体或表达形式 2. 信号的频谱 正弦信号 方波信号 满足狄里赫利条件&#xff0c;展开成傅里叶级数 附 狄里赫利条件: 1) 函数在任意有限区间内连续&#xff0c;或只有有限个第一类间断点&#xff08;当t从左或右趋于这个间断点时&#xff0c;函数有有限…

信号的频域描述

一、周期信号的频域描述 1. 狄里赫利条件 &#xff08;1&#xff09;函数在任意有限区间内连续&#xff0c;或只有有限个第一类间断点 &#xff08;2&#xff09;在一个周期内&#xff0c;函数有有限个 极大值或极小值 2. 傅里叶级数 &#xff08;1&#xff09;傅里叶级数…

【信号与系统】(十三)傅里叶变换与频域分析——周期信号的傅里叶级数

文章目录 周期信号的傅里叶级数1 周期信号三角形式的傅里叶级数1.1 三角形式的傅里叶级数1.2 狄里赫利(Dirichlet)条件1.3 .余弦形式的傅里叶级数1.4 吉布斯现象 2 周期信号波形对称性和谐波特性2.1 f ( t ) f(t) f(t)为偶函数2.2 f ( t ) f(t) f(t)为奇函数2.3 f ( t ) f(t…

连续时间傅立叶变换和拉普拉斯变换

连续时间傅里叶变换简称&#xff1a;CTFT 连续时间周期信号x(t)如果满足狄里赫利条件&#xff0c;则其存在傅立叶级数对&#xff1a; x(t)在任何有限区间内&#xff0c;有有限个不连续点&#xff0c;并且在每个不连续点都必须是有限值。 注意&#xff1a;狄里赫利条件是充分条…

狄利克雷条件

属于 傅里叶级数分析使用的条件&#xff1a; 傅里叶在提出 傅里叶级数时坚持认为&#xff0c;任何一个周期信号都可以展开成傅里叶级数&#xff0c;虽然这个结论在当时引起许多争议&#xff0c;但持异议者却不能给出有力的不同论据。直到20年后(1829年)狄里赫利才对这个问题作出…

从傅里叶变换到拉普拉斯变换

理解拉普拉斯变换&#xff0c;可以先从傅里叶变换开始。 傅里叶定律&#xff1a;只要一个函数满足如狄利赫里条件&#xff0c;都能分解为复指数函数之和。 狄利赫里条件&#xff1a; (1) 函数在任意有限区间内连续&#xff0c;或只有有限个第一类间断点&#xff1b; (2)在一…

周期信号的傅里叶级数

周期信号的傅里叶级数 周期信号三角形式的傅里叶级数 1.三角形式的傅里叶级数 系数an, bn称为傅里叶系数 2.狄里赫利(Dirichlet)条件&#xff1a; 条件1&#xff1a;在一个周期内&#xff0c;函数连续或只有有限个第一类间断点&#xff1b; 条件2&#xff1a;在一个周期内&…

【Spring Boot】请求参数传json对象,后端采用(pojo)CRUD案例(102)

请求参数传json对象&#xff0c;后端采用&#xff08;pojo&#xff09;接收的前提条件&#xff1a; 1.pom.xml文件加入坐标依赖&#xff1a;jackson-databind 2.Spring Boot 的启动类加注解&#xff1a;EnableWebMvc 3.Spring Boot 的Controller接受参数采用&#xff1a;Reque…

8.返回JSON数据(Jackson):【@Controller + @ResponseBody 等价于【@RestController】的使用方法 jackson乱码的xml配置

文章目录 Controller类&#xff0c;返回JSON数据(Jackson)【一个不乱码的对象】1. 使用Jackson&#xff0c;需要额外导入pom依赖&#xff1a;jackson-databind2. 配置web.xml&#xff1a;注册DispatcherServlet、自带的过滤器3. 配置springmvc-servlet.xml 【含jackson乱码的解…

SpringBoot默认使用Jackson,它与ObjectMapper的前世今生JSON工具(格式化、JSONObject转对象)

Jackson与ObjectMapper 1、Jackson可以轻松地将Java对象转换成json对象和xml文档&#xff0c;同样也可以将json、xml转换成Java对象&#xff1b; 2、ObjectMapper类是Jackson库的主要类。它称为ObjectMapper的原因是因为它将JSON映射为Java对象&#xff08;序列化&#xff09…

Json☀️ 二、使用 JsonUtility 创建并解析 Json

文章目录 &#x1f7e5; 要生成的 Json&#x1f7e7; 创建 Json 方法&#x1f7e8; 解析 Json 方法 在我们项目中&#xff0c;可能经常用到解析 Json&#xff0c; 但有时也需要存档的工作。那该怎样生成Json呢&#xff1f; 下面我们就以上节 Json 例子为例&#xff0c;来讲解如…

Jackson API指南(*)

一.Jackson 概述 与 依赖 1.市面上用于在 Java 中解析 Json 的第三方库&#xff0c;随便一搜不下几十种&#xff0c;其中的佼佼者有 Google 的 Gson&#xff0c; Alibaba 的 Fastjson以及本文的 jackson。 2.我们在学习一门技术之前&#xff0c;首选要了解这门技术的优劣性&am…

Jackson 工具类使用及配置指南

目录 前言Jackson使用工具类Jackson配置属性Jackson解析JSON数据Jackson序列化Java对象 前言 Json数据格式这两年发展的很快&#xff0c;其声称相对XML格式有很对好处&#xff1a; 容易阅读&#xff1b;解析速度快&#xff1b;占用空间更少。 不过&#xff0c;JSON 和 XML…