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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
) l5 l1 M- d* o6 e" [/ h8 M/ K* F) L
这篇在于讨论 impz 函数的使用。# Z) A9 A( M0 v# H8 f% M3 Q+ L

+ l3 R7 _2 u' `( H1 KMATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)$ m  b) G  f4 D1 E" m

- C  K8 N% Z7 w& t: C我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。
) Q+ B% ?1 X- H6 u3 q3 Y; S
7 r' Q2 U7 R4 m0 q) U帮助文档上对这个函数的概括是数字滤波器的脉冲响应。1 f2 R8 U+ P; C* `! X( d

$ g  w2 H' b; ?! k4 n5 [4 X所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:; y" g- p: H! [1 l8 W1 p4 X' v0 V
+ ~8 X1 x  Y8 k, B
. Z& X+ d. Z3 c; x6 M% H2 o. @
- P8 T" f. P" K" A$ j
或者由差分方程给出:9 y2 N& h; z! b

* Z" m+ v: g5 i8 L+ m- k) {1 H" w
( K/ W& x4 U; l' `
$ m7 n( \6 k; j/ C; }2 a上面的系数用系数向量表示为:
" E9 v6 V% I9 c1 h1 {* h5 a5 o$ E
6 m$ t: H; Z8 l5 T& n分母系数为:a = [1,a(2),...,a(n_a +1)]
+ {, w7 J! }4 f, M1 L9 @8 ?分子系数为:b = [b(1),b(2),...,b(n_b+1)] & t/ @+ q- v. v/ u) C# b

3 W' }- A; N  `9 O+ x) ^: A% w因此,impz函数的语法格式有这么一条:
) }1 ^2 Z* y1 R/ K1 J: f
8 H: o; r  c* |& w3 o6 t  K[h,t] = impz(b,a)
; I) D6 ^! ?" W3 r
8 `, S9 C9 J# A这里的b和a向量就是分子和分母系数的向量。- }, K/ k, a1 j# j
0 O6 S/ c4 N' w. J3 @
得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。
. w- T2 V- c9 [& ?& f1 r% U5 g& M5 N" C9 E$ ]
对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:6 w* k: ]# ?4 g7 D* X) l" q
0 E! d0 }: K' M) X& L
impz(...) with no output arguments plots the impulse response of the filter.) j, a% X( ?: n: p3 x

8 Z& m# d1 J9 f/ u意思是直接画出该系统的脉冲响应。( D6 ]. c$ u' t6 q" k

$ k+ x7 ^+ N8 O- j我们举个例子来理解:
2 R5 i9 i& C& ?/ @/ E
( y' w. ]/ e$ D这个系统使用差分方程来描述如下:0 Y6 j  u2 }- V

" Z/ T7 S. Q8 H; {1 b2 ]: dy(n) - y(n-1) + 0.9y(n-2) = x(n)
, U- z$ k2 q7 ]
) H  i7 l* C9 x9 R% M( w9 V要求计算并画出它的脉冲响应。
* P7 ^2 [5 U* U5 T! f9 Z4 S3 x9 M! q* }7 E: r1 h* i" U6 K
题解:
' j3 B, @" e: W
3 N6 n. d0 J) H/ J6 x! o跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。
0 R! }# s: e2 o9 T0 |; H+ [
+ t; Q5 |  Z6 j! c# y1 f
  • b = [1];
  • a = [1,-1,0.9];
  • [h,t] = impz(b,a)
  • stem(t,h);
  • title('Impulse Response');
  • xlabel('n');ylabel('h(n)');
    7 f7 @; a: K. `& p

7 M# F; X$ b) A 2 F) C4 i3 L- w: V+ F$ E- U) B

! I2 Q  A  F8 f2 A1 Y# s
! I9 p" f0 }# s4 V7 {7 Q0 d% v也可以:
5 ?# |4 R) Y6 o
2 l$ V1 L  _7 u' y
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • impz(b,a);
  • ylim([-1.2,1.2]);
    ' S6 Q  X9 v' c9 p! E
   : t, n% p4 [- `/ }% G6 D

# Z4 _  e6 `* `0 h/ ?& H  p) w! Z
3 q9 n8 l& r3 W, S5 n- J上面两种方法画出的脉冲响应其实是一样的。
3 \" X" ?8 t  l/ D4 t. n6 i4 _* f% P
上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
2 W) I% P/ o7 A2 \  ^. X
# @+ [$ Y" c; W6 `2 o4 P[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.
7 t# @8 O" O) R0 @' t4 k& a8 q! M4 ?只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。1 e! M. U7 _+ V9 t" c6 s
# B; L- m; j9 l
[h,t] = impz(...,n)
/ T7 y: X9 r4 L$ {6 I0 z
# M8 U+ v2 s; i" q, V$ e( ]5 D后面的这个n是什么玩意?# E% a/ g! W' P* q
1 H% o" A. v" ^
它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。
3 I. T5 z" u/ _; n5 U; h' |( ~% @. U$ f, w: l2 @" [9 A7 u
同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。, r$ E' x6 f5 N9 b* d
* b: J+ o, Z: c! ]5 v
这个系统使用差分方程来描述如下:
& l7 B) I5 f' Y7 |% y
; u- w9 b; a0 u0 r0 R& By(n) - y(n-1) + 0.9y(n-2) = x(n)
! ?0 N0 x: H  N( `/ f
0 t7 Y/ n; X9 ~要求计算并画出在n = -20,...,100 的脉冲响应h(n)。2 t5 N- E/ K7 W; {
7 t, d' X3 c* x$ m$ k1 M
脚本程序如下:
  F1 p3 o6 z3 L$ i8 g
8 ]% y: `5 P2 k
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • n = [-20:120]';
  • impz(b,a,n);
  • ylim([-1.2,1.2]);
    3 x& K! o+ Y6 ~- |; y2 J
; q4 m8 Y* I, E& b7 C

% w, s- u& c# U& p4 U1 o& {
: W' C: ?. D. d. |; M+ t+ W$ Q" K/ P2 j2 O1 S/ Q
这里的n是一个行向量或者一个列向量,无关紧要。9 R" \* w% C/ }( j

) i* v. y" L& z9 t也可以使用下面的方法来产生:
( q0 l* b* {/ i+ G9 b, v$ t" O1 p+ Y/ `8 M- j* M/ ], F
  • 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)');
    5 |4 R6 s) g) [; e+ |

' U4 L9 c  D& }$ z6 f8 s 0 z$ j* |, V) c8 m% |
% f+ ]( I2 }! e: W" V0 |

1 L: ^' o6 N- Z上面画图的函数stem(t,h),也可以改成stem(n,h)。7 P$ r  d$ t5 r0 G, A8 u0 m- d
+ a6 q- A& e$ e& z$ g
这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。$ m* G- Y# n1 j$ E& Q" ], t) P

. w  H% T' x( V' }2 ?可以使用这条语句进行验证:
6 X8 ^- m0 i" P
' C# u9 [- |0 [' v5 _n == h
; T: F, _  k4 g4 K5 x- A  R! l9 `$ W1 \8 v
可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
+ X$ U$ S$ m; i) ]4 S# H( \
3 V2 t( _# J& a4 N% A最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.& n/ H! e$ r/ K( a! {  I
3 }- |# G( f5 R% H
再给出一个例子:
$ \" }" N1 b, i& F' s- Y5 w# |8 m9 R5 v6 i' L* r
首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:
: Y* R) t, Y7 P4 i9 e) s! ?4 ~! A8 ~9 t2 t" r, F2 x2 g
MATLAB之ellip 函数介绍(椭圆滤波器设计), O- z  c+ q% N3 A# S" I

: |; J7 C0 v7 Y8 p5 v6 w* i& g设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。
5 F1 M6 m. w( ~( {7 ?( B' |
, Q$ B- W- R3 C+ C$ t- u
  • 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)
    + w5 j  c7 v! }. C0 Z

* ^: m& ?' E# s7 @. s& \6 @1 q0 j3 S: K7 L1 X0 y

' W9 E0 M+ i- T/ }$ j2 F

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 13:15 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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