DSP课程设计实验报告北京交通大学数字信号处理(DSP)综合设计性实验报告题目:任意信号发生器的设计学院:电子信息工程学院班级:指导教师:钱满义学生:北京交通大学电工电子教学基地2013年7月15日目录DSP课程设计实验报告一、设计任务…………………………………………………二、实验目的…………………………………………………三、实验要求及目标…………………………………………………四、实验原理…………………………………………………五、程序代码及仿真结果…………………………………………………1.泰勒级数产生正弦波2.泰勒级数产生余弦波3.三角波4.方波5.锯齿波六、实验总结…………………………………………七、参考资料…………………………………………DSP课程设计实验报告一.设计任务信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。各种波形曲线均可以用三角函数方程式来表示。能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路被称为函数信号发生器。函数信号发生器在电路实验和设备检测中具有十分广泛的用途。信号发生器在现代工程中应用非常广泛。在实际中常需要产生一些特殊波形,用于仿真实际信号的波形,以检测和调试测量装置。使用DSP可以产生连续的正弦波信号,同样也能产生方波、锯齿波、三角波等其它各种信号波形。本设计要求采用DSP及其CODEC产生上述各种信号波形。二.实验目的(1)了解产生信号的两种方法及各自的优缺点。(2)掌握使用DSP产生正弦波的原理和算法,进而掌握一般信号产生的原理和方法。(3)掌握5502DSKCODECC的工作原理和初始化过程。三.设计要求及目标基本部分:使用DSP产生300—4000HZ的正弦信号,要求使用计算法,并且频率可变、幅度可变、直流分量可变。DSP课程设计实验报告发挥部分:使用DSP产生300—4000HZ的方波、锯齿波和三角波。四.设计思路产生连续信号的方法通常有两种:查表法和计算法,查表法不如计算法使用灵活。计算法可以使用泰勒级数展开法进行计算,也可以使用差分方程进行迭代计算或者直接使用三角函数进行计算。计算结果可以边计算边输出,也可以先计算后输出。正弦函数和余弦函数的泰勒级数数学表达式为:xsin)!12()1(!9!7!5!31219753nxxxxxxnn,x),(xcos)!2()1(!8!6!4!2128642nxxxxxnn,x),(.如果要计算一个角度ⅹ的正弦和余弦值,可以取其前五项进行近似计算。或使用下面递归的差分方程进行计算。y[n]=A*y[n-1]-y[n-2]其中:A=2cos(x),x=2πF/FS。F—信号频率,FS—D/A转换频率。利用递推公式计算正弦和余弦值需要已知cos(x)和正弦、余弦的前两个值。计算时所需的计算量小,但如果用来产生连续的正弦和余弦信号,则累积误差太大。要得到精确的计算结果,可以使用泰勒级数展开法进行计算,当然计算时所需的计算量很大。在实际应用时可以根据需要选择相应的算法。要产生一个正弦信号,首先要算出一个周期内各样点的值,因为sin(x)的值总是小于1的小数,而5402DSP是16位的定点处理器,所以要将其乘以DSP课程设计实验报告215,变为Q15的数据格式,才能够在DSP中送到D/A转换器进行处理。查表法与计算法的优缺点比较:查表法:事先将要输出的数据计算好,存储在DSP的内部RAM中,然后依次循环输出,从而才生波形。这种方法的优点在于其速度快,可以产生频率很高的波形,而且不占用DSP的计算时间,它的缺点是需要占用DSP的内存空间,尤其是对采样频率比较大的输出波形,所需要的内部空间很大,所以这种方法用于对精度和频率要求不高的场合。计算法:采用计算的方法依次计算数据然后输出。计算法的优缺点正好和查表法相反。其优点是不占用DSP的存储空间,可以根据信息随时间改变或调整输出波形的周期波形;其缺点是占用DSP的计算时间,使得执行程序的开销大在本次实验中我们采用计算法来产生正弦波,并且同时使用了泰勒级数、递归差分方程和三角函数计算三种方法来进行计算,以对这三种算法进行横向比较。五.程序代码及仿真结果1.泰勒级数法实现正弦波程序代码:#includemath.h#includestdio.h#includecsl.h#includecsl_chip.h#includecsl_i2c.h#includecsl_pll.h#includecsl_mcbsp.hDSP课程设计实验报告#includecsl_emif.h#includecsl_emifBhal.h#includestdio.h//#includeE2PROM_Function.h#includeCODEC.h#defineNx720//每周期抽取点数#pragmaDATA_SECTION(output1,data_out1);//存放sin数据,浮点型floatoutput1[Nx];#pragmaDATA_SECTION(output,data_out);//存放sin数据,定点型intoutput[Nx];#definepi3.1415927#definepi22*pi#defineF01000//Signalfrequency#defineFs16000//Samplingfrequency//#undefCODEC_ADDR#defineCODEC_ADDR0x1A#define_COSX0.999390827/*Globaldeclarations*///intinp_buffer[BUFSIZE];/*processingdatabuffers*///intout_buffer[BUFSIZE];intgain=MINGAIN;/*volumecontrolvariable*/intfrequency=MINGAIN;intabc=MINGAIN;unsignedintprocessingLoad=BASELOAD;/*processingroutineloadvalue*//*****************余弦函数*****************/into=2;intdacdata[Nx];float_cosx[Nx];/*****************方波函数*********/doublesqu[Nx];intdacdata2[Nx];intoutbuffer[Nx];intamp=100;unsignedintt=0;/*****************锯齿波*****************/doublez=0;doubledt;unsignedintp=0;doublesaw[Nx];intdacdata4[Nx],outbuffer3[Nx];/*****************三角波函数*****************/DSP课程设计实验报告doubletri[Nx];intdacdata3[Nx],outbuffer2[Nx];intamp2=2;doubleT=0,DT;unsignedintI=0;//定义McBSP的句柄MCBSP_HandlehMcbsp;/*------------------------------------------------------------------------------------*/////FUNCTION:MAIN///*------------------------------------------------------------------------------------*/voidmain(void){Uint16i=0,k=0;floatinput0=0,x1;floata,b,c,d,e,f,g,h,ii,step;//step为角度步长step=360.0/Nx;//Nx为360度内取样点数/*****************正弦函数*****************/for(i=0;i=Nx-1;i++){floatangle,xx;angle=input0+step*i;x1=3.1415926*angle/180;//将角度转为弧度xx=x1*x1;a=1-xx/16/17;b=1-xx/14/15*a;c=1-xx/12/13*b;d=1-xx/10/11*c;e=1-xx/8/9*d;f=1-xx/6/7*e;g=1-xx/4/5*f;h=1-xx/2/3*g;ii=x1*h;//ii=x1*(1-xx/2/3*(1-xx/4/5*(1-xx/6/7*(1-xx/8/9*(1-xx/10/11*(1-xx/12/13*(1-xx/14/15*(1-xx/16/17))))))));//数学总公式//fprintf(stdout,COMPUTE%f,ii);fprintf(stdout,\n);//输出计算的正弦波的数值,x2=eoutput1[i]=32767*ii;//利用泰勒级数计算出正弦波的数值,存放到output1中output[i]=output1[i]/32;//InitializeCSLlibrary-ThisisREQUIRED!!!CSL_init();DSP课程设计实验报告//Themainfrequencyofsystemis240MHz//该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数PLL_setFreq(1,0xC,0,1,3,3,0);//EMIF初始化Emif_Config();//OpenMcBSPport1andgetaMcBSPtypehandlehMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);//ConfigMcBSPport1byusepreviouslydefinedstructureMcbsp_Config(hMcbsp);//I2C初始化I2C_cofig();//CODEC寄存器初始化inti_AIC();/*------------------------------------------------------------------------------------*///ReceivetheADCoutputdataofCODEC//ThenoutputthereceiveddatatoDACofCODEC/*------------------------------------------------------------------------------------*/while(1){while(!MCBSP_xrdy(hMcbsp)){};MCBSP_write16(hMcbsp,dacdata4[k]*gain+abc);//左声道输出while(!MCBSP_xrdy(hMcbsp)){};MCBSP_write16(hMcbsp,dacdata4[k]*gain+abc);//右声道输出k=k+1+frequency;//正弦波每周期的样点为360个,输出信号的频率为Fs/N=32000/360=88.89Hz//k=k+10;//正弦波每周期的样点为36个,输出信号的频率为Fs/N=32000/36=888.9Hzif(k=Nx)k=k%Nx;}}}GEL文件:DSP课程设计实验报告Amp.gel:menuitemSignalGainslidergain(0,1000,1,1,gainparameter){Amp=gainparameter;}Fre.gel:menuitemSignalFrequencysliderfre(40,1000,1,1,freparameter){Fre=freparameter;}硬件仿真结果:DSP课程设计实验报告添加GEL程序