|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
- H! m: E) v5 M* I这篇在于讨论 impz 函数的使用。
" q4 f3 J$ U6 W( D, s @: [( G) V0 U; ?; {
MATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)3 }2 g. w; J$ W9 X3 r
% O1 S4 H* j4 m& Q1 V; L
我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。
0 l; T$ T9 U. j- I' ^* f- _
, [& y' s6 E. m7 M帮助文档上对这个函数的概括是数字滤波器的脉冲响应。: \* g7 X3 M1 d
* n, M: |* _! B8 e0 @
所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:
3 F' n# q: J- M% A% r4 V6 [# E
: u/ R( w9 v- n
) g" M' S" F( @* p1 L
0 y1 v' _3 v2 a% K# @; _
或者由差分方程给出:; b# p$ g. h3 V3 a7 ?1 O3 I
3 [/ u# T4 u X
/ b! Z7 y3 R" ?0 Q, Q: V1 C: a8 q) y
上面的系数用系数向量表示为:' e9 T7 k& `% W* I
: }2 p. A6 u' K6 c" O0 F分母系数为:a = [1,a(2),...,a(n_a +1)]
( u2 M& ]8 B8 l2 W分子系数为:b = [b(1),b(2),...,b(n_b+1)]
5 S; s" }4 {4 Z" d: `
' J# ^2 m: R! S/ X" `% J) h
因此,impz函数的语法格式有这么一条:
% t3 `) O. N) q, q9 Z
9 d" {: W( {" @[h,t] = impz(b,a)
4 r5 e8 x7 Q& M2 p9 K9 ]9 R" ^1 w, W* g' I2 n; K% D
这里的b和a向量就是分子和分母系数的向量。6 ~% F- }6 n- n' s$ n3 M5 r8 r
' E) @3 T1 X3 g7 f( G得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。/ x( y) d! G4 s7 r
8 V5 q7 T6 v+ y: g' C' ~1 @
对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:: K) K5 z7 E: h _- o
8 ]: P2 h* n; P" Kimpz(...) with no output arguments plots the impulse response of the filter.( D# u, K# h$ M1 m4 N* ?% D
9 o: l5 U2 i$ {" e- E
意思是直接画出该系统的脉冲响应。! e; t! n% W2 O( f, ?4 O
% X5 M7 c9 w1 z# q+ d2 n& u4 V
我们举个例子来理解:
9 \; y" V) n' v4 S% G0 ^) k, `7 M" X( b8 Z7 _/ q
这个系统使用差分方程来描述如下:
! f9 d' N2 b! S8 z0 E+ I4 }% o- `2 u3 Z) i0 l; `& }" M1 r1 ?
y(n) - y(n-1) + 0.9y(n-2) = x(n)
1 b1 r) j! q6 ]
! x, ?+ Q3 v/ L2 J8 s( T要求计算并画出它的脉冲响应。
9 v# K- e, a2 R. E, r. `6 A' T- W+ }4 V0 d( q& X
题解:
; D* X; T2 k( h8 a7 _3 D; O- x$ v: V, i. ], z5 J$ V
跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。& E8 N8 ~4 _- T' g0 D: \
" U$ [* F+ M, t
- b = [1];
- a = [1,-1,0.9];
- [h,t] = impz(b,a)
- stem(t,h);
- title('Impulse Response');
- xlabel('n');ylabel('h(n)');
+ a4 {0 n% b+ ^5 F
/ Q( d5 `1 F2 C* O: _3 d
+ F$ f* D0 \5 F4 c$ _
7 \$ P/ n7 E7 q
* z3 m- K% p' d6 C- U# ~: e也可以:6 X, O, v0 A& ?2 q$ a% @" e
$ S6 S7 U( F* v5 [' G, {9 g% g1 @8 F- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- impz(b,a);
- ylim([-1.2,1.2]);
5 c+ o% A% z2 N. G0 u" a
( F+ n- F. P# {, O
: a0 N, t. p% P. J2 B6 H4 [! @
+ n: P4 T$ a) K, ?* ]上面两种方法画出的脉冲响应其实是一样的。
( Z+ j3 l7 m+ x6 N. Z1 A
9 F* W( b6 C) D+ ]: h1 a5 D4 C上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
. u# u, ]8 C g* _$ {* W' X, X c4 o
[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.
1 w! v2 u4 ^! p! \4 @只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。
9 p$ t. F; f; D4 y m' K! X1 S) S) Z4 a5 B, G
[h,t] = impz(...,n)
0 q+ { N: e: v2 Z0 ]+ I) s/ J$ Y/ D1 k) {# a# w
后面的这个n是什么玩意?
+ I* L$ ^' J" h3 r% e, b0 Z# n" l6 t5 {6 i& \% ~5 ^
它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。
; N0 d0 ]; e7 T+ n5 t- G
2 C* k8 A! c0 k% [+ _$ [% a" Y同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。
2 [- U# b6 ?% H g4 F
$ K! c; `& A6 q5 s4 S这个系统使用差分方程来描述如下:
; B: U M$ {8 ^8 y
" }7 d( s" r$ ]7 i, ?. m& My(n) - y(n-1) + 0.9y(n-2) = x(n)
# ?8 l) Q* e' D$ T* s' E
. t# w5 k/ I+ a* z# D8 ]" d( o要求计算并画出在n = -20,...,100 的脉冲响应h(n)。
% ` O8 p% a$ B7 B
2 O. r. J/ z5 R) U4 ~脚本程序如下:( q' o* E* t4 _% ?5 X+ a* H
, h- Z5 F) `; ], v3 B- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- n = [-20:120]';
- impz(b,a,n);
- ylim([-1.2,1.2]);
6 D2 Q& `3 v8 {8 I; e% P7 O % u$ x5 `8 e# d. f6 K# N. ]/ O
) D. E& _* n0 z0 i5 |7 W! Q: u. U2 J
3 A s. ^1 [9 F" {8 v+ V/ h% v, ~
这里的n是一个行向量或者一个列向量,无关紧要。
: N# O: |# F" U% m
0 t! v& i( }- p4 L也可以使用下面的方法来产生:4 I- O$ q8 o$ S3 {/ ]( D
; F$ p2 D9 ]8 c; u2 G- Y* j l5 h
- 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)');: Q9 s# f: B9 w2 G) d
+ p4 p- j1 P1 a+ v0 r8 _
! Z7 n9 ?/ ?: j$ K2 `% K
0 M$ ], w' ^' c5 |
}+ M) D' m7 f: E" I. h
上面画图的函数stem(t,h),也可以改成stem(n,h)。
`# H$ u. ~+ g. O! V Z
, [0 A7 q& ]3 [( w/ L- I$ ~这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。
2 |' c: o9 W" x; g1 `% F
0 Y2 g* U) k* ~- o. S# w可以使用这条语句进行验证:4 V; b" P1 J/ L: M( g
0 F3 y6 E* D/ |% }1 S$ \" d( l- un == h
$ H4 N% x6 f9 ^4 c8 p4 d; H
6 d: K$ `2 v# U% V7 K# _8 m$ @) Z可以得到一个和n同维度的向量,元素全为1.(可自行验证。)' T& J; B- C2 ^7 O! O) m
N/ k3 c+ h) V
最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.% x1 e5 z- ^0 E" @( [
; E, A4 U6 o& K7 K$ [ l再给出一个例子:. m4 P. S q" W- R' z- {; q
7 ^8 Z6 u& L$ C3 K8 a4 O
首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:
9 m+ y; ]6 F0 W& s N2 P
( a ~- o! o$ z( UMATLAB之ellip 函数介绍(椭圆滤波器设计)
& K8 |; d7 U" _3 V3 l. Z% V. X/ s0 c/ B) {
设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。
$ q# P& C& [# z- K" R* n* }- i+ T
% B- @# H% N. A, S# s5 h- X0 g- 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)
- q) w0 D! B% `
, W2 V; e) S; S( G
/ u, T7 g1 y) Q2 Z
+ s% k3 s5 R2 r8 O2 i |
|