目录
与 FIR 滤波器相比,IIR 滤波器的主要优点是,要满足同一组设定,它的滤波器阶数通常远远低于 FIR 滤波器。虽然 IIR 滤波器具有非线性相位,但 MATLAB® 软件中的数据处理通常是“离线”执行的,即整个数据序列在滤波之前是可用的。这允许采用非因果零相位滤波方法(通过 filtfilt 函数),消除 IIR 滤波器的非线性相位失真。
经典的 IIR 滤波器、Butterworth 滤波器、Chebyshev I 类和 II 类滤波器、椭圆滤波器和 Bessel 滤波器都以不同的方式逼近理想的矩形滤波器。
使用模拟原型的经典IIR滤波器设计
该工具箱提供的主要 IIR 数字滤波器设计方法基于将经典低通模拟滤波器转换为其等效的数字滤波器。
完成经典 IIR 滤波器设计
使用滤波器设计函数,可以轻松创建具有低通、高通、带通或带阻配置的任意阶滤波器。
滤波器设计函数
滤波器类型 |
设计函数 |
---|---|
Bessel(仅模拟) |
[b,a] = besself(n,Wn,options) [z,p,k] = besself(n,Wn,options) [A,B,C,D] = besself(n,Wn,options) |
Butterworth |
[b,a] = butter(n,Wn,options) [z,p,k] = butter(n,Wn,options) [A,B,C,D] = butter(n,Wn,options) |
Chebyshev I 类 |
[b,a] = cheby1(n,Rp,Wn,options) [z,p,k] = cheby1(n,Rp,Wn,options) [A,B,C,D] = cheby1(n,Rp,Wn,options) |
Chebyshev II 类 |
[b,a] = cheby2(n,Rs,Wn,options) [z,p,k] = cheby2(n,Rs,Wn,options) [A,B,C,D] = cheby2(n,Rs,Wn,options) |
椭圆 |
[b,a] = ellip(n,Rp,Rs,Wn,options) [z,p,k] = ellip(n,Rp,Rs,Wn,options) [A,B,C,D] = ellip(n,Rp,Rs,Wn,options) |
默认情况下,这些函数都返回低通滤波器;只需指定所需的截止频率Wn,以归一化单位表示(使Nyquist频率为1 Hz)。要获得高通将 'high' 附加到函数的参数列表中。要获得带通或带阻滤波器,将Wn指定为包含通带边缘频率的二元素向量。为带阻配置追加 'stop'。
比如一些数字滤波器的实例:
[b,a] = butter(5,0.4); % Lowpass Butterworth
[b,a] = cheby1(4,1,[0.4 0.7]); % Bandpass Chebyshev Type I
[b,a] = cheby2(6,60,0.8,'high'); % Highpass Chebyshev Type II
[b,a] = ellip(3,1,60,[0.4 0.7],'stop'); % Bandstop elliptic
要设计一个模拟滤波器(可能是出于仿真需要),请在尾部添加参数 's',以弧度/秒为单位指定截止频率:
[b,a] = butter(5,0.4,'s'); % Analog Butterworth filter
所有滤波器设计函数都会返回一个以传递函数、零极点增益或状态空间线性系统模型形式表示的滤波器,具体形式取决于存在多少输出参数。一般情况下,应该避免使用传递函数形式,因为可能会发生舍入误差导致的数值问题。更好的做法是使用零极点增益形式,可以使用 zp2sos 将其转换为二阶节 (SOS) 形式,然后使用SOS形式来分析或实现您的滤波器。
注意:所有经典的 IIR 低通滤波器都不适用于极低的截止频率。因此,与其设计通带非常窄的低通 IIR 滤波器,不如设计更宽的通带并抽取输入信号。
按照频域设定设计 IIR 滤波器
此工具箱提供阶选择函数,用于计算满足一组给定要求的最小滤波器阶。
滤波器类型 |
阶估计函数 |
---|---|
Butterworth |
[n,Wn] = buttord(Wp,Ws,Rp,Rs) |
Chebyshev I 类 |
[n,Wn] = cheb1ord(Wp,Ws,Rp,Rs) |
Chebyshev II 类 |
[n,Wn] = cheb2ord(Wp,Ws,Rp,Rs) |
椭圆 |
[n,Wn] = ellipord(Wp,Ws,Rp,Rs) |
它们与滤波器设计函数结合使用时非常有用。假设需要一个具有以下设定的带通滤波器:通带为1000 至 2000 Hz,阻带从通带两侧外 500 Hz 处开始,采样频率为 10 kHz,通带波纹至多 1 dB,阻带衰减至少 60 dB。可以通过使用以下 butter 函数来满足这些设定。
[n,Wn] = buttord([1000 2000]/5000,[500 2500]/5000,1,60)
[b,a] = butter(n,Wn);
可以得到滤波器的结果为:
n =
12
Wn =
0.1951 0.4080
满足相同要求的椭圆滤波器由下式给出
[n,Wn] = ellipord([1000 2000]/5000,[500 2500]/5000,1,60)
[b,a] = ellip(n,1,60,Wn);
可以得到滤波器的结果为:
n =
5
Wn =
0.2000 0.4000
参考代码:
%% 原始信号
fs = 1000; % 采样频率
t = 0:1/fs:2-1/fs; % 时间
singal0 = sin(2*pi*1*t); % 未加噪声的信号
SNR = 15; % 信号信噪比
singal = awgn(singal0,SNR); % 在加入高斯白噪声
%% IIR滤波 (butterworth滤波器)
fstop = 20; % 低通截止频率
wn = fstop/(fs/2); % 归一化截止频率
N_IIR = 5; % IIR阶数
[b_iir,a_iir] = butter(N_IIR,wn) % IIR滤波器参数
singal_iir = filter(b_iir,a_iir,singal); %IIR滤波
%% FIR滤波 (hamming窗)
N_FIR = 15; % FIR阶数
b_fir = fir1(N_IIR,wn) % FIR滤波器参数
singal_fir = filter(b_fir,1,singal); %FIR滤波
%% 滑动平均 (平滑常数M=10;)
wsize = 10; % 平滑常数
b_avg = ones(1,wsize)/wsize; % 权值
singal_avg = filter(b_avg,1,singal); %滑动平均滤波
%% 输出比较
figure
subplot(2,2,1)
plot(t,singal)
title('\fontname{宋体}\fontsize{12}原始信号');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal');
grid on;
subplot(2,2,2)
plot(t,singal_iir)
title('\fontname{宋体}\fontsize{12}5阶IIR滤波');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal(iir)');
grid on;
subplot(2,2,3)
plot(t,singal_fir)
title('\fontname{宋体}\fontsize{12}15阶FIR滤波');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal(fir)');
grid on;
subplot(2,2,4)
plot(t,singal_avg)
title('\fontname{宋体}\fontsize{12}滑动平均(常数10)');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal(avg)');
grid on;
如图所示: