太 原 理 工 大 学
DSP 原理及应用
课程设计报告书
课题名称 正弦波信号发生器 姓 名 学 号 院、系、部
专 业
※※※※※※※※※ ※※ ※
※ ※
※ ※
※※※※※※※
※
2009级学生DSP 原理及应用课程设计
正弦波信号发生器课程设计
一、课程设计基础
数字信号处理(Digital Signal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。数字信号处理是利用计算机或专用处理设备,以数字的形式对信号进行分析、采集、合成、变换、滤波、估算、压缩、识别等加工处理,以便提取有用的信息并进行有效的传输与应用。数字信号处理是以众多学科为理论基础,它所涉及的范围极其广泛。如数学领域中的微积分、概率统计、随机过程、数字分析等都是数字信号处理的基础工具。它与网络理论、信号与系统、控制理论、通信理论、故障诊断等密切相关。
一个典型的DSP系统应包括抗混叠滤波器、数据采集A/D转换器、数字信号处理器DSP、D/A转换器和低通滤波器等组成。
DSP信号处理过程:
①将输入信号x(t)进行抗混叠滤波,滤掉高于折叠频率的分量,以防止信号频谱
的混叠;
②经采样和A/D转换器,将滤波后的信号转换为数字信号x(n);
③数字信号处理器对x(n)进行处理,得数字信号y(n);
④经D/A转换器,将y(n)转换成模拟信号;
⑤经低通滤波器,滤除高频分量,得到平滑的模拟信号y(t)。
二、课程设计目的
1、了解DSP对数据的处理能力
2、利用DSP 实现正弦信号发生器
三、 课程设计总体方案
1. 总体方案设计
① 基于DSP 的特点,本设计采用TMS320C54X 系列的DSP 作为正弦信号发生器的核心控制芯片。
② 用泰勒级数展开法实现正弦波信号。
③ 设置波形时域观察窗口,得到其滤波前后波形变化图; ④ 设置频域观察窗口,得到其滤波前后频谱变化图。
2. 正弦波信号发生器
正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信
号处理系统中。
通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。 查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。 泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。 本次主要用泰勒级数展开法来实现正弦波信号。
产生正弦波的算法正弦函数和余弦函数可以展开成泰勒级数,其表达式:
取泰勒级数的前5项,得近似计算式:
-+
-
+
-
=!
9!
7!
5!
3)sin(9
7
5
3
x
x
x
x
x x
-+
-
+
-
=!
8!
6!
4!
21)cos(8
6
4
2
x
x
x
x
x ))))
((((9
817
615
413
21 !
9!
7!
5!
3)sin(2
2
2
2
9
7
5
3
?-
?-
?-
?-
=+-
+-
=x
x
x
x
x x
x
x
x
x x
递推公式:
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 、si
n(n-2)x 和cos(n -2)x 。
四、课程设计内容
1.用泰勒级数展开法计算sin(x )的值;
2.用泰勒级数展开法计算con(x) 的值;
3.用泰勒级数展开法产生正弦波。
五、课程设计步骤
1、用泰勒级数展开法计算sin(x)的值:
1.在CCS 中建立项目:sinx.pjt ,装载程序并运行;
2.在程序sinx.asm 中,给出的x 的值为pi/4=6487弧度。如果改变x 在程序中的值,便可以计算其他角度的正弦值。
3.执行结果sin(pi/4)=5A81H ,存储在数据存储器d_sinx(2003H)单元中。用查看寄存器的方法可以看到此结果。
2、用泰勒级数展开法计算cos(x)的值:
1.在CCS 中建立项目:cosx.pjt ,装载程序并运行;
2.在程序cosx.asm 中,给出的x 的值为pi/4=6487弧度。如果改变x 在程序中的值,便可以计算其他角度的余弦值。
3.执行结果sin(pi/4)=5A82H ,存储在数据存储器d_sinx(2003H)单元中。用查看寄存器的方法可以看到此结果。
3、用泰勒级数展开法产生正弦波:
)))
(((8
716
514
312
1 !8!
6!
4!
21)cos(2
2
2
2
8
6
4
2
?-
?-
?-
-
=+
-+
-=x
x
x
x
x
x
x
x x
1.在CCS中建立项目: sin.pjt,装载程序;
2.在程序的适当处加上一个断点。作用:这里定义了一个显示缓冲区
dis_buf,
将要输出到D/A的数据送到显示缓冲区当中去,以便在CCS图形显示的时候可以从图形显示中得到数据。
3.打开CCS的图形显示窗口,修改如下参数:Start Address=0x1010、Page=Data、Acquisition Buffer Size=1、Display Data Size=1000;DSP Data Type=16-bit signed integer修改后的界面如下:
4.点击CCS的Debug/Animate运行此程序,就可以在CCS的图形观察窗口看到正弦波的显示。注:Animate运行方式是在遇见断点后继续执行的一种方式,在显示图形是特别方便,显示效果如下:
参考程序:
******************************************************
* 用泰勒级数开展开式计算一个角度的正弦值* *sin(x)=x(1-x*x/2*3(1-x*x/4*5(1-x*x/6*7(1-x*x/8*9))))*
****************************************************** .title "sinx.asm"
.mmregs
.def start
STACK: .usect "STACK",10
start:STM #STACK+10,SP
LD #d_x,DP
ST #6487H,d_x ;x-->d_x
CALL sin_start
end: B end
sin_start:
.def sin_start
d_coeff .usect "coeff",4
.data
table: .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_x .usect "sin_vars",1
d_squr_x .usect "sin_vars",1
d_temp .usect "sin_vars",1
d_sinx .usect "sin_vars",1
c_1 .usect "sin_vars",1
.text
SSBX FRCT
STM #d_coeff,AR5
RPT #3
MVPD #table,*AR5+
STM #d_coeff,AR3
STM #d_x,AR2
STM #c_1,AR4
ST #7FFFH,c_1
SQUR *AR2+,A ;A=x^2
ST A,*AR2 ;(AR2)=x^2
||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2
MPY A 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)
MPY A *AR2+ ;B=x^2(1-x^2/42(1-x^2/72))
ST B,*AR2 ;(d_temp)=x^2(1-x^2/42(1-x^2/72))
||LD *AR4,B ;B=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2/20(1-x^2/42(1-x^2/72))
MPY A *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=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))) MPY A d_x ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))) STH B,d_sinx ;sin(theta)
RET
.end
******************************************************
* 用泰勒级数开展开式计算一个角度的正弦值*
* cos(x)=1-x*x/2(1-x*x/3*4(1-x*x/5*6(x*x/7*8))) *
****************************************************** .title "cosx.asm"
.mmregs
.def start
STACK: .usect "STACK",10
start:STM #STACK+10,SP
LD #d_x,DP
ST #6487H,d_x ;x-->d_x
CALL cos_start
end: B end
cos_start:
.def cos_start
d_coeff .usect "coeff",4
.data
table: .word 0249H ;c1=1/(7*8)
.word 0444H ;c2=1/(5*6)
.word 0AABH ;c3=1/(3*4)
.word 4000H ;c4=1/(1*2)
d_x .usect "cos_vars",1
d_squr_x .usect "cos_vars",1
d_temp .usect "cos_vars",1
d_cosx .usect "cos_vars",1
c_1 .usect "cos_vars",1
.text
SSBX FRCT
STM #d_coeff,AR5
RPT #3
MVPD #table,*AR5+
STM #d_coeff,AR3
STM #d_x,AR2
STM #c_1,AR4
ST #7FFFH,c_1
SQUR *AR2+,A ;A=x^2
ST A,*AR2 ;(AR2)=x^2
||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=1-x^2/56,T=x^2
MPY A 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)
MPY A *AR2+ ;B=x^2(1-x^2/30(1-x^2/56))
ST B,*AR2 ;(d_temp)=x^2(1-x^2/30(1-x^2/56))
||LD *AR4,B ;B=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2(1-x^2/30(1-x^2/56))
SFTA A,-1,A ;A右移一位即A除以2
NEG A
MPY A *AR2+ ;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))
MAR *AR2+
RETD
ADD *AR4,16,B ;B=1-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))) STH B,*AR2 ;cos(theta)
RET
.end
**************************************
* 利用泰勒公式产生正弦波的程序*
**************************************
.title "sin.asm"
.mmregs
.def start
sin_x: .usect "sin_x",360
STACK: .usect "STACK",10H
.bss dis_buff,1
k_theta .set 286
PA0 .set 0x0002
start: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
CALL cosx
LD #d_sinx,DP
LD @d_sinx,16,A
MPY A @d_cosx
STH B,1,*AR6+
MAR *AR1+0
loop1: STM #sin_x+89,AR7
STM #88,BRC
RPTB loop2-1
LD *AR7-,A
STL A,*AR6+
loop2: STM #179,BRC
STM #sin_x,AR7
RPTB loop3-1
LD *AR7+,A
NEG A
STL A,*AR6+
loop3: STM #sin_x,AR6
STM #1,AR0
STM #360,BK
loop4: PORTW *AR6+0%,PA0
LD *AR6,A
MVDK *AR6,@dis_buff
B loop4
****************************************************** *用泰勒级数开展开式计算角度的正弦值* *sin(x)=x(1-x*x/2*3(1-x*x/4*5(1-x*x/6*7(1-x*x/8*9))))*
****************************************************** sinx:
.def d_xs,d_sinx
.data
.data
.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",4
d_xs .usect "sin_vars",1
d_squr_xs .usect "sin_vars",1
d_temp_s .usect "sin_vars",1
d_sinx .usect "sin_vars",1
d_l_s .usect "sin_vars",1
.text
SSBX FRCT
STM #d_coef_s,AR5
RPT #3
MVPD #table_s,*AR5+
STM #d_coef_s,AR3
STM #d_xs,AR2
STM #d_l_s,AR4
ST #7FFFH,d_l_s
SQUR *AR2+,A ;A=x^2
ST A,*AR2 ;(AR2)=x^2
||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2
MPY A 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) MPY A *AR2+ ;B=x^2(1-x^2/42(1-x^2/72))
ST B,*AR2 ;(d_temp)=x^2(1-x^2/42(1-x^2/72))
||LD *AR4,B ;B=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2/20(1-x^2/42(1-x^2/72))
MPY A *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=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))) MPY A 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)
RET
*************************************************
*用泰勒级数开展开式计算角度的余弦值*
*cos(x)=1-x*x/2(1-x*x/3*4(1-x*x/5*6(x*x/7*8))) *
*************************************************
cosx:
.def d_xc,d_cosx
d_coef_c .usect "coef_c",4
.data
table_c:
.word 0249H ;c1=1/(7*8)
.word 0444H ;c2=1/(5*6)
.word 0AABH ;c3=1/(3*4)
.word 4000H ;c4=1/(1*2)
d_xc .usect "cos_vars",1
d_squr_xc .usect "cos_vars",1
d_temp_c .usect "cos_vars",1
d_cosx .usect "cos_vars",1
c_l_c .usect "cos_vars",1
.text
SSBX FRCT
STM #d_coef_c,AR5
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=x^2
ST A,*AR2 ;(AR2)=x^2
||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=1-x^2/56,T=x^2
MPY A 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)
MPY A *AR2+ ;B=x^2(1-x^2/30(1-x^2/56))
ST B,*AR2 ;(d_temp)=x^2(1-x^2/30(1-x^2/56))
||LD *AR4,B ;B=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2(1-x^2/30(1-x^2/56))
SFTA A,-1,A ;A右移一位即A除以2
NEG A
MPY A *AR2+ ;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))
MAR *AR2+
RETD
ADD *AR4,16,B ;B=1-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56))) STH B,*AR2 ;cos(theta)
RET
.end
六、课程设计总结
本次课程设计中遇到一些课堂中从未有过的问题,通过网络查找和同学交流,大大促进了设计进程。并在过程中进一步提高自身的创作、创新水平,扎实基础,扩展所学。并且此次课程设计,基于课程理论知识和网上资料,使我对数字信号处理课程有了更深一步的了解和掌握,对利用CCS软件编程的数字信号处理方法有了进一步的了解。在理论课的基础上进行实验实习,是对本门课程的深入学习和掌握,在以后的工作学习中,数字信号的处理都是采用计算机仿真的方法进行测试,因此,掌握基于计算机的数字信号处理方法对以后的工作和学习有很大的帮助。这样一个课程设计对我们的发展有着极大的帮助!
参考文献
[1] 邹彦、王毓银DSP原理及应用[M] 北京:电子工业出版社
[2] 张伟雄,陈亮,徐光辉.DSP集成开发与应用实例[M]。北京:电子工业出版社
[3] 刘湘涛、江世民.单片机原理与应用[M].电子工业出版社, 2006.
[4] 戴明桢,周建江.TMS320C54XDSP结构,原理及应运[M]北京航空航天出版社
[5] 赵红怡.DSP技术与应用实例.西安:电子工业出版社,2009