【 MATLAB 】使用 impz 函数计算并画出脉冲响应

举报
李锐博恩 发表于 2021/07/15 23:34:24 2021/07/15
【摘要】 这篇博文在于讨论 impz 函数的使用。 MATLAB帮助文档对impz的介绍:【 MATLAB 】impz函数介绍(数字滤波器的脉冲响应) 我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。 帮助文档上对这个函数的概括是数字滤波器的脉冲响应。 所谓的数字滤波...

这篇博文在于讨论 impz 函数的使用。

MATLAB帮助文档对impz的介绍:【 MATLAB 】impz函数介绍(数字滤波器的脉冲响应)

我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。

帮助文档上对这个函数的概括是数字滤波器的脉冲响应。

所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:

或者由差分方程给出:

上面的系数用系数向量表示为:

分母系数为:a = [1,a(2),...,a(n_a +1)]

分子系数为:b = [b(1),b(2),...,b(n_b+1)]

因此,impz函数的语法格式有这么一条:

[h,t] = impz(b,a)

这里的b和a向量就是分子和分母系数的向量。

得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。

对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:

impz(...) with no output arguments plots the impulse response of the filter.

意思是直接画出该系统的脉冲响应。


我们举个例子来理解:

这个系统使用差分方程来描述如下:

y(n) - y(n-1) + 0.9y(n-2) = x(n)

要求计算并画出它的脉冲响应。

题解:

跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。


  
  1. b = [1];
  2. a = [1,-1,0.9];
  3. [h,t] = impz(b,a)
  4. stem(t,h);
  5. title('Impulse Response');
  6. xlabel('n');ylabel('h(n)');

也可以:


  
  1. clc
  2. clear
  3. close all
  4. b = [1];
  5. a = [1,-1,0.9];
  6. impz(b,a);
  7. ylim([-1.2,1.2]);

上面两种方法画出的脉冲响应其实是一样的。


上面这个简单的用法也就告一段落,下面我们再看一条变体语法:

[h,t] = impz(...,n) computes n samples of the impulse response when n is an integer (t = [0:n-1]'). If n is a vector of integers, impz computes the impulse response at those integer locations, starting the response computation from 0 (and t = n or t = [0 n]). If, instead of n, you include the empty vector, [], for the second argument, the number of samples is computed automatically.
只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。

[h,t] = impz(...,n)

后面的这个n是什么玩意?

它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。

同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。

这个系统使用差分方程来描述如下:

y(n) - y(n-1) + 0.9y(n-2) = x(n)

要求计算并画出在n = -20,...,100 的脉冲响应h(n)。

脚本程序如下:


  
  1. clc
  2. clear
  3. close all
  4. b = [1];
  5. a = [1,-1,0.9];
  6. n = [-20:120]';
  7. impz(b,a,n);
  8. ylim([-1.2,1.2]);

这里的n是一个行向量或者一个列向量,无关紧要。

也可以使用下面的方法来产生:


  
  1. clc
  2. clear
  3. close all
  4. b = [1];
  5. a = [1,-1,0.9];
  6. n = [-20:120]';
  7. [h,t] = impz(b,a,n)
  8. stem(t,h);
  9. title('Impulse Response');
  10. xlabel('n');ylabel('h(n)');

上面画图的函数stem(t,h),也可以改成stem(n,h)。

这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。

可以使用这条语句进行验证:

n == h

可以得到一个和n同维度的向量,元素全为1.(可自行验证。)

最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.



再给出一个例子:

首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:

【 MATLAB 】ellip 函数介绍(椭圆滤波器设计)

设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。


  
  1. clc
  2. clear
  3. close all
  4. %
  5. % Impulse Response of an Elliptic Lowpass Filter
  6. % Design a fourth-order lowpass elliptic filter with normalized passband frequency 0.4.
  7. % Specify a passband ripple of 0.5 dB and a stopband attenuation of 20 dB.
  8. % Plot the first 50 samples of the impulse response.
  9. [b,a] = ellip(4,0.5,20,0.4);
  10. impz(b,a,50)

 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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