DSP正弦函数计算程序的编写

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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、计算一个角度的余弦值

计算余弦值与计算正弦值相同。

存储单元分配图:

相关文档
最新文档