DSP原理与应用实验报告2Word格式文档下载.docx
《DSP原理与应用实验报告2Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DSP原理与应用实验报告2Word格式文档下载.docx(18页珍藏版)》请在冰点文库上搜索。
![DSP原理与应用实验报告2Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/3565a89a-af5b-4114-929c-88d3481e9d0b/3565a89a-af5b-4114-929c-88d3481e9d0b1.gif)
编译、链接、加载、运行程序,选择菜单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<
M;
j++)
{
x[0]=in[j];
for(yn=0.0,i=0;
i<
L;
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,"
#pragmaDATA_SECTION(out,"
output"
#pragmaDATA_SECTION(LP_hfloat,"
#pragmaDATA_SECTION(xfloat,"
#pragmaDATA_SECTION(infloat,"
#pragmaDATA_SECTION(outfloat,"
#pragmaDATA_SECTION(inputfloat,"
#pragmaDATA_SECTION(input,"
#pragmaCODE_SECTION(main,"
/*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;
SN;
xfloat[i]=0;
j=0;
x[i]=0;
index=0;
while
(1)
for(i=0;
i<
i++)
in[i]=input[j++];
//Getabufferofsamples
if(j==160)
j=0;
infloat[i]=inputfloat[j++];
/*Getabufferofsamples*/
if(j==160)
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<
math.h>
#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;
N;
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:
.sysmem:
DARAM1
.data:
.bss:
.const:
fir_coef:
SARAM0/*userdefinedsections*/
fir_data:
DARAM2
input:
output:
SARAM0align0x4/*boundaryalignment*/
fir_code:
【试验截图】
输入信号inputfloat的时域图:
输入信号inputfloat的幅度图和相位图:
用MATLAB设计低通滤波器:
经过C语言的低通滤波器后的信号outfloat的时域图:
经过C语言的低通滤波器后的信号outfloat的幅度图和相位图:
经过汇编语言的低通滤波器后的信号out的时域图:
经过汇编语言的低通滤波器后的信号out的幅度图和相位图:
用MATLAB设计高通滤波器:
经过C语言的高通滤波器后的信号outfloat的时域图:
经过C语言的高通滤波器后的信号outfloat的幅度图和相位图:
经过汇编语言的高通滤波器后的信号out的时域图:
经过汇编语言的高通滤波器后的信号out的幅度图和相位图:
五、总结实验体会及实验中存在的问题
这是第二次做DSP实验,实验指导书中很详细的介绍了实验的方法,我按照实验指导书步步执行,并未遇到严重的大问题。
在实验的过程中由于对汇编语言不熟悉,导致因为格式不对而编译出错,但在老师的细心帮助下很快得到了解决。
我希望能在这几次实验后能更加熟练DSP及MATLAB的操作,对fir滤波器做更深了解。