资源简介
用C++代码实现卡尔曼滤波,可直接运行,也可以单独调用类,设置参数然后获取数据

代码片段和文件信息
#include “kalman.h“
#include
#include
#include
#include
Kalman::Kalman()
{
m_dQ = 0.0;
m_dR = 0.0;
// 初始化容器大小
m_vecSysNoise.resize(N);
m_vecObserNoise.resize(N);
m_vecReal.resize(N);
m_vecObser.resize(N);
m_vecKF.resize(N);
m_vecCov.resize(N);
}
void Kalman::setIniVal(float dval float dQ float dR)
{
m_dQ = dQ;
m_dR = dR;
m_vecReal[0] = dval;
m_vecObser[0] = dval;
m_vecKF[0] = dval;
// 初始化系统噪声
for(int i = 0; i < N; ++i)
{
m_vecSysNoise[i] = sqrt(m_dQ) * frand();
}
// 初始化观测噪声
for(int i = 0; i < N; ++i)
{
m_vecObserNoise[i] = sqrt(m_dR) * frand();
}
// 协方差赋初值
m_vecCov[1] = 0.01;
}
void Kalman::getData(vector &vecReal
vector &vecObserver
vector &vecFilter)
{
float dXPre = 0.0; // 一步预测值
float dPpre = 0.0; // 协方差一步预测
float Kg = 0.0; // 滤波增益
for(int i = 1; i < N; ++i)
{
m_vecReal[i] = m_vecReal[i-1] + m_vecSysNoise[i-1]; // 真实温度波动变化
m_vecObser[i] = m_vecReal[i] + m_vecObserNoise[i]; // 观测值波动变化
// 以下五步为Kalman核心步骤
dXPre = m_vecKF[i-1]; // 一步预测
dPpre = m_vecCov[i-1] + m_dQ; // 协方差一步预测
Kg = dPpre / (dPpre + m_dR); // 计算增益
m_vecKF[i] = dXPre + Kg * (m_vecObser[i] - dXPre); // 状态更新
m_vecCov[i] = (1 - Kg) * dPpre; // 协方差更新
}
// 输出结果
vecReal = m_vecReal;
vecObserver = m_vecObser;
vecFilter = m_vecKF;
return;
}
void Kalman::displayerror()
{
float ObError = 0.0; // 观测误差
float KfError = 0.0; // 卡尔曼滤波误差
for(int i = 0; i < N; ++i)
{
cout <<“ Real Value “< cout <<“ Observer Value “< cout <<“ Error “< cout <<“ KF Value “< cout <<“ Error “< ObError += fabs(m_vecReal[i] - m_vecObser[i]);
KfError += fabs(m_vecReal[i] - m_vecKF[i]);
}
cout<<“\n“<<“ Observer Error “< cout<<“ KalmanFilter Error “< }
float Kalman::frand()
{
static int seed = 0;
int i = time(0) % 100000;
seed += i;
srand(seed);
float a = 2 * ((rand() / (float)RAND_MAX) - 0.5);//随机噪声
return a;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2774 2019-06-29 15:59 kalman.cpp
文件 1261 2019-06-29 16:01 kalman.h
文件 288 2019-06-29 15:53 main.cpp
文件 148 2019-06-28 21:11 KalmanFilter.pro
- 上一篇:C语言——车票管理系统
- 下一篇:15年C语言专升本100题
相关资源
- 高精度加法(c++代码)
- 高效FFT的C/C++代码实现包括基2的DIF和
- 多功能计算器实现C++代码以及代码详
- 扩展欧几里德算法c++代码
- 移动最小二乘法MLS基于C++代码实现
- 编译原理 LR分析器 c++代码
- 简单蚁群算法C++代码
- QQ可用 Directshow实现的虚拟摄像头win
- 交通标识牌检测c++代码
- OLSR路由协议实现代码
- 超级玛丽c++代码(经典小游戏)
- GMM C++代码
- 数据结构课程设计(C++代码+报告)
- DICOM图片转换BMP的C++代码
- QSplat:基于点绘制的图形学开山之作
- 飞行棋c++代码
- Delphi2Cppdelphi代码转换为C++代码
- snake算法的C++代码
- 外卖管理系统含界面C++代码
- TLD 全C++代码 OpenCV3.0.0 VS2013 工程文件
- Microsoft+VisualC++6.0代码提示插件
- 史上最全C++代码
- Visual C++代码 获取本地网络信息
- 操作系统文件管理C++代码实现
- DX9.0小游戏C++代码
- 傅里叶变换和傅里叶逆变换的C++代码
- 课程设计---c++代码相似度计算
- 遥感图像融合C++代码
- 控制网平差C++代码实现
- C++:面向对象程序设计陈良银 李涛
评论
共有 条评论