找回密码
 注册
关于网站域名变更的通知
查看: 1656|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-10-15 14:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

/ @3 H/ |) ]+ |1 g* C- V2 n这篇在于讨论 impz 函数的使用。! z/ n0 d: D$ z$ j) c
, o( k3 j- x$ l& o
MATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)
2 g& j  g, z( S8 H" a1 }6 `9 F0 g  R5 ]8 f- t$ `
我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。; i  C) P/ P# z) a$ C( z8 V
+ ^" u  A. ?/ p7 V- ~* N
帮助文档上对这个函数的概括是数字滤波器的脉冲响应。& x& t. ^4 U* w. Z# U+ s# j7 |$ p
, n! g) f1 a( U# U( F5 C
所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:
5 M# U! G9 R  o4 h% p( H- `" h8 b/ i$ M
9 X3 t: i7 [0 `9 p2 W# c
4 ^* g' k& S2 [2 k! f$ ~  V: n
或者由差分方程给出:4 j' i( W5 N' ]

" a" K' B$ t( |) P. w ; ?/ h$ U. [9 K, j+ h

9 r4 [- n' h) C; ^$ k9 `+ O5 t上面的系数用系数向量表示为:# }2 p6 x% S' T. T1 g( f
* _# b$ E* k: r
分母系数为:a = [1,a(2),...,a(n_a +1)] 8 l! f! H. K" z, b) ^1 c) i
分子系数为:b = [b(1),b(2),...,b(n_b+1)]
% d. I) ^2 _: ^9 [' Z& t7 y4 h/ G& D- r) ?8 P& E0 l+ T6 k3 r0 o4 Z4 |
因此,impz函数的语法格式有这么一条:
  u0 }5 d$ D% c* R0 {
5 @/ f% O4 ^5 C3 [3 \[h,t] = impz(b,a)
2 G* C* g5 w# }, b& @
8 O. h, W" E$ A& Y这里的b和a向量就是分子和分母系数的向量。
( h+ D, O* F- L6 u6 J! I$ h
3 j: `; @* Z1 |. w得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。
6 d% k5 y5 m& _% r7 f$ \: s: n
2 X7 r7 J( {3 P/ c  K对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:1 t$ W6 y" S. ^* I6 [9 a* `4 s
% ]$ C( X% E5 w% \% Y2 s: c
impz(...) with no output arguments plots the impulse response of the filter.
3 t+ j& f5 E! N* P1 I6 x% ?6 O* f7 S! ], y( k  M& e4 Y
意思是直接画出该系统的脉冲响应。
2 V. ]- q1 C: p8 F* r6 O5 T, Y; V/ ?$ {8 d. v, E0 [
我们举个例子来理解:
2 }) Z9 \3 H8 n3 u
/ y  P7 k  M7 Y7 l这个系统使用差分方程来描述如下:
% {' I3 Q8 r- E, T* Y- X% Y. F* @1 O  `" X+ S3 N
y(n) - y(n-1) + 0.9y(n-2) = x(n)' u% b9 I0 m; ?0 b1 _9 I

" H# r, w1 A$ h! [$ r要求计算并画出它的脉冲响应。
4 v7 B* T; U/ c4 s$ B: V' q! h! {! t1 e0 u# S
题解:
/ \6 f  |8 u; n8 v  x3 l# ^" `
# @- t0 b& N4 X跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。/ {. {0 E, r  z

0 v- s3 D& {: ~* w2 s7 A
  • b = [1];
  • a = [1,-1,0.9];
  • [h,t] = impz(b,a)
  • stem(t,h);
  • title('Impulse Response');
  • xlabel('n');ylabel('h(n)');% G2 ~! w( ?% R! A

5 B3 i; D, i7 c - Y/ i# H  R" t) M5 C
- ^# ]+ k* |7 T1 ^! s2 t* v6 w
7 @! n) j& C) s
也可以:4 y5 m1 u% ~( X& W2 q
" }- }+ s% {, n/ C1 T4 `  X/ f! R
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • impz(b,a);
  • ylim([-1.2,1.2]);
    : ~$ }1 f. m5 }6 v
   
; b4 l7 W8 k, t( x4 g& }% T) L6 ` 3 {* c2 U0 d7 a" u+ g

: B4 `* s3 ]# p5 C+ p% X: R上面两种方法画出的脉冲响应其实是一样的。3 E4 r6 k& b+ Z

4 [, N2 e; V& V: h上面这个简单的用法也就告一段落,下面我们再看一条变体语法:, o& u% o$ ?% Q& `0 ^
9 {* J, l: M+ v2 J4 A2 @3 E
[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.# q5 Z- `4 N1 u" h! y
只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。
" I& I) b2 ~  m" m. H8 N4 k- {) F) ~3 s" O
[h,t] = impz(...,n)
; v/ S6 R3 }: I$ H
9 _$ d* K6 p: r$ K# `后面的这个n是什么玩意?
2 @) r' n3 e( t
3 T+ c: Z" R1 |$ e% d它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。; X+ h- f% E- f  K# M  Z+ g
6 Z8 _9 a4 w2 `3 t6 C$ ?  a8 [& `/ O
同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。
% d3 `4 N4 e) y/ }9 ?+ k% w+ \' Z' I) M
9 \* G& }! i) M+ V0 n; y这个系统使用差分方程来描述如下:! q4 Y) }* P  E6 C! I
8 C/ `4 v( S8 ^) E5 G1 u$ R" V4 r
y(n) - y(n-1) + 0.9y(n-2) = x(n)+ |1 |, B8 I4 Z& V% z( w- R3 |

# q& ]% C/ n8 U4 X# R要求计算并画出在n = -20,...,100 的脉冲响应h(n)。
* }  a! m+ d4 C7 E. R8 S) L. z+ e* x9 h/ p( @* r. a8 C9 ~  d# Y7 x
脚本程序如下:+ s. d$ I( W2 u  n; Z
; @, z, u4 C% C% A3 o. @. q; j+ k
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • n = [-20:120]';
  • impz(b,a,n);
  • ylim([-1.2,1.2]);
    ( x1 ]( u& S% T7 v  ^, n# N

: G& c( ]) f9 d% P6 Z
2 A: W6 p+ t% d5 m% B $ X2 N0 ^5 N: [1 w# t# T0 r

6 ^; O2 J4 u: n# {$ ?6 g这里的n是一个行向量或者一个列向量,无关紧要。
, q* `9 L8 Y9 N0 j2 O
" m( b  W# D0 _8 Y7 @6 D1 v8 G也可以使用下面的方法来产生:
# D/ s5 S9 o4 U1 N) b' B* e' h9 d
: d+ l0 m* T; q0 w" n" e" c
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • n = [-20:120]';
  • [h,t] = impz(b,a,n)
  • stem(t,h);
  • title('Impulse Response');
  • xlabel('n');ylabel('h(n)');
    ( Q2 o# l0 Z2 S$ v( M
* |+ i- f+ i) Q4 \# ]

. n% h4 w4 ~% u$ l( C( m
: y2 V% ?  d& X% K6 J* ?- S' \7 j) G5 Y3 k
上面画图的函数stem(t,h),也可以改成stem(n,h)。; }0 @4 K* Z  m  g( Q

$ Z& V# P; _9 \) V& t6 i这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。2 K! f& S- ?: \- @( J& I6 H

/ I! c% C1 X8 p2 }5 t% r- K5 n可以使用这条语句进行验证:
- b, S7 e$ u  I3 o8 }9 f, P/ _+ T1 ]' a
n == h8 X$ m' b- q4 ]% U

" T% n. f$ `6 V0 c4 W  z* V( t可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
' h6 c1 B0 n, m
5 i! Y6 K4 w3 L9 L% e最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.. ]/ g( ~* G; E! x( |

! W- h2 L, x1 j! e再给出一个例子:
5 n' |! I- m2 Z2 i+ U$ M+ X. F2 a& T0 }: C
首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:
' a% M: _1 D- B: v6 U% q0 L- O  ?, ]7 o! c( _
MATLAB之ellip 函数介绍(椭圆滤波器设计)
. f; k/ O0 s7 g  w9 k% V
% `3 }7 p1 T" ?1 V/ m设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。
2 w4 g- x6 q) Z: I8 c" w! s! C5 `; e% ~; q5 e
  • clc
  • clear
  • close all
  • %
  • % Impulse Response of an Elliptic Lowpass Filter
  • % Design a fourth-order lowpass elliptic filter with normalized passband frequency 0.4.
  • % Specify a passband ripple of 0.5 dB and a stopband attenuation of 20 dB.
  • % Plot the first 50 samples of the impulse response.
  • [b,a] = ellip(4,0.5,20,0.4);
  • impz(b,a,50). `5 X) E' r  O- [

4 \3 V4 ^/ V( G, o
2 ^+ v( W1 d7 p) W) N( I
" a- V6 \3 l0 @/ u1 A7 v( C

该用户从未签到

2#
发表于 2020-10-15 14:59 | 只看该作者
MATLAB之使用 impz 函数计算并画出脉冲响应
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-23 03:22 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表