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;%Hz
Input_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.02
global Now_P;%当前估算协方差 初始化值为0
global out;%卡尔曼滤波器输出 初始化值为0
global Kg;%卡尔曼增益 初始化值为0
global Q;%过程噪声协方差 初始化值为0.001
global R;%观测噪声协方差 初始化值为0.543
LastP = 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));
end
figure(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
- 卡尔曼滤波的基本原理及应用