设计一有限冲击响应 FIR 滤波器的设计
一、设计目的
1,掌握数字滤波器的设计过程;
2,了解 FIR 的原理和特性;
3,熟悉设计 FIR 数字滤波器的原理和方法;
4 ,学习 FIR 滤波器的 DSP 实现原理;
5 ,学习使用 ccs 的波形观察窗口观察输入、输出信号波形和频谱变化情况。
二、设计内容
1 通过 MATLAB 来设计一个低通滤波器,对它进行模拟仿真确定 FIR 滤波器系
数;
2 用 DSP 汇编语言及 C 语言进行编程,实现 FIR 运算,对产生的合成信号,
滤除信号中高频成分,观察滤波前后的波型变化.
三、设计原理
滤波器就是在时间域或频域内,对已知激励产生规定响应的网络.使其能够
从信号中提取有用的信号,抑制并衰减不需要的信号,滤波器的设计实质上就是
对提出的要求给出相应的性能指标.再通过计算,使物理可实现的实际滤波器响
应特性逼近给出的频率响应特性。
FIR 数字滤波器是一种非递归系统,其传递函数为:
H (z) =Y(Z)/X(Z)=∑b(n)z-n
由此可得到系统的差分方程为
y(n ) = ∑h ( i ) x ( n -i)
其激响应 h(n)是有限长序列,它其实就是滤波器系数向量 b ( n ) , N 为
FIR 滤波器的阶数.
在数字信号处理应用中往往需要设计线性相位的滤波器,FIR 滤波器在保证
幅度特性满足技术要求的同时,易做到严格的线性相位特性。为了使滤波器满足
线性相位条件,要求其单位脉冲响应 h(n)为实序列,且满足偶对称或奇对称条件,
即 h ( n )=h(N-1-n)或 h(n)=h(N-1-n)。这样,当 N 为偶数时,偶对称线性相位 F 讯
滤波器的差分方程表达式为
Y(n)= ∑h ( i ) (x ( n -i)+x(N-1-n-i))
由上可见,FIR 滤波器不断地对输入样本 x(n)延时后,再做乘法累加算法,
将滤波器结果 y(n)输出。因此,FIR 实际上是一种乘法累加运算。而对于线性
相位 FIR 而言,利用线性相位 FIR 滤波器系数的对称特性,可以采用结构精简
的 FIR 结构将乘法器数目减少一半。
应用 MATLAB 设计 FIR 滤波器的主要任务就是根据给定的性能指标设计一
个 H(z) ,使其逼近这一指标,进而计算并确定滤波器的系数 b ( n ) ,再将所
设计滤波器的幅频响应、相频响应曲线作为输出,与设计要求进行比较,对设计
的滤波器进行优化,设计完成之后将得到 FIR 滤波器的单位冲激响应序列 h
( n )的各个参数值。
四、MATLAB 设计 FIR 滤波器的方法
FIR 滤波器最大的优点就是在满足幅频特性的同时,还可以获得严格的线性
相位特性,这使得它在语音处理、图像处理等要求高保真的数字信号处理中显得
十分重要。设计 FIR 滤波器主要有窗函数法、最优化设计法及约束最小二乘法
等设计方法。用 MATLAB 设计 FIR 数字滤波器方法有很多种,最常用的有窗函数
设计方法、最优化设计方法等。
1 窗函数设计方法
窗函数法一般是基于直接程序设计法来设计标准频率响应的,可实现加窗线
性相位 FIR 数字滤波器设计。Fir1 是用来设计标准频率响应的基于窗函数的 FIR
滤波器函数,可实现加窗线性相位 FIR 数字滤波器的设计,使用 firl 函数可设
计标准的低通、高通、带通和带阻四种滤波器;fir2 是用来设计有任意频率响
应的各种加窗 FIR 滤波器函数。
利用 firl 和 fir2 两种函数可以设计有任意频率响应的各种加窗 FIR 滤波
器.滤波器系数包含在返回值 b 中,可表示为
b(z)=b(1)+b(2)z-n+…+b(n+1)z-n
fir1 函数的使用格式有以下几种:
b=fir(n,Wn),可得到低通滤波器;参数 n 为滤波器的阶数;Wn 为滤波器的截止
频率:其中,0<Wn< 1 , Wn=1 相当于 0.5fs .当 Wn=[W1 W2]时,为带通滤波
器,其通带为 wl <W<w2,w1.w2 分别为通带的下限频率和上限频率.
b=fir1(n,Wn,’ftype’),当 ftype=high 时,可设计高通滤波器;当 ftype=stop
时,可设计带阻滤波器‘
b = firl (n,Wn window ) ,参数 window 用来指定的窗函数类型,默认值为
hamming 窗,参数可以使用的窗口函数有 boxcar、hamming 、blackman 、kasier
和 chebwin.
b=firl ( n , wn, ftype, window ) ,ftype 参数用来决定滤波器的类型:参
数 window 用来指定所使用的窗函数类型
这里需要注意的是,用 firl 函数设计高通和低通池波器时,所使用的阶数
n 为偶数,当输入的阶数 n 为奇数时.firl 函数会自动将阶数增加 1 形成偶
数。
fir2 函数的使用格式有以下几种:
b = fir2 ( n ,f,m } ,参数 n 为滤波器的阶数.
b = fir2 ( n ,f,m ,window) ,参数 f 为频率点矢量,f 属于[0,l ] ,
对应于 0.5 fs.矢量 f 按升序排列,且第一个元素必须为 0 ,最后一个必须为 l ,
并可以包含重复的频率点
b = fir2 ( n ,f,m ,npt ) ,参数 m 为幅度点矢量,在矢量 m 中包含了与 f
相对应的期望得到的滤波器幅度
b = fir2 (n ,f,m ,npt,window ) ,参数 window 用来指定所使用的窗函数
类型,其默认为汉明( hamming )窗.
b = fir2 (n ,f,m ,npt,lap),参数 npt 用来指定 fir2 函数对频率响应进
行内插的点数.
b = fir2 (n ,f,m ,npt,lap, window ) ,参数 laP 用来指定 fir2 函数
在重复频率点附近插入的区域大小.
2 最优化设计法
Remez 函数可采用 Parks 一 Mcclellan 算法设计线性相位 FIR 滤波器,
Parks 一 Mcclellan 算法使用 Remez 交换算法和 chebyshev 逼近理论来设计最
优拟合滤波器,这种滤波器使期望频率响应与实际频率响应之间的最大误差最
小,使其频率响应呈现出等波形特性,因此有时也称为等波纹滤波器。由于这种
滤波器具有等波纹特性,因此在其冲激响应的头部和尾部会表现出不连续性。
remez 函数的使用格式有以下几种:
b=remez(n,f,a),可得到一个 n 阶 FIR 讯数字滤波器,其幅频特胜由 f 和 a 指
定.f 是频带边缘频率矢量,且 f 属于[0 , 1 ],当 f=1 时相当于 n(Nyquist
频率)。矢量 f 按升序排列,且第一个元素必须为 0。最后一个必须为 1 。a 是
频率矢量 f 处的期望幅值响应。f 和 a 的长度必须相等,而且为偶数。
b=remez(n,f,a,w),可利用加权矢量 w 对各频率段的误差进行加权处理,w 的
长度是 f 和 a 长度的一半,用以指定各频率段的权值。
b=remez(n,f,a,’ftype’ )和 b=remez(n,f,a,w, ’ftype’) ,可指定滤波
器的类型,当 ftype=hilbert 时,设计的滤波器为奇对称的线性相位滤波器(Ⅲ
型和Ⅳ型).当 ftype=differentiator 时,采用了特殊的加权技术设计Ⅲ型和
Ⅳ型滤波器。
[n,f0,a0,w] = remezord (f,a,dev ) ,可找到近似的阶 n ,归一化频带边缘
矢量 f0 、频带内辐值响应矢量匀及加权矢量 w ,使由 remez 函数构成的滤波
器满足 f,a 及 dev 指定的性能要求。其中 f 和 a 分别指定频段的边缘矢量与相
应的幅值响应,dev 用于指定各频带允许的偏差
[ n , f0 ,a0,w]=remezord ( f , a , dev,fs ) ,可指定取样频率 fs , fs 的
缺省值为 2Hz .
五、设计步骤
1 利用 MATLAB 来确定 FIR 滤波器的参数
2 启动 CCS ,在 CCS 中建立一个汇编源文件、建立一个 C 源文件和一个命令文
件,并将这三个文件添加到工程,再编译并装载程序
3 设置波形时域观察窗口,得到其滤波前后波形变化图;
4 设置频域观察窗口,得到其滤波前后频谱变化图。
六、利用 MATLAB 来确定 FIR 滤波器的参数
用双线性法设计低通滤波器,并确定 FIR 滤波器的参数:
fp=1000;
fc=1200;
as=100;
ap=1;
fs=22000;
wp=2*fp/fs;
wc=2*fc/fs;
%归一化截止频率
[n,wn]=ellipord(wp,wc,ap,as); %求数字滤波器的最小阶数和归一
化截止频率
[b,a]=ellip(n,ap,as,wn);
%求传递函数的分子分母系数
freqz(b,a,512,fs);
七、源程序
1、汇编源文件
.global _fir,_init,_B,_outdata
_fir
bset frct
amov #_B,xdp
mov #_B,cdp
mov t0,ac0
sub #1,ac0
mov ac0,mmap(csr)
add ac0,ar0
mov #0,ac0
rpt csr
macmz *ar0-,*cdp+,ac0
mov hi(ac0),t0
ret
_init
mov mmap(t0),ac0
sub #1,ac0
mov ac0,ar7
rptz ac0,ar7
mov ac0,*ar0+
ret
_outdata
mov t1,ac0
sub #2,ac0
mov ac0,mmap(csr)
add ac0,ar0
rpt csr
delay *ar0-
mar *ar0+
mov t0,*ar0
ret
2、C 源文件
extern int fir(int *,int);
extern int init(int *,int#include "s.h"
#include "math.h"
#define signal_1_f 200
#define signal_2_f 620
#define signal_sample_f 2000
#define pi 3.1415926
#define coff_L 23
#define bufer_L 256
int data_in[bufer_L];
int out[bufer_L] ;
int firout;
int x[coff_L+1];
int k=0;
int bufer=bufer_L;
);
extern int outdata(int *,int,int);
void inputwave();
void main()
{