如何确定卡尔曼滤波器中的初始值

信息处理 matlab 卡尔曼滤波器
2022-02-23 18:51:08

我有 EEG 信号并从中提取 PSD 特征,然后必须对其应用降噪算法,我使用卡尔曼滤波器,

  1. 但是论文中的输出信号比我的输出要平滑得多,并且

  2. 在我的情况下,垂直轴不同

我认为这是因为卡尔曼滤波器初始化;初始状态和预测。

这是我的输出和纸张输出。

  • 论文输出:

    在此处输入图像描述

  • 矿 :

    在此处输入图像描述

这是MATLAB代码:

N = length(z);          % number of Klamn filter iterations
Qfactor = 1;            % process noise mult factor
Rfactor = 1;          % measurement noise mult factor
F = [ 1   2            % update matrix  
      0   1 ];
H = [ 1   0 ];            % measurement matrix
sigmaQ = 5e-5;  
sigmaR = 1;
Q = sigmaQ^2 * [ 8/3  2     % process noise covariance matrix
                  2   2 ];
R = sigmaR^2 * [ 1 ];         % measurement noise covariance
P = zeros(2, 2, N);
x = zeros(2, N);
x(:,1) = [ 0
           0 ];
P(:,:,1) = Q;

for i=2:N
    [xpred, Ppred] = predict(x(:,i-1), P(:,:,i-1), F, Q);
    [nu, S] = innovation(xpred, Ppred, z(i), H, R);
    [x(:,i), P(:,:,i)] = innovation_update(xpred, Ppred, nu, S, H);
end

情节(x(1,2:N),'b');

功能:

  • 预言

    函数 [xpred, Ppred] = predict(x, P, F, Q)
     xpred = F * x;
     Ppred = F * P * F' + Q;
  • 创新:

    函数 [nu, S] = 创新(xpred, Ppred, z, H, R)
     nu = z - H * xpred; %% 创新
     S = R + H * Ppred * H'; %% 创新协方差

  • 和创新更新:

    函数 [xnew, Pnew] = innovation_update(xpred, Ppred, nu, S, H)
     K = Ppred * H' * inv(S); %% 卡尔曼增益
     xnew = xpred + K * nu;%% 新状态
     Pnew = Ppred - K * S * K'; %% 新协方差

1个回答

但是论文中的输出信号比我的输出要平滑得多,并且

我不知道我们指的是哪篇论文,但你会平滑你的输出以进行绘图的情况并不少见 - 指定你是如何做到的就足够了,但请注意,遗憾的是这并不意味着每个人都坚持到那种做法。

在我的情况下,垂直轴不同

这可能只是一个缩放错误,不一定是坏事。同样,我们不知道哪篇论文是关于哪篇论文的,以及您是否正在处理完全相同的数据,但仅凭您的线更细并且看起来有更多点这一事实表明他们应用了一些平滑和/或归一化.

我认为这是因为卡尔曼滤波器初始化;初始状态和预测。

我没有看到这方面的迹象。相反,假设事情收敛,我会说你的初始状态很好。