一、摘要
前面一篇文章介绍了通过 FDATool 工具箱实现滤波器的设计,见“基于
Matlab 中 FDATool 工具箱的滤波器设计及相关文件的生成”,这里通过几个例
子说明采用 Matlab 语言设计 FIR 滤波器的过程。
二、实验平台
Matlab7.1
三、实验原理
以低通滤波器为例,其常用的设计指标有:
通带边缘频率 fp(数字频率为Ωp)
阻带边缘频率 fst (数字频率为Ωst)
通带内最大纹波衰减δp=-20log10(1-αp),单位为 dB
阻带最小衰减αs=-20log10(αs),单位为 dB
阻带起伏αs
通带峰值起伏αp
其中,以1、2、3、4条最为常用。5、6条在程序中估算滤波器阶数等参数
时会用到。
数字频率 = 模拟频率/采样频率
四、实例分析
例1 用凯塞窗设计一 FIR 低通滤波器,通带边界频率Ωp=0.3pi,
阻带边界频率 Ωs=0.5pi,阻带衰减δs 不小于50dB。
方法一:手动计算滤波器阶数 N 和β值,之后在通过程序设计出滤波器。
第一步:通过过渡带宽度和阻带衰减,计算滤波器的阶数 B 和β值。
第二步:通过程序设计滤波器。
程序如下:
b = fir1(29,0.4,kaiser(30,4.55));
[h1,w1]=freqz(b,1);
plot(w1/pi,20*log10(abs(h1)));
axis([0,1,-80,10]);
grid;
xlabel('归一化频率/p') ;
ylabel('幅度/dB') ;
波形如下:
方法二:
采用[n,Wn,beta,ftype] = kaiserord(f,a,dev)函数来估计滤波器阶数等,得
到凯塞窗滤波器。
这里的函数 kaiserord(f,a,dev)或者 kaiserord(f,a,dev,fs):
f 为对应的频率,fs 为采样频率;当 f 用数字频率表示时,fs 则不需要写。
a=[1 0]为由 f 指定的各个频带上的幅值向量,一般只有0和1表示;a 和 f
长度关系为(2*a 的长度)- 2=(f 的长度)
devs=[0.05 10^(-2.5)]用于指定各个频带输出滤波器的频率响应与其
期望幅值之间的最大输出误差或偏差,长度与 a 相等,计算公式:
阻带衰减误差=αs,通带衰减误差=αp,可有滤波器指标中的3、4条得到。
fs 缺省为2Hz。
程序如下:
fcuts = [0.3 0.5]; %归一化频率 omega/pi,这里指通带截止频率、阻带起
始频率
mags = [1 0];
devs = [0.05 10^(-2.5)];
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs); %计算出凯塞窗 N,
beta 的值
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');
freqz(hh);
波形如下:
实际中,一般调用 MATLAB 信号处理工具箱函数 remezord 来计算等波纹
滤波器阶数 N 和加权函数 W(ω),调用函数 remez 可进行等波纹滤波器的设计,
直接求出滤波器系数。函数 remezord 中的数组 fedge 为通带和阻带边界频率,
数组 mval 是两个边界处的幅值,而数组 dev 是通带和阻带的波动,fs 是采样
频率单位为 Hz。
例2 利用雷米兹交替算法设计等波纹滤波器,设计一个线性相位低
通 FIR 数字滤波器,其指标为:通带边界频率 fc=800Hz,阻带
边界 fr=1000Hz,通带波动 阻带最小衰减 At=40dB,采样频率
fs=4000Hz。
解:在 MATLAB 中可以用 remezord 和 remez 两个函数设计
程序如下:
fedge=[800 1000];
mval=[1 0];
dev=[0.0559 0.01];
fs=4000;
[N,fpts,mag,wt]=remezord(fedge,mval,dev,fs);
b=remez(N,fpts,mag,wt);
[h,w]=freqz(b,1,256);
plot(w*2000/pi,20*log10(abs(h)));
grid;
xlabel('频率/Hz') ;
ylabel('幅度/dB');
波形如下:
例3 利用 MATLAB 编程设计一个数字带通滤波器,指标要求如下:
通带边缘频率:Ωp1=0.45pi,Ωp2=0.65pi,通带峰值起伏:
δ1<=1[dB]。阻带边缘频率:Ωs1=0.3pi,Ωs2=0.8pi,最小
阻带衰减:δ2>=40[dB] 。
方法一:窗函数法
程序如下:
[n,wn,bta,ftype]=kaiserord([0.3 0.45 0.65 0.8],[0 1 0],[0.01 0.1087
0.01]);%用 kaiserord 函数估计出滤波器阶数 n 和 beta 参数
h1=fir1(n,wn,ftype,kaiser(n+1,bta),'noscale');
[hh1,w1]=freqz(h1,1,256);
figure(1)
subplot(2,1,1)
plot(w1/pi,20*log10(abs(hh1)))
grid
xlabel('归一化频率 w');ylabel('幅度/db');
subplot(2,1,2)
plot(w1/pi,angle(hh1))
grid
xlabel('归一化频率 w');ylabel('相位/rad');
波形如下:
滤波器系数为:
h1 =
Columns 1 through 8
0.0041
0.0055
-0.0091
-0.0018
-0.0056
-0.0000
0.0391
-0.0152
Columns 9 through 16
-0.0381
-0.0517
0.0077
0.3500
-0.0293
0.0940
0.0907
-0.2630
Columns 17 through 24
-0.0517
-0.2630
-0.0381
-0.0152
0.0907
0.0940
-0.0293
0.0077
Columns 25 through 31
0.0391
0.0041
-0.0000
-0.0056
-0.0018
-0.0091
0.0055
如果直接用 freqz(h1,1,256),得幅频特性和相频特性曲线:
方法二:等波纹法设计
程序如下:
[n,fpts,mag,wt]=remezord([0.3 0.45 0.65 0.8],[0 1 0],[0.01 0.1087
0.01]);%用 remezord 函数估算出 remez 函数要用到的阶 n、归一化频带边
缘矢量 fpts、频带内幅值响应矢量 mag 及加权矢量 w,使 remez 函数设计出
的滤波器满足 f、a 及 dev 指定的性能要求。
h2=remez(n,fpts,mag,wt);%设计出等波纹滤波器
[hh2,w2]=freqz(h2,1,256);
figure(2)