您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页dsp正弦函数计算程序的编写

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

来源:保捱科技网


摘要

正弦作为一种数学方法,在科研和平时的数据处理方面应用的很广泛。尤其是在通信、仪器仪表和工业控制等领域应用更为广泛。在科技高速发展的今天,对函数的计算不仅要求有很高的精度,还对计算的时间又很高的要求,必须在很短的时间内完成数据的处理,否则根本不能完成大批量数据的实时性计算和处理。介于DSP芯片运算速度快的特点,用DSP芯片完成这些算法已越来越受到重视。

通常有两种方法可以产生正弦波,分别是查表法和泰勒级数展开法。查表法应用于精度要求不很高的场合,而泰勒级数展开法是一种比查表法更为有效的方法。它能精确的计算出一个角度的正弦和余弦值,且占用的储存空间较小,体现了它的优越性。

关键词:sin函数 算法

1

摘要 .................................................................................................................................. 1 1 正余弦的泰勒级数展开式........................................................................................... 3 2 存储空间分配 ............................................................................................................ 4 3 迭代法计算正弦值 ...................................................................................................... 5

3.1流程图 ................................................................................................................ 5 3.2、程序 ................................................................................................................. 7 4 复位向量文件和链接文件........................................................................................... 9

4.1、复位向量 ......................................................................................................... 9 4.2、链接 ................................................................................................................. 9 5 调试 ............................................................................................................................ 10 6 总结 ............................................................................................................................ 12 参考文献 ........................................................................................................................ 12

2

1 正余弦的泰勒级数展开式

高等数学中,正弦函数和余弦函数可以展开的泰勒级数,其表达试如下:

x3x5x7x9sin(x)x (1)

3!5!7!9!x2x4x6x8cos(x)1 (2)

2!4!6!8!若要计算一个角度x的正弦和余弦值,可取泰勒级数的前五项进行计算。

x3x5x7x9sin(x)x

3!5!7!9!222x2xxx11 (3) x112*34*56*78*9x2x4x6x8cos(x)1

2!4!6!8!x212222xxx11 1(4) 3*45*67*8由式(3)和(4)可得导出递推公式,即

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。

3

2 存储空间分配

在正弦函数的计算程序所需要的存储空间有四个已初始化的数据段table_s与若干个程序段组成的已初始化段和九个存储空间未初始化段,分别为:d_xs、d_squr_xs、d_temp_s、d_sinx、c_1_s、d_coef_s(4个存储空间)。其存储空间分布如下:

数据存储空间 程序存储空间 x d_xs C1=1/(8*9) x^2 d_squr_xs C2=1/(6*7) d_temp_s C3=1/(4*5) Sin(x) d_sinx C1=1/(2*3) 7FFFH c_1_s (C1=01C7H) d_coef_s (C2=030BH) (C3=0666H) (C4=1556H) 计算正弦值存储单元分配

4

table_s

3 迭代法计算正弦值

3.1流程图

d_temp_s=x 2A=1-d_temp_s*T=d_empty_s an B=A*T d_temp_s=B Sin(x)=d_temp_s 迭代法正弦值的计算流程图

其中an随迭代次数的变化而变化a1=

a4=

111、a2=、a3=、8*97*65*41 3*2

(1) 执行第一次迭代:

5

||DL *AR5,B

MASR *AR3+,*AR2+,B,A

MPYA A STH A,*AR3 执行结果:

x2d_temp_s= x17*8

2(2) 执行第二次迭代:

MASR *AR3-,*AR2+,B,A

MPYA *AR3+ ST B,*AR3 执行结果:

2

x2x2d_temp_s= x16*717*8 执行第三次迭代:

||DL *AR5,B

MASR *AR3-,*AR2+,B,A MPYA *AR3+ ST B,*AR3 执行结果:

222xxx1 1d_temp_s= x15*46*77*82执行第四次迭代:

||DL *AR5,B

MASR *AR3-,*AR2+,B,A STM #d_xs,AR3 执行结果:

2222xxxx1 d_temp_s= x1113*25*46*77*8即可粗略的求的sinx的值为d_temp_s中的值

6

3.2、程序

.title \"sin.asm\" .mmregs

.def start

.ref sin_start,d_xs,d_sinx

STACK: .usect \"STACK\;定义堆栈空间 Start: STM #STACK+10,SP ;给堆栈指针赋值栈顶 LD #d_xs,DP ST #87H,d_xs CALL sin_start end: B end sin_start:

.def sin_start D_coef_s .usect \"coef_s\ .data

Table_s: .word 01C7H ;C1=01C7H .word 030bH ;C2=030bH .word 0666H ;C3=0666H .word 1556H ;C4=1556H

d_xs .usect \"sin_vars\;定义未初始化段 d_squr_xs .usect \"sin_vars\d_temp_s .usect \"sin_vars\d_sinx .usect \"sin_vars\c_1_s .usect \"sin_vars\

.text

SSBX FRCT ;设置小数乘法 STM #d_coff_s,AR4 RPT #3

MVPD #table_s,*AR4+ ;c1=1/72,c2=1/42,c3=1/20

;c4=1/6 STM #d_coef_s,AR2 STM #d_xs,AR3

STM #c_1_s,AR5 ;AR5指向C_1_S

7

(AR3)

ST SQUR ST #7FFFH,c_1_s

*AR3+,A ;求x的平方值 A,*AR3 ;把x平方值放入

||DL *AR5,B ;B=1

MASR *AR3+,*AR2+,B,A ;A=(1-x^2)/72 ;T = x^2

MPYA A ; A=x^2(1-x^2)/72

STH A,*AR3 ; 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 ; AR3=d_temp_s=B ||DL *AR5,B

MASR *AR3-,*AR2+,B,A

;A=1-x^2/20(1-x^2/42(1-x^2/72)

MPYA

*AR3+ ;B=(1-x^2/20(1-x^2/42(1-x^2/72))*x^2

ST B,*AR3

; d_temp_s= B =

(1-x^2/20(1-x^2/42(1-x^2/72))*x^2 ||DL *AR5,B

MASR *AR3-,*AR2+,B,A ;

A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))*x^2

STM #d_xs,AR3 MPYA AR3

;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72

))*x^2)

STH B, d_sinx ; d_sinx=b 的出结果

RET

.end

8

4 复位向量文件和链接文件

4.1、复位向量

程序中所用的复位向量文件如下: .sect \".vectors\"

.ref start ; C entry point .align 0x80 ; must be aligned on page boundary

RESET: ; reset vector

BD start ; branch to C entry point .end

4.2、链接

链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。在命令文件中可使用两个十分有用的伪指令MEMORY和SECTIONS,用来指定实际应用中的存储器结构和地址的映射。在命令行中不能使用这两个伪指令,命令文件为ASCⅡ文件,可包含一下内容:

(1)输入文件名,用来指定目标文件、存档库或其他命令文件。注意,当命令文件调用其他文件时,该调用语句必须是最后一句,连接器不能从被调用的命令文件中返回。

(2)连接器选项,他们在命令文件中的使用方法于在命令行中相同。

(3)MEMORY和SECTIONS链接伪指令,MEMORY用来指定目标存储器结构,SECTIONS用来控制段的构成于地址分配 程序中所用到的链接文件如下:

vectors.obj sinx.obj -o a1.out -m a1.map -e start MEMORY

9

{

PAGE 0: EPROG: origin = 0x1400, len = 0x7c00 VECT: origin = 0xff80, len = 0x80 PAGE 1: USERREGS: origin = 0x60, len = 0x1c BIOSREGS: origin = 0x7c, len = 0x4 IDATA: origin = 0x80, len = 0x1380 EDATA: origin = 0x1400, len = 0x8000 EDATA1: origin = 0x9400, len = 0x4c00 }

SECTIONS

{ .vectors: {} > VECT PAGE 0 .sysregs: {} > BIOSREGS PAGE 1 .data: {} > EPROG PAGE 0

.text: {} > EPROG PAGE 0 .cinit: {} > EPROG PAGE 0 .pinit: {} > EPROG PAGE 0 .sysinit: {} > EPROG PAGE 0 .stack: {} > IDATA PAGE 1 .bss: {} > IDATA PAGE 1

.sin_vars: {} > IDATA PAGE 1}

5 调试

第一次叠代计算结果:

A=004E4510A4 B=007FFF0000 T=4EF3 AR2=0061 AR3=1428 AR4=0094 SP=00

第二次叠代计算结果:

A=007E230000

10

B=004DCCCA72 T=4EF3 AR2=0093 AR3=0095 AR4=0094 SP=00

第三次叠代计算结果:

A=007C1B0000 B=004C8C0F42 T=4EF3 AR2=0094 AR3=0095 AR4=0094 SP=00

第四次叠代计算结果:

A=00733D0000 B=0013356EFC T=1556 AR2=0094 AR3=0094 AR4=0094 SP=008A

11

6 总结

两周的课程设计很快结束了,从刚接触课程设计时的无从下手,到最后的完成,收获了很多

参考文献

1. DSP原理及应用 电子工业出版社 邹彦主编 2.DSP实用技术》苏涛 卢光跃 让 编著

12

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务