EDA365电子论坛网

标题: MATLAB之使用 impz 函数计算并画出脉冲响应 [打印本页]

作者: mytomorrow    时间: 2020-10-15 14:07
标题: MATLAB之使用 impz 函数计算并画出脉冲响应
1 {' m; X$ T1 Y0 c( @
这篇在于讨论 impz 函数的使用。. _$ |$ `8 m) X' V5 f
0 Q. Y( y' v9 X8 [( T4 l" Y1 ?- \
MATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)
3 F; ?+ e# {# @
& B" @  |  a! h1 L* c我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。7 k+ J$ K+ Y0 g6 Y2 t0 {- N& n, ^/ n
" o# s0 c% L' X# n# o' h: I" {6 p
帮助文档上对这个函数的概括是数字滤波器的脉冲响应。, {- [4 |. v. {5 S2 c8 ?+ Q( G& J

6 ^, E* p: d, G1 U0 P1 D" r( A4 D/ I所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:
2 k# _# }! ^' v  j' e& ]$ @  P7 k) Q( b
6 x3 t8 p6 z$ P+ Y" u

% R8 j& k! j# h6 Z或者由差分方程给出:6 M" M. U- ^/ b5 R, X
+ ~& g& l" k9 k
- P3 \( A4 C8 i

! k6 L/ P  l$ p: z7 K上面的系数用系数向量表示为:
# F1 s( W& L$ O/ h0 _
/ m" Q8 M3 i2 e# ], I# I9 e分母系数为:a = [1,a(2),...,a(n_a +1)]
& y. w, U9 {9 H8 Q" w% p分子系数为:b = [b(1),b(2),...,b(n_b+1)]   M& j' f$ n3 Q' |  V

- |+ O# H" w% R; m3 N8 P2 ]因此,impz函数的语法格式有这么一条:
8 P0 D1 }& o- w# R
$ I4 W9 G3 H4 H[h,t] = impz(b,a)
/ x6 o9 h$ q8 q+ J
" ^: D3 P8 m% Q6 ^6 o( e+ S这里的b和a向量就是分子和分母系数的向量。
+ ]  L2 v' R& y9 S% ?' L
3 |& [6 g1 w; k* ?/ R得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。
3 V5 Q7 N9 R* Z4 p# g* {7 V4 G4 X$ m: s0 V
对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:5 ^6 U9 s! X6 d+ G- m

9 |; n7 u+ p/ V% Qimpz(...) with no output arguments plots the impulse response of the filter.
& H7 U2 |# p6 h5 s$ S7 k5 h
% q/ N% n/ b. n( m" ^, q意思是直接画出该系统的脉冲响应。4 v  d/ a- _# v

; U1 J, Y9 U& s1 ]' t. h我们举个例子来理解:
5 d& ?1 \2 a1 |- w/ e3 b4 Q; G1 G3 V7 `& ^# o3 E
这个系统使用差分方程来描述如下:
: _! C( Y$ D: \  ^9 J
3 {, G, L  }# Q# @3 qy(n) - y(n-1) + 0.9y(n-2) = x(n)- u: [2 q6 j! a4 \# g

. K  `9 x9 Z0 l0 ?5 ?3 E" J要求计算并画出它的脉冲响应。
& I  h7 J# H: H9 g& [! E0 A
; T* [" z3 d7 r题解:2 P  @& I' r' y# [; ]6 G/ x% w

" _7 j% B/ g5 ]) Z8 g跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。' O7 j- f+ j" M5 a; Q+ b
, r4 V5 O8 Z. M$ j9 m& Y
6 p: r; [: ^" D5 K

; \2 a3 J( D( \' Z  Z2 o( Z$ n1 E% v) V  l

) D8 t$ }% H& ^  W. b也可以:' W& x! t: F4 X8 A% [7 l" o3 h1 N

9 d$ \# s* d( _9 y) S6 |( s! J   + D% ~7 s2 o. e9 e) S+ r! G. N

  X7 e4 [+ l: D) q5 n2 c5 d4 u9 L; f
上面两种方法画出的脉冲响应其实是一样的。
8 u3 I! s' _+ H! n; R0 @
4 H1 M8 k8 N* _- Q% s! L上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
& b9 k2 o3 K. ^, k, d3 b
$ ^0 A2 Z. p/ n/ L. ]- V/ y; |; x0 p, N[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.: z9 L3 r8 ^* c& m2 [: U- Z+ z
只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。
" Q& }0 N. M' V% P1 M  W, e; O: Y
( a! v$ ^* K7 {  Q6 w[h,t] = impz(...,n)
! m/ p/ ?+ W' {1 U) |/ R. C, n( M; x
后面的这个n是什么玩意?; h% u% F/ X& z: M, B, e, P
( E0 R. p  G: E  {( g2 d; I
它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。
  o. a& m/ n, F. J' }" b- g2 \) e! k4 y/ S* Y3 S
同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。
. U; E. e/ `1 v8 j. u
/ I( e& g2 [( `5 C& X这个系统使用差分方程来描述如下:
! b) y! F6 y3 H) H% F1 c
1 s% @) G/ O: h; ^y(n) - y(n-1) + 0.9y(n-2) = x(n)
; t3 p4 V6 z5 B' k, M) p# A5 e
8 l, H, S% L; C; v. D7 M& v# k9 d要求计算并画出在n = -20,...,100 的脉冲响应h(n)。
3 L5 W( q7 `% b9 n
1 Q8 n8 V8 b7 {. t5 l2 h; u) N脚本程序如下:9 j+ a4 B+ x( o7 _: z
6 V% t' V: y- ?0 ]6 X3 K8 q

- J8 _# s, O" p8 ~* u( N2 Z9 m, R/ E0 B  {8 \4 s, N, n4 @7 @

/ O5 L  I( K! B) S& F# M& m$ E) E: N; Z+ @4 s- t! I
这里的n是一个行向量或者一个列向量,无关紧要。
# C" x7 ~7 D" p4 x- d
9 k& _5 k8 z3 q, z" v. h也可以使用下面的方法来产生:
5 u6 v8 Y+ I) A8 r* H" K
7 s9 }$ H  q8 T. h
" f4 z4 @& ]" X, |
9 @: u* I1 i+ n# G' l
; N" O% Z, [: L4 g$ Q; s. h8 k, n' X7 [+ D# T
上面画图的函数stem(t,h),也可以改成stem(n,h)。
0 t+ K; T& @, _% J  p4 L
4 J  x4 M9 k9 ]6 k. I) ~这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。2 q9 k# n# v$ u  X9 |' }: R& U% D
: t6 i9 `+ L5 `- ~
可以使用这条语句进行验证:4 {; f; i  C3 [- C! U% M4 k+ K

/ m! R. K$ k4 B$ y% F& E  Wn == h2 _6 n4 }1 d  `7 E! `
4 d( P6 g- \! P+ B% U
可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
+ F/ d1 U2 |3 \0 q. U2 n6 y7 }* d% z) f! S0 c" i& U" c
最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.
- i/ ?# o( @- O' Q# c7 e  }& F7 A1 X9 j; \: R# V  N: u  \. }0 p$ \& N
再给出一个例子:% v9 n( [5 @4 z1 c0 c
0 a3 |9 `8 s1 N% _' t
首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:" r9 a7 s( V1 V& q: r

" ]. C+ e/ L3 r0 T, T5 }MATLAB之ellip 函数介绍(椭圆滤波器设计)
* E! v5 V9 j  y4 U- _0 d$ Q" p) L, B1 R& j( {
设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。' M$ m1 n! ^5 g) i% H% e4 e, I

" }! ?, a5 H8 ]# r# h& W6 Q" T2 G, _; x# \$ f
* t" w# K2 }: L$ w  C9 \$ o

% T) C6 o; i; h& |
作者: xiaogegepcb    时间: 2020-10-15 14:59
MATLAB之使用 impz 函数计算并画出脉冲响应




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2