使用 Matlab 的 filter() 函数求解具有初始条件的差分方程

信息处理 matlab 离散信号 无限脉冲响应 数字滤波器
2022-01-30 12:04:22

我正在尝试使用 Matlab 的filter函数求解具有初始条件的差分方程:

(1)y[n]=12y[n1]+x[n],y[1]=1

为了x[n]=6u[n], 计算y[n]用手给

(2)y[n]=[12(6y[1]/2)(12)n]u[n]

但是,产生的解决方案filter是不同的。有人能指出我的错误吗?

代码如下所示:

disp('Solution of a difference equation:')
% The example difference equation considered is
% y(n) = 0.5y(n-1) + x(n) 
num_coef = [ 1 ]; % coefficient of x
den_coef = [1 -0.5]; % coefficient of y
n = 0:4; % Considering five samples 
x = 6 * ones(1,5) % x(n) = 6u(n)
init_cond = [1];  % y(-1) = 1
y = filter(num_coef, den_coef, x, init_cond) % Solution returned by 'filter'
yM = 12 - (11/2)*(1/2).^n % Solution obtained manually
plot(y);hold on; % PLots for comparison
plot(yM,'r')
1个回答

问题是函数初始条件的定义filter()请注意,根据mathworks 参考页filter是使用直接形式 II 转置结构实现的。如果您查看相应的图表,您会看到过滤器状态(称为wk(m)图中)是在乘以各自的滤波器系数后定义的。

因此,在您的示例中,如果您想filter使用过去的输出值进行初始化y[1],您的初始状态由下式给出y[1]0.5因为那是延迟元素的输入值。

y = filter(num_coef, den_coef, x, 0.5)

应该给你预期的结果。

请注意,对于一般情况,有函数filtic,它根据过去的输出样本(以及,如果需要,过去的输入样本)计算必要的初始条件。对于您的示例,您将使用命令

zi = filtic(num_coef, den_coef, 1)

这导致zi = 0.5,如上所述。