正弦函数计算程序的编写I摘要泰勒级数展开法作为一种数学方法,在科研和平时的数据处理方面应用的很广泛。尤其是在通信、仪器仪表和工业控制等领域应用更为广泛。在科技高速发展的今天,对函数的计算不仅要求有很高的精度,还对计算的时间又很高的要求,必须在很短的时间内完成数据的处理,否则根本不能完成大批量数据的实时性计算和处理。介于DSP芯片运算速度快的特点,用DSP芯片完成这些算法已越来越受到重视。产生正弦波,分别是查表法和泰勒级数展开法。查表法应用于精度要求不很高的场合,而泰勒级数展开法是一种比查表法更为有效的方法。它能精确的计算出一个角度的正弦和余弦值,且占用的储存空间较小,体现了它的优越性。关键词:DSP泰勒级数正弦波正弦函数计算程序的编写II目录摘要.....................................................................................................I1、正余弦信号发生器的实现原理..................................................11.1、正弦波信号发生器...........................................................12、正弦波的实现..............................................................................22.1、计算一个角度的正弦值...................................................22.2、计算一个角度的余弦值...................................................43、正弦波的实现.............................................................................84、链接文件....................................................................................105、调试结果....................................................................................12总结..................................................................................................13参考文献..........................................................................................14正弦函数计算程序的编写11、正余弦信号发生器的实现原理1.1、正弦波信号发生器泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。本次主要用泰勒级数展开法来实现正弦波信号。正弦函数和余弦函数可以展开成泰勒级数,其表达式:3579sin()3!5!7!9!xxxxxx2468cos()12!4!6!8!xxxxx取泰勒级数的前5项,得近似计算式:35792222sin()3!5!7!9!111123456789(((())))xxxxxxxxxxx24682222cos()12!4!6!8!11112345678((()))xxxxxxxxx递推公式: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。正弦函数计算程序的编写22、正弦波的实现2.1、计算一个角度的正弦值计算一个角度x的正弦值,可利用泰勒级数的展开式,采用子程序的调用方式来实现。在调用前先在数据存储器d_xs单元中存放x的弧度值,计算结果存放在d_sinx单元中。程序中要用到一些存储单元存放数据和变量,存储单元的分配如下:d_xs:x;d_squr_xs:x2d_temp_s:暂存;d_sinx:计算结果sinxc_1_s:7FFFh(数值1);d_coef_s:泰勒系数存储单元分配图:数据存储器程序存储器表1计算正弦值存储单元分配xd_xsd_squr_xsd_temp_sd_sinxc_1_sd_coef_stable_sc1=1/(8*9)x2c2=1/(6*7)c3=1/(4*5)sinxc4=1/(2*3)(7FFFH)(c1=01c7H)(c2=030BH)(c3=0666H)(c4=1556H)正弦函数计算程序的编写3程序清单sinx.asm:.title“sinx.asm”.mmregs.defstart.refsin_start,d_xs,d_sinxSTACK:.usect“STACK”,10start:STM#STACK+10,SPLD#d_xs,DPST#6487H,d_xsCALLsin_startend:Bendsin_start:.defsin_startd_coef_s.usect“coef_s”,4.datatable_s:.word01C7H;c1=1/(8*9).word030BH;c2=1/(6*7).word0666H;c3=1/(4*5).word1556H;c4=1/(2*3)d_xs.usect“sin_vars”,1d_squr_xs.usect“sin_vars”,1d_temp_s.usect“sin_vars”,1d_sinx.usect“sin_vars”,1c_1_s.usect“sin_vars”,1.textSSBXFRCTSTM#d_coef_s,AR4RPT#3MVPD#table_s,*AR4+STM#d_coef_s,AR2STM#d_xs,AR3正弦函数计算程序的编写4STM#c_1_s,AR5ST#7FFFH,c_1_sSQUR*AR3+,A;求x的平方值STA,*AR3;x平方值存入(AR3)||LD*AR5,B;B=1MASR*AR3+,*AR2+,B,A;A=1-x^2/72,T=x^2MPYAA;A=T*ASTHA,*AR3;(d_temp_s)=x^2(1-x^2/72)MASR*AR3-,*AR2+,B,A;A=1-x^2/42(1-x^2/72);T=x^2(1-x^2/72)MPYA*AR3+;B=x^2(1-x^2/42(1-x^2/72))STB,*AR3;(d_temp_s)=x^2(1-x^2/42(1-x^2/72))||LD*AR5,B;B=1MASR*AR3-,*AR2,B,A;A=1-x^2/20(1-x^2/42(1-x^2/72))MPYA*AR3+;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))STB,*AR3;(d_temp_s)=……||LD*AR5,B;B=1MASR*AR3-,*AR2,B,A;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.end2.2、计算一个角度的余弦值计算余弦值与计算正弦值相同。存储单元分配图:正弦函数计算程序的编写5数据存储器程序存储器表2计算余弦值存储单元分配程序清单cosx.asm:.title“cosx.asm”.mmregs.def_c_int00.refcos_start,d_cosxSTACK:.usect“STACK”,10_c_int00:STM#STACK+10,spLD#d_xc,DPST#6487h,d_xcCALLcos_startend:Bendcos_start:.defcos_startd_coeff.usect“coef_c”,4.dataTable.word0249h;c1=1/(7*8)xd_xcd_squr_xcd_temp_cd_cosxc_1_cd_coef_ctable_sc1=1/(7*8)x2c2=1/(5*6)c3=1/(3*4)cosxc4=1/2(7FFFH)(c1=00249H)(c2=0444H)(c3=0AABH)(c4=4000H)正弦函数计算程序的编写6.Word0444h;c2=1/(5*6).Word0aahh;c3=1/(3*4).word4000h;c4=1/2d_x.usect“cos_vars”,1d_squr_x.usect“cos_vars”,1d_temp.usect“cos_vars”,1d_cosx.usect“cos_vars”,1c_1.usect“cos_vars”,1.textSSBXFRCTSTM#d_coef_c,AR4Rpt#3MVPD#table_c,*AR4+STM#d_coef_c,AR2STM#d_xc,AR3STM#c_1_c,AR5ST#7FFFH,c_1_cSQUR*AR3+.A;求x的平方值STA,*AR3;x平方值存入(AR3)||LD*AR5,B;B=1MASR*AR3-,*AR2+,B,A;A=1-x^2/56,T=x^2MPYAA;A=T*ASTHA,*AR3;(d_temp_c)=x^2(1-x^2/56)MASR*AR-,*AR3+,B,A;A=1-x^2/30(1-x^2/56);T=x^2(1-x^2/56)MPYA*AR3+;B=x^2(1-x^2/30(1-x^2/56))STB,*AR3;(d_temp_s)=x^2(1-x^2/30(1-x^2/56))||LD*AR5,B;B=1MASR*AR3-,*AR2,B,A;;A=1-x^2/12(1-x^2/30(1-x^2/56))SFTAA,-1,A;-1/2正弦函数计算程序的编写7NEGAMPYA*AR3+;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))MAR*AR2+RETDADD*AR5,16,B;B=1-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))STHB,*AR3RET.end正弦函数计算程序的编写83、正弦波的实现利用计算一个角度的正弦值和余弦值程序公式可实现正弦波,步骤如下:第一步:利用sin_start和cos_start子程序,计算0o~45o(间隔为0.5o)的正弦和余弦值。第二步:利用sin(2x)=2sin(x)cos(x),计算0-90o的正弦值(间隔为1o).第三步:通过复制,获得0-359o的正弦值。第四步:将0-359o的正弦值重复从PA口输出,便可得到正弦波。程序清单sin.asm:.title“sinx_asm”.mmregs.defstart.refd_xs,sinx,d_sinx,d_xc,cosx,d_coxsin_x:.usect“sin_x”,360STACK.usect“STACK”,10k_theta.286;theta=pi/360PA0.set0Start:.textSTM#STACK+10,SPSTM#0,AR0;AR0=x=0STMk_theta,AR1;设置增量STM#sin_x,AR7;AR7指向sin_xSTM#90,BRC;设置重复次数,计算sin0-sin9RPTBloop-1LDMAR0,ALD#d_xs,DPSTLA,@d_xs正弦函数计算程序的编写9STLA,@d_x