特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
/ H) T; \2 T* N: H. w! ?第39章 IIR滤波器的Matlab设计
% I5 k2 l7 _6 C# m8 q, ~ 本章节讲解IIR滤波器的Matlab设计,主要包括巴特沃斯滤波器,切比雪夫I型和II型滤波器以及椭圆滤波器。 39.1 巴特沃斯滤波器的设计 39.2 切比雪夫滤波器的设计 39.3 椭圆滤波器的设计 39.4 总结
+ F' Y. N! q6 t' p39.1 巴特沃斯滤波器的设计3 ?& o6 F7 L: V3 u& b h
39.1.1 butter函数功能:用于设计Butterworth(巴特沃斯)滤波器 语法:[b, a] = butter(n, Wn); 说明:butter函数可以设计低通、带通、高通和带阻数字滤波器,其特性可以使通带内的幅度响应最大限度地平坦,但会损失截止频率处的下降斜度,使幅度响应衰减较慢。 l [b,a] = butter(n,Wn)可以设计截止频率为Wn的n阶低通butterworth滤波器,其中截止频率Wn应满足0Wn1,Wn=1相当于0.5fs(采样频率)。当Wn = [W1 W2]时,butter函数产生一个2n阶的数字带通滤波器,其通带为W1 < W < W2。 l [b,a] = butter(n,Wn,'ftype')可以设计高通或带阻滤波器。当ftype=high时,可设计截止频率为Wn的高通滤波器;当ftype=stop时,可设计带阻滤波器,此时Wn = [W1 W2],阻带为W1 < W < W2。 使用butter函数设计滤波器,可以使通带内的幅度响应最大地平坦,但会损失截止频率处的下降斜度。因此,butter函数主要用于设计通带平坦的数字滤波器。 2 f# d; w; f7 F& R) }, d4 x( F8 M! }
39.1.2 buttord函数功能:用来选择Butterworth滤波器的阶数。 语法:[n, Wn] = buttord(WP, WS, RP, Rs); 说明:buttord函数可以在给定滤波器性能的情况下,选择Butterworth数字滤波器的最小阶数,其中WP和WS分别是通带和阻带的截止频率,其值为0Wp(或Ws)1,当该值为1时表示0.5fs(采样率)。RP和 Rs分别是通带和阻带区的波纹系数和衰减系数。 [n, Wn] = buttord(WP, WS, RP, Rs)可以得到高通、带通和带阻滤波器的最小阶数n。 当WP>WS时,为高通滤波器;当WP, WS为二元矢量时,若WP<WS,则为带通和带阻滤波器,此时Wn也为二元矢量。 利用buttord函数可得到Butterworth数字滤波器的最小阶数n,并使通带(0,WP)内的波纹系数小于RP,阻带(WS, 1)内衰减系数大于Rs。buttord函数还可以得到截止频率Wn,再利用butter函数可产生满足指定性能的滤波器。 使用butter函数设计数字滤波器,可以使通带内的幅度响应最大限度地平坦,但在截止频率附件幅度响应衰减慢。如果期望幅度响应下降斜度大,衰减快,可使用Elliptic(椭圆)或Chebyshev(切比雪夫)滤波器。 6 n/ s8 q; h3 h5 @' n
39.1.3 巴特沃斯低通滤波器设计 下面我们通过一个实例来讲解巴特沃斯低通滤波器的设计。原始信号是由50Hz正弦波和200Hz的正弦波组成,将200Hz的正弦波当做噪声滤掉,下面通过函数butter设计一组低通滤波器系数,其阶数是2,截止频率为0.25(也就是125Hz),采样率1Kbps。Matlab运行代码如下: - fs=1000; %设置采样频率 1k% C8 R2 ?+ Z- n0 T! u o
- N=1024; %采样点数
. d* v/ D& W+ d3 o0 q/ \: `* A - n=0:N-1;
, u3 q Z# G( Q" }1 M6 s - t=0:1/fs:1-1/fs; %时间序列 2 h3 d# m" }6 r7 v# V
- f=n*fs/N; %频率序列2 R% I/ G p; }
- ; h# }$ f: [7 k* L' v/ [
- x1=sin(2*pi*50*t); %信号
1 g& ^7 a G7 R# U - x2=sin(2*pi*200*t); %噪声( x& E+ T! H5 M [8 z1 j2 ^
- x=x1+x2; %信号混合
2 B+ Z+ Y% u8 d: I% L -
6 E% R- G* u' r/ } - subplot(221);
5 ]" C# M1 b; h/ _! Y2 E - plot(t,x); %绘制原始信号
0 P2 i6 y/ u6 Z3 z - xlabel('时间');$ C1 P1 ]4 A! Y9 R" p
- ylabel('幅值');
( b4 B5 ?: H% | - title('原始信号');: A2 D2 D3 O2 u1 V( l! h8 d, c
- grid on;; l. p1 o" [6 v/ J& M5 V/ J0 A
- # H9 S9 T9 i+ W7 Q
- subplot(222);: z& Z A: h0 A4 D, @( C
- y=fft(x,N); %绘制原始信号的幅频响应9 v# \1 B4 ^# S L9 J5 \; o
- plot(f,abs(y));( [3 E3 K- M- u m2 k7 l
- xlabel('频率/Hz');* O: j* l. I0 h0 d
- ylabel('振幅');" T$ A( X [6 [4 v) N
- title('原始信号FFT');$ W( r' o" T$ G3 F4 [! e0 Y# T
- grid on;
+ `! W" f* v8 z+ {4 ` -
4 i3 n# b, k8 M- Y - subplot(223); ; b1 K. A( g3 Z7 ^; N
- Wc=2*125/fs; %设置截止频率125Hz
& b6 ~8 T2 K: h5 [ - [b,a]=butter(2,Wc); %获取2阶IIR滤波系数; N9 Y& G. I1 k# s
- % y2=filter(b,a,x);9 x$ m4 f+ B# ~" f
- y2=filtfilt(b,a,x); %计算滤波后的波形y2
% N- y$ q* d+ Q$ i - y3=fft(y2,N); %滤波后波形的幅频响应
3 k/ b, t4 n5 K - plot(f,abs(y3));
2 j! A6 N( f) X5 e* p: ^ j - xlabel('频率/Hz');
/ N U) D2 q; a - ylabel('振幅');
. }; j' x1 C( w8 n - title('滤波后信号FFT');7 l8 O' C) }/ ~% ]/ V* v8 _
- grid on;
9 d7 S+ R- w0 W4 \3 F -
$ h4 ?- ~7 G5 G3 \$ q8 U - [H,F]=freqz(b,a,512);
" v7 d% K) H5 {' _0 L. W - subplot(224);8 G1 p3 e3 b5 x- d. V. |* u, g$ _
- plot(F/pi,abs(H));
8 \( s+ S3 a. {' s( b- h - xlabel('归一化频率'); %绘制绝对幅频响应' x7 l2 g) C6 c: \; P# M7 m# X
- ylabel('幅度');
/ x" P" d3 A r! E/ l5 D - Ps=sum(x1.^2); %信号的总功率
6 D8 S9 o# E6 Z/ [& d: b - Pu=sum((y2-x1).^2); %剩余噪声的功率0 x* W3 K$ n+ [- _( c1 G2 i! a
- SNR=10*log10(Ps/Pu); %信噪比' }. |: x7 r9 m& ^' N: T" @4 i
- title(['Order=',int2str(2), ' SNR=',num2str(SNR)]);: A5 P2 a/ T0 O! [5 M, x
- grid on;
复制代码运算Malab结果如下: 从滤波的效果来看,2阶的IIR滤波器能够达到将近20的信噪比,比使用FIR需要更少的阶数。 0 [- f5 [8 b+ E' F0 }
39.1.4 巴特沃斯高通滤波器设计 下面我们通过一个实例来讲解巴特沃斯高通滤波器的设计。原始信号是由50Hz正弦波和200Hz的正弦波组成,将50Hz的正弦波当做噪声滤掉,下面通过函数butter设计一组高通滤波器系数,其阶数是2,截止频率为0.25(也就是125Hz),采样率1Kbps。Matlab运行代码如下: - fs=1000; %设置采样频率 1k
7 z2 M7 m9 F. d% z7 U5 s2 q; N - N=1024; %采样点数* p- F' v* O% k1 ` f' a1 E
- n=0:N-1;
- n9 R+ ~1 @/ H - t=0:1/fs:1-1/fs; %时间序列
; h6 ^, K: ^4 o8 g0 ?8 O$ w - f=n*fs/N; %频率序列6 ^% _1 q8 o/ M- D
- / T/ q! w, V. s1 U5 p" {
- x1=sin(2*pi*50*t); %噪声
7 P& N6 T: Y# ?& h& I7 V - x2=sin(2*pi*200*t); %信号! K) y9 T2 w1 w1 G& R
- x=x1+x2; %信号混合
, o# n5 F ~9 U& i7 U+ Z J5 h -
2 {8 n! d; h9 v3 K1 A. L. M - subplot(221);
) W0 g' G6 l. [/ r+ k - plot(t,x); %绘制原始信号
5 V) z* ^! k6 E4 ^: h9 q% e' J2 F& j - xlabel('时间');
+ v5 L! o t' s0 B) q( m - ylabel('幅值');
5 }5 ~% |5 ?; R z" L9 e+ k - title('原始信号');
! X6 O! t y1 E: s6 l0 c5 u. s4 u - grid on;8 k6 x% n. @3 l$ c6 S4 [
-
7 a/ s/ {* J/ E( R$ I% ]9 i - subplot(222);0 r' M. x4 {' w7 k
- y=fft(x,N); %绘制原始信号的幅频响应- C5 U% j+ O* u4 D4 [- g! `% t' g4 z
- plot(f,abs(y));! L6 D) i7 s' q F
- xlabel('频率/Hz');5 K5 W7 _& f. C# s) ?
- ylabel('振幅');' |' b3 E0 M- O: k9 w7 s1 y, u
- title('原始信号FFT');* M' O& P. t& `1 U: ?" B
- grid on;
. }# M. O/ Q% ^7 A7 M0 r; w -
9 ^0 u) @6 }3 Y - subplot(223); , x3 J8 u8 X6 }" a+ u. a2 L) G+ i/ t
- Wc=2*125/fs; %设置截止频率125Hz 4 n7 A9 P5 c# j" L8 B) q% \0 I, M
- [b,a]=butter(2,Wc, 'high'); %获取2阶IIR滤波系数2 {& q! ?6 U4 Y* f* D! a
- % y2=filter(b,a,x);
! _' d' I9 z1 [0 d - y2=filtfilt(b,a,x); %计算滤波后的波形y2
' q* e! }% g& ]& |3 a; y( B9 X/ q - y3=fft(y2,N); %滤波后波形的幅频响应
( H W' c& e5 |! k- |0 ^ - plot(f,abs(y3));# y4 Z6 W; G! C) R
- xlabel('频率/Hz');+ s1 \* v+ t6 l! T3 ~/ U
- ylabel('振幅');- o! `) t* j4 J
- title('滤波后信号FFT');% |% Q0 T* K/ y- T5 E+ X! f
- grid on;
' A3 @. S! }) u -
$ r7 I4 u* j; J; Q - [H,F]=freqz(b,a,512); P1 K9 M3 ^$ k S- F
- subplot(224);7 h2 A* E7 \' u- d
- plot(F/pi,abs(H));
+ r& d5 E! s( H& m! P& _0 u - xlabel('归一化频率'); %绘制绝对幅频响应
( I2 p$ v z# h ]) Z0 | E$ x - ylabel('幅度');- }9 m5 O% v% @
- Ps=sum(x2.^2); %信号的总功率
, P; z: |0 o/ H/ @/ l6 V: Y; _ - Pu=sum((y2-x2).^2); %剩余噪声的功率* ?( b; ]3 N# u: P7 x! Z$ H
- SNR=10*log10(Ps/Pu); %信噪比9 s5 \0 C4 ]3 M, b( F" q2 O
- title(['Order=',int2str(2), ' SNR=',num2str(SNR)]);
& n1 u1 k, ~) ~4 R" {1 W- V - grid on;
复制代码Matlab运行结果如下: 从滤波的效果来看,2阶的IIR滤波器效果还是比较好的。
+ H. w: k4 E* A+ `39.1.5 巴特沃斯带通滤波器设计 下面我们通过一个实例来讲解巴特沃斯带通滤波器的设计。原始信号是由50Hz正弦波和200Hz的正弦波组成,将50Hz的正弦波当做噪声滤掉,下面通过函数butter设计一组带通滤波器系数,其阶数是2,通带为125Hz到300Hz,采样率1Kbps。Matlab运行代码如下: - fs=1000; %设置采样频率 1k" A6 j3 K% X8 b+ G2 {/ E" G: N+ W
- N=1024; %采样点数
( h S/ [& f. I; E$ N' H - n=0:N-1;' S& e+ B" u/ e+ z+ ^* z
- t=0:1/fs:1-1/fs; %时间序列 & w/ g" N. P3 F6 X! s3 M
- f=n*fs/N; %频率序列2 C" o% W9 J( ?2 R8 l
-
- w. v" Z* X4 x3 \# m5 q - x1=sin(2*pi*50*t); %噪声
& y) L" T: Y+ T, [) Q - x2=sin(2*pi*200*t); %信号
2 @5 ~2 z0 ~% B1 i. z0 ` - x=x1+x2; %信号混合9 v' X9 V8 N: w& M; H6 e
-
: Y. Y" C% t2 {4 ^1 q - subplot(221); r7 S4 y3 M1 e: I: z3 A2 d
- plot(t,x); %绘制原始信号- c! f( W5 L! Q+ v7 F! M+ v
- xlabel('时间');: L' P1 {1 U5 N% s& |4 Q4 J/ e
- ylabel('幅值');5 H3 J& R! P, v& }, D( r7 `( J& L
- title('原始信号'); A* L8 m; ?& b- _- U4 r: y
- grid on;
7 b% l+ X$ j) B1 n- B7 h -
( L, F$ b1 a5 ], F1 | - subplot(222);! E2 @ G0 z2 Z8 K8 v0 d0 \
- y=fft(x,N); %绘制原始信号的幅频响应
3 l, Z" `/ Q0 B* y, o - plot(f,abs(y));$ \6 f& ]7 Q5 h1 G" J2 s: \
- xlabel('频率/Hz');) N+ o- ]' H- S2 w& M' _
- ylabel('振幅');
* Z2 I% [3 D0 u6 d, E# M1 B - title('原始信号FFT');% ~: P7 J5 p+ L0 e$ t
- grid on;
. F2 s4 L. `/ E+ f2 `# E -
) X4 M3 @2 X' N$ _3 Y* s - subplot(223); # j3 T# I/ A4 Z
- Wn=[125*2 300*2]/fs; %设置通带125Hz到300Hz
+ @7 ]0 C% L( ? - [b,a]=butter(1,Wn); %注意第一个参数虽然是1,但生成的却是2阶IIR滤波器系数
: C: w$ D5 E1 G8 L3 i - % y2=filter(b,a,x);" q1 a3 R* A0 R8 U% T
- y2=filtfilt(b,a,x); %计算滤波后的波形y2: f' V/ K# }6 n/ p C
- y3=fft(y2,N); %滤波后波形的幅频响应
( w4 y. w, i. ?: ? - plot(f,abs(y3));5 d3 m- \4 M) N
- xlabel('频率/Hz');
$ K) D5 l1 j- C* I' E w. l% p8 { - ylabel('振幅');
' ]' i3 U, U3 x5 \ - title('滤波后信号FFT');
- ?8 c/ L- s$ I& w9 {# Z - grid on;8 _+ z- Q& z% y0 n% u" q" W3 @4 q
-
# @: Y" Y. e" U6 I# t2 q2 {% J$ i - [H,F]=freqz(b,a,512);
$ H: @! Q( {8 f) d) F% H& y. p6 x - subplot(224);
7 K. Y5 K: z: l9 } - plot(F/pi,abs(H)); j) G' M8 g" n. w4 [$ P
- xlabel('归一化频率'); %绘制绝对幅频响应) t. u& M- U. w' R# s
- ylabel('幅度');. u O- Z% l" i9 Q7 A4 p
- Ps=sum(x2.^2); %信号的总功率
3 \( c$ j5 |9 y( K# ? - Pu=sum((y2-x2).^2); %剩余噪声的功率
- v# G' z0 }( ~9 K5 A - SNR=10*log10(Ps/Pu); %信噪比& T$ M% V4 @/ I$ ^5 N
- title(['Order=',int2str(2), ' SNR=',num2str(SNR)]);2 z4 U2 B+ ?# A* y
- grid on;
复制代码Matlab的计算结果如下: 从滤波的效果来看,2阶的IIR滤波器效果还是比较好的。
9 l. ~2 D" ~2 P& |3 G' S4 P39.1.6 巴特沃斯带阻滤波器设计 下面我们通过一个实例来讲解巴特沃斯带阻滤波器的设计。原始信号是由50Hz正弦波和200Hz的正弦波组成,将200Hz的正弦波当做噪声滤掉,下面通过函数butter设计一组带阻滤波器系数,其阶数是2,阻带为125Hz到300Hz,采样率1Kbps。Matlab运行代码如下: - fs=1000; %设置采样频率 1k$ }& O2 \. z/ k, s H+ E
- N=1024; %采样点数9 d9 K3 ^& K' C) Q2 M
- n=0:N-1;
) X# W0 l7 M" B5 l - t=0:1/fs:1-1/fs; %时间序列 ) F! t' U) Z5 M" T2 ]2 N% `
- f=n*fs/N; %频率序列
: ~# r1 B1 J$ m! F$ f2 `) J: k7 l - 8 H) G4 P; ?& Y# m, ^# O
- x1=sin(2*pi*50*t); %信号$ D9 u# K, `# |' O: o0 f
- x2=sin(2*pi*200*t); %噪声
2 m( K5 |+ @" y1 ~( @ k - x=x1+x2; %信号混合
0 h8 i; e/ `' I0 x- h+ b - " m% n* T3 |3 _* \5 g% }: ~1 V
- subplot(221);
9 v+ J- K8 V( q+ o" _ - plot(t,x); %绘制原始信号
' ~5 _7 j4 V# ^% f - xlabel('时间');$ J# T* \( y0 x2 i
- ylabel('幅值');
_& u/ c9 j }8 j, t5 w - title('原始信号');
5 k( i6 s! p0 p7 X+ E! v - grid on;
- n; I' `9 }' i& ` -
- \+ x2 ?# k7 Z2 F& ]: v% V& F - subplot(222);3 [3 \6 G% p7 j* s
- y=fft(x,N); %绘制原始信号的幅频响应, ~( N# y$ R! S+ y% n
- plot(f,abs(y));7 Z0 d) r, o1 V2 B5 Y$ C
- xlabel('频率/Hz');
0 m0 I/ ?: \) h - ylabel('振幅');- s* O9 l, Z- g& u
- title('原始信号FFT');
% ?: j5 V" L/ L - grid on;
: \; n. | L0 w0 M -
" |) ]" \; ^! ~ - subplot(223);
+ F. W i1 X3 H" f - Wn=[125*2 300*2]/fs; %设置阻带125Hz到300Hz
1 X V6 L6 C% J4 L* [! W9 r) m0 B - [b,a]=butter(1,Wn, 'stop'); %注意第一个参数虽然是1,但生成的却是2阶IIR滤波器系数
. ]! e2 G* y( W0 K2 }& @0 v - % y2=filter(b,a,x);0 a- b* m/ a2 E9 y
- y2=filtfilt(b,a,x); %计算滤波后的波形y25 w$ r: e+ z; P
- y3=fft(y2,N); %滤波后波形的幅频响应
/ [7 ~" k: B/ x( F' X - plot(f,abs(y3));) V) E0 |8 e% A0 ?) s/ J$ u
- xlabel('频率/Hz');
! \5 K; a' Y T$ L0 j - ylabel('振幅');' [, B& f# ]. e2 j$ Y& E/ ~$ o
- title('滤波后信号FFT');
8 A7 f6 R3 s' J+ W; v8 s7 v - grid on;, O4 c2 U9 D. X
-
3 A! `+ }! y) D$ Y2 Y! ^/ Y - [H,F]=freqz(b,a,512);
, Z- j2 n: R& \* S X6 N+ v& ~. a6 w - subplot(224);
) d* o2 r" ^, h# h' T5 m0 z0 ?7 o - plot(F/pi,abs(H));, r; Z/ w8 d% W- v1 s/ w
- xlabel('归一化频率'); %绘制绝对幅频响应
. Z6 {8 j7 [6 {# _6 h6 m6 D - ylabel('幅度');
# \4 E8 m" k( b9 r7 \ - Ps=sum(x1.^2); %信号的总功率
5 K, b/ e, ^3 e |$ \ - Pu=sum((y2-x1).^2); %剩余噪声的功率
3 q3 }$ t$ ] A; g" x, O5 `; M1 k - SNR=10*log10(Ps/Pu); %信噪比
6 o9 w" @9 V& p" r6 v0 ]# q5 C. s - title(['Order=',int2str(2), ' SNR=',num2str(SNR)]);
! Z: p5 L% I+ i5 M c- @2 q0 w - grid on;
复制代码Maltab运行结果如下: 从滤波的效果来看,2阶的IIR滤波器效果还是比较好的。 & R& L7 K5 a, m; d) [
|
39.2.2 cheby1ord函数
39.2.3 cheby2函数
39.2.4 cheby2ord函数
39.2.5 切比雪夫I型低通滤波器设计
39.2.6 切比雪夫I型高通滤波器设计
39.2.7 切比雪夫I型带通滤波器设计
39.2.8 切比雪夫I型带阻滤波器设计
39.3.1 ellip函数
39.3.2 ellipord函数
39.3.3 椭圆滤波器设计