logo资料库

基于dsp的FIR低通数字滤波器器设计.doc

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
《DSP 应用系统设计》综合设计报告 题目:FIR 低通数字滤波器器设计 姓名 XXX _ 学号 _XXX 手机 XXX Email lanyiyu1991@126.com 专 业 电子信息工程_ 班级 _09-1 _ _ 开课学期 2012 至 2013 学年_ 1 _学期 提交时间 2012 年 06 月 28 日
摘 要 数字滤波器在数字信号处理的各种应用中有着广泛的应用。数字滤波器分为低通,高 通,带通,带阻等。低通滤波器是一个通过低频信号而衰减或抑制高频信号的部件。本文 以 FIR 低通数字滤波器为例,研究有限冲击响应(FIR)滤波器的基本原理,通过 MATLAB 软件和 Code composer studio v4 软件来实现。 关键词:FIR 低通滤波器;MATLAB;Code composer studio v4 一、引言 在现代通信系统中,由于信号中经常混有各种复杂成分,说以很多信号的处理和分析 都是基于数字滤波器而进行的。数字滤波器按照其响应方式可分为有限脉冲响应(FIR) 滤波器和无限脉冲响应(IIR)滤波器两种。IIR 滤波器的特征是具有无限持续时间冲激响 应,这种滤波器一般需要用递归模型来实现,因而有时也称之为递归滤波器,而 FIR 滤波 器的冲激响应只能延续一定时间,在工程实际中可以采用递归的方式实现,也可以采用非 递归的方式实现,但其结构主要还是是非递归结构,没有输出到输入的反馈,并且 FIR 滤 波器很容易获得严格的线性相位特性,避免被处理信号产生相位失真,而线性相位体现在 时域中仅仅是 h( n)在时间上的延迟,这个特点在图像信号处理、数据传输等波形传递系统 中是非常重要的,且不会发生阻塞现象,能避免强信号淹没弱信号,因此特别适合信号强 弱相差悬殊的情况。 目前 FIR 滤波器的实现方法大致可分为三种:利用单片通用数字滤波器集成电路、DSP 器件和可编程逻辑器件实现。单片通用数字滤波器使用方便,但由于字长和阶数的规格较 少,不能完全满足实际需要,使用以串行运算为主导的通用 DSP 芯实现要简单,是一种实 时、快速、特别适合于实现各种数字信号处理运算的微处理器,借助于通用数字计算机按 滤波器的设计算法编出程序进行数字滤波计算 。由于它由具有丰富的硬件资源、改进的哈 佛结构、高速数据处理能力和强大的指令系统而在通信、航空、航天、雷达、工业控制、 网络及家用电器等各个领域得到广泛应用。 数字处理器(DSP)有很强的数据处理能力,它在高速数字信号处理领域有广泛的用 用,例如数字滤波、音频处理、图像处理等。相对于模拟滤波器,数字滤波器没有漂移, 能够处理低频信号,频率响应特性可做成非常接近于理想的特性,且精度可以达到很高, 容易集成等。使用可编程的 DSP 芯片实现数字滤波可以通过修改滤波器的参数十分方便地 改变滤波器的特性,下面主要说明利用 TMS320VC54x DSP 芯片设计实现 FIR 数字滤波器。 设计目的意义 一个实际的应用系统中,总存在各种干扰,所以在系统设计中,滤波器的好坏将直接影响 系统的性能。使用 DSP 进行数字处理,可以对一个具有噪声和信号的混合信号源进行采样, 再经过数字滤波,滤除噪声,就可以提取有用信号了。所以说,数字滤波器是 DSP 最基本的 应用领域,熟悉基于 DSP 的数字滤波器能为 DSP 应用系统开发提供良好的基础。 二、系统方案 数字滤波器有多种设计方法,如双线性变换法、窗函数设计法、插值逼近法和 Chebyshev 逼近法等等,但是通常采用窗函数法设计。窗函数法设计 FIR 滤波器的基本思 想是:根据给定的滤波器技术指标选择滤波器长度 N 和窗函数ω(n),使其具有最窄宽度 的主瓣和最小的旁瓣,其核心是从给定的频率特性,通过加窗确定有限长单位脉冲响应序 列 h(n)。一般采用以下四种窗函数:矩形窗、Hanning 窗、Hamming 窗、Blackmen 窗。
在实际的 FIR 滤波器的设计中,一般采用计算机辅助设计。MATLAB 是一套功能强大的适 应于科学工程计算的可视化高性能语言,它不但提供了 FIR1、FIR2 两种窗函数方法设计 FIR 滤波器的函数,而且其本身所附带的 Simlink 工具更是能很方便的设计低通、高通、带 通、带阻、陷波等各种类型的数字滤波器。 三、算法设计 1.采用 MATLAB 设计 FIR 数字滤波器 采用 MATLAB 设计 FIR 数字滤波器的方法有多种,本实验采用 fir1 函数,使用方法 简介如下: (1)设计低通滤波器,格式为:b=fir1(N,Wn)或 b = fir1(N,Wn,'low') 其中 N+1 为滤波器阶数,b 为返回的长度为 N+1 的系数向量。Wn 为归一化边界频率, 0 < Wn < 1.0,Wn 处增益为-6dB。Wn =1.0 对应的非归一化频率为 Fs/2,其中 Fs 为采样频 率。 例,设 Fs=8000Hz,低通滤波器的边界频率 fp=1000Hz,则对应的归一化数字角频率 为 Wn=fp/(Fs/2)=0.25,取 N=31(对应的滤波器阶数为 32)。于是,该低通 fir 滤波器的设 计指令为 b=fir1(31,0.25)。执行该指令得到的系数为: b=[-0.000630469148644,-0.001818568124278,-0.002561941612458,-0.001587493994396, 0.002369512668975,0.008332496978353,0.011803612855041,0.00675929677933, -0.009174511997729,-0.029730906886036,-0.039816452266422,-0.022301647638688, 0.031027965907247,0.111143500492515,0.192455402100706,0.243730203886485, 0.243730203886485,0.192455402100706,0.111143500492515,0.031027965907247, -0.022301647638688,-0.039816452266422,-0.029730906886036,-0.009174511997729, 0.00675929677933,0.011803612855041,0.008332496978353,0.002369512668975, -0.001587493994396,-0.002561941612458,-0.001818568124278,-0.000630469148644] 注意: 上述滤波器系数为浮点格式,当 DSP 程序中采用整数格式时。滤波器系数需相 应地变为整数,方法为乘以 32768 并取整。 (2)设计高通滤波器,格式为:b = fir1(N,Wn,'high') 参数意义同上。 (3)设计带通滤波器,格式为:b = fir1(N,Wn, 'bandpass') 其中 Wn = [W1 W2], W1、W2 为边界频率。 (4)设计带阻滤波器,格式为:b = fir1(N,Wn, 'stop') 其中 Wn = [W1 W2], W1、W2 为边界频率。 采用函数 plot(b)可以绘制滤波器的冲击响应图:
0.3 0.2 0.1 0 -0.1 0 5 10 15 20 25 30 35 采用函数 freqz(b)可以绘制滤波器的频率响应图: ) B d ( e d u t i n g a M ) s e e r g e d ( e s a h P 50 0 -50 -100 -150 0 0 -500 0.1 0.2 0.3 0.4 0.5 0.6 0.7 Normalized Frequency ( rad/sample) -1000 -1500 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 Normalized Frequency ( rad/sample) 0.8 0.9 1 0.8 0.9 1 四、软件实现 本实验通过利用 MATLAB 设计滤波器,通过 code composer studio v4 软件来实现。 实验步骤: 1.双击桌面图标,启动 Code Composer Studio,选择工作目录。 2.建立工程 lab5。 3. 向工程 lab5 中加载文件 lab5.c、fir.asm、lab5.cmd,修改 lab5.c 中的滤波器系数数据。 4.建立配置文件 lab5.ccxml(选择 VC5509A Simulater 模式)。 5. 编译、链接工程,下载程序。 6.运行程序至主程序的“index--”语句,打开图形观察窗口。观察滤波器系数波形、观察 滤波器输入信号、输出信号波形。
7.全速运行程序,数秒钟后暂停。观察滤波器输入信号、输出信号波形。 8. 改变输入信号参数(信号频率、幅度等),重复上述第 6、7、8 步操作。 9.退出 CCS。 五、实验结果与分析 取输入信号如图,频率为 200 和 2000. 生成信号图为 通过 DSP 滤波后得到输出波形入下图
六、结论 低通滤波器将高频量滤去,留下低频量。通过 DSP 芯片滤波作用将频率为 2000 的正弦 波滤去,只留下频率为 200 的波形。 七、附件:源程序清单 #include "math.h" #include "mysysconfig.h" #include "Myfilter.h" #include #include #include #define NBIQ 9 #define NX 64 #define L 36 /*定义句柄*/ extern CLK_init(); MCBSP_Handle hMcbsp0; TIMER_Handle mhTimer0; Int16 in[NX],out[NX]; //input buffer&output buffer Int16 dbuffer[NX]; Int16 xtemp,temp; Int16 nOut=0;
Uint16 timer0_cnt=0; Uint16 eventId0; Uint16 old_intm; Uint16 tim_val; extern Uint16 fir(Int16 *, Int16 *,Uint16); void taskFxn(void); interrupt void timer0Isr(void); //定时器设置子程序 //中断服务子程序 /* Reference start of interrupt vector table */ /* This symbol is defined in file, vectors.s55 */ extern void VECSTART(void); /* Low-pass FIR filter coefficients*/ Int16 coeff[L]={-34, 632, 3105, -62, 312, 3257, 82, -49, 1031, 2816, -133, -73, 1486, 2422, -149, -103, 1964, 1964, -133, -133, 2422, 1486, -103, -149, -133, 2816, 1031, -73, 3105, 632, -49, -62, 3257, 312, ; -34} 82, /* Create a TIMER configuration structure that can be passed */ /* to TIMER_config CSL function for initialization of Timer */ /* control registers. TIMER_Config timCfg0 = { */ TIMER_CTRL, 0x4650, 0x0000 }; //定时器设置 void main(void) { Uint32 aic23data; Int16 i=0; CLK_init(); /* TCR0 */ /* PRD0 */ /* PRSC */ // 初始化 DSP 运行时钟 //EMIF 为全 EMIF 接口初始化 EMIF 接口 CHIP_RSET(XBSR,0x0a01); /*初始化 DSP 的 EMIF*/ EMIF_config(&emiffig); IRQ_setVecs((Uint32)(&VECSTART)); //获取中断向量 Myfilter_Init(); taskFxn(); //AIC23B 初始化 //定时器设置
hMcbsp0 = MCBSP_open(MCBSP_PORT0,MCBSP_OPEN_RESET); //打开 McBSP0 MCBSP_config(hMcbsp0,&McbspConfig); MCBSP_start(hMcbsp0, //配置 McBSP0 MCBSP_RCV_START | MCBSP_XMIT_START , //开启 McBSP0 发送和接收 0x3000); for(i=0;i>16) & 0xffff); //AIC23B1 的左声道数据 for(i=NX;i>0;i--) { in[i] = in[i-1]; } in[0]=xtemp; out[nOut]=fir(in,coeff,L); while(!MCBSP_xrdy(hMcbsp0)){}; MCBSP_write16(hMcbsp0,out[nOut]); /* break point */ nOut--; if ( nOut==-1 ) { nOut=NX-1; } timer0_cnt=0; } //判断是否准备好发送数据,若没有,则等待 //发送数据 } } /*****************************************************/ interrupt void timer0Isr(void)//中断服务程序 {
分享到:
收藏