|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: k$ N- x% P, l. e$ I+ j3 d. S
这篇在于讨论 impz 函数的使用。
% i* O, }6 z v" F- e) f/ A6 z0 [3 X9 m$ h$ j- K
MATLAB帮助文档对impz的介绍:MATLAB之impz函数介绍(数字滤波器的脉冲响应)
, I4 k- D" a; u- @- Y* X% ]6 J- |0 c+ H; d3 l
我在 MATLAB 中查看 impz 的帮助文档时,始终看的不是太明白这个函数的使用,于是我根据一个例子,对这个函数做了一点分析,解决了一些我的疑惑,记录于此。
. j/ I" T* W$ X; x% D% }& m5 _& F w7 V4 O
帮助文档上对这个函数的概括是数字滤波器的脉冲响应。
2 u+ {7 u$ h' e+ Q0 ?* D. \4 Q: F/ A* m1 A2 B$ j1 C
所谓的数字滤波器不就是一个线性时不变系统而已,根据脉冲响应的分子分母系数,可以得到该系统的脉冲响应。这个脉冲响应可以用下面的有理传递函数给出:# H/ i8 y v3 z" Y9 U1 y* P
$ ^/ ~: l- |, w3 _# T) }/ y
/ V$ f$ |) j) d4 `4 F/ d, @ f
# w0 ~- d! R5 j" V$ d v或者由差分方程给出:
& v5 L$ m! G; p) F7 K
8 g4 ]( P( S4 n- V
" e1 r6 b5 Y. b; R' Z8 o
( Z3 J1 |3 g5 P7 p, z& b1 Z上面的系数用系数向量表示为:; z4 p# t9 T: N3 s6 `
6 V! k4 {, J4 x( Y7 n! o分母系数为:a = [1,a(2),...,a(n_a +1)]
: W3 \% K. a4 l& F4 y. F分子系数为:b = [b(1),b(2),...,b(n_b+1)]
) v9 l5 `% f8 d% Z
* \+ {# K4 ]. a6 P因此,impz函数的语法格式有这么一条:; b5 R! L3 G) b4 t/ D P
3 v$ @0 Y, @: K2 @$ d. T
[h,t] = impz(b,a)/ Y/ H' U4 S6 v3 p* s! N, {
0 n4 Z1 x/ b* ]- s
这里的b和a向量就是分子和分母系数的向量。
6 ^0 J5 N7 p. S. T' p, M1 b) }9 \) @+ ^; D
得到的h就是该系统的脉冲响应,而 t 是脉冲响应值对应的位置。( [/ \$ \6 r# V9 l7 W
! B+ ?2 w5 m3 m- n- |
对于这个函数的使用,可以直接使用右边的部分,而不出现左边的部分,即 impz(b,a),而文档对其解释如下:
8 `4 r* k( r l [0 `9 ]
9 T2 p% C2 h; ]9 o) E. `% q% I4 Zimpz(...) with no output arguments plots the impulse response of the filter.7 O% z3 G, b8 u7 a
# q) g# V) D T& C. o [
意思是直接画出该系统的脉冲响应。
% k- _& {( s& b E
. g5 J% S0 u5 t$ {& R4 w. T我们举个例子来理解:
+ Z! z, W% T) j, \- o8 h0 u3 B: Z3 {
这个系统使用差分方程来描述如下:
7 m( D& z8 x- b$ z% h; x9 {' T# o8 t" t' H
y(n) - y(n-1) + 0.9y(n-2) = x(n)
8 Y5 S, ?3 K$ B
- r N1 _/ u/ l% i要求计算并画出它的脉冲响应。7 A5 }) }! {6 M
% M8 _. S& ?1 Z6 l6 I题解:
6 H7 a& k, S3 f5 T+ s E j" @1 I+ C1 q/ z4 k0 T$ c8 p9 S, o
跟上上述对impz函数地简单介绍,其实我们可以直接画出它的脉冲响应了。
+ t! @7 X. n, o, W1 H
! y' z ]* w) ?* b4 D! |- b = [1];
- a = [1,-1,0.9];
- [h,t] = impz(b,a)
- stem(t,h);
- title('Impulse Response');
- xlabel('n');ylabel('h(n)');% q3 U0 q' ^+ U0 E: ~
/ ^. N' h& I3 k* T7 A% ^+ `9 t( j
m3 p7 L) V6 v5 O" m: |3 I
+ f+ D8 m7 B! t) \" o! r
! T0 Y% @, M, X7 v+ J) Z也可以:
: C* \; N/ @# S! C! L+ a B. M( S
& q+ L; k& j% l2 s- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- impz(b,a);
- ylim([-1.2,1.2]);
) T; q2 n6 a) H& V# x. f # k4 O( \6 n& V5 E6 G4 i6 m
7 i0 q8 K5 j+ |8 I3 i! P0 {, z4 X$ m
上面两种方法画出的脉冲响应其实是一样的。
; }$ _9 @8 I9 ~ a" Q, B U+ S1 x o, c! x5 z$ `8 f T* ?
上面这个简单的用法也就告一段落,下面我们再看一条变体语法:
8 C# D& K, o7 j+ u
" }2 [8 Y) p3 i4 {. 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.$ l+ g: [# f# E5 X5 R
只看语法格式,那么一大串英文介绍暂时不管,后面我会慢慢解释。
. i1 I1 ? ]- Q7 V1 O' O8 \0 i% W+ \) J" C' e
[h,t] = impz(...,n)
% v" K2 E/ X/ y
0 h/ ? L- V9 ^1 ` L后面的这个n是什么玩意?3 R' O/ k- I3 f; m4 d6 x v
, f6 w# [) K1 ]它的用意我用自己的语言叙述下就是如果我要求的脉冲响应不是从0开始,那么我就可以使用这个n向量来指定脉冲响应的位置范围。2 @5 k% D+ I- \0 e& S" ~
9 O8 F1 r6 Y' f2 p4 f Z同样使用一个实例来说明,同样是上面的那个差分方程表示的系统,我们求它的脉冲响应。: Y2 u1 A! E b; v
/ m; n8 l; r( N9 N5 g9 \
这个系统使用差分方程来描述如下:
( u6 ~0 `6 p3 j" F/ H! k
: P! k: I+ G4 _/ i' F7 sy(n) - y(n-1) + 0.9y(n-2) = x(n)
: |$ k2 p) Z1 [ ?% T& ^+ y6 p
' `) p, T; \! P要求计算并画出在n = -20,...,100 的脉冲响应h(n)。# N3 i" t# B% w
6 ?) N% \$ `% W/ E4 q7 J
脚本程序如下:; k% I" ?7 a" U% [+ f4 Q+ D3 n
" R/ f: H) z; s, v5 V9 @- clc
- clear
- close all
- b = [1];
- a = [1,-1,0.9];
- n = [-20:120]';
- impz(b,a,n);
- ylim([-1.2,1.2]);& w1 F0 g; o+ T- Z$ q0 ^
0 D3 r$ M# g s9 f0 J7 n
! U5 T/ n. W$ W
- n" C# O, b( H& p6 `& k
* @: \. q+ C* F- E3 d. b6 N, n这里的n是一个行向量或者一个列向量,无关紧要。
9 h8 |8 P! n0 m* Q9 F3 h! a" k" A' T# `* K6 |3 H
也可以使用下面的方法来产生:
% t! s) L" j9 W
/ X5 X! Q5 c6 s: O0 ~- a& W- 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)');
3 A r) n U9 y8 N7 X7 U w& h
' H1 u* b9 f2 \' |$ X% O6 D& A6 X0 i
7 I/ e. A' e7 ?, ^, S- }- f, E
- W* P0 t- W, B( V! U0 i: e/ p- ^; F8 Y) Y- X+ v$ E
上面画图的函数stem(t,h),也可以改成stem(n,h)。
$ f, D. H7 g9 l. O' k: `
" L' v0 }" J d, _) H, H. d: b这间接说明了t和n是一样的,函数产生的t是一个列向量,如果n也是一个列向量的话,那么二者一致。* c. G) X+ e" d0 X; Y6 ~% I
% @* ^& T$ h( o, f) M8 K0 G, F
可以使用这条语句进行验证:& H7 t/ A7 H R! T$ N w
6 Z: j" |9 Q) L' e) {7 hn == h
4 H8 Y/ i1 }) Y( R' o
`; W' g3 L) r可以得到一个和n同维度的向量,元素全为1.(可自行验证。)
, S7 o, N6 s1 L; W. p; `2 c& J- i1 H+ k/ N
最后,需要说明的是由于是同一个系统,所以指定与不指定n产生的脉冲响应都是一样的,只不过这里指定了显示脉冲响应的位置在-20,...,100.. a+ [6 _. s" r( N
; h+ W0 @$ O6 l
再给出一个例子:4 Q9 j" L" D9 x5 x$ G6 u
, a; ~3 g7 C) ^- o1 j
首先使用ellip函数产生一个满足如下要求的滤波器,关于ellip函数介绍如下:
: Q4 F8 P5 ]3 h. a$ a5 @7 U1 U* Z: G& O R0 z. [
MATLAB之ellip 函数介绍(椭圆滤波器设计)
( q" S/ d9 T8 ?% S" s9 N2 @5 O
6 I& Q6 Q; w4 i# s# s* P设计具有归一化通带频率0.4的四阶低通椭圆滤波器。 指定0.5 dB的通带纹波和20 dB的阻带衰减。 绘制脉冲响应的前50个样本。
/ m$ c1 P- I( `) f t0 j- d* G" K+ X: n& a3 p, r) I8 S% Z$ ?
- 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)
- D. X8 g8 ?! ~ + T7 L: r0 a; O4 ?
8 S, a2 q2 g/ W; | F
$ w+ w+ ^$ o4 z7 A( ]) v |
|