DSP-B实验指导书 下载本文

实验四 FIR数字滤波器的设计

一、实验目的

1)掌握MATLAB中设计FIR数字滤波器的常用函数,并编写简单程序。 2)熟悉用FDATool进行FIR滤波器设计与分析的方法。 二、实验原理

用 MATLAB 提供的函数,设计FIR数字滤波器 三、实验内容与要求 1.

用Kaiser窗设计一个FIR数字带阻滤波器,对模拟信号

xa(t) = cos (a t) + cos (b t) + cos (c t)

a = 2*pi *6500, b = 2*pi *7000, c = 2*pi *9000

滤波,要求滤去7000Hz 的频率成分。系统采样率为 fs = 32000 Hz 这同我们第二次实验。但采样点数应该比较大,可以用 N = 4096。

滤波器的 Rp = 0.25 dB, As = 50 dB, 过渡带宽可以用模拟频率(例如200Hz)也可以用数字频率指定。还可以改变As(比如30dB)观察滤波效果。 注意:

A) 如何从滤波器指标要求导出其它设计参数,如确定窗口类型、滤波器的阶数等; B) 如何验证设计得到的滤波器是否满足设计指标的语句; 试着直接用我们讲的MATLAB函数fir1()、fir2()进行设计

2. 利用FDATool设计一个如上要求的FIR滤波器,对比使用不同的方法设计的滤波器。 四、参考程序:

1、FIR1Demo1.m 用 fir1 函数设计高通滤波器例,各种窗口都试了一下; 2、FIR1Demo2.m 用 fir1 函数设计多通带滤波器例; 3、FIR2Demo3.m 用 fir2 函数设计多通带滤波器例;

4、FIRLsRemesDemo.m 用 firls 和 remez 函数设计例,fir2 也在这里做了对照。 1 和4项所列的文件注释详细些。

FIR1Demo1.m

% 用窗函数设计线性相位FIR滤波器 % 教科书讲到的 6 种窗都用一下 % 本例未涉及如何确定滤波器的设计参数

- 9 -

figNo = 1; % 显示用窗口号,接连用了3个 n = 48 % 滤波器阶数 Wn = 0.35; % 截止频率

beta = 0.1102*(60 - 8.7); % Kaiser 窗参数,假设阻带要求60分贝衰减(p.253) % 生成窗口矩阵,各窗函数看教科书 pp.243-53 % 先创建一个空矩阵,然后再把各窗函数列向量加进去 Windows = [];

Windows = [Windows, rectwin(n+1)]; Windows = [Windows, bartlett(n+1)]; Windows = [Windows, blackman(n+1)]; Windows = [Windows, hann(n+1)]; Windows = [Windows, hamming(n+1)]; Windows = [Windows, kaiser(n+1, beta)];

% 接下来用一个循环完成用各窗口函数设计的滤波器 % 并得到相应的传输函数向量,按列放在矩阵 Hs 中 % 在这个循环中,win 依次取矩阵 Windows 的各列 Hs = [];

for win = Windows

b = fir1 (n, Wn, 'high', win); % 把 high 参数去掉就是低通滤波器 [h, w] = freqz(b,1); Hs = [Hs, h]; end

% 现在用3种尺度来显示, 请观察对比各窗口 figure (figNo)

freqzplot (Hs, w, 'linear') figure (figNo+1) freqzplot (Hs, w, 'squared') figure (figNo+2)

freqzplot (Hs, w) % 用分贝数显示

- 10 -

figure (figNo) % 把第一个窗口推到前头

FIR1Demo2.m

% 用窗函数设计线性相位FIR带通/带阻滤波器 n = 48;

Wn = [0.35 0.65]; % 通带或阻带 % Haming window by default b = fir1 (n, Wn, 'stop');

% 再省去第三个参数 'stop' 就是带通

win = rectwin (n+1); % 矩形窗,宽度是滤波器阶数+1 bb = fir1 (n, Wn, 'stop', win); [H, w] = freqz (b, 1, 512); [HH] = freqz (bb, 1, 512); TH = [H, HH];

freqzplot (TH, w, 'squared')

FIR2Demo3.m

% 用窗函数设计线性相位FIR滤波器 % 设计 2 个带通/带阻滤波器演示 n = 48

f = [0 .2 0.4 0.6 0.8 ]; % f 的元素一定不能包含 0 和 1!

bhm = fir1(n, f, 'DC-1'); % 'DC-0' 表示频率 [0, 0.2] 是阻带,'DC-1' 是通带 win = rectwin(n+1); % 上面用缺省海明窗,下面用的矩形窗 brec = fir1(n, f, 'DC-1', win); % 显示

[Hm,w] = freqz (bhm, 1); [Hrec] = freqz (brec, 1); H2 = [Hm, Hrec]; freqzplot (H2, w, 'linear')

- 11 -

FIRLsRemesDemo.m

% 最优化FIR线性相位滤波器设计例 % 均方误差最小准则 % b = firls (n, f, m)

% 最大误差最小化准则,雷米兹交换算法 % b = remez (n, f, m) % 参数:

% b: 返回的滤波器传输函数分子多项式的系数, 也就是单位样本响应 % n: 滤波器的阶数

% f: 行向量,以 0 开始递增,各关键频率点,以 1 结束 % m: 行向量,维数与 f 相同,各关键频率点对应的响应幅度值 %n = 20; % Filter order %f = [0 0.4 0.5 1]; % Frequency band edges %m = [1 1 0 0]; % Desired amplitudes

% 下面的例子是用这两种方法设计的两个通带的滤波器 % 再加上 FIR2 设计的作为对照

% useplot 是控制显示方式的变量,参看下面显示部分 useplot = 0;

% 试着改动各参数观察一下,比如改变过渡带的宽度、阶数等 n = 40;

m = [1 1 0 0 1 1 0 0]; f = [ 0 0.3 0.4 0.5 0.6 0.7 0.8 1]; b1 = firls (n, f, m); b2 = remez (n, f, m); % 用 FIR2 设计 b3 = fir2 (n, f, m);

% 下面的代码显示比较它们的频率响应

- 12 -