MATLAB信号处理---学习小案例(11)---离散系统中的Z域描述

线性时不变离散系统可用线性常系数差分方程描述,即 ∑ i = 0 N a i y ( n − i ) = ∑ j = 0 M b j x ( n − j ) \sum_{i=0}^Na_iy(n-i)=\sum_{j=0}^Mb_jx(n-j) i=0Naiy(ni)=j=0Mbjx(nj),其中, y ( k ) y(k) y(k)为系统的输出序列, x ( k ) x(k) x(k)为输出序列。将上式两边进行Z变换得到 H ( z ) = Y ( z ) X ( z ) = ∑ j = 0 M b j z − j ∑ i = 0 N a i z − i = B ( z ) A ( z ) H(z)=\frac{Y(z)}{X(z)}=\frac{\sum_{j=0}^Mb_jz^{-j}}{\sum_{i=0}^Na_iz^{-i}}=\frac{B(z)}{A(z)} H(z)=X(z)Y(z)=i=0Naizij=0Mbjzj=A(z)B(z),因式分解后有 H ( z ) = C ∏ j = 1 M ( z − q j ) ∏ i = 1 N ( z − p i ) H(z)=C\frac{\prod_{j=1}^{M}(z-q_j)}{\prod_{i=1}^{N}(z-p_i)} H(z)=Ci=1N(zpi)j=1M(zqj),其中,C为常数, q j ( j = 1 , 2 , … … , M ) q_j(j=1,2,……,M) qj(j=1,2,M) H ( z ) H(z) H(z)的M个零点, p i ( i = 1 , 2 , … … , N ) p_i(i=1,2,……,N) pi(i=1,2,N) H ( z ) H(z) H(z)的N个零点。系统函数 H ( z ) H(z) H(z)的零极点分布完全决定了系统的特性,若某系统函数的零极点已知,则系统函数便可确定下来。

离散系统函数频域分析

离散系统的频率响应 H ( e j w ) H(e^{jw}) H(ejw)对于某因果稳定离散系统,如果激励序列为正弦序列 x ( n ) = A s i n ( w 0 n ) u ( n ) x(n)=Asin(w_0n)u(n) x(n)=Asin(w0n)u(n),则系统的稳态响应为 y s s ( n ) = A ∣ H ( e j w ) ∣ s i n [ w n + φ ( w ) ] u ( n ) y_{ss}(n)=A|H(e^{jw})|sin[wn+\varphi (w)]u(n) yss(n)=AH(ejw)sin[wn+φ(w)]u(n)

定义离散系统的频率响应为 H ( e j w ) = H ( z ) ∣ z = e j w = ∣ H ( e j w ) ∣ e j φ ( w ) H(e^{jw})=H(z)|_{z=e^{jw}}=|H(e^{jw})|e^{j\varphi(w)} H(ejw)=H(z)z=ejw=H(ejw)ejφ(w),其中, ∣ H ( e j w ) ∣ |H(e^{jw})| H(ejw)为离散系统的幅频特性; φ ( w ) \varphi(w) φ(w)为离散系统的相频特性; H ( e j w ) H(e^{jw}) H(ejw)是以 2 π 2\pi 2π为周期的周期函数,只要确定 H ( e j w ) H(e^{jw}) H(ejw) ∣ w ∣ ⩽ π |w| \leqslant \pi wπ范围内的情况,便可分析出系统的整个频率特性。

利用几何矢量求解离散系统的频响,设 e j w − p i = A i e j θ i , e j w − q j = B j e j ψ j e^{jw}-p_i=A_ie^{j\theta_i},e^{jw}-q_j=B_je^{j\psi_j} ejwpi=Aiejθiejwqj=Bjejψj,那么,离散系统的频率响应为 H ( e j w ) = ∏ j = 1 M B j e j ( ψ 1 + ψ 2 + … … + ψ M ) ∏ i = 1 N A i e i ( θ 1 + θ 2 + … … + θ N ) = ∣ H ( e j w ) ∣ e j φ ( w ) H(e^{jw})=\frac{\prod_{j=1}^{M}B_je^{j(\psi_1+\psi_2+……+\psi_M)}}{\prod_{i=1}^{N}A_ie^{i(\theta_1+\theta_2+……+\theta_N)}}=|H(e^{jw})|e^{j\varphi(w)} H(ejw)=i=1NAiei(θ1+θ2++θN)j=1MBjej(ψ1+ψ2++ψM)=H(ejw)ejφ(w),那么,系统的幅频特性和相频特性分别为 H ( e j w ) = ∏ j = 1 M B j ∏ i = 1 N A i , φ ( w ) = ∏ j = 1 M ψ j − ∏ i = 1 N θ i H(e^{jw})=\frac{\prod_{j=1}^{M}B_j}{\prod_{i=1}^{N}A_i},\varphi(w)=\prod_{j=1}^{M}\psi_j-\prod_{i=1}^{N}\theta_i H(ejw)=i=1NAij=1MBjφ(w)=j=1Mψji=1Nθi

利用MATLAB求解频率响应的过程如下:

1. 根据系统函数H(z)定义分子、分母多项式系统向量B和A
2. 调用函数ljdt求出H(z)的零极点,并绘出零极点图
3. 定义Z平面单位圆上的k个频率分点
4. 求出H(z)所有的零点和极点到这些等分点的距离
5. 求出H(z)所有的零点和极点到这些等分点矢量的相角
6. 求出系统的$|H(e^{jw})|$和$\varphi(w)$
7. 绘制指定范围内系统的幅频曲线和相频曲线

在MATLAB中,函数freqz用于求离散时间系统频响特性,该函数的调用方法如下:

[H,w]=freqz(B,A,N)
[H,w]=freqz(B,A,N,'whole')

其中,B与A分别表示H(z)的分子与分母多项式的系数向量,N为正整数,默认值为512;返回值w包含 [ 0 , π ] [0,\pi] [0,π]范围内的N个频率等分点,返回值H则是离散时间系统频率响应 H ( e j w ) H(e^{jw}) H(ejw) [ 0 , π ] [0,\pi] [0,π]范围内N个频率处对应的值。

例:绘制离散系统的频响曲线 H ( z ) = z − 1.3 z H(z)=\frac{z-1.3}{z} H(z)=zz1.3

运行程序如下:

B=[1 -1.3];
A=[1 0];
[H,w]=freqz(B,A,400,'whole');
Hf=abs(H);
Hx=angle(H);
clf;
subplot(121);
plot(w,Hf);
title('离散系统幅频特性曲线');
xlabel('频率');
ylabel('幅度');
grid on;
subplot(122);
plot(w,Hx);
xlabel('频率');
ylabel('幅度');
grid on;
title('离散系统相频特性曲线');

结果:
在这里插入图片描述
例:绘制离散系统的幅频响应和相频响应

clear all;close all;clc;
w=(-4*pi:0.001:4*pi) + eps;
X=1./(1-0.6*exp(-j*w));
subplot(211);
plot(w/pi,abs(X),'lineWidth',2);
xlabel('\omega/\pi');
ylabel('|H(e^j^\omega)|');
title('幅度响应');
axis([-3.2 3.2 0.5 2.2]);
grid;
subplot(212);
plot(w/pi,angle(X),'lineWidth',2);
xlabel('\omega/\pi');
ylabel('\theta(\omega)');
title('相频响应');
axis([-3.2 3.2 -0.6 0.6]);
grid;
set(gcf,'color','w');

运行结果:
在这里插入图片描述
离散系统函数零点分析
离散时间系统的函数定义为 H ( z ) = Y ( z ) X ( z ) H(z)=\frac{Y(z)}{X(z)} H(z)=X(z)Y(z)
如果系统函数的有理函数表达式为 H ( z ) = b 1 z m + b 2 z m − 1 + … … + b m z + b m + 1 a 1 z n + a 2 z n − 1 + … … + a n z + a n + 1 H(z)=\frac{b_1z^m+b_2z^{m-1}+……+b_mz+b_{m+1}}{a_1z^n+a_2z^{n-1}+……+a_nz+a_{n+1}} H(z)=a1zn+a2zn1++anz+an+1b1zm+b2zm1++bmz+bm+1
在MATLAB中,系统函数的零极点可以通过函数roots得到,也可以借助函数tf2zp得到,tf2zp的语句格式为

[Z,P,K] = tf2zp(B,A)

其中,B与A分别表示H(z)的分子与分母多项式的系数向量。它的作用是将H(z)的有理分式表示为零极点增益形式 H ( z ) = k ( z − z 1 ) ( z − z 2 ) … … ( z − z m ) ( z − p 1 ) ( z − p x ) … … ( z − p n ) H(z)=k\frac{(z-z_1)(z-z_2)……(z-z_m)}{(z-p_1)(z-p_x)……(z-p_n)} H(z)=k(zp1)(zpx)(zpn)(zz1)(zz2)(zzm)

函数zplane用于绘制H(z)的零极点图,该函数的调用格式为

zplane(z,p)

绘制出列向量z中的零点(以符号“。”表示)和列向量p中的极点(以符号“X”表示),以及参考单位圆,并在多阶零点和极点的右上角标出其阶数。如果z和p为矩阵,则会以不同的颜色绘出z和p各列中的零点和极点

例:已知某离散系统的系统函数为 H ( z ) = 2 z + 1 3 z 5 − 2 z 4 + 1 H(z)=\frac{2z+1}{3z^5-2z^4+1} H(z)=3z52z4+12z+1
试用MATLAB求出该系统的零极点,并画出零极点分布图,判断该系统是否稳定。用函数roots求得 H ( z ) H(z) H(z)的零极点后,就可以用函数plot绘制出系统的零极点图。下面是求系统零极点,并绘制其零极点图的MATLAB实用函数ljdt,同时还绘制出了单位圆。

子程序如下:

function ljdt(A,B)
p = roots(A); %求系统的极点
q = roots(B); %求系统的零点
p = p'; %将极点列向量转置为行向量
q = q'; %将零点列向量转置为行向量
x = max(abs([p q 1])); %确定纵坐标范围
x = x + 0.1;
y = x; %确定横坐标范围
clf
hold on
axis([-x x -y y]); %确定坐标轴的显示范围
w = 0:pi/300:2*pi;
t = exp(i*w);
plot(t) %画单位圆
axis('square')
plot([-x x],[0 0]); %画横坐标轴
plot([0 0],[-y y]); %画纵坐标轴
text(0.1,x,'jIm[z]');
text(y,1/10,'Re[z]');
plot(real(p),imag(p),'x'); %画极点
plot(real(q),imag(q),'o');
title('零极点图');
hold off

运行程序如下:

a = [3 -2 0 0 0 1];
b = [2 1];
ljdt(a,b);
p = roots(a)
q = roots(b)
pa = abs(p)

运行结果:

p =

   0.8212 + 0.4270i
   0.8212 - 0.4270i
  -0.1367 + 0.7316i
  -0.1367 - 0.7316i
  -0.7024 + 0.0000i


q =

   -0.5000


pa =

    0.9256
    0.9256
    0.7442
    0.7442
    0.7024

在这里插入图片描述
例:各种系统零极点图的实现

运行程序如下:

%绘制a系统零极点分布图及系统单位序列响应
z = 0; %定义系统零点位置
p = 0.25; %定义系统极点位置
k = 1; %定义系统增益
subplot(221);
zplane(z,p);
grid on;
%绘制系统零极点分布图
subplot(222);
[num,den] = zp2tf(z,p,k);
impz(num,den);
%绘制系统单位序列响应时域波形
title('h(n)');
grid on;
%定义标题
%绘制b系统零极点分布图及系统单位序列响应
p = 1;
subplot(223);
zplane(z,p);
grid on;
[num,den] = zp2tf(z,p,k);
subplot(224);
impz(num,den);
title('h(n)');
grid on;

运行程序如下:
在这里插入图片描述
离散系统差分函数求解

连续函数f(t)经过采样后,获得采样函数f(kT),那么
一阶向前和向后差分形式分别为
Δ f ( k ) = f ( k + 1 ) − f ( k ) \Delta f(k)=f(k+1)-f(k) Δf(k)=f(k+1)f(k)
∇ f ( k ) = f ( k ) − f ( k − 1 ) \nabla f(k)=f(k)-f(k-1) f(k)=f(k)f(k1)
二阶向前和向后的差分形式分别为
Δ 2 f ( k ) = Δ f ( k + 1 ) = f ( k + 2 ) − 2 f ( k + 1 ) + f ( k ) \Delta ^2f(k)=\Delta f(k+1)=f(k+2)-2f(k+1)+f(k) Δ2f(k)=Δf(k+1)=f(k+2)2f(k+1)+f(k)
∇ 2 f ( k ) = ∇ [ Δ f ( k ) ] = f ( k ) − 2 f ( k − 1 ) + f ( k − 2 ) \nabla ^2f(k)=\nabla[ \Delta f(k)]=f(k)-2f(k-1)+f(k-2) 2f(k)=[Δf(k)]=f(k)2f(k1)+f(k2)
根据上式可以推导出向前和向后的n阶差分为
Δ n f ( k ) = Δ n − 1 f ( k + 1 ) − Δ n − 1 f ( k ) \Delta ^nf(k)=\Delta ^{n-1}f(k+1)-\Delta ^{n-1}f(k) Δnf(k)=Δn1f(k+1)Δn1f(k)
∇ n f ( k ) = Δ n − 1 f ( k ) − Δ n − 1 f ( k − 1 ) \nabla ^nf(k)=\Delta ^{n-1}f(k)-\Delta ^{n-1}f(k-1) nf(k)=Δn1f(k)Δn1f(k1)
连续系统的时间序列方程为 d 2 c ( t ) / d t 2 + a d c ( t ) / d t + b c ( t ) = k r ( t ) d^2c(t)/dt^2+adc(t)/dt+bc(t)=kr(t) d2c(t)/dt2+adc(t)/dt+bc(t)=kr(t)
上式中的微分用差分方程替代,则有
d 2 c ( t ) / d t 2 = Δ 2 c ( t ) = c ( k + 2 ) − 2 c ( k + 1 ) + c ( k ) d^2c(t)/dt^2=\Delta^2c(t)=c(k+2)-2c(k+1)+c(k) d2c(t)/dt2=Δ2c(t)=c(k+2)2c(k+1)+c(k)
d c ( t ) / d t = c ( k + 1 ) − c ( k ) dc(t)/dt=c(k+1)-c(k) dc(t)/dt=c(k+1)c(k)
推导到离散时间系统,c(k)代替c(t),r(k)代替r(t),则有
[ c ( k + 2 ) − 2 c ( k + 1 ) + c ( k ) ] + a [ c ( k + 1 ) − c ( k ) ] + b c ( k ) = k r ( k ) [c(k+2)-2c(k+1)+c(k)]+a[c(k+1)-c(k)]+bc(k)=kr(k) [c(k+2)2c(k+1)+c(k)]+a[c(k+1)c(k)]+bc(k)=kr(k)
整理得
c ( k + 2 ) + ( a − 2 ) c ( k + 1 ) + ( 1 − a + b ) c ( k ) = k r ( k ) c(k+2)+(a-2)c(k+1)+(1-a+b)c(k)=kr(k) c(k+2)+(a2)c(k+1)+(1a+b)c(k)=kr(k)
由此可以推导出一般离散系统的差分方程为
c ( k + n ) + a 1 c ( k + n − 1 ) + a 2 ( k + n − 2 ) + … … + a n c ( k ) = b 0 r ( k + m ) + b 1 r ( k + m − 1 ) + … … + b m r ( k ) c(k+n)+a_1c(k+n-1)+a_2(k+n-2)+……+a_nc(k)=b_0r(k+m)+b_1r(k+m-1)+……+b_mr(k) c(k+n)+a1c(k+n1)+a2(k+n2)++anc(k)=b0r(k+m)+b1r(k+m1)++bmr(k)
差分方程的解分为通解与特解,通解是与方程的初始状态有关的解,特解与外部输入有关,他描述系统在外部输入作用下的强迫运动

例:求解差分方程 y ( n ) − 0.5 y ( n − 1 ) − 0.45 y ( n − 2 ) = 0.55 x ( n ) + 0.5 x ( n − 1 ) − x ( n − 2 ) y(n)-0.5y(n-1)-0.45y(n-2)=0.55x(n)+0.5x(n-1)-x(n-2) y(n)0.5y(n1)0.45y(n2)=0.55x(n)+0.5x(n1)x(n2),其中 x ( n ) = 0. 7 n ε ( n ) x(n)=0.7^n \varepsilon (n) x(n)=0.7nε(n),初始状态 y ( − 1 ) = 1 , y ( − 2 ) = 2 , x ( − 1 ) = 2 , x ( − 2 ) = 3 y(-1)=1,y(-2)=2,x(-1)=2,x(-2)=3 y(1)=1,y(2)=2,x(1)=2,x(2)=3

运行程序如下:

num = [0.55 0.5 -1];
den = [1 -0.5 -0.45];
x0 = [2 3];
y0 = [1 2];
N = 50;
n = [0:N - 1]';
x = 0.7.^n;
Zi = filtic(num,den,y0,x0);
[y,Zf] = filter(num,den,x,Zi);
plot(n,x,'r-',n,y,'b--');
title('响应');
xlabel('n');
ylabel('x(n)-y(n)');
legend('输入x','输入y',1);
grid;

运行结果如下图:
在这里插入图片描述
例:编制程序求解下列两个系统差分方程的单位脉冲响应,并绘出其图形。
y [ n ] + 0.75 y [ n − 1 ] + 0.125 y [ n − 2 ] = x [ n ] − x [ n − 1 ] y[n]+0.75y[n-1]+0.125y[n-2]=x[n]-x[n-1] y[n]+0.75y[n1]+0.125y[n2]=x[n]x[n1]

运行程序如下:

clc;
N = 32;
x_delta = zeros(1,N);
x_delta(1) = 1;
p = [1,-1,0];
d = [1,0.75,0.125];
h1_delta = filter(p,d,x_delta);
subplot(211);
stem(0:N-1,h1_delta,'r');
hold off;
xlabel('方程1的单位脉冲序列');
x_unit = ones(1,N);
h1_unit = filter(p,d,x_unit);
subplot(212);
stem(0:N-1,h1_unit,'r');
hold off;
xlabel('方程1的阶跃响应');

运行结果如下:
在这里插入图片描述
参考文献:

  1. 《精通MATLAB信号处理》,沈再阳编写,清华大学出版社

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/113182074
今日推荐