【 MATLAB 】使用 residuez 函数求 z 反变换的几个案例分析

举报
李锐博恩 发表于 2021/07/15 04:59:23 2021/07/15
【摘要】 这篇博文属于我的专栏:数字信号处理的MATLAB实现里面的内容,专栏中给出了这一系列博文的集合,有兴趣的可以关注下。 上篇博文讲解了 residuez 函数的基础知识: 【 MATLAB 】residuez 函数介绍(Z变换部分分数扩展) 这篇博文就给出几个案例来练练手。 案例1: 为了校核留数计算,考虑下面的有理函数: 使用residuez对其进行讨论。 ...

这篇博文属于我的专栏:数字信号处理的MATLAB实现里面的内容,专栏中给出了这一系列博文的集合,有兴趣的可以关注下。


上篇博文讲解了 residuez 函数的基础知识:

【 MATLAB 】residuez 函数介绍(Z变换部分分数扩展)

这篇博文就给出几个案例来练练手。

案例1:

为了校核留数计算,考虑下面的有理函数:

X(z)=\frac{z}{3z^2-4z+1}

使用residuez对其进行讨论。

题解:

先将这个有理函数重新整理为以z^-1升幂的函数:

X(z)=\frac{z^{-1}}{3-4z^{-1}+z^{-2}}=\frac{0+z^{-1}}{3-4z^{-1}+z^{-2}}

现在利用residuez函数来求它的留数部分、极点以及直接项:


  
  1. clc;clear;close all;
  2. b = [0,1];
  3. a = [3,-4,1];
  4. [r,p,c] = residuez(b,a)

得到:

r =

    0.5000
   -0.5000


p =

    1.0000
    0.3333


c =

     []

这说明了:

X(z)= \frac{0.5}{1-z^{-1}}- \frac{0.5}{1-\frac{1}{3}z^{-1}}

同样,我们利用residuez函数返回它的有理多项式形式:


  
  1. clc;clear;close all;
  2. b = [0,1];
  3. a = [3,-4,1];
  4. [r,p,c] = residuez(b,a);
  5. [b,a] = residuez(r,p,c)

b =

   -0.0000    0.3333


a =

    1.0000   -1.3333    0.3333

这样:

X(z)= \frac{0+\frac{1}{3}z^{-1}}{1-\frac{4}{3}z^{-1}+\frac{1}{3}z^{-2}}  =\frac{z^{-1}}{3-4z^{-1}+z^{-2}}  = \frac{z}{3z^2-4z + 1}

 

可见,和之前有理函数一致。


案例2:

求:

X(z) = \frac{1}{(1-0.9z^{-1})^2(1+0.9z^{-1})},\left | z \right | > 0.9

的z反变换。

题解:

从分母多项式中可以看出分母多项式的根分别为:0.9,0.9,-0.9,因此可以使用poly函数求出分母多项式的系数,关于poly函数见博文:

【 MATLAB 】poly 函数介绍

延伸:

【 MATLAB 】roots 函数介绍(多项式根)


  
  1. clc;clear;close all;
  2. b = 1;
  3. a = poly([0.9, 0.9, -0.9])
  4. [r,p,c]=residuez(b,a)

a =

    1.0000   -0.9000   -0.8100    0.7290


r =

   0.2500 + 0.0000i
   0.2500 + 0.0000i
   0.5000 - 0.0000i


p =

  -0.9000 + 0.0000i
   0.9000 + 0.0000i
   0.9000 - 0.0000i


c =

     []

这样:

X(z) = \frac{0.25}{1-0.9z^{-1}}+\frac{0.5}{(1-0.9z^{-1})^2} + \frac{0.25}{1+0.9z^{-1}},\left | z \right | > 0.9

=\frac{0.25}{1-0.9z^{-1}}+\frac{0.5}{0.9}z\frac{0.9z^{-1}}{(1-0.9z^{-1})^2} + \frac{0.25}{1+0.9z^{-1}},\left | z \right | > 0.9

由常用函数的z变换以及z变换的性质,可得z反变换:

x(n) = 0.25(0.9)^nu(n)+\frac{5}{9}(n+1)(0.9)^{n+1}u(n+1)+ 0.25(-0.9)^nu(n)

进一步化简:

x(n)= 0.75(0.9)^nu(n)+ 0.5n(0.9)^nu(n)+0.25(-0.9)^nu(n)


MATLAB验证环节:

我们的思路是将X(z)方程有理传递函数,那么x(n)就相当于单位脉冲响应,如果系统输入一个单位脉冲信号,那么输出还是x(n).

这样,我们就可以使用filter函数进行验证x(n)是否正确了。

脚本使用到了单位样值函数:


  
  1. function [x,n]=impseq(n0,n1,n2);
  2. % generate x(n) = delta(n - n0); n1 <= n <= n2
  3. %_____________________________________________
  4. %[x,n] = impseq(n0, n1, n2);
  5. %
  6. n = [n1:n2];
  7. x = [(n-n0) == 0];

直接给出MATLAB脚本:


  
  1. clc;clear;close all;
  2. b = 1;
  3. a = poly([0.9, 0.9, -0.9])
  4. [delta,n] = impseq(0,0,7);
  5. x = filter(b,a,delta);
  6. subplot(2,1,1);
  7. stem(n,x,'filled');
  8. title('x(n) by impulse response');
  9. x = 0.75 * (0.9).^n + 0.5 * n .* (0.9).^n + 0.25 * (-0.9).^n;
  10. subplot(2,1,2);
  11. stem(n,x);
  12. title('x(n) in z inverse transform');

可见,这里的z反变换是正确的。

 

 

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/83446872

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。