1、一连续平稳的随机信号,自相关函数,信号为加性噪声所干扰,噪声是白噪声,测量值的离散值为已知。。。。。。自编卡尔曼滤波递推程序,估计信号的波形
以下为相关matlab代码
clc,clear all,close all
% 导入数据
Z = [-3.2,-0.8,-10,-16,-17,-18,-3.3,-2.4,-18,-0.3,-0.4,-0.8,-19,-2,-1.2,-11,-14,-0.9,0.8,10,0.2,0.5,-0.5,2.4,-0.5,0.5,-13,0.5,10,-12,0.5,-0.6,-15,-0.7,15,0.5,-0.7,-2.0,-19,-17,-11,-14];
T= 0.02;
x= [0;0];
F = [1 T
0 1 ];
H = [1 0 ];
Q =[0.5, 1; 1, 0.5]; % 过程噪声协方差矩阵
P=diag([1,1]); % 协方差矩阵
R =1; % 观测噪声方差
for k=1:length(Z)
[x,P] = kalman_filter(x, P, F, Q, H, R, Z(:,k));
result(:,k)=x;
end
plot(1:length(Z),Z,'r-',1:length(Z),result(1,:),'b-');
xlabel('采样点数');ylabel('信号幅值');
function [x,P] = kalman_filter(x1, P1, F, Q, H, R, Z)
% x1 为前一时刻状态值
% P1 为前一时刻协方差矩阵
% F 为状态转移矩阵
% Q 为过程噪声的协方差矩阵
% H 为观测矩阵
% R 为观测噪声协方差
% Z 为观测值
x = F * x1; %% X(k|k-1) = F(k)*X(k|k-1)
P = F * P1 * F'+Q;% 协方差的一步预测
%% 更新
Z1 = H*x; %观测的预测
K = P*H'/(H*P*H'+R);% 卡尔曼增益
x = x+K*(Z-Z1); % 状态更新
P = P- K*H*P; % 协方差更新
end
以下是卡尔曼滤波的使用大致流程: