北京信息科技大学DSP实验二.docx

上传人:b****5 文档编号:3307526 上传时间:2022-11-21 格式:DOCX 页数:11 大小:676.88KB
下载 相关 举报
北京信息科技大学DSP实验二.docx_第1页
第1页 / 共11页
北京信息科技大学DSP实验二.docx_第2页
第2页 / 共11页
北京信息科技大学DSP实验二.docx_第3页
第3页 / 共11页
北京信息科技大学DSP实验二.docx_第4页
第4页 / 共11页
北京信息科技大学DSP实验二.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

北京信息科技大学DSP实验二.docx

《北京信息科技大学DSP实验二.docx》由会员分享,可在线阅读,更多相关《北京信息科技大学DSP实验二.docx(11页珍藏版)》请在冰豆网上搜索。

北京信息科技大学DSP实验二.docx

北京信息科技大学DSP实验二

实验报告

 

课程名称DSP原理与应用

实验项目FIR算法的DSP实现

指导教师

 

学院信息与通信工程_

专业电子信息工程

班级/学号

学生姓名

实验日期

成绩_______________________

实验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”对话框中进行相应的配置显示滤波系数、输出信号的时域图和频域的幅度和相位图。

五、实验截图:

(1)MATLAB实现低通滤波器

(2)混合波形的时域和频域图形

图(3)C语言实现FIR低通滤波后的时域、频域波形

图(4)汇编语言实现FIR低通滤波后的时域、频域波形

图(5)Profiler工具测试函数大小及滤波时间

六、实验心得

本次实验考察了fir滤波器在DSP中的实现算法,通过MATLAB导出滤波器的系数,然后再利用DSP中的C语言算法或汇编算法可以实现对于混合信号的滤波作用。

通过这样的一次实验,我掌握了一些DSP软件调试中的方法,如利用观测窗验证部分变量的值的变化,就可以判断算法中运行情况,还有就是断点和探针的应用。

实验中还用到了波形发生函数,将几个不同的频率的正弦波混合到一起,相信通过这样的一次编程,以后遇到相同的问题就可以顺利解决了。

在实验中设计了一个低通滤波器,相类似的可以设计出高通、带通和带阻的。

附:

程序代码

1、MATLAB设计低通滤波器

clc,closeall

fsamp=8000;%采样率

fcuts=[11001600];%截止频率

mags=[10];%低通滤波

devs=[0.030.03];%波纹系数

[N,Wn,BETA,TYPE]=KAISERORD(fcuts,mags,devs,fsamp);

B=FIR1(N,Wn,TYPE,kaiser(N+1,BETA));

plot(B),figure,freqz(B)

%浮点系数的导出

f1=fopen('B.txt','w');

fprintf(f1,'%9f,',B);

fclose(f1);

%Q15格式系数的导出

f2=fopen('BQ15.txt','w');

BQ15=round(B.*32768);%朝最近的整数取整

fprintf(f2,'%6d,',BQ15);

fclose(f2);

2、

-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

}

3、正弦波产生文件

#include

#defineT0.000125/*8000Hzsamplingfrequency*/

#definef1600/*800Hzfrequency*/

#definef22000/*1800Hzfrequency*/

#definef32800/*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)((0x7FFF*temp)+0.5);此行为英文教材内写的语句,有误

//if(temp>=0)x[i]=(int)(0x8000*temp+0.5);

//elsex[i]=(int)(0x8000*temp-0.5);

x[i]=temp>=0?

(int)(0x8000*temp+0.5):

(int)(0x8000*temp-0.5);

//浮点转Q15定点并且四舍五入,采用条件运算符

//C语言优先级由高到低:

算术运算符关系运算符逻辑运算符

//条件运算符赋值运算符逗号运算符

y[i]=temp;

}

}

4、主函数

//fircasm.c

intinput[160];

floatinputfloat[160];

#defineM128/*Inputsamplesize*/

#defineL27/*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]={

291,62,-393,-576,

-91,768,1066,115,-1540,

-2155,-131,4368,9066,11069,

9066,4368,-131,-2155,-1540,

115,1066,768,-91,-576,-393,

62,291,};

//低通,通带的范围是0Hz到1100Hz,阻带的范围是1600Hz到4000Hz

staticfloatLP_hfloat[L]=

{0.008868,0.001896,-0.011995,-0.017569,

-0.002763,0.023447,0.032522,0.003501,

-0.047009,-0.065779,-0.003996,0.133297,

0.276677,0.337806,0.276677,0.133297,

-0.003996,-0.065779,-0.047009,0.003501,

0.032522,0.023447,-0.002763,-0.017569,

-0.011995,0.001896,0.008868,};

//低通,通带的范围是0Hz到1100Hz,阻带的范围是1600Hz到4000Hz

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;

for(;;)

{

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*/

}

}

5、汇编算法

-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

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1