|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: W$ F: I+ A# ?! |) u这篇在于讨论 impz 函数的使用。
v8 T" k/ s( l' w& |/ U# I2 n0 d6 {% e
MATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)1 }7 X- y1 r. d/ u8 w8 h5 l
- ~0 }9 b- \# j W
我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。7 N, G4 w$ D% {* v2 x3 p5 Z/ ?
2 h) c- j5 \4 j$ a& [* }帮助文档上对这个函数的概括是数字滤波器的脉冲响应。
. @- i& p/ O- i- ~5 X1 A! q2 B: x6 T1 s5 a$ V
所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:4 P" b9 A4 d K/ l: M. I
8 @% j/ L. c+ Q- {/ F4 O: @
1 S- C: A6 U2 J! s0 R/ I$ ]* W
2 y8 f- V" I" L或者由差分方程给出:
% Z6 m. [, P5 i/ ~
, K; D' v$ [ e% B
* `2 n2 k0 f9 M, f0 Q, i, m" Y/ E+ N* F
0 H) Z4 ]' b+ v0 c0 C3 E上面的系数用系数向量表示为:" t) P, C% _9 ^. Q% O) N S' O7 P
4 L5 ^: f( O2 y* L$ _分母系数为:a = [1,a(2),...,a(n_a +1)]
* p% x! r/ I6 ^
分子系数为:b = [b(1),b(2),...,b(n_b+1)]
% o0 \& x/ o4 N/ e& _8 u3 X
3 b2 Q N4 y( X1 \, h因此,impz函数的语法格式有这么一条:6 O' }& P- ?4 L- u% S0 V% Z2 E
; r9 U% d+ H% T* g$ f* C% H' F& N* C
[h,t] = impz(b,a), d6 r2 ~% p k
+ m. E& u4 g' h3 t7 `
这里的b和a向量就是分子和分母系数的向量。
a( \7 i6 @" c) j; }: W& g/ _( v0 Y- S! _
得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。
" i/ Z( W9 H% m* c# K$ R: S% Y
" D# G, ]8 K7 t% X2 `对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:7 M& a6 `% J1 g# o- @. t
( j; O v" z7 }% K
impz(...) with no output arguments plots the impulse response of the filter.
7 _8 x5 U- }& a4 C5 S3 T4 m0 a! \& H# L, o$ Z0 h" J5 G8 V( u
意思是直接画出该系统的脉冲响应。0 o! j) W, c2 i5 r8 f* e7 y3 a
- V/ V* g$ {& b- F8 u0 P我们举个例子来理解:" f. i- B7 v8 l% a! y N
# g/ [6 l. h2 G7 N# i
这个系统使用差分方程来描述如下:
6 W' V- B( A4 {2 W& ~: y9 I2 z
% W$ O; i/ X2 m1 N! n! |y(n) - y(n-1) + 0.9y(n-2) = x(n)+ Z4 E% M& d( [. w& U9 h+ {; Y
1 C- o- b& a" z7 a8 U要求计算并画出它的脉冲响应。
5 D; ?& V- ~5 v5 Q# U2 y* I$ ]* C" x I4 K8 d4 {
题解:
- c/ o- C4 S9 M- R' W5 @) M) ^4 B% z6 {2 C8 \/ F
跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。$ D4 Q+ g. q. g6 R [6 O2 x- S
. w4 U% s }3 M- b = [1];
- a = [1,-1,0.9];
- [h,t] = impz(b,a)
- stem(t,h);
- title('Impulse Response');
- xlabel('n');ylabel('h(n)');
5 h1 a4 H4 K% [ ; Q7 q7 U8 O8 H$ B
5 P2 d3 ~3 m3 Y% p e, G8 `# m7 S0 I( e
$ ^# i* _- z5 H) s8 |1 w, j/ B) b也可以:
7 l+ k: h9 z) x* J$ ]- _8 }% J" v! e- D- K; X1 e% H! j, e- I
- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- impz(b,a);
- ylim([-1.2,1.2]);; G; N) i' j0 {, b3 [2 `
. \3 x9 s% b' {0 B7 x
# f2 K# Q3 b, e5 a% k% i' {( L8 v; c! B# N9 E2 Z; e
上面两种方法画出的脉冲响应其实是一样的。
* U5 [, {+ A5 T+ _- e1 n' u; M; S3 ^& [. Q
上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
! z7 f' R6 d7 i2 b% c' G& Z: @/ J/ W5 w& Q1 g
[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.
0 {1 S: j0 j7 N. P7 e- _" a只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。: a1 _. X; f' p+ v$ Y
& h0 o& Y8 }+ M. i[h,t] = impz(...,n)
, R1 u5 f3 s% T# m& ]: l+ U, j J- T) Q E
后面的这个n是什么玩意?. U8 o9 v7 `+ U! v; d9 b) g
0 m- x- y+ ~& S6 \& X- s
它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。5 v+ U2 K' @" |4 U D
" B, p* A( o% Q2 s3 }/ @2 o- ~7 L同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。
$ a! ^' i. U9 |/ _- o( q) F2 l3 H8 e- t' V- I+ A
这个系统使用差分方程来描述如下:9 Y2 ? M* z& F2 z( ]
4 D' S8 P, I0 {0 `/ r4 Qy(n) - y(n-1) + 0.9y(n-2) = x(n)
, ~, V: Z$ x9 l# z) l1 q/ Z' h# g" ~! B& V
要求计算并画出在n = -20,...,100 的脉冲响应h(n)。
# Q1 v4 u9 Z- d: @( \# }" I4 \+ q3 J; W) J
脚本程序如下:
2 k/ A6 N" C$ e
! Y, o- h7 g( [ {" F! v- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- n = [-20:120]';
- impz(b,a,n);
- ylim([-1.2,1.2]);9 l& P! M; W4 \1 I4 Z
, F- R! L( i$ }# q* B3 b
0 j/ B) }; W0 |7 ^5 e, o: O
8 d k9 Z' n H4 i X3 q
3 x, \& l$ C- L$ t' I8 k4 F r; l* c) _
这里的n是一个行向量或者一个列向量,无关紧要。7 I* q6 y, ]- w+ `. {
6 {/ V' x% V: S+ K- ~% r b也可以使用下面的方法来产生:
' X- L' I/ p* X! Z) s2 w, L! ^7 N) [4 ]5 v
- 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)');! i) m1 o: P6 e9 f* f
& R9 ?: s# H' N. P0 \
e, y- h# c6 G% x9 K7 A5 A2 i
- U( f$ v& n: r6 d& R. T
& t1 u1 M" e: r7 Z4 ?上面画图的函数stem(t,h),也可以改成stem(n,h)。
+ T* U6 F$ H: D. r/ [) P
2 T1 Z( C# x# T) {# N; |这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。
: B: i- t6 b1 W( i/ h6 N ?4 h0 M5 \! t: ?- u
可以使用这条语句进行验证:2 h& I9 d/ j+ ]* Q
5 g s2 Q* a& C2 J& g
n == h% ^. E3 O- F( L% U
) u/ L0 r" T2 J% E9 V E可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
' R/ X: h2 n' X( @: c% J9 @9 S( A: |. f
最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.! |" F; {3 p( f3 Z7 V" X
/ N7 y. ?2 ]1 M. d+ ? ]
再给出一个例子:: _9 {% x& _- V& d
' b4 u; w* G7 I y. s! i) `
首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:, @' N3 m! }9 _
/ I) [: y% e Y7 B9 d# uMATLAB之ellip 函数介绍(椭圆滤波器设计)
% ~) e" R& o, k7 {- x' H( t, |& G5 G
设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。4 [ k3 T; S# b0 u- H! v) c T
/ t4 h2 X9 C# \8 a* u5 ^- 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)
2 S) {/ s% p# E M( y 4 t [$ Z; k* @* p
8 f8 f; x8 Q# Y* A/ L. _/ e! t" g6 {
D# E& S8 u- ~4 ?) B( W5 r
|
|