|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 |1 H/ k4 w! q; _6 I这篇在于讨论 impz 函数的使用。
" {- ?# P. }8 }/ q( c/ Z& X+ e/ r5 z- ~
MATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)1 r& `7 f4 [- G
! J1 u4 A4 `! J% Q0 h9 ]8 S我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。
5 [! L* C3 F2 r' x7 Z! V8 c- N% ?6 M, _2 V# X1 A% u) t0 {
帮助文档上对这个函数的概括是数字滤波器的脉冲响应。
- P' j, V8 c& a/ E8 ~+ o
9 W$ ]7 z' U, q/ j% ]1 }7 i所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:. u% X2 d' a* f
+ T8 d/ ^, L( G
) x+ g! z) ^/ b0 o7 Y. m
0 u7 {) e: _$ M5 B或者由差分方程给出:! s1 ?! L9 H2 h
3 _0 o+ u0 X% u7 C/ d6 B) s
: j! ?+ W8 |* K: k' L* k) Q+ X# H( l; d; U+ p' M
上面的系数用系数向量表示为:( e4 y* E- o9 u* Y
6 W+ H- O, w& @" h. \% }1 e分母系数为:a = [1,a(2),...,a(n_a +1)]
7 y5 f/ o, a* T5 V7 w# Q% N分子系数为:b = [b(1),b(2),...,b(n_b+1)]
& g( F7 \" [- J2 B/ @* E, @' K
; Z- A( B6 H3 O因此,impz函数的语法格式有这么一条:4 B7 s0 R% P9 o N& K9 c5 m
8 m0 X( Y" u+ m: {+ r[h,t] = impz(b,a)7 j) S0 M7 G$ ~+ `! L/ |2 k
) q0 w& R2 o5 F: `
这里的b和a向量就是分子和分母系数的向量。$ B, T- k& n/ S; o2 |
& v* Q3 N6 s# j9 F6 N
得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。 C4 Z e; i! k1 `5 G; o$ J
: D3 h: a E. m# A* {对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:" `0 h2 ?. x# l# O1 k
0 [7 ~5 R' K6 Q. G: c+ k* T* |9 \0 {
impz(...) with no output arguments plots the impulse response of the filter.
3 b' {2 Q' r6 \. d0 v' g6 v. g0 F# F* T) F
意思是直接画出该系统的脉冲响应。4 E5 T% u& b0 N
. p/ L% _; u( Q4 q! C1 z
我们举个例子来理解:" _! s0 Q" Z5 e2 @& c H
( m4 p+ x4 B) b0 r# |
这个系统使用差分方程来描述如下:
* \! h! W1 `) H1 q& _! _) N! C
/ `) w4 J: ]' w! Y7 A' Uy(n) - y(n-1) + 0.9y(n-2) = x(n)1 W" }4 }+ {4 k
( I+ p" k+ I+ [ X! F要求计算并画出它的脉冲响应。
# A( g8 _+ }; }5 Z- W8 C$ ?! O- O8 K: Q* x3 N
题解:
. m' m+ J. D2 ` o7 |
% u, l! b1 [' T4 |! A5 x2 V跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。( T" u0 `- n4 F$ N
% C5 }& z0 K; o& c
- b = [1];
- a = [1,-1,0.9];
- [h,t] = impz(b,a)
- stem(t,h);
- title('Impulse Response');
- xlabel('n');ylabel('h(n)');" S& ^: s3 e A5 J6 C0 o0 l/ z
5 H; p1 V- m7 K: x& F# M1 [( ~
) c3 S9 U$ r1 }7 \
V( Q# D* ]& E, Q2 H' t8 a6 ?, C; Y; i, i3 |
也可以:" z1 l& Y. m" k9 P/ k! `
5 U4 J, A% s4 ^# f- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- impz(b,a);
- ylim([-1.2,1.2]);
7 X b" h) Z8 f+ o: f
3 I. N3 S- f5 S% K$ W! X
5 `( \& K) T H( a
( w8 X& t# _5 s% x ~. E' g1 N! v- i- J上面两种方法画出的脉冲响应其实是一样的。
- X% `! ?5 \& B+ S
9 o1 [" j$ y, ^8 R: s5 R上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
! C0 T! Y" \' G U% P; @$ I' f5 U7 I6 d
[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.+ `5 Y: H: V9 G/ M/ z
只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。! p) k, J8 k4 K u2 S1 |
" @$ M! o$ w9 n! _. @7 ^+ k3 h[h,t] = impz(...,n)5 M% f7 r3 d7 _/ Y- |2 Y, a
+ G6 d+ N0 w w; |! J后面的这个n是什么玩意?
7 A, S2 l/ c; q7 X
]- d' Y, Z9 N* F: ^它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。
0 _$ q8 R# Y) ]9 w, m" ^* O6 B
( {! t3 T4 R: W8 [- _5 u同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。" B$ i6 C# t9 a3 Q8 J7 k
2 w z, {- F+ @# p4 A; l$ T/ W( I2 B
这个系统使用差分方程来描述如下:
, B5 T( e1 [/ Q. g4 A Z/ e$ }
& ~& k$ o$ e6 i9 d# P4 zy(n) - y(n-1) + 0.9y(n-2) = x(n)/ r) r( p+ [% W; x
" H3 k4 U3 V0 q' o9 E0 |4 `8 U4 q
要求计算并画出在n = -20,...,100 的脉冲响应h(n)。% N7 w; {2 c* X: J% x6 n g
# o3 a$ e3 e5 Z: m% y
脚本程序如下:
: D0 d- l& w9 W9 H3 Y# M' k7 u' R4 c; ^6 ^' m! U) c+ T5 {
- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- n = [-20:120]';
- impz(b,a,n);
- ylim([-1.2,1.2]);( N8 l0 d, e+ ^: W* n
8 Y5 A2 B8 j# R4 Q J7 {8 y
- s5 O+ |8 W4 o8 y4 ~: Y9 w
3 p* |9 q( {' g8 [, u: G
: j) N) O! o( k" F; [这里的n是一个行向量或者一个列向量,无关紧要。* O$ V& f. S' ~5 W3 F1 t% H8 q6 ?7 I
6 ^* d5 V w+ Q% d s
也可以使用下面的方法来产生:) [; `" R/ e) h$ @" w$ q. ]+ x
5 W/ w; W* w/ d+ \2 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)');- U9 t" N7 Q" Y& A
7 Y. F; S2 m+ m5 ~3 H
^: Z6 N! i3 g4 o
1 L# U7 ~$ y1 ]1 e$ a
, N0 v( L4 a2 \" n+ Y4 e上面画图的函数stem(t,h),也可以改成stem(n,h)。
o7 _. F8 Y4 C3 P9 b. t+ L5 f+ @( m" S3 N0 q1 \
这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。, B! o4 m( ]& S) W2 v
6 v7 h: a3 ]/ j* w1 T) v- b, e可以使用这条语句进行验证:
9 d% [! L- t8 {
: _0 q/ O& t K. }n == h
% H3 S3 p; U1 e* r
' T1 ~; t( m6 x% w! \可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
/ Y7 u0 w/ A; }' ~, b( O+ s6 b7 f2 P# B* k0 M; d
最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100., s! [( A) ~0 s" l9 w; u
6 h5 h n$ v1 R! F! v6 @( K
再给出一个例子:
0 C9 W+ ]: `2 k
0 f$ V5 Z6 L/ y0 X" J) \首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:
8 q: v- [0 M/ n5 c: N x' X
" k/ o) w6 P( Y, \MATLAB之ellip 函数介绍(椭圆滤波器设计)5 y% J& _6 H, x+ S( l) E
- ^& X* G) u% Z% d# w/ C# w; K% m
设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。, Z2 q# [; M6 U `
6 f3 H8 {$ K1 r1 O; F' }- 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)
) \# V6 a0 w$ a# M l U7 y
) r) a- \8 f! O( l+ ^6 P' p1 w; T! Q4 Y* H& F
+ Q- x# q4 b1 y. _& l |
|