DSP正弦函数计算程序的编写
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
泰勒级数展开法作为一种数学方法,在科研和平时的数据处理
方面应用的很广泛。尤其是在通信、仪器仪表和工业控制等领域应
用更为广泛。在科技高速发展的今天,对函数的计算不仅要求有很
高的精度,还对计算的时间又很高的要求,必须在很短的时间内完
成数据的处理,否则根本不能完成大批量数据的实时性计算和处理。介于DSP芯片运算速度快的特点,用DSP芯片完成这些算法已越来
越受到重视。
产生正弦波,分别是查表法和泰勒级数展开法。查表法应用于
精度要求不很高的场合,而泰勒级数展开法是一种比查表法更为有
效的方法。它能精确的计算出一个角度的正弦和余弦值,且占用的
储存空间较小,体现了它的优越性。
关键词: DSP 泰勒级数正弦波
目录
摘要 .....................................................................................................I 1、正余弦信号发生器的实现原理 .. (1)
1.1、正弦波信号发生器 (1)
2、正弦波的实现 (2)
2.1、计算一个角度的正弦值 (2)
2.2、计算一个角度的余弦值 (4)
3、正弦波的实现 (8)
4、链接文件 (10)
5、调试结果 (12)
总结 (13)
参考文献 (14)
1、正余弦信号发生器的实现原理
1.1、正弦波信号发生器
泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。
本次主要用泰勒级数展开法来实现正弦波信号。 正弦函数和余弦函数可以展开成泰勒级数,其表达式:
3579
sin()3!5!7!9!x x x x x x =-+-+
-
2468
cos()12!4!6!8!
x x x x x =-+-+
-
取泰勒级数的前5项,得近似计算式:
3579
2222
sin()3!5!7!9!
111123456789(((())))
x x x x x x x
x x x x =-+-+
=----⨯⨯⨯⨯ 2468
2222
cos()12!4!6!8!
11112345678
((()))
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 、sin(n -2)x 和cos(n -2)x 。
2、正弦波的实现
2.1、计算一个角度的正弦值
计算一个角度x的正弦值,可利用泰勒级数的展开式,采用子程序的调用方式来实现。
在调用前先在数据存储器d_xs单元中存放x的弧度值,计算结果存放在d_sinx单元中。
程序中要用到一些存储单元存放数据和变量,存储单元的分配如下:
d_xs:x; d_squr_xs:x2
d_temp_s:暂存; d_sinx:计算结果sin x
c_1_s:7FFFh (数值1);d_coef_s :泰勒系数
存储单元分配图:
数据存储器程序存储器
表1计算正弦值存储单元分配
程序清单sinx.asm:
.title “sinx.asm”
.mmregs
.def start
.ref sin_start,d_xs,d_sinx
STACK:.usect “STACK”,10
start: STM #STACK+10,SP
LD #d_xs,DP
ST #6487H,d_xs
CALL sin_start
end: B end
sin_start:
.def sin_start
d_coef_s .usect “coef_s”,4
.data
table_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_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
c_1_s .usect “sin_vars”,1
.text
SSBX FRCT
STM #d_coef_s,AR4
RPT #3
MVPD #table_s,*AR4+
STM #d_coef_s,AR2
STM #d_xs,AR3
STM #c_1_s,AR5
ST #7FFFH,c_1_s
SQUR *AR3+,A ;求x的平方值
ST A,*AR3 ;x平方值存入(AR3) || LD *AR5,B ;B=1
MASR *AR3+,*AR2+,B,A;A=1-x^2/72,T=x^2
MPYA A ;A=T*A
STH A,*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))
ST B,*AR3 ;(d_temp_s)= x^2(1- x^2/42(1- x^2/72))
|| LD *AR5,B ;B=1
MASR *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)))
ST B,*AR3 ;(d_temp_s) =……
|| LD *AR5,B ;B=1
MASR *AR3-,*AR2,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)
RET
.end
2.2、计算一个角度的余弦值
计算余弦值与计算正弦值相同。
存储单元分配图: