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

时间:2016-03-10 18:46:41

标签: matlab signal-processing convolution

我有一个非常简单的问题:生成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}也是如此。我可以通过2种方式使用 MATLAB 执行此操作(使用过滤器之前使用循环并进行一些手动调整)。如何使用过滤器的初始条件的内置容差?

我的代码如下:

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非常不同。我做错了什么?

2 个答案:

答案 0 :(得分:1)

在第三种选择中,初始条件的第一个元素稍微偏离。

您使用初始条件:

yinitial =

    -4
    -3

但正确的是

yinitialFix =

    -7
    -3

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

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);

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

答案 1 :(得分:0)

对于备选方案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);