DSP课程设计DSP原理及应用课程设计一、设计题目——正弦波信号发生器二、设计目的1、掌握用汇编语言编写输出正弦波信号的程序2、掌握正弦波信号的 DSP 实现原理和 C54X 编程技巧3、进一步加深对CCS 的认识4、能通过 CCS 的图形显示工具观察正弦信号波形三、实验设备PC 兼容机一台,操作系统为 WindowsXP,安装Code Composer Studio 3.1软件。
四、设计原理在通信、仪器和工业控制等领域的信号处理系统中常常会用到信号发生器来产生正弦波! 产生正弦波的方法一是查表法,二是泰勒级数展开法!查表法主要用于对精度要求不很高的场合,而泰勒级数展开法是一种比查表法更为有效的方法,它能精确地计算出一个角度的正弦和余弦值,且只需要较少的存储空间。
本实验将利用泰勒级数展开法利用计算一个角度的正弦值和余弦值程序可实现正弦波。
(1)产生正弦波的算法:在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为:3579xxxxsin(x),x,,,,,... 3!5!7!9!2468xxxx cos(x),1,,,,,...2!4!6!8!若要计算一个角度的正弦和余弦值,可取泰勒级数的前五项进行近似计算。
3579xxxxx,x,,,,,sin()...3!5!7!9!2222xxxx(1(1(1(1)))),x,,,,,,,,234567892468xxxx cos(x),1,,,,,... 2!4!6!8!2222xxxx,,,,, 1(1(1(1))) ,,,2345678由这两个式子可推导出递推公式,即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)xsin(n,2)xcos(n,2)x(2)正弦波的实现1、计算一个角度的正弦值利用泰勒级数的展开式,可计算一个角度x的正弦值,并采用子程序的调用方式。
在调用前先在数据存储器d_xs单元中存放x的弧度值,计算结果存放在d_sinx单元中。
实现计算一个角度的正弦值的程序片段如下: sinx:.def d_xs,d_sinx.datatable_s .word 01C7H ;C1=1/(8*9).word 030BH ;C2=1/(6*7).word 0666H ;C3=1/(4*5).word 1556H ;C4=1/(2*3)d_coef_s .usect "coef_s",4d_xs .usect "sin_vars",1d_squr_xs .usect "sin_vars",1d_temp_s .usect "sin_vars",1d_sinx .usect "sin_vars",1d_l_s .usect "sin_vars",1.textSSBX FRCTSTM #d_coef_s,AR5 ;move coeffs table_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^2ST A,*AR2 ;(AR2)=x^2||LD *AR4,B ;B=1MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2MPYA A ;A=T*A=x^2(1-x^2/72)STH A,*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)))ST B,*AR2 ;(d_temp)=B||LD *AR4,B ;B=1MASR*AR2-,*AR3,B,A ;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))) MPYA d_xs ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))) STH B,d_sinx ;sin(theta)RET2、计算一个角度的余弦值利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实现。
调用前先将x弧度值放在数据存储器d_xc单元中,计算结果存放在d_cosx单元中。
实现计算一个角度的余弦值的程序片段如下:cosx:.def d_xc,d_cosxd_coef_c .usect "coef_c",4.datatable_c .word 0249H ;C1=1/(7*8).word 0444H ;C2=1/(5*6).word 0AABH ;C3=1/(3*4).word 4000H ;C4=1/2d_xc .usect "cos_vars",1d_squr_xc .usect "cos_vars",1d_temp_c .usect "cos_vars",1d_cosx .usect "cos_vars",1c_l_c .usect "cos_vars",1.textSSBX FRCTSTM #d_coef_c,AR5 ;move coeffs table_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^2ST A,*AR2 ;(AR2)=x^2||LD *AR4,B ;B=1MASR *AR2+,*AR3+,B,A ;A=1-x^2/56,T=x^2MPYA A ;A=T*A=x^2(1-x^2/56)STH A,*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,A ;A=1-x^2/12(1-x^2/30(1-x^2/56))SFTA A,-1,A ;-1/2NEG AMPYA *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)))STH B,*AR2 ;cos(theta)RET3、正弦波的实现利用计算一个角度的正弦值和余弦值程序可实现正弦波。
其实现步骤如下: ,,第一步:利用sin_start和cos_start子程序,计算(间隔0~45,为)的正弦和余弦值; 0.5,,第二步:利用sin(2x)=2sin(x)cos(x)公式,计算的正弦0~90,值(间隔为); 1,,第三步:通过复制,获得的正弦值; 0~359,,第四步:将的正弦值重复从PA口输出,便可得到正弦波。
0~359产生正弦波的程序片段如下:.mmregs.def start.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x: .usect "sin_x",360 STACK: .usect "STACK",10H k_theta .set 286 ;theta=pi/360(0.5deg)start:.textSTM #STACK+10H,SPSTM k_theta,AR0STM 0,AR1STM #sin_x,AR6STM #90,BRCRPTB loop1-1LDM AR1,ALD #d_xs,DPSTL A,@d_xsSTL A,@d_xcCALL sinx ;d_sinx=sin(x)CALL cosx ;d_cosx=cos(x)LD #d_sinx,DPLD @d_sinx,16,A ;A=sin(x)MPYA @d_cosx ;B=sin(x)*cos(x)2*sin(x) STH B,1,*AR6+ ;AR6----MAR *AR1+0loop1: STM #sin_x+89, AR7 ;sin91(deg.)-sin179(deg.) STM #88,BRCRPTB loop2-1LD *AR7-,ASTL A,*AR6+loop2: STM #179,BRC ;sin180(deg.)-sin359(deg.)STM #sin_x,AR7RPTB loop3-1LD *AR7+,ANEG ASTL A,*AR6+loop3: STM #sin_x,AR6 ;generate sin wave STM #1,AR0STM #360,BKB loop3产生正弦波链接命令文件的程序片段如下: MEMORY{PAGE 0:EPROM: org=0E000H, len=1000HVECS: org=0FF80H, len=0080HPAGE 1:SPRAM: org=0060H, len=0020HDARAM1: org=0080H, len=0010HDARAM2: org=0090H, len=0010HDARAM3: org=0200H, len=0200H}SECTIONS{.text :> EPROM PAGE 0.data :> EPROM PAGE 0STACK :> SPRAM PAGE 1sin_vars :> DARAM1 PAGE 1coef_s :> DARAM1 PAGE 1cos_vars :> DARAM2 PAGE 1coef_c :> DARAM2 PAGE 1sin_x : align(512) {} > DARAM3 PAGE 1.vectors :>VECS PAGE 0 }五、设计内容本实验需要使用C54X汇编语言产生正弦波,并通过 CCS的图形显示工具观察波形。