Matlab 使用filter求解系统响应
MATLAB 提供了函数filter
,可以实现差分方程的递规求解。
设差分方程的形式为\(a_0y(n) + a_1y(n-1) + \cdots + a_my(n-m)=b_0x(n)+b_1x(n-1)+\cdots+b_sx(n-s)\)
基本的调用方法:
yn = filter(B, A, xn)
- \(B = [b_0, \cdots, b_s], A = [a_0, \cdots, a_m]\);
xn
是输入信号;yn
是输入信号通过系统的零状态响应。
如果输入是单位脉冲函数,则输出就是系统单位脉冲响应。
yn = filter(B, A, xn, xi)
- 前3个参数的用法同上。
xi
是等效初始条件序列,一般是通过调用函数filtic
得到的。yi
是由系统初始状态引起的零输入相应和输入信号引起的零状态相应之和,即全响应。
xi = filtic(B, A, ys, xs)
- 参数
B,A
的用法如上 ys
和xs
表示的输入和输出在\(n_0\)时刻之前的初始条件:\(ys =[y(-1),y(-2),\cdots, y(-N)]\),\(xs=[x(-1),x(-2),\cdots, x(-N)]\)。如果系统是因果系统,显然输入为0,即xs = 0
,此时可以省略xs
。
例子
- 求系统的单位脉冲响应和零输入相应
% 滑动平均滤波器的差分方程如下
% y(n) = 1/5 * (x(n) + x(n-1) + x(n-2) + x(n-3) + x(n-4))
windowSize = 5;
B = ones(1, windowSize) / windowSize;
A = 1;
% 求该系统的单位脉冲响应
subplot(411)
delta = [1, zeros(1,33)]; % 单位脉冲信号
y0 = filter(B, A, delta);
stem(0:length(y0)-1, y0)
title('单位脉冲响应')
% 求系统在某个输入信号下的零状态响应
% 输入信号
subplot(412)
xn = [ones(1, 32), zeros(1,4)];
xn(13)=2; xn(16)=0.5;xn(20)=1.5;
stem(0:length(xn)-1, xn);
title('输入信号')
% 零状态相应
subplot(413)
yn = filter(B, A, xn, xi);
stem(0:length(yn)-1, yn);
title('零状态相应输出')
% 卷积验证
subplot(414)
yc = conv(xn, y0)
stem(0:length(yc)-1, yc)
title('卷积验证')
xlim([0, 35])
运行结果:
- 求系统的全响应
% 设因果系统 y(n) = 0.8*y(n-1) + x(n),输入为x(n)=\delta(n)
% 在不同初始条件下的输出:(1)y(-1)=0; (2) y(-1)=1
A = [1, -0.8];
B = 1;
xn = [1, zeros(1, 30)];
% y(-1)=0, 输出即是零状态输入
subplot(211)
y0 = filter(B, A, xn);
stem(0:length(y0)-1, y0)
title('初始状态为y(-1)=0')
ylim([0, 2])
% y(-1)=1
subplot(212)
ys = 1; % 初始状态
xi = filtic(B, A, ys);
yn = filter(B, A, xn, xi);
stem(0:length(yn)-1, yn);
title('初始状态为y(-1)=1')
ylim([0, 2])
运行结果