logo资料库

有限冲击响应FIR 滤波器的设计.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
设计一有限冲击响应 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() {
分享到:
收藏