|
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 |
|