跳转至

MATLAB 常用函数总结

功能/响应类型 连续系统 (Continuous) 离散系统 (Discrete)
定义系统 tf(b,a)zpk(z,p,k) tf(b,a,-1)zp2tf(z,p,k)
冲激响应 impulse(sys) impz(b,a,N)
阶跃响应 step(sys) stepz(b,a,N)
任意输入响应 lsim(sys,x,t) filter(b,a,x)conv(x,h)
频率响应 (幅频/相频) bode(sys)freqresp(sys) freqz(b,a,N)

绘图相关

连续图(幅频相频/连续时域)用plot(x,y)画,离散响应用stem(x,y)画。使用xlabel('xxx'),ylabel('xxx'),title('xxx')画xy坐标轴和标题,支持latex语法。

子图定义:使用subplot(m,n,p)后,plot就能绘制\(m\\times n\)图的第\(p\)个子图。如2006年题依次使用subplot(3,1,1), subplot(3,1,2), subplot(3,1,3)绘制幅频、相频、样值响应: alt text

离散系统相关

得到系统函数

已知系统零点\({z_1,,z_2,,\\cdots}\)极点\({p_1,,p_2,,\\cdots}\),即系统函数

\[ H(z)=k\\cdot \\frac{(z-z_1)\\cdot(z-z_2)\\cdots}{(z-p_1)\\cdot(z-p_2)\\cdots} \]

使用zp2tf

z = [z1;z2;...];   % 零点
p = [p1;p2;...];   % 极点
k = 1;       % 系统增益,可以调整
[b,a] = zp2tf(z,p,k);   % 转成分子分母多项式

即可得到系统函数\(H(z)=B(z)/A(z)\)。如果已知条件是差分方程

\[ a_0y\[n\]+a_1y\[n-1\]+\\cdots+a_py\[n-p\]=b_0x\[n\]+b_1x\[n-1\]+\\cdots+b_qx\[n-q\] \]

则直接令

b = [b0,b1,b2...bq];
a = [a0,a1,a2...ap];

即可。

画频率响应

频率响应即

\[ H(\\exp(j\\omega))=H(z){|} _{z=\\exp(j\\omega)} \]

使用函数freqz得到频率响应(复数形式)

[H,w] = freqz(b,a,512);

然后使用absangle得到模和相位, 使用plot画图。

subplot(2,1,1)
plot(w/pi, abs(H));
xlabel('归一化频率 \omega/\pi');
ylabel('|H(e^{j\omega})|');
title('幅度响应');
subplot(2,1,2);
plot(w/pi, angle(H));
xlabel('归一化频率 \omega/\pi');
ylabel('\phi(\omega)');
title('相位响应')

画时域响应

初值

yPast = [y(-1), y(-2), ...];
xPast = [x(-1), x(-2), ...];
zi = filtic(b,a,yPast,xPast);

得到初值zi,然后filter(b,a,x,zi)即可。

样值和阶跃

分别使用impzstepz绘制。如

h = impz(b,a,20);   % 前20个冲激响应
stem(0:19,h);
xlabel('n'); ylabel('h[n]');
title('单位样值响应');

一般信号的响应

对于已知的\(x\[n\]\), 只需要令

\[ y\[n\]=x\[n\]\*h\[n\] \]

即可得到其响应。matlab种使用函数conv(x,h)即可,其中himpz得到。同样也可以利用filter函数得到

y = filter(b,a,x);

其中系数矩阵[b,a]=zp2tf(z,p,k);对应

\[ H(z)=\\frac{B(z)}{A(z)} \]

\(x\[n\]\)可以通过对(0:N)作逐元素运算得到。这里(0:N)表示矩阵\(\[,0,,1,,2,,\\cdots,,N,\]\)