DSP原理与应用实验报告2.docx
- 文档编号:515677
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:18
- 大小:228.81KB
DSP原理与应用实验报告2.docx
《DSP原理与应用实验报告2.docx》由会员分享,可在线阅读,更多相关《DSP原理与应用实验报告2.docx(18页珍藏版)》请在冰点文库上搜索。
DSP原理与应用实验报告2
实验2FIR算法的DSP实现
一、实验目的
1.掌握汇编语言的编程方法。
2.掌握C语言和汇编语言的混合编程。
3.利用MATLAB设计FIR滤波器。
4.编写以浮点和Q15格式产生混合波形数据的函数。
5.编写C语言浮点实现FIR滤波算法函数。
6.编写C可调用汇编语言定点实现FIR滤波器算法函数。
7.使用CCS图形显示窗口观察和分析信号波形及其频谱。
8.进行代码性能测评。
二、实验仪器及工具
计算机,安装WindowsXP操作系统、MATLAB7.0.1、TI的TMS320C5000DSP的开发软件CCS2.21;ICETEK-VC5509教学实验箱。
三、实验内容
1.利用MATLAB设计FIR滤波器,以浮点和Q15格式导出滤波器系数。
2.FIR算法的TMS320C55xDSP的C语言浮点及汇编语言定点实现。
四、实验步骤
1.编写MATLAB程序,利用MATLAB设计FIR低通或高通滤波器,以浮点和Q15格式导出滤波器系数。
例:
利用kaiser窗设计一个低通FIR数字滤波器,通带的范围是0Hz到1100Hz,阻带的范围是1600Hz到4000Hz,通带的波纹最大为0.03,阻带的波纹最大为0.03。
信号的抽样频率为8000Hz。
可根据信号的频率更改滤波器的频率。
2.设置CCS为“C55xCycleAccurateSimulator”软件仿真模式,打开CCS,创建项目,编写.cmd文件,编写主程序文件。
编写以浮点和Q15格式产生混合波形数据的函数。
如产生抽样频率为8000Hz,600Hz、2000Hz、2800Hz的三种频率的混合波形数据,其中混合频率可以自行确定。
添加文件到项目中。
编译、调试、链接、加载、运行程序,使用观测窗查看波形数据;选择菜单View→Graph→Time/Frequency,在弹出的“GraphPropertyDialog”对话框中进行相应的配置显示产生波形的时域和频域图。
3.编写C语言浮点实现FIR滤波算法函数。
在主程序文件中增添C语言浮点实现FIR滤波算法的模块,这其中包括导入MATLAB设计的滤波器浮点系数。
编译、调试、链接、加载、运行程序,选择菜单View→Graph→Time/Frequency,在弹出的“GraphPropertyDialog”对话框中进行相应的配置显示滤波系数和输出信号的时域图和频域的幅度和相位图。
并利用Profiler工具测试函数大小及滤波时间。
4.编写C可调用汇编语言定点实现FIR滤波器算法函数。
利用单乘法单元(MAC)定点实现块FIR滤波器算法。
编译、链接、加载、运行程序,选择菜单View→Graph→Time/Frequency,在弹出的“GraphPropertyDialog”对话框中进行相应的配置显示滤波系数和输出信号的时域图和频域的幅度和相位图。
利用Profiler工具测试函数大小及滤波时间,并与C语言的浮点实现进行比较。
5.设置CCS为“C5510DeviceSimulator”,利用Profiler工具测试函数大小及滤波时间。
观察程序运行状况,与以上结果对比分析。
6.再次将设置CCS为“C55xCycleAccurateSimulator”软件仿真模式,并保存退出,打开CCS2(’C5000)集成开发环境,打开项目,将滤波系数替换为高通滤波,运行程序,选择菜单View→Graph→Time/Frequency,在弹出的“GraphPropertyDialog”对话框中进行相应的配置显示滤波系数、输出信号的时域图和频域的幅度和相位图。
【程序代码】
//block_fir.c
voidfirc(float*in,intM,float*h,intL,float*out,float*x)
{
floatyn;
inti,j;
for(j=0;j { x[0]=in[j]; for(yn=0.0,i=0;i { yn+=h[i]*x[i]; } out[j]=yn; for(i=L-1;i>0;i--) { x[i]=x[i-1];//刷新缓冲 } } return; } ;fir.asm-GenericFIRfilter ;利用单MAC ;prototype: unsignedintfir(int*,unsignedint,int*, ;unsignedint,int*,int*,unsignedint); ; ;Entry: arg0: AR0-filterinputbufferpointer ;arg1: T0numberofsamplesininputbuffer;arg2: AR1-FIRcoefficientsarraypointer ;arg3: T1-FIRfilterorder ;arg4: AR2-outputbufferpointer ;arg5: AR3-signalbufferpointer ;arg6: AR4-signalbufferindex ; ;Return: T0=signalbufferindex .def_fir .sect"fir_code" _fir pshmST1_55;SaveST1,ST2,andST3 pshmST2_55 pshmST3_55 or#0x340,mmap(ST1_55);SetFRCT,SXMD,SATD bsetSMUL;SetSMUL movmmap(AR1),BSA01;AR1=baseaddressforcoeff movmmap(T1),BK03;Setcoefficientarraysize movmmap(AR3),BSA23;AR3=baseaddressforsignalbuffer or#0xA,mmap(ST2_55);AR1&AR3ascircular pointers mov#0,AR1;Startfromzerooffset movAR4,AR3;Startwithoffset=index sub#1,T0;T0=M-1 movT0,BRC0;InitouterloopforMtimes sub#3,T1,T0;T0=L-3 movT0,CSR;InitinnerloopL-2times ||rptblocalsample_loop-1;Starttheouterloop mov*AR0+,*AR3;Putthenewsampletosignalbuffer mpym*AR3+,*AR1+,AC0;Dothe1stoperation ||rptCSR;Starttheinnerloop macm*AR3+,*AR1+,AC0 macmr*AR3,*AR1+,AC0;Dothelastoperation movhi(AC0),*AR2+;SaveQ15filteredvalue sample_loop popmST3_55;RestoreST1,ST2,andST3 popmST2_55 popmST1_55 movAR3,T0;Returnsignalbufferindex ||ret .end #defineM128/*Inputsamplesize*/ #defineL37/*NumberofFIRfiltercoefficients*/ #defineSNL/*Signalbuffersize*/ externvoidsignal_gen(int*x,float*y,intN); externvoidfirc(float*,int,float*,int,float*,float*); externunsignedintfir(int*,unsignedint,int*,unsignedint, int*,int*,unsignedint); /*DefineDSPsystemmemorymap*/ #pragmaDATA_SECTION(LP_h,"fir_coef"); #pragmaDATA_SECTION(x,"fir_data"); #pragmaDATA_SECTION(in,"input"); #pragmaDATA_SECTION(index,"fir_data"); #pragmaDATA_SECTION(out,"output"); #pragmaDATA_SECTION(LP_hfloat,"fir_coef"); #pragmaDATA_SECTION(xfloat,"fir_data"); #pragmaDATA_SECTION(infloat,"input"); #pragmaDATA_SECTION(outfloat,"output"); #pragmaDATA_SECTION(inputfloat,"input"); #pragmaDATA_SECTION(input,"input"); #pragmaCODE_SECTION(main,"fir_code"); /*Low-passFIRfiltercoefficients*/ staticintLP_h[L]={ -79,-101,0,180,256,68,-307,-525,-251, 444,976,665,-567,-1835,-1722,653,4745,8653, 10262,8653,4745,653,-1722,-1835,-567,665,976, 444,-251,-525,-307,68,256,180,0,-101,-79, };//低通 staticfloatLP_hfloat[L]={ -0.002423,-0.003085,0.000000,0.005480,0.007808,0.002078, -0.009368,-0.016010,-0.007649,0.013553,0.029784,0.020294, -0.017318,-0.055992,-0.052540,0.019938,0.144791,0.264073, 0.313170,0.264073,0.144791,0.019938,-0.052540,-0.055992, -0.017318,0.020294,0.029784,0.013553,-0.007649,-0.016010, -0.009368,0.002078,0.007808,0.005480,0.000000,-0.003085, -0.002423 };//低通 intinput[160]; floatinputfloat[160]; intx[SN];/*Signalbuffer*/ unsignedintindex;/*Signalbufferindex*/ intout[M];/*Outputbuffer*/ intin[M];/*Inputbuffer*/ floatinfloat[M]; floatoutfloat[M]; floatxfloat[L]; voidmain(void) { unsignedinti,j; signal_gen(input,inputfloat,160); /*Initializefiltersignalbuffer*/ for(i=0;i xfloat[i]=0; j=0; for(i=0;i x[i]=0; index=0; while (1) { for(i=0;i { in[i]=input[j++];//Getabufferofsamples if(j==160) j=0; } for(i=0;i { infloat[i]=inputfloat[j++];/*Getabufferofsamples*/ if(j==160) j=0; } firc(infloat,M,LP_hfloat,L,outfloat,xfloat); index=fir(in,M,LP_h,L,out,x,index);/*FIRfilter*/ } } /* signal_gen.c-Generatesinewavesastestdata prototype: voidsignal_gen(int*,float*,int) arg0: -databufferpointerforoutputinQ15 arg1: -databufferpointerforoutputinfloat arg2: -numberofsamples */ #include #defineT0.000125/*8000Hzsamplingfrequency*/ #definef1800/*800Hzfrequency*/ #definef21800/*1800Hzfrequency*/ #definef33300/*3300Hzfrequency*/ #definePI3.1415926 #definetwo_pi_f1_T(2*PI*f1*T)/*2*pi*f1/Fs*/ #definetwo_pi_f2_T(2*PI*f2*T)/*2*pi*f2/Fs*/ #definetwo_pi_f3_T(2*PI*f3*T)/*2*pi*f3/Fs*/ #definea10.333/*Magnitudeforwave1*/ #definea20.333/*Magnitudeforwave2*/ #definea30.333/*Magnitudeforwave3*/ voidsignal_gen(int*x,float*y,intN) { floattemp; inti; for(i=0;i { temp=a1*cos((double)two_pi_f1_T*i); temp+=a2*cos((double)two_pi_f2_T*i); temp+=a3*cos((double)two_pi_f3_T*i); x[i]=(int)((0x8000*temp)+0.5);//浮点转Q15定点 y[i]=temp; } } -lrts55.lib /* LinkercommandfileforExperiment2(C55xmemorymap) */ MEMORY { MMR: origin=0000000h,length=00000c0h SPRAM: origin=00000c0h,length=0000040h DARAM0: origin=0000100h,length=0003F00h DARAM1: origin=0004000h,length=0004000h DARAM2: origin=0008000h,length=0004000h DARAM3: origin=000c000h,length=0004000h SARAM0: origin=0010000h,length=0004000h SARAM1: origin=0014000h,length=0004000h SARAM2: origin=0018000h,length=0004000h SARAM3: origin=001c000h,length=0004000h SARAM4: origin=0020000h,length=0004000h SARAM5: origin=0024000h,length=0004000h SARAM6: origin=0028000h,length=0004000h SARAM7: origin=002c000h,length=0004000h SARAM8: origin=0030000h,length=0004000h SARAM9: origin=0034000h,length=0004000h SARAM10: origin=0038000h,length=0004000h SARAM11: origin=003c000h,length=0004000h SARAM12: origin=0040000h,length=0004000h SARAM13: origin=0044000h,length=0004000h SARAM14: origin=0048000h,length=0004000h SARAM15: origin=004c000h,length=0004000h VECS: origin=0ffff00h,length=00100h/*resetvector*/ } SECTIONS { vectors: {}>VECS/*interruptvectortable*/ .cinit: {}>SARAM0 .text: {}>SARAM1 .stack: {}>DARAM0 .sysstack: {}>DARAM0 .sysmem: {}>DARAM1 .data: {}>DARAM1 .bss: {}>DARAM1 .const: {}>DARAM1 fir_coef: {}>SARAM0/*userdefinedsections*/ fir_data: {}>DARAM2 input: {}>SARAM0 output: {}>SARAM0align0x4/*boundaryalignment*/ fir_code: {}>SARAM1 } 【试验截图】 输入信号inputfloat的时域图: 输入信号inputfloat的幅度图和相位图: 用MATLAB设计低通滤波器: 经过C语言的低通滤波器后的信号outfloat的时域图: 经过C语言的低通滤波器后的信号outfloat的幅度图和相位图: 经过汇编语言的低通滤波器后的信号out的时域图: 经过汇编语言的低通滤波器后的信号out的幅度图和相位图: 用MATLAB设计高通滤波器: 经过C语言的高通滤波器后的信号outfloat的时域图: 经过C语言的高通滤波器后的信号outfloat的幅度图和相位图: 经过汇编语言的高通滤波器后的信号out的时域图: 经过汇编语言的高通滤波器后的信号out的幅度图和相位图: 五、总结实验体会及实验中存在的问题 这是第二次做DSP实验,实验指导书中很详细的介绍了实验的方法,我按照实验指导书步步执行,并未遇到严重的大问题。 在实验的过程中由于对汇编语言不熟悉,导致因为格式不对而编译出错,但在老师的细心帮助下很快得到了解决。 我希望能在这几次实验后能更加熟练DSP及MATLAB的操作,对fir滤波器做更深了解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 原理 应用 实验 报告