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;
我希望得到 y
、s
和 r
的相同答案。但是只有 y
和 s
是相同的,而 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);
我有一个非常简单的问题:生成 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;
我希望得到 y
、s
和 r
的相同答案。但是只有 y
和 s
是相同的,而 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);