✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。
????个人主页:算法工程师的学习日志
项目最近正好用上kalman滤波器,故整理一下kalman滤波器相关资料,网上有很多详细的kalman资料,参考如下:
1、https://zhuanlan.zhihu.com/p/34656822
2、https://blog.csdn.net/m0_37953670/article/details/89528002
由于项目处理的是一维信号,过滤噪点,故上面2篇文献足够完成项目
以其中的一篇参考资料为例:
卡尔曼滤波器的递归过程:
- 估计时刻k 的状态:
X(k) = AX(k-1) + Bu(k)
这里, u(k) 是系统输入,在项目中,一维输入信号A=1 - 计算误差相关矩阵P, 度量估计值的精确程度:
P(k) = A*P(k-1)*A’+ Q
这里, Q = E{ Wj^2 } 是系统噪声的协方差阵,即系统框图中的Wj的协方差阵, Q 应该是不断变化的,为了简化,当作一个常数矩阵。 - 计算卡尔曼增益, 以下略去 (k), 即 P = P(k), X = X(k):
K = P C’ (C * P * C’ + R) -1
这里 R = E{ Vj^2 }, 是测量噪声的协方差(阵), 即系统框图中的 Vj 的协方差, 为了简化,也当作一个常数矩阵。由于我们的系统一般是单输入单输出,所以 R是一个 1x1的矩阵,即一个常数,上面的公式可以简化为:
K = P C’ / (C P * C’ + R) - 状态变量反馈的误差量:
e = Z(k) – C*X(k)
这里的 Z(k) 是带噪声的测量,在项目中,一维输入信号C=1 - 更新误差相关矩阵P
P = P – K * C * P - 更新状态变量:
X =X + Ke = X + K (Z(k) – C*X(k)) - 最后的输出:
Y = C*X
在项目上,关键的是获取到Q、R、P,这3个数据需要通过实验统计获取,代码可以直接复用,其中参数需要自己择优选择