|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) P# w f4 e. n( j$ v! S: G这篇在于讨论 impz 函数的使用。2 v2 Z3 K2 Q" l
" {. x' {3 q$ i8 ]2 B+ Q& a( j& BMATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)
9 _& e% _' {6 S( \* p
* e; F& i) s% ?: t" m* A5 b( }我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。& w0 R4 C: B; r
- j% q8 q) J \. T9 D
帮助文档上对这个函数的概括是数字滤波器的脉冲响应。7 L6 b w* L! j
5 r" i0 b' F; P* y" k5 V
所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:9 j8 Y0 R* g0 D* G1 \; C
8 m9 B, O7 W2 v5 r! w6 w4 F! e
: R9 n+ T% A; E, V) d: u6 A* L: X
6 E) ~/ Y1 g0 w+ m; U2 R或者由差分方程给出:( r/ G& k5 C( N% Y2 P
/ w' I6 u `7 r3 q4 m* k+ ]
. O8 s! ^2 n ~2 l! n5 R
5 t- m/ _+ z% L1 r上面的系数用系数向量表示为:
& B5 k; B& U5 R7 Z# u$ T* x! D( R$ ^! _. d
分母系数为:a = [1,a(2),...,a(n_a +1)]
) O+ q+ J3 ~- L$ A) @ E
分子系数为:b = [b(1),b(2),...,b(n_b+1)]
% @( K l4 p- h
9 \0 P/ _; y6 g7 ^8 y; I# Q因此,impz函数的语法格式有这么一条:
! F0 u% y Q) {& b- I2 \+ F& @) [6 q
[h,t] = impz(b,a)4 S8 p+ j( R* D# ^+ B# Y) Z
' ?% _4 c' h+ p0 ]
这里的b和a向量就是分子和分母系数的向量。5 g1 G$ `! F+ [+ j- i- R& g
* q4 h: D: y% k得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。
4 q. k8 f, _0 K2 r; x
1 ]7 G2 n* O6 H$ ~, z$ p对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:9 P# S4 L* [0 r" K/ g ]% ]4 T
" G, K3 a6 Z- N
impz(...) with no output arguments plots the impulse response of the filter.
/ ?6 |. W) {0 i" Y! E1 |9 v4 B" {/ [* \- Y$ s" W
意思是直接画出该系统的脉冲响应。7 C4 j6 [' [ J ]1 s8 a
4 m! x$ I$ ?& v) ]" H我们举个例子来理解:: ]8 W5 x8 |( o' v, V; O
- a, W! m$ u$ M这个系统使用差分方程来描述如下:
1 H) q" K) Z. {/ r2 A
' I! p" p; z# o/ d# `# {: t/ |y(n) - y(n-1) + 0.9y(n-2) = x(n)6 \$ ~& d4 L) ~6 J# @: ]9 y' h
2 m2 d# e1 ?" b' t, J+ C9 }要求计算并画出它的脉冲响应。* b) Q7 N" M' w" v7 p8 e
' d' p. y, H' ^. ^
题解:
2 [. p7 ?4 Z, |+ l# ?1 \/ n6 e9 u. w0 k' z* m( W7 h; @
跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。; F' {" B( g8 G& J' @, S1 O
S3 }+ {" w: A! _
- b = [1];
- a = [1,-1,0.9];
- [h,t] = impz(b,a)
- stem(t,h);
- title('Impulse Response');
- xlabel('n');ylabel('h(n)');
( U& H2 M5 @- Z- l
8 z% v& z4 h# m. z' U/ Y6 r
' {+ k7 X7 n! X" z' j; y8 \" P' F; \2 M) `- z/ m
, K0 Z# q9 R3 a4 D也可以:+ Z9 t' w4 q1 ]* x
6 y# w. x- O! T( R* Q* y; H- Y
- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- impz(b,a);
- ylim([-1.2,1.2]);
& n6 T ]- J8 W5 s( `! l( P7 K! A
* @5 k; h& ?$ k N
. x5 r' V, g2 @' b
% V; C7 W3 s: T& x2 J8 o1 F7 S上面两种方法画出的脉冲响应其实是一样的。
2 v# e; a6 K9 \- G4 y
( R5 ~! H1 F& I4 j. R( p# b9 s1 U上面这个简单的用法也就告一段落,下面我们再看一条变体语法:& O. [+ x {5 x; U+ ~
. H. J" Q5 x' Q, U4 J[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.3 q0 J) C, b0 n( i4 w+ j4 e
只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。
5 [, q3 G9 b# e0 S/ h1 F
# c8 D3 {& A1 J/ v+ a[h,t] = impz(...,n), j( k' l' `% M" \4 z# V
3 ^* _2 t( J! j后面的这个n是什么玩意?, _* O# |+ x6 A3 r( }
0 y) f( U( T- x" y它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。* D0 k1 V" S9 `7 I" @
2 J9 Q: B$ G$ ], I2 u同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。
7 r) g2 P5 `$ _% n, @0 V6 `5 I- n7 N5 r r) w, B8 j T
这个系统使用差分方程来描述如下:! G1 b1 j0 Z& v2 a" a
2 s+ b. f" J# a) c4 U
y(n) - y(n-1) + 0.9y(n-2) = x(n)" E6 _8 D5 ]) [. c5 C6 `/ e8 K
" p/ `/ }, j& w5 D, Z
要求计算并画出在n = -20,...,100 的脉冲响应h(n)。9 |( b; D) b! i0 `" F# l" V
7 i' S% ? A4 H6 C4 e
脚本程序如下:) K: R0 O" M0 h8 e% V9 ^
; g" T- k6 e f1 w/ f6 M' q, A" @
- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- n = [-20:120]';
- impz(b,a,n);
- ylim([-1.2,1.2]);
3 n# s6 J( G" d$ [. K( K" M0 o
+ }; B+ q# v; N+ p1 k8 ?" _& Q2 t! p5 ]/ k
* _* ]: K* G3 M( G, e/ m, R" B$ Y
% {" c* U- H* m- q( B/ V9 A这里的n是一个行向量或者一个列向量,无关紧要。
0 E: I5 j3 A6 {$ X1 f8 a: z5 {; H& ^% T- e& X) f$ W7 ~5 _
也可以使用下面的方法来产生:1 F4 J0 H+ B# I
2 ` Y: j$ L3 m$ V+ R( R! @4 I7 [
- 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)');
4 @, d& P" g( I% \! v
& q8 J1 n6 N. d( C5 F1 l
/ @4 t4 o. u5 a9 S* U5 R
3 @" n3 U+ X: K, s) A" V
2 f) w1 i3 A( L! F( R上面画图的函数stem(t,h),也可以改成stem(n,h)。
' Y1 \3 T5 w3 W7 W& q. z1 f$ P: t" O, P, N+ r
这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。' n5 e9 h8 h/ @+ c
( C! @7 G3 j- K& G1 q可以使用这条语句进行验证:
+ Z- ]0 x, @1 @- F3 r+ Q7 k& q5 H( s, i) Z5 f% p
n == h1 N! |" r% E' T7 p6 A
% q* D8 n2 S; g) a7 z: p可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
8 J: a j' W$ a9 ?5 L( j0 M2 n7 |/ o9 }2 T) H3 }( R. Y' [ F
最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.
4 L6 c. p$ F2 v, s9 R, _6 F8 V1 z9 D3 C$ }- c1 Z9 W: x
再给出一个例子:
4 R" U3 U' N7 o% u5 Y8 }" N
% A7 r9 @4 H: g5 l9 U首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:& x8 Q( N; @- G* Z; S/ v: }2 [
+ d. ^& h T- r1 h" C# `MATLAB之ellip 函数介绍(椭圆滤波器设计)% M# d: B1 _2 j5 `
, {1 d2 B% Y1 S) _ P J* h/ H+ |设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。 N5 v+ P1 E/ k# o
& x" G) m; Q" s% v- ^; i' t- 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)
- a7 v1 O5 Q4 w
- B* l+ ?% B* F1 L- u$ u9 v7 f1 `- Q' H" n) O5 r
1 b8 B; \3 n$ i+ e/ J |
|