Kalman五方程
一维滤波器仅考虑前后两个过程
当前测量值(输入)为
当前状态变量(输出)为
历史状态变量(上一时刻输出)为
预测状态方程
预测协方差方程
卡尔曼增益方程
更新最优值方程
更新协方差方程
核心方程的理解
- 公式经过推导变形后得到最终的五个关键方程,很难从方程中还原物理含义
- 需要明确方程中各个变量的含义并加以区分
- 一维为Kalman滤波器最简单的情况,在一维的情况下,各个预测矩阵将退化为单一的数值
- 简单来说,卡尔曼滤波器是一个最优化自回归数据处理算法,通过协方差的反馈对预测调整
- 协方差,可以理解为衡量两者相关程度的变量,数值越大,两个变量越相关(相互影响)
- 可以参考文末其他资料进一步深刻理解:参考资料
仿真测试
matlab代码
%滤波器本体%输入:当前测量值%输出:当前状态量(滤波器实际输出)function Output = Kalmanfilter(zk)% 输入序列窗口,这里没有实际作用,仅为方便向多维扩展global x_Array;global M;global LastP; % 上次估算协方差global Now_P; % 当前估算协方差global out; % 卡尔曼滤波器输出global Kg; % 卡尔曼增益global Q; % 过程噪声协方差global R; % 观测噪声协方差% 更新选取的x_Array窗口序列x_cul = x_Array(M);%x_cul = x_Array(2:M);% 输入序列窗口填充,这里没有实际作用,仅为方便向多维扩展x_cul(M) = zk;x_Array = x_cul;% 上面这一块,在一维情况下等效为% x_Array = zk;% 预测状态方程out=out;% 预测协方差方程Now_P=LastP+Q;% 卡尔曼增益方程Kg=Now_P/(Now_P+R);% 更新最优值方程out=out+Kg*(x_Array-out);% 更新协方差方程LastP=(1-Kg)*Now_P;Output = out;end
输入测试信号
- 同LMS自适应滤波器作比较,同样输入混有高斯白噪声干扰的1Hz有用信号,对比观测Kalman滤波器效果
N = 2000;fs = 200;%(Hz)t = (0:N-1)/fs;Freq = (0:N-1)*fs/N;%有用信号f1 = 1;%HzInput_1 = 5*sin(2*pi*f1*t);%产生一个高斯白噪声信号Input_2 = wgn(1,N,2);Input = Input_1+Input_2;Input_fft = fft(Input);%----------滤波器-------------------------------------------------global LastP;%上次估算协方差 初始化值为0.02global Now_P;%当前估算协方差 初始化值为0global out;%卡尔曼滤波器输出 初始化值为0global Kg;%卡尔曼增益 初始化值为0global Q;%过程噪声协方差 初始化值为0.001global R;%观测噪声协方差 初始化值为0.543LastP = 0.02;Now_P = 0;out = 0;Kg = 0;Q = 0.005;R = 0.5;global M;global x_Array;M = 1; % 滤波器阶数x_Array = zeros(1,M); % 输入窗口Output = zeros(1,length(Input));% 调用滤波器for N = 1:length(Input)Output(N) = Kalmanfilter(Input(N));endfigure(1);hold on;plot(t,Input,'r');plot(t,Output,'b');%对输出信号做傅里叶变换Output_fft = fft(Output);%经过滤波器前后数据频域对比figure(2);hold on;plot(Freq,abs(Input_fft),'r');plot(Freq,abs(Output_fft),'b');
滤波效果
- 时域上

- 红线为混有干扰的1Hz信号波形
- 蓝线为经滤波器处理后的信号
- 可以看到明显的噪声带来的毛刺得到了抑制
- 相较于LMS滤波器的收敛速度更快,波形更稳定
- 频域上

- 频域上也可以看出高频的噪声得到了有效的抑制
性能对比
- Kalman滤波

- LMS滤波

- 通过对比可以得知
- Kalman滤波器比LMS滤波器的收敛速度更快,LMS需要经历一段时间学习后才可正常工作
LMS滤波器正常工作后的波形比Kalman滤波器的输出波形更平滑,更能抵抗突变量的影响
在实际使用中
- Kalman滤波器的可调参数较多,想要达到理想的滤波效果调试周期较长,而LMS仅需调整阶数和学习率即可
Kalman滤波器仅需输入信号即可工作,而LMS滤波器需要纯净的噪声用来学习,条件较难实现
综合来看
- Kalman滤波器似乎更能适应实际需求
参考资料
- 通俗理解卡尔曼滤波及其算法实现
https://blog.csdn.net/tiandijun/article/details/72469471
- 卡尔曼滤波器算法原理以及C语言实现
https://blog.csdn.net/CSDN_X_W/article/details/90289021
- 卡尔曼滤波的基本原理及应用
