资源简介
用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++代码提取LBP特征
- http上传C++代码实现
- 哈弗曼树的建立 C++代码
- aes加密算法的verilog和c++代码
- LEACH算法源代码_C++代码
- 数据结构中用栈实现迷宫问题的c++代
- 音频去噪C++代码,注释清晰可用
- 新安江模型C++代码 VS2008平台下
- 人脸识别c++代码
- 条件平差的 C++代码
- 算法分析中单源最短路径问题的C++代
- DBSCAN聚类算法C++代码实现
- 《操作系统课内实验》文件系统实现
- OpenCV单目视觉定位测量C++代码
- arp攻击c++代码
- 高斯滤波的c++代码实现
- 茶壶的光照观察组(c++代码)
- 鲸鱼优化算法C++代码
- 九九乘法表(c++代码)
- rbtree C++代码
- 最小覆盖圆问题(c++代码)
- 窗口3D效果(c++代码)
- 大华设备初始化(c++代码)
- 银行家算法的实现(c++代码)
- KMP算法(c++代码实现)
- opencv计算信息熵(c++代码)
- 俄罗斯方块(c++代码)
- OPENCV识别圆心c++代码
- 四次Bezier曲线动态生成 VC++代码实现
- 矩阵运算的C++代码
评论
共有 条评论