北京信息科技大学DSP实验二.docx
《北京信息科技大学DSP实验二.docx》由会员分享,可在线阅读,更多相关《北京信息科技大学DSP实验二.docx(11页珍藏版)》请在冰豆网上搜索。
北京信息科技大学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;ixfloat[i]=0;
j=0;
for(i=0;ix[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
}