DSP原理及应用课程设计正弦波信号发生器_第1页
DSP原理及应用课程设计正弦波信号发生器_第2页
DSP原理及应用课程设计正弦波信号发生器_第3页
DSP原理及应用课程设计正弦波信号发生器_第4页
DSP原理及应用课程设计正弦波信号发生器_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 *ar

29、2+ ;b=1-x2/2(1-x2/12(1-x2/30 ;(1-x2/56) mar *ar2+ ; retd ; add *ar4,16,b ;b=1-x2/2(1-x2/12(1-x2/30 ;(1-x2/56) sth b,*ar2 ;cos(theta) ret ; .end ;2. *.cmd文件描述输入文件和输出文件,说明系统中有哪些可用存储器、程序段、堆栈及复位向量和中断向量等安排在什么地方。其中memory段就是用来规定目标存储器的模型,通过这条指令,可以定义系统中所包含的各种形式的存储器,以及它们占据的地址范围;sections段说明如何将输入段组合成输出段以及在可执行文件

30、中定义输出段、规定输出段在存储器中的位置等。正弦波程序链接命令文件sin.cmd: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 = 0200h, len = 0200hsections .text :eprom page 0 ;文本代码段其实地址为0e000h,长度为1000h .data :eprom page 0 ;数据代码段其实地址为0d00

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论