MATLAB 的过滤器:如何设置初始条件

MATLAB's filter: how to setup the initial conditions

我有一个非常简单的问题:生成 y_1, ..., y_n 这样

y_t = x_t + a * y_{t-1} + b * y_{t-2}

其中 a、b、x_1、...、x_n 已给出,y_0 和 y_{-1} 也是如此。我可以用 MATLAB 以两种方式做到这一点(在使用 filter 之前使用循环和一些手动调整)。如何使用 filter?

的初始条件的内置余量来执行此操作

我的代码如下:

clc; clear; tic;

n        = 20;
x        = (1:1:n)';  %//' this is here so code looks good in SO.com
yzero    = -3;
yminus1  = -4;
a        = 1;
b        = 1;
yinitial = [yminus1;yzero];

% alternative 1
y = zeros(n,1);
for i = 1:n
    if i == 1
        y(1) = x(1) + a * yzero + b * yminus1;
    elseif i == 2
        y(2) = x(2) + a * y(1) + b * yzero;
    else
        y(i) = x(i) + a * y(i-1) + b * y(i-2);
    end
end

% alternative 2
z    = x;
z(1) = z(1) + a * yzero + b * yminus1;
z(2) = z(2)             + b * yzero;
s    = filter(1,[1,-a,-b],z);

% alternative 3
r    = filter(1,[1,-a,-b],x,yinitial);


toc;

我希望得到 ysr 的相同答案。但是只有 ys 是相同的,而 r 是非常不同的。请问我做错了什么?

初始条件的第一个元素在第三个备选方案中略有偏差。

您使用初始条件:

yinitial =

    -4
    -3

但正确的是

yinitialFix =

    -7
    -3

为什么?在备选方案 3 中调用 filter 的第 4 个参数包含初始条件:in 以便执行这些初始步骤:

x(1) = x(1) + yinitialFix(1)
x(2) = x(2) + yinitialFix(2)

因此,在您的初始步骤中,您实际上(隐含地)计算了备选方案 2 中 yinitialFix 的正确值:

  • 初始步骤将 z(1) 移动 a * yzero + b * yminus1 = -7
  • 同理,z(2) 移位 b * yzero = -3

应用修复后,备选方案 3

%// ...
%// alternative 3;
yinitialFix = [-7; -3];
r    = filter(1,[1,-a,-b],x,yinitialFix);

产生与前两个相同的结果。

对于备选方案 3,像我一样使用 yinitial 是不正确的。这里有两种修复方法。首先,我需要重新定义 yinitial:

yinitial = [yzero;yminus1];

然后,我从

得到xinitial
xinitial = filter([b,a],1,yinitial);
xinitial = xinitial(end:-1:1);

来自

xinitial = filtic(1,[1,-a,-b],yinitial);

然后,我打电话给

r        = filter(1,[1,-a,-b],x,xinitial);