FIR 滤波器设计.doc
FIR带通滤波器的设计一、 设计要求试用DSP设计FIR滤波器,分别实现带通的功能,具体要求如下:(1) 滤波器的阶数5,截止频率自行选定,滤波系数用MATLAB确定。(2)编制C54XDSP实现FIR滤波器的汇编源程序。(3)用软件仿真器完成上述程序的模拟调试。(4)以数据文件形式自行设定滤波器输入数据,以数据文件形式输出滤波结果,并与输入数据进行比较分析。用软件仿真器有关工具显示FIR滤波器的输入输出波形,以证明滤波器滤波性能。二、 设计目的(1)了解FIR滤波器的原理及使用方法;(2)了解使用MATLAB语言设计FIR滤波器的方法;(3)了解DSP对FIR滤波器的设计及汇编方法;(4)熟悉DSP的调试方法;三、 FIR滤波器的基本原理假设FIR滤波器的冲击响应为h(0)、h(1)、h(2)h(N-1),x(n)为滤波器的输入信号,则对应的滤波器输出由下列关系式确定,FIR滤波器的传递函数为:直接由差分方程得出的实现结构如图所示:图横截型(直接型卷积型) FIR滤波器的结构图一般只要实现了上面的关系式就相当于将信号进行了滤波,从上面的关系式我们可以看出首先必须知道FIR滤波器的冲击响应系数h(0)、h(1)、h(2)h(N-1),这和知道FIR滤波器的系数是一样的,我们必须在高级语言中将这些滤波器冲击响应的系数得到,在本次设计中我们使用MATLAB语言实现这一任务,然后将得到的冲击响应系数应用到DSP汇编语言的程序中,实现上述计算公式,就可以方便的实现FIR滤波器,完成实验的要求,达到滤波的效果。四、 FIR滤波器的设计FIR滤波器的设计方法主要有窗函数法和频率采样法。其中,窗函数法是最基本的方法。本次设计采用窗函数法。一般是先给定所要求的理想滤波器频率响应,由导出,我们知道,理想滤波器的冲击响应是无限长的非因果序列,而我们要设计的是是有限长的FIR滤波器,所以要用有限长序列来逼近无限长序列,设:(-1) 常用的方法是用有限长度的窗函数w(n)来截取 即:(-) 这里窗函数就是矩形序列RN(n),加窗以后对理想低通滤波器的频率响应将产生什么样的影响呢?根据在时域是相乘关系,在频域则是卷积关系: (-)其中,为矩形窗谱, 是FIR滤波器频率响应。通过频域卷积过程看的幅度函数H()的起伏现象,可知,加窗处理后,对理想矩形的频率响应产生以下几点影响:(1)使理想频率特性不连续点处边沿加宽,形成一个过渡带,其宽度等于窗的频率响应的主瓣宽度。(2)在截止频率的两边的地方即过渡带的两边,出现最大的肩峰值,肩峰的两侧形成起伏振荡,其振荡幅度取决于旁瓣的相对幅度,而振荡的多少,则取决于旁瓣的多少。(3)改变N,只能改变窗谱的主瓣宽度,改变的坐标比例以及改变的绝对值大小,但不能改变主瓣与旁瓣的相对比例(此比例由窗函数的形状决定)。(4)对窗函数的要求:a、窗谱主瓣尽可能窄,以获取较陡的过渡带;b、尽量减小窗谱的最大旁瓣的相对幅度;即能量集中于主瓣,使肩峰和波纹减小,增大阻带的衰减。五、 CCS的使用步骤。1. 创建源文件:(1)打开CCS选择File New Source File命令; (2)编写源代码并保存; (3)保存源程序名为:*.C,选择File Save; (4) 创建其他源文件可重复上述步骤。2. 创建工程文件:(1)选择 Project New,创建一个新工程。 (2)点击Project选择Add file to project,添加所需文件。 (3)在弹出的对话框的下拉菜单中选择所需的源程序,点击打 开,即可添加到工程中。3. 设置编译与链接选项:(1)点击project选择Build options 在弹出的对话框中 设置相应的参数,一般按照默认参数即可:4. 工程编译与调试:(1)点击Project选择Build all,对工程进行编译,如正确则产生Out文件。若需修改程序,可以使用Project中的Build命令进行链接它只对修改部分做编译链接。(2)点击file中的load program,在弹出的对话框中载入Debug文件夹下的.out可执行打开。(3)装载完毕。5. 运行程序:在view菜单下选择Watch window选项来观测变量值。一次输入input和output来观测输入输出变量值。分别为滤波前的输入数据和滤波后的输出数据的首地址。在本次设计中,输入首地址为:0x00a6;输出首地址为:0x2400.6. 观察波形:在View菜单下拉选项Garph/time freguence.弹出一个话框。根据要求设计响应参数,来观测输入输出波形。六、 带通滤波器设计指标本次要设计一个FIR带通滤波器,其采样频率fs=15000Hz,通带为2000Hz3000Hz,即保留频率在2000Hz3000Hz范围内的信号成分,幅度失真小于1dB;阻带边界频率为1000Hz和4000Hz,衰减小于30dB。同时,FIR滤波器的阶数N=20。七、 设计思路及实现步骤 1.基于Matlab工具箱Signal中的fir1函数设计FIR带通滤波器,选择Hamming窗函数法,进而获取FIR带通滤波器的系数b,并保存为fir01.txt数据文件。这里FIR滤波器的阶数N=20。 程序格式为:b=fir1(N-1.ws1,ws2,style); 实现代码如下:clear allfs=10000; %采样频率;fs=10000; %采样频率;fd1=1000; %阻带下截止频率f1=2000; %通带下截止频率f2=3000; %通带上截止频率fd2=4000; %阻带下截止频率w1=f1/10000*2; w2=f2/10000*2; %频率的归一化处理;b=fir1(19,w1,w2,'bandpass');fp=fopen('fir01.txt,'wt');fprintf(fp,'.%20.4fn',b);fclose(fp); 获得的FIR带通滤波器的系数b如下:b= -0.0007 0.0031 0.0092 -0.0217 -0.0421 0.0696 0.1012 -0.1321 -0.1568 0.1706 0.1706 -0.1568 -0.1321 0.1012 0.0696 -0.0421 -0.0217 0.0092 0.0031 -0.0007同时,通过Matlab中的滤波器设计工具,可以得到满足设计要求的FIR带通滤波器的频率特性和相位特性。 其中,参数设计如下: 阻带下截止频率Fstop1=1000HZ; 通带下截止频率Fass1=2000HZ; 通带上截止频率Fpass2=3000HZ; 阻带上截止频率Fstop2=4000HZ; 具体如下图所示: FIR滤波器的频率特性FIR滤波器的相位特性2. 建立DSP汇编程序的FIR滤波器系数文件程序如下:clear allfs=10000; fstop1=1000; f1=2000; f2=3000; fstop2=4000; w1=f1/10000*2; w2=f2/10000*2; b=fir1(19,w1,w2,'bandpass');fp=fopen('firdata.inc','wt');fprintf(fp,'.word%5.0fn',b*32768);fclose(fp); 利用上述程序产生的firdata.inc文件,内容如下:N .set 20COFF_FIR: .sect “COFF_FIR”.word 101.word 300.word -711.word-1379.word 2281.word 3317.word-4330.word-5139.word 5589.word 5589.word-5139.word-4330.word 3317.word 2281.word-1379.word -711.word 300.word 101.word -243用MATLAB产生输入信号 产生一个由1000HZ、3000HZ、4500HZ合成的正弦信号。代码如下,该代码会生成一个名为indata.inc的文件。clear all;f1=3000;f2=1000;f3=4500;fs=10000; N=128; T=1/fs; n=0:N-1;x1=0.08*sin(2*pi*f1*n*T);x2=0.08*sin(2*pi*f2*n*T);x3=0.08*sin(2*pi*f3*n*T);xn=ceil(32768*(x1+x2+x3);figure(1);plot(xn)figure(2)yff=abs(fft(xn);df=n*(fs/N);plot(df,yff);fid=fopen('indata.inc','w');fprintf(fid,' .word%5.0fn',xn); fclose(fid);4.产生滤波器输入信号的firinput.c文件设计滤波器的输入信号为f1=1800Hz,f2=2800Hz,f3=4500Hz的混频信号。#include<stdio.h>#include<math.h>void main()int i;double f256;FILE *fp; / FILE是变量类型,C语言定义的标准数据结构,用于文件if(fp=fopen(“firin.inc”,”wt”)=NULL) / 打开firin文件用于写printf(“cant open file!n”);return;fprintf(fp,”INPUT: .sect %cINPUT %c n”,”,”);for(i=0;i<=255;i+) fi=sin(2*3.14159*i*1500/18000)+sin(2*3.14159*i*2800/10000)+sin(2*3.14159*i*4500/10000); fprintf(fp,” .word %1dn”,(long)(fi*16384/2); / 16384是什么意思Fclose(fp);5.编写的应用FIR数字滤波器的汇编程序fir.asm.mmregs.global start.def start,_c_int00INDEX.set 1KS.set 256.copy “lpin.inc”.copy “ lpdata.inc”.dataOUTPUT.space 1024FIR_DP.usect “FIR_VARS”, 0D_FIN.usect “FIR_VARS”, 1D_FOUT.usect “FIR_VARS”, 1COFFTAB.usect “FIR_COFF”, NDATABUF.usect “FIR_BFR”, NBOS.usect “STACK”, 0FHTOS.usect “STACK”, 1.text.asg AR0, INDEX_P.asg AR4, DATA_P.asg AR5, COFF_P.asg AR6, INBUF_P.asg AR7, OUTBUF_P_c_int00:B startNOPNOPstart:STM #COFFTAB, COFF_PRPT #N-1MVPD #COFF_FIR, COFF_P+STM #INDEX, INDEX_PSTM #DATABUF, DATA_PRPTZ A, #N-1STL A, *DATA_P+STM #(DATABUF+N-1), DATA_PSTM #COFFTAB, COFF_PFIR_TASK:STM #INPUT, INBUF_PSTM #OUTPUT, OUTBUF_PSTM #KS-1, BRCRPTBD LOOP-1STM #N, BKLD *INBUF_P+, AFIR_FILTER:STL A, *DATA_P+%RPTZ A, N-1MAC * DATA_P+0%, *COFF_P+0%,ASTH A, *OUTBUF_P+LOOP:EEND B EEND .end6.对应于以上FIR滤波器的汇编程序的链接文件fir.cmd如下:fir.obj-mfir.map-ofir.outMEMORYPAGE 0:ROM1(RIX):ORIGIN=0080h,LENGTH=1000hPAGE 1:INTRAM1(RW) :ORIGIN=2400h,LENGTH=0200h INTRAM2(RW) :ORIGIN=2600h,LENGTH=0100hINTRAM3(RW) :ORIGIN=2700h,LENGTH=0100hINTRAM4(RW) :ORIGIN=2800h,LENGTH=0040hB2B(RW):ORIGIN=0070h,LENGTH=10hSECTIONS.text: >ROM1PAGE0.data: >INTRAM1PAGE1FIR_COFF: >INTRAM2PAGE1FIR_BFR: >INTRAM3PAGE1FIR_VARS: >INTRAM4PAGE1.stack: >B2BPAGE1 八、 实验结果 以下即为此次设计中,混频信号的时域(图1)和频域(图2)波形的输出波形为: 图1 三种叠加信号的时域波形 图2 三种叠加信号的频域图2.下面为输入混频信号经过设计的FIR器滤波后的时域(图3)和频域(图4)波形的输出图像:图3 经FIR滤波器滤波后的信号时域图 图4 经FIR滤波器滤波后的信号频域图九、 实现结果分析通过图2与图4的比较分析,可以很清楚地看出,本次设计的FIR滤波器滤可以较好的滤除带外信号,即滤除了20003000HZ以外的频段,基本可以明显的看出保留目标信号。进而说明了该FIR滤波器满足设计要求。心得体会通过这次FIR带通滤波器的设计,首先,我对数字信号处理中的FIR滤波器的设计的方法和步骤有了更深一步的理解;其次,对MATLAB编程,以及MATLAB工具箱的使用也有了一定的了解。最后,对于DSP的编程软件CCS的使用方法包括它的源程序的编写,向量表的生成,以及链接文件的编写和生成都有了一定的了解。当然,在本次设计中也遇到了许多问题,对于一个完全不懂得汇编软件CCS使得设计难度不言而喻。但是正是因为这样,才是得我们的能力得到了很大程度的提高。也懂得了协作,讨论的重要性。总之,这次设计我有太多的收获。