DSP原理及应用课程设计设计题目:正弦波信号发生器学校:学院:专业班级:姓名:学号:同组人:、1设计题目正弦波信号发生器设计目的学会使用CCS(CodeComposerStudio)集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。设计内容编写一个产生正弦波信号的程序,在CCS软件下进行模拟运行,观察输出结果。设计原理正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。本次课程设计只要使用泰勒级数展开法来实现正弦波信号。1.产生正弦波的算法在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为!9!7!5!3)sin(9753xxxxxx!8!6!4!21)cos(8642xxxxx若要计算一个角度x的正弦和余弦值,可取泰勒级数的前5项进行近似计算。981761541321!9!7!5!3)sin(22229753xxxxxxxxxxx87165143121!8!6!4!21)cos(22228642xxxxxxxxx由上述两个式子可以推导出递推公式,即sin(nx)=2cos(x)sin[(n-1)x]-sin[(n-2)x]cos(nx)=2cos(x)sin[(n-1)x]-cos[(n-2)x]由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且还需要sin[(n-1)x]、sin[(n-2)x]和cos[(n-2)x]。2.正弦波的实现⑴计算一个角度的正弦值利用泰勒级数的展开式,可计算一个角度x的正弦值,并采用子程序的调用2方式。在调用前先在数据存储器d_xs单元中存放x的弧度值,计算结果存放在d_sinx单元中。实现计算一个角度的正弦值的程序片段如下:sinx:.defd_xs,d_sinx.datatable_s.word01C7H;C1=1/(8*9).word030BH;C2=1/(6*7).word0666H;C3=1/(4*5).word1556H;C4=1/(2*3)d_coef_s.usectcoef_s,4d_xs.usectsin_vars,1d_squr_xs.usectsin_vars,1d_temp_s.usectsin_vars,1d_sinx.usectsin_vars,1d_l_s.usectsin_vars,1.textSSBXFRCTSTM#d_coef_s,AR5;movecoeffstable_sRPT#3MVPD#table_s,*AR5+STM#d_coef_s,AR3STM#d_xs,AR2STM#d_l_s,AR4ST#7FFFH,d_l_sSQUR*AR2+,A;A=x^2STA,*AR2;(AR2)=x^2||LD*AR4,B;B=1MASR*AR2+,*AR3+,B,A;A=1-x^2/72,T=x^2MPYAA;A=T*A=x^2(1-x^2/72)STHA,*AR2;(d_temp)=x^2(1-x^2/72)MASR*AR2-,*AR3+,B,A;A=1-x^2/42(1-x^2/72);T=x^2(1-x^2/72)MPYA*AR2+;B=x^2(1-x^2/42(1-x^2/72))STB,*AR2;(d_temp)=x^2(1-x^2/42(1-x^2/72))||LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A;A=1-x^2/20(1-x^2/42(1-x^2/72))MPYA*AR2+;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))STB,*AR2;(d_temp)=B||LD*AR4,B;B=1MASR*AR2-,*AR3,B,A3;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))MPYAd_xs;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))))STHB,d_sinx;sin(theta)RET⑵计算一个角度的余弦值利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实现。调用前先将x弧度值放在数据存储器d_xc单元中,计算结果存放在d_cosx单元中。实现计算一个角度的余弦值的程序片段如下:cosx:.defd_xc,d_cosxd_coef_c.usectcoef_c,4.datatable_c.word0249H;C1=1/(7*8).word0444H;C2=1/(5*6).word0AABH;C3=1/(3*4).word4000H;C4=1/2d_xc.usectcos_vars,1d_squr_xc.usectcos_vars,1d_temp_c.usectcos_vars,1d_cosx.usectcos_vars,1c_l_c.usectcos_vars,1.textSSBXFRCTSTM#d_coef_c,AR5;movecoeffstable_cRPT#3MVPD#table_c,*AR5+STM#d_coef_c,AR3STM#d_xc,AR2STM#c_l_c,AR4ST#7FFFH,c_l_cSQUR*AR2+,A;A=x^2STA,*AR2;(AR2)=x^2||LD*AR4,B;B=1MASR*AR2+,*AR3+,B,A;A=1-x^2/56,T=x^2MPYAA;A=T*A=x^2(1-x^2/56)STHA,*AR2;(d_temp)=x^2(1-x^2/56)MASR*AR2-,*AR3+,B,A;A=1-x^2/30(1-x^2/56);T=x^2(1-x^2/56)MPYA*AR2+;B=x^2(1-x^2/30(1-x^2/56))STB,*AR2;(d_temp)=x^2(1-x^2/30(1-x^2/56))||LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A4;A=1-x^2/12(1-x^2/30(1-x^2/56))SFTAA,-1,A;-1/2NEGAMPYA*AR2+;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))MAR*AR2+RETDADD*AR4,16,B;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))STHB,*AR2;cos(theta)RET⑶正弦波的实现利用计算一个角度的正弦值和余弦值程序可实现正弦波。其实现步骤如下:第一步:利用sin_start和cos_start子程序,计算45~0(间隔为5.0)的正弦和余弦值;第二步:利用sin(2x)=2sin(x)cos(x)公式,计算90~0的正弦值(间隔为1);第三步:通过复制,获得359~0的正弦值;第四步:将359~0的正弦值重复从PA口输出,便可得到正弦波。产生正弦波的程序片段如下:.mmregs.defstart.defd_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x:.usectsin_x,360STACK:.usectSTACK,10Hk_theta.set286;theta=pi/360(0.5deg)start:.textSTM#STACK+10H,SPSTMk_theta,AR0STM0,AR1STM#sin_x,AR6STM#90,BRCRPTBloop1-1LDMAR1,ALD#d_xs,DPSTLA,@d_xsSTLA,@d_xcCALLsinx;d_sinx=sin(x)CALLcosx;d_cosx=cos(x)LD#d_sinx,DPLD@d_sinx,16,A;A=sin(x)MPYA@d_cosx;B=sin(x)*cos(x)STHB,1,*AR6+;AR6----2*sin(x)MAR*AR1+0loop1:STM#sin_x+89,AR7;sin91(deg.)-sin179(deg.)STM#88,BRC5RPTBloop2-1LD*AR7-,ASTLA,*AR6+loop2:STM#179,BRC;sin180(deg.)-sin359(deg.)STM#sin_x,AR7RPTBloop3-1LD*AR7+,ANEGASTLA,*AR6+loop3:STM#sin_x,AR6;generatesinwaveSTM#1,AR0STM#360,BKBloop3产生正弦波链接命令文件的程序片段如下:MEMORY{PAGE0:EPROM:org=0E000H,len=1000HVECS:org=0FF80H,len=0080HPAGE1:SPRAM:org=0060H,len=0020HDARAM1:org=0080H,len=0010HDARAM2:org=0090H,len=0010HDARAM3:org=0200H,len=0200H}SECTIONS{.text:EPROMPAGE0.data:EPROMPAGE0STACK:SPRAMPAGE1sin_vars:DARAM1PAGE1coef_s:DARAM1PAGE1cos_vars:DARAM2PAGE1coef_c:DARAM2PAGE1sin_x:align(512){}DARAM3PAGE1.vectors:VECSPAGE0}在实际应用中,正弦波是通过D/A口输出的。选择每个正弦周期中的样点数、改变每个样点之间的延迟,就能够产生不同频率的波形,也可以利用软件改变波形的幅度以及起始相位。总体方案设计1.总体实现方案我们知道一个角度为x的正弦和余弦函数,都可以展开为泰勒级数,且其前6五项可以看为:981761541321!9!7!5!3)sin(22229753xxxxxxxxxxx87165143121!8!6!4!21)cos(22228642xxxxxxxxx本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点与x轴的每一个角度值相对应,那么我们可以利用DSP处理器处理大量重复计算的优势来计算,x轴每一点对应的y轴的值(在x轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍。可由于正弦波的特殊的对称形式给程序的编制找到了出口。)4sin(的弧度为0.78541,即4~0之间的任意正弦、余弦值可以利用汇编程序得到N又可以利用公式:cossin22sin得到2~0之间的正弦值。而2~0之间的正弦曲线与~2之间的正弦曲线通过2x这条轴左右对称,那么就可以得到~2的正弦值,而~0的正弦曲线的相反数通过x这条轴与2~左右对称。这样2~的正弦值也得到了。一个周期内完整的正弦波就得到了。正弦波产生的流程图如下:得到正弦值得到余弦值sin2a=2sinacosa得到2~0的值得到~2的值得到2~的值得到2~0的值循环输出数据72.具体实现步骤本课程设计需要使用C54X汇编语言产生正弦波,并通过CCS的图形显示工具观察波形。设计分以下几步完成:启动CCS,操作如下:1.建立新的工程文件:点击Project→New,保存文件名为sin