DSP原理及应用课程设计正弦波信号发生器.doc

上传人:土8路 文档编号:11072396 上传时间:2021-06-26 格式:DOC 页数:14 大小:197.50KB
返回 下载 相关 举报
DSP原理及应用课程设计正弦波信号发生器.doc_第1页
第1页 / 共14页
DSP原理及应用课程设计正弦波信号发生器.doc_第2页
第2页 / 共14页
DSP原理及应用课程设计正弦波信号发生器.doc_第3页
第3页 / 共14页
DSP原理及应用课程设计正弦波信号发生器.doc_第4页
第4页 / 共14页
DSP原理及应用课程设计正弦波信号发生器.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《DSP原理及应用课程设计正弦波信号发生器.doc》由会员分享,可在线阅读,更多相关《DSP原理及应用课程设计正弦波信号发生器.doc(14页珍藏版)》请在三一文库上搜索。

1、DSP原理及应用课程设计设计题目:正弦波信号发生器学校:太原理工大学学院:信息工程学院专业班级:通信0903班姓名:学号:2009001374同组人: 设计题目正弦波信号发生器设计目的学会使用CCS(Code Composer Studio)集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。设计内容编写一个产生正弦波信号的程序,在CCS软件下进行模拟运行,观察输出结果。设计原理正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。通常有两种

2、方法可以产生正弦波,分别为查表法和泰勒级数展开法。查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。本次课程设计只要使用泰勒级数展开法来实现正弦波信号。1. 产生正弦波的算法在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为 若要计算一个角度x的正弦和余弦值,可取泰勒级数的前5项进行近似计算。由上述两个式子可以推导出递推公式,即sin(nx)=2cos(x)sin(n-1)x-sin(n-2)xcos(nx)=2cos(x)sin(n-1)x-co

3、s(n-2)x由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且还需要sin(n-1)x、sin(n-2)x和cos(n-2)x。2. 正弦波的实现计算一个角度的正弦值利用泰勒级数的展开式,可计算一个角度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

4、) .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 .text SSBX FRCT STM #d_coef_s,AR5 ;move coeffs table_s RPT #3 MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 STM #d_l_s,AR4

5、 ST #7FFFH,d_l_s SQUR *AR2+,A ;A=x2 ST A,*AR2 ;(AR2)=x2 |LD *AR4,B ;B=1 MASR *AR2+,*AR3+,B,A ;A=1-x2/72,T=x2 MPYA A ;A=T*A=x2(1-x2/72) STH A,*AR2 ;(d_temp)=x2(1-x2/72) MASR *AR2-,*AR3+,B,A ;A=1-x2/42(1-x2/72);T=x2(1-x2/72) MPYA *AR2+ ;B=x2(1-x2/42(1-x2/72) ST B,*AR2 ;(d_temp)=x2(1-x2/42(1-x2/72) |LD

6、 *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A=1-x2/20(1-x2/42(1-x2/72) MPYA *AR2+ ;B=x2(1-x2/20(1-x2/42(1-x2/72) ST B,*AR2 ;(d_temp)=B |LD *AR4,B ;B=1 MASR *AR2-,*AR3,B,A ;A=1-x2/6(1-x2/20(1-x2/42(1-x2/72) MPYA d_xs ;B=x(1-x2/6(1-x2/20(1-x2/42(1-x2/72) STH B,d_sinx ;sin(theta) RET计算一个角度的余弦值利用余弦函数展开的泰勒级数的前五项计

7、算一个角度的余弦值,可采用子程序的调用方式来实现。调用前先将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 .usec

8、t cos_vars,1d_cosx .usect cos_vars,1c_l_c .usect cos_vars,1 .text SSBX FRCT STM #d_coef_c,AR5 ;move coeffs table_c RPT #3 MVPD #table_c,*AR5+ STM #d_coef_c,AR3 STM #d_xc,AR2 STM #c_l_c,AR4 ST #7FFFH,c_l_c SQUR *AR2+,A ;A=x2 ST A,*AR2 ;(AR2)=x2 |LD *AR4,B ;B=1 MASR *AR2+,*AR3+,B,A ;A=1-x2/56,T=x2 MPY

9、A A ;A=T*A=x2(1-x2/56) STH A,*AR2 ;(d_temp)=x2(1-x2/56) MASR *AR2-,*AR3+,B,A ;A=1-x2/30(1-x2/56);T=x2(1-x2/56) MPYA *AR2+ ;B=x2(1-x2/30(1-x2/56) ST B,*AR2 ;(d_temp)=x2(1-x2/30(1-x2/56) |LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A=1-x2/12(1-x2/30(1-x2/56) SFTA A,-1,A ;-1/2 NEG A MPYA *AR2+ ;B=-x2/2(1-x2/1

10、2(1-x2/30(1-x2/56) MAR *AR2+ RETD ADD *AR4,16,B ;B=-x2/2(1-x2/12(1-x2/30(1-x2/56) STH B,*AR2 ;cos(theta) RET正弦波的实现利用计算一个角度的正弦值和余弦值程序可实现正弦波。其实现步骤如下:第一步:利用sin_start和cos_start子程序,计算(间隔为)的正弦和余弦值;第二步:利用sin(2x)=2sin(x)cos(x)公式,计算的正弦值(间隔为);第三步:通过复制,获得的正弦值;第四步:将的正弦值重复从PA口输出,便可得到正弦波。产生正弦波的程序片段如下:.mmregs .def

11、 start .def d_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x: .usect sin_x,360STACK: .usect STACK,10Hk_theta .set 286 ;theta=pi/360(0.5deg)start: .text STM #STACK+10H,SP STM k_theta,AR0 STM 0,AR1 STM #sin_x,AR6 STM #90,BRC RPTB loop1-1 LDM AR1,A LD #d_xs,DP STL A,d_xs STL A,d_xc CALL sinx ;d_sinx=sin(x) CALL

12、cosx ;d_cosx=cos(x) LD #d_sinx,DP LD d_sinx,16,A ;A=sin(x) MPYA d_cosx ;B=sin(x)*cos(x) STH B,1,*AR6+ ;AR6-2*sin(x) MAR *AR1+0loop1: STM #sin_x+89, AR7 ;sin91(deg.)-sin179(deg.) STM #88,BRC RPTB loop2-1 LD *AR7-,A STL A,*AR6+loop2: STM #179,BRC ;sin180(deg.)-sin359(deg.) STM #sin_x,AR7 RPTB loop3-1

13、LD *AR7+,A NEG A STL A,*AR6+loop3: STM #sin_x,AR6 ;generate sin wave STM #1,AR0 STM #360,BK B loop3产生正弦波链接命令文件的程序片段如下:MEMORY PAGE 0: EPROM: org=0E000H, len=1000H VECS: org=0FF80H, len=0080H PAGE 1: SPRAM: org=0060H, len=0020H DARAM1: org=0080H, len=0010H DARAM2: org=0090H, len=0010H DARAM3: org=0200

14、H, len=0200H SECTIONS .text : EPROM PAGE 0 .data : EPROM PAGE 0 STACK : SPRAM PAGE 1 sin_vars : DARAM1 PAGE 1 coef_s : DARAM1 PAGE 1 cos_vars : DARAM2 PAGE 1 coef_c : DARAM2 PAGE 1 sin_x : align(512) DARAM3 PAGE 1 .vectors : VECS PAGE 0在实际应用中,正弦波是通过D/A口输出的。选择每个正弦周期中的样点数、改变每个样点之间的延迟,就能够产生不同频率的波形,也可以利

15、用软件改变波形的幅度以及起始相位。总体方案设计1. 总体实现方案我们知道一个角度为x的正弦和余弦函数,都可以展开为泰勒级数,且其前五项可以看为:本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点与轴的每一个角度值相对应,那么我们可以利用DSP处理器处理大量重复计算的优势来计算,轴每一点对应的y轴的值(在x轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍。可由于正弦波的特殊的对称形式给程序的编制找到了出口。的弧度为0.7854 Graph - Time/Frequency菜单打开一个图形显示窗口。将 “Start A

16、ddress”项改为地址sin_x,将“Acquisition Buffer Size”项设置为360,将“Display Data Size”项设置为360,将“DSP Data Type”改为“16-bit signed integer” 。即将Graph Property Dialog对话框改为见下图:这样,将在图形显示窗口中显示从sin_x(首地址)开始的360个点的 16 位有符号整数的图形。主要参数1. sin(theta)=x(1-x2/2*3(1-x2/4*5(1-x2/6*7(1-x2/8*9)2. cos(theta)=1-x2/2*3(1-x2/4*5(1-x2/6*7(

17、1-x2/8*9)3. sin(2*theta)=2*sin(theta)*cos(theta)源程序1. 产生正弦波程序清单sin.asm: .title sin.asm ;为汇编文件取名为“sin.asm” .mmregs ;定义存储器映像寄存器 .def _c_int00 .ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx;定义标号sin_x: .usect sin_x,360 ;为sin_x保留360个存储空间STACK: .usect STACK,10 ;为堆栈保留10个存储空间k_theta .set 286 ;theta=pi/360(0.5deg)PA

18、0 .set 0_c_int00 .text ;定义文本程序代码段 STM #STACK+10,SP ;设置堆栈指针 STM k_theta,AR0 ;AR0-K_theta(increment) STM 0,AR1 ;(AR1)=X(rad) STM #sin_x,AR6 ;AR6- - sin(x) STM #90,BRC ;form sin0(deg.)sin90(deg);重复执行块语句(下条语句开始至loop1-1 )91次 RPTB loop1-1 LDM AR1,A LD #d_xs,DP ;DPd_xs STL A,d_xs ;(A)低16位d_xs STL A,d_xc ;(

19、A)低16位d_xc CALL sinx ;调用sinx程序 CALL cosx ;调用conx程序 LD #d_sinx,DP ;DP d_sinx LD d_sinx,16,A ;A=sin(x) MPYA d_cosx ;B= sin(x)*cos(x) STH B,1,*AR6+ ;AR6- - 2*sin(x)*cos(x) MAR *AR1+0 ;修改辅助寄存器AR1loop1: STM #sin_x+89,AR7 ;sin91(deg.)- -sin179(deg.) STM #88,BRC ;重复执行下条指令至loop2-1 RPTB loop2-1 ;处90次 LD *AR7

20、-,A ;(AR7) A,然后AR7减去1 STL A,*AR6+ ;(A) 低16位AR6loop2: STM #179,BRC ;sin180(deg.)- -sin359(deg.);(BRC)=179,重复执行180次 STM #sin_x,AR7 ;AR7指向sin_x首地址 RPTB loop3-1 ; LD *AR7+,A ;(AR7) A,然后AR7加1 NEG A ;累加器变负 STL A,*AR6+ ;A低16位AR6loop3: STM #sin_x,AR6 ;generate sin wave AR6指向sin_x STM #1,AR0 ;AR 01 STM #360,

21、BK ;BK360loop4: PORTW *AR6+0%,PA0 ;PA0=*AR6+0%,向PA0输出数据 B loop4 ;sinx: .def d_xs,d_sinx ;定义标号d_xs,d_sinx .data ;定义数据代码段table_s .word 01c7h ;c1=1/(8*9) .word 030bh ;c1=1/(6*7) .word 0666h ;c1=1/(4*5) .word 1556h ;c1=1/(2*3)d_coef_s .usect coef_s,4 ;为coef_s保留4个存储空间d_xs .usect sin_vars,1 ;为d_xs中sin_var

22、s保留1个存储空间d_squr_xs .usect sin_vars,1 ;为d_squr_xs中sin_vars保留1个存储空间d_temp_s .usect sin_vars,1 ;为d_temp_s中sin_vars保留1个存储空间d_sinx .usect sin_vars,1 ;为d_sinx中sin_vars保留1个存储空间c_l_s .usect sin_vars,1 ;为d_xs中sin_vars保留1个存储空间 .text ;定义代码开始段 SSBX FRCT ;设置FRCT=1以解决冗余符号位 STM #d_coef_s,AR5 ;AR5指向d_coef_s首地址 RPT

23、#3 ;重复下条指令4次 MVPD #table_s,*AR5+ ;table_s中的数复制到AR5指向的单元 STM #d_coef_s,AR3 ;AR3指向d_coef_s首地址 STM #d_xs,AR2 ;AR2指向d_xs首地址 STM #c_l_s,AR4 ;AR4指向c_l_s首地址 ST #7FFFh,c_l_s ;7FFFh c_l_s SQUR *AR2+,A ;AR2指向累加器A中的数值求其平方 ST A,*AR2 ;(A)左移16位AR2 |LD *AR4,B ;(AR4)左移16位B MASR *AR2+,*AR3+,B,A ;从累加器A中减去(AR2)*(AR3)

24、MPYA A ;操作数与累加器A中高位相乘 STH A,*AR2 ;(A)高16位AR2 MASR *AR2-,*AR3+,B,A ;从累加器A中减去(AR2)*(AR3) MPYA *AR2+ ;AR2指向的数与累加器A的高16位相乘 ST B,*AR2 ;(B)左移16位AR2 |LD *AR4,B ;(AR4)左移16位B MASR *AR2-,*AR3+,B,A ;从累加器A中减去(AR2)*(AR3) MPYA *AR2+ ;与累加器A中高16位相乘 ST B,*AR2 ;(B)左移16位AR2 |LD *AR4,B ;(AR4)左移16位B MASR *AR2-,*AR3+,B,A

25、 ;从累加器A中减去(AR2)*(AR3) MPYA d_xs ;d_xs指向的操作数与累加器A中高16位相乘 STH B,d_sinx ;(B)高16位d_sinx RET ;返回cosx: .def d_xc,d_cosx ;定义标号d_xc,d_cosxd_coef_c .usect coef_c,4 ;为coef_c保留4个存储空间 .data ;定义数据代码段table_c .word 0249h ;c1=1/(7*8) .word 0444h ;c2=1/(6*5) .word 0aabh ;c3=1/(3*4) .word 4000h ;c4=1/2d_xc .usect cos

26、_vars,1 ;为d_xc中cos_vars保存1个存储单元d_squr_xc .usect cos_vars,1 ;为d_squr_xc中cos_vars保存1个存储单元d_temp_c .usect cos_vars,1 ;为d_temp_c中cos_vars保存1个存储单元d_cosx .usect cos_vars,1 ;为d_cosx中cos_vars保存1个存储单元c_l_c .usect cos_vars,1 ;为c_l_c中cos_vars保存1个存储单元 .text ;定义文本代码段 SSBX FRCT ;FRCT=1以清除冗余符号位 STM #d_coef_c,AR5 ;

27、AR5指向d_coef_c首地址 RPT #3 ;重复下条指令4次 MVPD #table_c,*AR5+ ;把table_c中的数复制到中AR5 STM #d_coef_c,AR3 ;AR3指向d_coef_c首地址 STM #d_xc,AR2 ;AR2 指向d_xc首地址 STM #c_l_c,AR4 ;AR4指向c_l_c首地址 ST #7FFFh,c_l_c ;7FFFhc_l_c SQUR *AR2+,A ;求X的平方存放在累加器A中 ST A,*AR2 ;(A)左移16位AR2 |LD *AR4,B ;(AR4)左移16位B MASR *AR2+,*AR3+,B,A ;A=1-x2

28、/56,T=x2 MPYA A ;A=T*A=x2(1-x2/56) STH A,*AR2 ;(d_temp)= x2(1-x2/56) MASR *AR2-,*AR3+,B,A ;A=1-x2/30(1-x2/56),T= x2(1-x2/56) MPYA *AR2+ ;B=x2(1-x2/30(1-x2/56) ST B,*AR2 ;(d_temp)= x2(1-x2/30(1-x2/56) |LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A= 1-x2/12(1-x2/30(1-x2/56) SFTA A,-1,A ;-1/2 NEG A ; MPYA *AR2+ ;B=1-x2/2(1-x2/12(1-x2/30 ;(1-x2/56) MAR *AR2+ ; RET

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1