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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
: x. m$ C' c' Z2 o- s. m
这篇在于讨论 impz 函数的使用。
$ l( c/ H+ W0 M
8 m' \" ?3 q( MMATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)
$ j. s% k" A, `3 A& q8 q; a4 b( B3 f4 L
我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。0 V& A) X) C+ P* D% a) A$ K

2 L( Z! ?: {  n" [$ u; X% v- u帮助文档上对这个函数的概括是数字滤波器的脉冲响应。* o6 j- ]( D+ h, T

  |' F) H2 W" {. E; M4 ^: x所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:( Y6 A0 \5 T0 E

) o' W* o. f5 ^8 x, ^
/ f' P% f- t4 }7 t8 F: x3 |' j" U
或者由差分方程给出:; j! c, i2 Z5 a* V" |' R8 @
& [- q7 `! s4 C' I2 N8 n
$ ?$ r3 q7 t; p9 g
0 y: D0 ]$ G. r% {. B& I( ?( q
上面的系数用系数向量表示为:
! v3 a5 S9 M: M% I7 a7 B$ h7 x: {
, p+ N% ]/ X: }分母系数为:a = [1,a(2),...,a(n_a +1)] " s& L( r" V4 k( W3 f
分子系数为:b = [b(1),b(2),...,b(n_b+1)]
  \! o# I% }" G) {+ A2 Y& p$ g9 y& S6 e/ p
因此,impz函数的语法格式有这么一条:
9 j3 n/ i# p& ~; D2 ]+ Y7 Q* W- c* T% g( h( h
[h,t] = impz(b,a)
( o" {0 m4 X* U- @  x( T
( P- K' ]+ B2 D0 X: Y$ r7 ]- Y6 ~- D2 h这里的b和a向量就是分子和分母系数的向量。  V+ Y* |* B/ }3 n) ^

+ O  f4 i8 `; l& R6 Y2 c得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。
" R/ |6 F+ K( S: n8 @' N6 g2 t7 z* G5 v, r! i% c2 ]3 O
对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:
% q  H- i/ ^, g4 [- k
& V1 W% R0 }' V+ S) y, }impz(...) with no output arguments plots the impulse response of the filter.6 r1 |$ h- V/ \/ B& N# S/ G
1 |7 W: {- v! [
意思是直接画出该系统的脉冲响应。
9 G- b" m8 ?: J3 {. h8 B1 o. w
! J& s4 f( u% \: \( m/ }我们举个例子来理解:
0 c3 }* X8 G3 v( e3 }
: Q4 X3 }$ I; l" I这个系统使用差分方程来描述如下:
. R; A) `/ r! y$ o6 P9 y% \# N( v# B; q. J! e4 P8 U
y(n) - y(n-1) + 0.9y(n-2) = x(n)
7 h- s3 V4 A: B9 m! f' k
; C7 ^: ]. |* E' a; V要求计算并画出它的脉冲响应。; \1 f2 T5 t0 X6 J( {
; L2 u) p- E% b4 K; ?
题解:% v. J2 @; v# P* d4 c9 K
" g& d  e* r. X% _3 l6 M/ g
跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。1 \  {% w' K( G' o! `! p/ g' e

% u; z" S6 s$ D* l3 k
  • b = [1];
  • a = [1,-1,0.9];
  • [h,t] = impz(b,a)
  • stem(t,h);
  • title('Impulse Response');
  • xlabel('n');ylabel('h(n)');
    # i4 v( j; L' I! S+ {# N
" g( ^; a% O/ K" b2 v3 s

/ ]( j0 ^8 A/ p' g- x6 u" p2 [+ a
& C' j% q1 f' L2 b; Z1 h2 ^" v/ Y; e8 w  e* L* H1 ^# v
也可以:7 C' w3 i, I- H7 W9 J( B* G) p: t
6 b$ y/ A6 b( f/ ]. r, q2 k
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • impz(b,a);
  • ylim([-1.2,1.2]);0 c# C4 |) C, \& N2 u6 c9 f
   
8 Q; D4 L$ g# ^8 p' \
7 u8 e6 [' Z; T  t& T( G9 E3 _
- q# M( z, y9 U$ v7 y+ A( P上面两种方法画出的脉冲响应其实是一样的。
1 F# a9 S* ~$ r0 |3 K9 X6 C" j4 I, y) F3 x  p& c
上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
* {! R4 p: H" G1 ~5 J+ @3 R+ ~  A/ N( i6 i9 z9 ]2 S
[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.
8 ]% ]6 ~6 N. Q, i只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。
; ~5 Y; m2 Y" l: u8 l' \9 r) u% \
[h,t] = impz(...,n)
9 ^' S/ U0 _$ s- R- G3 S5 [4 J/ [2 C
后面的这个n是什么玩意?2 Z- F* E5 s+ L+ C6 {. Z

; C1 C. m/ h7 F, Y; u' A8 ~它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。* y" n$ K* F( X" ?
+ v1 H  d" R6 M+ U' C' x4 e2 X
同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。
/ B! U) T; F: q; _; I! {* J9 ]% H# A6 I! Q; n4 E
这个系统使用差分方程来描述如下:5 K9 n; R' s) ^8 [: Z, `
3 ^4 p. u# L3 o9 q
y(n) - y(n-1) + 0.9y(n-2) = x(n)7 O* t+ O* O; B* M7 |! Y. `% P3 h1 L

" C5 ?1 b+ c. g0 t2 L4 [4 L要求计算并画出在n = -20,...,100 的脉冲响应h(n)。
" r. e9 q  a! z) `$ w+ A. F  |* |
  E% S5 T, o6 F" F  r脚本程序如下:* |! m4 w( I8 P% Y; u! K
" M6 U* R; g) E; Z. K) j7 u
  • clc
  • clear
  • close all
  • b = [1];
  • a = [1,-1,0.9];
  • n = [-20:120]';
  • impz(b,a,n);
  • ylim([-1.2,1.2]);5 y$ _3 e" c2 j2 l! O0 H( F. U1 N) h
" R1 z5 H. _) G" ^- F6 f/ D- _" y, K
: G4 G  P) b' u
' t6 c6 \) i4 c: u+ Q
% g  e% s, p: ~8 }  t! J  T
这里的n是一个行向量或者一个列向量,无关紧要。1 T- f; u1 ^5 }' j4 l0 Z. p

9 L6 L# b( O3 S7 P$ _# o也可以使用下面的方法来产生:
; \4 n/ y: x1 g3 r: [5 [
2 e' q: c4 m) e/ Z" A& z
  • 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)');
    9 [6 s* j% u8 r
1 \+ I6 R$ V3 y/ X
$ Q+ r8 m- Q9 r

* `; v( p) w, @) {  |
/ s' t9 Y  H: d6 }上面画图的函数stem(t,h),也可以改成stem(n,h)。+ J* h/ w) T& c8 u( X

5 [+ |; K( T1 o) y这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。
4 G" s9 ]) A2 a1 l/ i/ W
( \1 E2 h4 q1 e3 Z$ `8 H  A1 [% l0 f9 A可以使用这条语句进行验证:
1 V5 x4 w, l* X7 Q4 R( ~' L
3 y. W( \# W* mn == h
7 k8 z  |" p+ ~: Z' P. G" n0 c; C3 D0 R  b
可以得到一个和n同维度的向量,元素全为1.(可自行验证。)0 K5 ]* \! N) z5 C: B% j

8 @5 W& c  l& o# [( S最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.
1 }, t0 c8 l3 \) R- t' i6 C: h( P: n5 W, O
再给出一个例子:0 q0 U  o8 r! E  [, e
7 l8 D) z) s0 s7 H; i1 t4 l; J) Y
首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:) u, K! M8 Y# x
; \3 o: ]9 N  {4 P- h
MATLAB之ellip 函数介绍(椭圆滤波器设计)
( w" i7 a$ t. l1 k& o: n: U
3 P8 t6 C) j; x+ V' o" w设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。0 A, j. [- M/ a! {7 z1 Y% j
1 B4 F6 S; ^/ D) I
  • 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)6 o3 f" ~- Q) I, _/ d
+ Z% U7 x8 E5 S* R$ h$ Y0 r

, U) c4 J& \& f  p& w) q, b1 z
! x! X) {* a  a( {( l3 n5 P

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-13 10:35 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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