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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

2 p; k6 W. X2 {3 o% K这篇在于讨论 impz 函数的使用。
1 r& E+ u  i+ j8 ~/ ]* S
& ~2 A% V# R. f" s7 pMATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)
* B) w6 V/ ~$ Y) q
) W: b. P+ q& x" j9 M我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。
' I! d2 R4 h; k" d. W) H
2 S+ J' t% G  C" r4 j帮助文档上对这个函数的概括是数字滤波器的脉冲响应。( ~, q7 ~8 J" M

& @3 [3 n$ A9 x所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:5 \1 S- S2 g/ T0 Y- }0 `) [
+ e. U  E( c0 x5 {4 P& G
' r) R: d! ?1 j+ G- ~; O' p

$ s2 `/ z( Y# d* |) ?/ b4 E或者由差分方程给出:+ ^8 N5 n1 S5 @1 {* S

5 k: Z/ d9 w1 J 0 g% U: D# J: K! X6 h# Q

; {. ?' |  I3 f+ G上面的系数用系数向量表示为:9 d7 U; u" G8 i3 V! J/ X

) y) L, M0 ~& r分母系数为:a = [1,a(2),...,a(n_a +1)] 4 Q: \: b" ?, e' \* l! U
分子系数为:b = [b(1),b(2),...,b(n_b+1)] % I+ D% M# ~( Q( w* m. R  U

2 g# ]4 X) C( h5 X  F因此,impz函数的语法格式有这么一条:3 t$ A+ x% g8 C1 z8 h- Z7 a

! N, S( t' d: _+ {$ x5 v[h,t] = impz(b,a)
; n. A& \9 f9 _7 ^2 E4 V) }* W4 R4 m- `" _
$ z: [/ X2 H+ p3 |: i( B这里的b和a向量就是分子和分母系数的向量。% q$ @( c' r) K2 s$ v, z4 K) f
! q# A  i7 I/ G6 S2 n
得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。& T9 T( I  `# L  O6 R) B* V# j
% Q  @6 g3 R( m- \9 p8 y' P/ R
对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:
. d$ i. Y4 Z0 P" D9 t
8 ~6 M$ F2 Y$ c" cimpz(...) with no output arguments plots the impulse response of the filter.
' `& W/ d! L* f2 |- s( {$ D( s5 B0 A4 V1 g. z3 d  l1 U# T" v
意思是直接画出该系统的脉冲响应。# P7 @& c8 a6 \5 Y5 r  G

3 c$ d) x: `5 A- z* q% H8 I  }  F我们举个例子来理解:
) u6 d  v1 u' d0 y! w0 U( e# {- W+ A0 A
这个系统使用差分方程来描述如下:5 W' X/ K$ w, h6 M

6 ]+ g* S! [& W& T! Ly(n) - y(n-1) + 0.9y(n-2) = x(n)+ L4 d/ K+ x: E

$ e1 M0 }9 J" f6 _5 O1 U要求计算并画出它的脉冲响应。
( v- o- u0 s4 }, K3 I
' r6 R( C1 S" \5 @题解:
2 U: j; J7 z1 k' P6 B3 R. r0 B6 e4 X# T+ V  L
跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。0 [1 o+ s+ Z0 w

0 f$ i8 }3 M4 b7 A0 ~& B3 d
  • b = [1];
  • a = [1,-1,0.9];
  • [h,t] = impz(b,a)
  • stem(t,h);
  • title('Impulse Response');
  • xlabel('n');ylabel('h(n)');
    ; m6 Q7 L; g3 L
; m9 n( `6 U* e  c0 t
6 A  d( U1 B8 n! E9 c, b" h: t
/ ~% S" g, a. P

( i* X% Y- H) C* O% d, T也可以:
3 V: z2 i. u! N9 ]- ]
$ Q. x4 E" Q/ b* R
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • impz(b,a);
  • ylim([-1.2,1.2]);
    ; O! p4 {% w- ]3 F, s/ |# C2 w
   
# y4 b1 Y: X! C2 C8 K. ^
, h; r2 o' r( m  ~/ w7 [: f1 P2 I/ ~* i: H4 o. b# {) ~
上面两种方法画出的脉冲响应其实是一样的。
0 ~; `2 ^* z, h" O6 M5 N" c! w, h4 ^5 S$ j
4 z7 ^  V% Z% m上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
8 _  `( z$ s4 `8 _. z) S# ?% V7 M5 }* p& F. R2 T/ t) m# [( F
[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.) I. V# e3 X3 r9 }. N7 E8 m2 P
只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。  ^/ `+ J$ Y9 D- d, V
; X* D" N* U4 I3 C& p1 ~  X
[h,t] = impz(...,n): p! ^. E( ~% e7 M  n- d8 i- }

3 D: ?( s$ ^, d5 M- h& ]: T后面的这个n是什么玩意?: [: Y9 a0 B2 d3 y

, U: s/ J1 |" F它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。  D0 y2 m, F" T2 a# q

% \$ q/ q, J" h! d1 \0 t+ t/ K同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。5 W- r8 S& Q. m+ E  A! X

- a2 S# ^  h8 O, j: p$ G- j6 G这个系统使用差分方程来描述如下:9 t2 J6 F* T+ i

6 @' m) ^8 B9 g7 B2 |0 hy(n) - y(n-1) + 0.9y(n-2) = x(n)
" n: n& }" {+ Q/ C! |0 I, r8 q" R( \5 |" g
要求计算并画出在n = -20,...,100 的脉冲响应h(n)。
4 U( @1 R, l9 \- x, ?7 z1 G
% Q5 b4 B4 v$ ~; c$ g脚本程序如下:9 W. I6 q1 M( z7 u# A. H! |4 B

& f: r" G# M$ n0 d
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • n = [-20:120]';
  • impz(b,a,n);
  • ylim([-1.2,1.2]);
    * @. ~6 W+ f! ?! w+ I8 A

0 E" h% }  p( p- w, ~, ^! ~+ ]8 W8 [

2 q: `* z' V0 {* N' K7 ~7 v' ?+ r# K1 k  e/ C# n6 Y9 T, k
这里的n是一个行向量或者一个列向量,无关紧要。
/ ~+ Q4 R' V0 h( \
( B3 Z  V8 i/ C# j也可以使用下面的方法来产生:9 S9 k: O% |: z9 Z# W
/ ?: t, Q( W9 C; {) B* l
  • 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)');+ k7 _' {# y6 \$ M

) f" C* W) b& [  O& r& m2 U& e " Y4 Q: J, f( F3 b; |( e
6 `' J; v, O& x. i: D. }5 ?

5 d/ U" L; }9 d上面画图的函数stem(t,h),也可以改成stem(n,h)。
- {; K1 d/ y3 T
  C' ?- h( I! `+ \& c5 o" ~这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。
# Z) q% T( E; Y2 i" ?6 A9 r5 \& Y9 I) N4 }4 v
可以使用这条语句进行验证:. ?( b2 i5 [2 S) L8 v

; X+ R* k# N" m) Gn == h! Q9 O( y4 Q; e6 i2 Z. M- f8 N

* a" U; N$ e& r5 @0 w5 m可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
* ?0 i) ?: Z$ v- T: w: h0 M  _! A, r( p: m! [
最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.: ?. B9 M5 ?( R( r

( m$ h/ o9 K5 U再给出一个例子:- P* T, Q0 E! b1 M3 P

* {; L; H9 ^# t+ k8 b首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:/ h5 H- P$ ?, o6 L
) \4 ]# J& L: [( o! @5 f+ }4 q
MATLAB之ellip 函数介绍(椭圆滤波器设计)
% F' p. L8 H$ V# i0 ~- ]/ n. b& {6 G$ ^7 I& q2 [
设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。0 ]/ ?" s. ~9 R
1 ~5 o5 A2 A& t
  • 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)9 s" G" F' D+ T' S' f! {

" N4 l5 L) e% F  @& D
* u0 b( M! F# l! c8 U+ o. m/ v1 \ ) Z4 A' Y) T8 B! ]; p* N' i

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 16:13 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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