FIR-CCS-实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《DSP原理及应用》――FIR滤波器的C54X实现一、实验目的用matlab获得FIR滤波器的抽头系数,用汇编语言实现FIR滤波器。产生一混频信号,用所设计的滤波器进行滤波,查看滤波器输出。二、实验仪器1.PC一台(win7系统);2.CodeComposerStudio3.1软件;3.MATLAB2009;4.DevC++6.0软件。三、实验要求1.设计一个FIR低通滤波器,通带边界频率为2500Hz,通带波纹小于1dB;阻带边界频率为3000Hz,阻带衰减大于40dB;采样频率为10000Hz。2.设计一个采样频率Fs为10000Hz,输入信号频率为2000Hz和3250Hz的合成信号,通过设计的低通滤波器将3250Hz信号滤掉,余下2000Hz信号。3.用循环缓冲区和双操作数寻址方法编写实现FIR滤波的程序。四、实验原理如果FIR滤波器的冲激响应为h(0),h(1),...,h(N-1)。X(n)表示滤波器在n时刻的输入,则n时刻的输出为:y(n)=h(0)x(n)+h(1)x(n-1)+...+h(N-1)x[n-(N-1)]使用MAC或FIRS指令可以方便地实现上面的计算。图1说明了使用循环寻址实现FIR滤波器的方法。为了能正确使用循环寻址,必须先初始化BK,块长为N。同时,数据缓冲区和冲激响应(FIR滤波器的系数)的开始地址必须是大于N的2的最小幂的倍数。例如,N=11,大于N的最小2的幂为16,那么数据缓冲区的第一个地址应是16的倍数,因此循环缓冲区起始地址的最低4位必须是0。在图1中,滤波系数指针初始化时指向h(N-1),经过一次FIR滤波计算后,在循环寻址的作用下,仍然指向h(N-1)。而数据缓冲区指针指向的是需要更新的数据,如x(n)。在写入新数据并完成FIR运算后,该指针指向x(n-(N-1))。所以,使用循环寻址可以方便地完成滤波窗口数据的自动更新。五、实验内容及步骤1.FIR滤波器的设计FIR滤波器的设计可以用MATLAB软件的窗函数法进行,这里选择Hamming窗,程序为:b=fir1(16,1500/8000*2)得到FIR数字滤波器系数b为:b0=0b9=0.2834b1=0.0048b10=0.0973b2=0.008b11=-0.029b3=-0.0089b12=-0.0429b4=-0.0429b13=-0.0089b5=-0.029b14=0.008b6=0.0973b15=0.0048b7=0.2834b16=0b8=0.3745在DSP汇编语言中,不能直接输入十进制小数,在MATLAB中进行如下转换:h=round(b*2^15)将系数转换为Q15的定点小数形式,为:h0=0h9=9287h1=158h10=3187h2=264h11=-951h3=-290h12=-1406h4=-1406h13=-290h5=-951h14=264h6=3187h15=158h7=9287h16=0h8=122722.产生滤波器输入信号文件以下是一个产生输入信号的C语言程序,信号是频率为1000Hz和2500Hz的正弦波合成的波形。文件名为firinput.c。#includestdio.h#includemath.hvoidmain(){inti;doublef[256];FILE*fp;if((fp=fopen(firin.inc,wt))==NULL){printf(can'topenfile!\n);return;}for(i=0;i256;i++){f[i]=sin(2*3.14159*i*1000/8000)+sin(2*3.14159*i*2500/8000);fprintf(fp,.word%ld\n,(long)(f[i]*32768/2));}fclose(fp);}该程序产生名为firin.inc的输入信号程序。Firin.inc文件的部分内容如下:.word0.word26722.word4798.word5315.word16384::.word-5319.word-4793.word-26721在DSP汇编语言程序中通过.copy汇编命令将生成的数据文件firin.inc复制到汇编程序中,作为FIR滤波器的输入数据。3.编写FIR数字滤波器的汇编源程序FIR数字滤波器汇编程序fir.asm如下:.mmregs.globalstart.defstart,_c_int00INDEX.set1KS.set256;模拟输入数据缓冲区大小N.set17COFF_FIR.sectCOFF_FIR;FIR滤波器系数.word0.word158.word264.word-290.word-1406.word-951.word3187.word9287.word12272.word9287.word3187.word-951.word-1406.word-290.word260.word158.word0.dataINPUT.copyfirin.inc;模拟输入在数据存储区0x2400OUTPUT.space1024;输出数据在数据区0x2500COFFTAB.usectFIR_COFF,NDATABUF.usectFIR_BFR,NBOS.usectSTACK,0FhTOS.usectSTACK,1.text.asgAR0,INDEX_P.asgAR4,DATA_P;输入数据x(n)循环缓冲区指针.asgAR5,COFF_P;FIR系数表指针.asgAR6,INBUF_P;模拟输入数据指针.asgAR7,OUTBUF_P;FIR滤波器输出数据指针_c_int00bstartnopnopstart:ssbxFRCTSTM#COFFTAB,COFF_PRPT#N-1;将FIR系数从程序存储器移动MVPD#COFF_FIR,*COFF_P+;到数据存储器STM#INDEX,INDEX_PSTM#DATABUF,DATA_PRPTZA,#N-1STLA,*DATA_P+;将数据循环缓冲区清零STM#(DATABUF+N-1),DATA_P;数据缓冲区指针指向x[n-(N-1)]STM#COFFTAB,COFF_PFIR_TASK:STM#INPUT,INBUF_PSTM#OUTPUT,OUTBUF_PSTM#KS-1,BRCRPTBDLOOP-1STM#N,BK;FIR循环缓冲区大小LD*INBUF_P+,A;装载输入数据FIR_FILTER:STLA,*DATA_P+%RPTZA,N-1MAC*DATA_P+0%,*COFF_P+0%,ASTHA,*OUTBUF_P+LOOP:EENDBEEND.end4.编写FIR滤波器链接命令文件对应以上汇编程序的链接命令文件fir.cmd如下:firasm.obj-mfir.map-ofir.outMEMORY{PAGE0:ROM1(RIX):ORIGIN=0080H,LENGTH=100HPAGE1:INTRAM1(RW):ORIGIN=2400H,LENGTH=0200HINTRAM2(RW):ORIGIN=2600H,LENGTH=0100HINTRAM3(RW):ORIGIN=2700H,LENGTH=0100HB2B(RW):ORIGIN=0070H,LENGTH=10H}SECTIONS{.text:{}ROM1PAGE0.data:{}INTRAM1PAGE1FIR_COFF:{}INTRAM2PAGE1FIR_BFR:{}INTRAM3PAGE1STACK:{}B2BPAGE1}5.在CodeComposerStudio3.1软件中将有关程序运行并调试。六、实验结果及分析1.观察输入信号的波形,如图2所示。2.观察输入信号的频谱,如图3所示。3.观察输出信号的波形,如图4所示。4.观察输出信号的频谱,如图5所示。七、实验总结这次实验完成了FIR滤波器在DSP上仿真实现,对FIR滤波器有更深入的了解,进一步掌握对CCS软件的使用方法,巩固了对DSP汇编语言的理解,对以后深入学习有很大帮助。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功