1 引言
在数字音频、图像处理、数据传输、生物医学等领域中,要求高保真的信号处理,
数字滤波器得到了广泛应用。数字滤波器是一种用来过滤时间离散信号的数字系统,通
过对抽样数据进行数学处理来达到频域滤波的目的。根据其单位冲激响应函数的时域特
性可分为两类:无限冲激响应(IIR)滤波器和有限冲激响应(FIR)滤波器。与 IIR 滤波
器相比,FIR 的实现是非递归的,它的单位抽样响应是有限长序列,因而总是稳定的;更
重要的是,FIR 滤波器在满足幅频响应要求的同时,可以获得严格的线性相位特性。
MATLAB 软件在多个研究领域都有着广泛的应用.基于 MATLAB 环境下,用窗函数
设计法实现 FIR 数字滤波器的设计,过程简便易行,从仿真结果可以看出它可以达到技
术指标要求,而且方法简单、快捷,大大减轻了工作量。滤波器的设计工作完成后,可
以借助于 MATLAB 的 export 操作导出所设计滤波器的系统函数 H(z)。由于 MATLAB 具
有强大的接口功能,仿真后的结果可以很方便的移植到 DSP、CPLD 或 FPGA 等器件中。
在实际应用中,只需按要求修改滤波器参数,并对程序作较少的改动,即可实现不同截止频
率的 FIR 滤波器,实用性较强。
2 FIR 滤波器的窗函数设计法
2.1 设计原理
FIR 滤波器的设计方法有许多种,如窗函数设计法、频率采样设计法和最优化设计法
等。窗函数设计法的基本原理是用一定宽度窗函数截取无限脉冲响应序列获得有限长的脉
冲响应序列。
对于所给定的理想滤波器频率响应
,要求设计一个 FIR 滤波器频率响应
来逼近
。但是设计是在时域进行的,因而先由
的
傅里叶反变换导出
,即
由于
是矩形频率特性,故
一定是无限长的序列,且是非因果的,而我们要设
1
计的是 FIR 滤波器,其 必然是有限长的,所以要用有限长的 来逼近无限长的
最有效的方法是截断
,或者说是用一个有限长度的窗口函数序列
来截取
即
因而窗函数序列的形状及长度的选择很关键。
按照卷积公式,在时域是相乘,则频域上是周期性卷积关系,即
,
,
因而
逼近
的好坏,完全取决于窗函数的频率特性
。
求得 的傅里叶变换,也就是找出待求 FIR 滤波器的频率特性,这样就能看出加窗
处理后究竟对频率响应有何影响。
窗函数法的主要设计步骤为:
(1) 首先是给定所要求的频率响应函数
;
(2)其次,求出
;
(3)再次,由过渡带宽及阻带最小衰减的要求,选定窗
形状及 N 的大小,一般 N
要通过几次试探而最后确定;
(4)求得所设计的 FIR 滤波器的单位抽样响应
,
,检验是否满足设计要求,如不满足,则需重新设计。
(5)求
2.2 矩形窗
窗函数
频率特性
为
2
对于矩形窗
,则有
也可表示成幅度函数与相位函数
其中
就 是 频 域 抽 样 内 插 函 数 ( 差 一 个 常 数 因 子 ), 其 幅 度 函 数
在
之内为一个主瓣,两侧形成许多衰减振荡的旁瓣。如图 1 所示
是周期
函数,这里只画了
的一部分图形。
图 1 矩形窗函数序列及其频率特性
3 设计任务
设计一个线性相位FIR高通滤波器,给定抽样频率为
通
带 截 止 频 率 为
,阻带衰减不小于
, 阻 带 上 限 截 止 频 率 为
。
3
4 设计步骤
(1)求出各模拟频率对应的数字频率
通带截止频率为
阻带上限截止频率为
阻带衰减相当于
(2)设
为理想线性相位高通滤波器
首先由所需高通滤波器的过渡带求理想高通滤波器的截止频率
其对应的数字频率为
由此可得
其中, 为线性相位所必须的移位,且应满足
。
(3)由阻带衰减 来确定窗形状,由过渡带宽来确定 N。
由于
,可选矩形窗,其阻带最小衰减
满足要求。
所要求的过渡带宽(数字频域)
由于矩形窗过渡带宽满足
,
4
所以
(4)由矩形窗表达式
矩形窗
确定 FIR 滤波器的 。
所以
(5)由 求
检验各项指标是否满足要求,如不满足要求要改变 N,或改变窗
形状(或两者都改变)来重新计算。
5 MATLAB 仿真
MATLAB 信号处理工具箱提供了各种窗函数、滤波器设计函数和滤波器实现函数。
利用 MATLAB 信号处理工具箱进行 FIR 滤波器设计,语法简单,编程快捷,能够达到要
求的各项性能指标。
基于矩形窗的 FIR 数字高通滤波器的 MATLAB 实现过程中,会用到基本数学函数、
基本作图函数,矩形窗函数 rectwin,freqzn 函数等,主程序的设计中还嵌套有子程序。
5.1 矩形窗函数
在 MATLAB 的库函数中可以直接调用窗函数。例如,建立一个长度为 50 的矩形窗,
可使用下面的指令:
5
5.2 子程序
5.2.1 ideal_hp 函数
ideal_hp 函数定义的是计算理想 FIR 数字高通滤波器的单位冲激响应
,在
MATLAB 中,可用下面的指令建立 Ideal_hp 函数:
function hd=ideal_hp(wc,N)
% compute the ideal highpass fiter unit pulse respondence hd(n)
% wc:cutoff frequency
% N:window length
% hd:unit pulse respondence
alpha=(N-1)/2
n=0:1:N-1;
m=n-alpha+eps;
hd=[sin(pi*m)-sin(wc*m)]./(pi*m);
5.2.2 freqz 函数
freqz 函数定义的是计算实际 FIR 数字高通滤波器的幅频响应,在 MATLAB 中,可用
下面的指令建立 freqz 函数:
function [db,mag,pha,grd,w]=freqz_m(b,a)
[H,w]=freqz(b,a,1000,'whole');
H=(H(1:1:501))';
w=(w(1:1:501))';
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
grd=grpdelay(b,a,w);
6
5.3 主程序
基于矩形窗的 FIR 数字高通滤波器的 MATLAB 设计程序如下:
wp=0.413*pi;
ws=0.213*pi;
tr_with=wp-ws; %过渡带宽度
N=ceil(1.8*pi/tr_with) %滤波长度
n=0:1:N-1;
wc=(ws+wp)/2; %理想高通滤波器的截止频率
hd=ideal_hp(wc,N); %理想高通滤波器的单位冲激响应
w_han=(rectwin(N))'; %矩形窗
h=hd.*w_han; %截取得到实际的单位脉 冲响应
[db,mag,pha,grd,w]=freqz_m(h,[1]); %计算实际滤波器的幅度响应
delta_w=2*pi/1000;
Ap=-(min(db((wp/delta_w+1):1:501))) %检验最小阻带衰减
As=-round(max(db(1:1:(ws/delta_w+1)))) %检验实际的通带纹波
%画图
subplot(1,1,1)
subplot(2,2,1)
stem(n,hd)
title('理想单位脉冲响应 hd(n)')
axis([0, N-1, -0.1, 0.3]);xlabel('n');ylabel('hd(n)');
subplot(2,2,2)
stem(n, w_han)
title('矩形窗 w(n)')
axis([0, N-1, 0, 1.1]);xlabel('n');ylabel('hd(n)');
subplot(2,2,3)
stem(n,h)
title('实际单位脉冲响应 hd(n)')
7
axis([0, N-1, -0.1, 0.3]);xlabel('n');ylabel('h(n)');
subplot(2,2,4)
plot(w/pi,db)
title('幅度响应(db)')
axis([0, 1 ,-100, 10]);xlabel('pi');ylabel('分贝');
figure(2)
N=0:1:100
xn=sin(0.2*pi*N)+sin(0.6*pi*N)+sin(0.3*pi*N);
[db,mag,pha,grd,w]=freqz_m(xn,[1]);
subplot(211);
stem(N,xn);
xlabel('Time N');ylabel('x(n)');title('输入函数');
subplot(212);
plot(w/pi,db);axis([0,1,-20,10]);
xlabel('w/pi');ylabel('Manitudexnyn(dB)');title('输入函数频谱');
figure(3)
yn=conv(xn,hd);
[db,mag,pha,grd,w]=freqz_m(yn,[1]);
subplot(211);
stem([0:length(yn)-1],yn,'.');
xlabel('Time n');ylabel('y(n)');title('输出函数');
subplot(212);
plot(w/pi,db);axis([0,1,-20,10]);
xlabel('w/pi');ylabel('Manitudexnyn(dB)');title('输出函数频谱');
8