您的位置:首页 > 编程语言 > MATLAB

滤波器设计(1):经典IIR数字滤波器的设计

2016-11-03 16:09 615 查看

引言

经典IIR(Infiniti Impulse Response)数字滤波器,虽然我在《信号与系统》和《数字信号处理》里学过,但现在已经忘得差不多了。翻翻书,还是能回忆起来。

好像有Butterworth滤波器,ChebyshevI型、II型滤波器、椭圆滤波器,等等。根据通带特性,分为低通、高通、带通、带阻、全通等。

设计方法,如果用手算的话,模拟的好像还要查表,数字的好像是先设计模拟的,再用脉冲响应不变法、双线性变换法设计数字的。

这里有IIR数字滤波器的百度词条,可以看看。

设计步骤

整个设计的步骤大致如下。

1. 根据需求,提出所需滤波器的类型和相应的(模拟)指标;

2. 根据1的指标,转换为数字指标;

3. 求滤波器的阶数;

4. 求滤波器的系数;

5. 根据系数,检验其频率响应是否满足1的需求。如果满足,结束;否则,重新设计。

设计实例

下面给出LPF和HPF的例子。

IIR 低通(Low Pass Filter)

%% 内容:我自己设计的LPF滤波器
% 作者:qcy
% 版本:v1.0
% 时间:2016年10月27日20:13:01

%% 设计一个数字低通滤波器 IIR
% fp = 500 Hz, fs = 750 Hz, Fs = 8000 Hz, Rp = 3 dB, Rs = 50 dB

clear;
close all;
clc

%% 0. 把所有模拟指标变换为数字指标
fp = 500; % Hz
fs = 750;
Fs = 8000;
Fs2 = Fs/2;
Rp = 3;
Rs = 50;

Wp = fp/Fs2; % 注意,这个是对(Fs/2)归一化的频率!!! 量纲为[1]
Ws = fs/Fs2; % 注意,这个是归一化频率!!!

%% 1. Butterworth  --> 最平坦
% (1) 确定阶数
[n,Wn] = buttord(Wp,Ws,Rp,Rs); % Wn 是对(Fs/2)归一化的频率。 量纲为[1]
% (2) 确定系数
[b,a] = butter(n,Wn);
% freqz(b,a,1e4);
[H,w] = freqz(b,a,1e4);
figure;
plot(w/2/pi*Fs,20*log10(abs(H)+eps));

figure
zplane(b,a);

%% 2. Chebyshev II型 --> 阻带等波纹
[n,Wn] = cheb2ord(Wp,Ws,Rp,Rs);
[b,a] = cheby2(n,Rs,Wn);
[H,w] = freqz(b,a,1e4);
figure;
plot(w/2/pi*Fs,20*log10(abs(H)+eps));

figure
zplane(b,a);

%% 3. Chebyshev I型 --> 通带等波纹
[n,Wn] = cheb1ord(Wp,Ws,Rp,Rs);
[b,a] = cheby1(n,Rs,Wn);
[H,w] = freqz(b,a,1e4);
figure;
plot(w/2/pi*Fs,20*log10(abs(H)+eps));

figure
zplane(b,a);


Butterworth LPF



Chebyshev I LPF --> 因为要设计低通,所以通带等波纹的Chebyshev II型肯定是不行的。如下图。



Chebyshev II LPF。阻带等波纹还可以。



IIR 高通(High Pass Filter)

%% 内容:我自己设计的HPF滤波器
% 作者:qcy
% 版本:v1.0
% 时间:2016年10月27日20:54:10

%% 设计一个数字高通滤波器 IIR
% fp = 200 Hz, fs = 1000 Hz, Fs = 8000 Hz, Rp = 3 dB, Rs = 20 dB

clear;
close all;
clc

%% 0. 把所有模拟指标变换为数字指标
fp = 200; % Hz
fs = 800;
Fs = 8000;
Fs2 = Fs/2;
Rp = 3;
Rs = 20;

Wp = fp/Fs2; % 注意,这个是对(Fs/2)归一化的频率!!! 量纲为[1]
Ws = fs/Fs2; % 注意,这个是归一化频率!!!

%% 1. Butterworth  --> 最平坦
% (1) 确定阶数
[n,Wn] = buttord(Wp,Ws,Rp,Rs); % Wn 是对(Fs/2)归一化的频率。 量纲为[1]
% (2) 确定系数
[b,a] = butter(n,Wn,'high');
% freqz(b,a,1e4);
[h,w] = freqz(b,a,1e4);
figure(1);
plot(w/2/pi*Fs,20*log10(abs(h)+eps));

%% 2. Chebyshev II型 --> 阻带等波纹
[n,Wn] = cheb2ord(Wp,Ws,Rp,Rs);
[b,a] = cheby2(n,Rs,Wn,'high');
[h,w] = freqz(b,a,1e4);
figure(2);
plot(w/2/pi*Fs,20*log10(abs(h)+eps));

%% 3. Chebyshev I型 --> 通带等波纹
[n,Wn] = cheb1ord(Wp,Ws,Rp,Rs);
[b,a] = cheby1(n,Rs,Wn,'high');
[h,w] = freqz(b,a,1e4);
figure(3);
plot(w/2/pi*Fs,20*log10(abs(h)+eps));


Chebyshev I LPF --> 因为要设计高通,所以阻带等波纹的Chebyshev I型是不行的。
阻带等波纹,相当于是会有很多低频也能通过HPF。明显不能实现HPF的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab 滤波器设计 IIR