xyx2012xyx 发表于 2015-5-9 15:02:52

如何减少正弦、余弦的计算时间

dsp程序中需要大量做正弦、余弦、反正切计算,共运行24次计算,现采用直接计算的方法,没有用到IQmath,发现计算时间过长,不知道是否有好的解决方法。另外运行正弦、余弦的时间有多少,有没文档说明的!

DOER 发表于 2015-5-9 15:07:52

查表、降低精度迭代计算
计算速度实测吧,不同处理器不同

xyx2012xyx 发表于 2015-5-9 15:41:34

DOER 发表于 2015-5-9 15:07
查表、降低精度迭代计算
计算速度实测吧,不同处理器不同

查表法有个问题,这个表的格式是float还是int类型比较合适,int类型表应该少占空间,但是做正弦、余弦计算结果希望是float,这样数据类型的转换是否会降低精度;若采用float类型表应该会占空间较大,就是怕放不下这么多数据(正弦、余弦各自1000个点)

DOER 发表于 2015-5-9 15:50:26

xyx2012xyx 发表于 2015-5-9 15:41
查表法有个问题,这个表的格式是float还是int类型比较合适,int类型表应该少占空间,但是做正弦、余弦计 ...

正弦表与余弦表是一个表,而且取前90°即可

charlesg 发表于 2015-5-9 16:42:48

CORDIC,字数

xyx2012xyx 发表于 2015-5-9 17:32:37

charlesg 发表于 2015-5-9 16:42
CORDIC,字数

没接触过这个,有文档说明能共享下不

charlesg 发表于 2015-5-9 18:05:58

xyx2012xyx 发表于 2015-5-9 17:32
没接触过这个,有文档说明能共享下不

不好意思,我这边没有现成的文档,谷歌一大堆,可以自己搜一下

qingpangxi 发表于 2015-5-9 18:26:30

没必要每个都计算吧!正弦、余弦、反正切计算可以相互转换,只要解决一个就好了

aureole 发表于 2015-5-9 18:50:58

你的dsp是定点的还是浮点的?这一点不说,很难判断怎么搞。总之一句话,优化代码要靠cpu特性(定点、浮点特性)和算法来实现。

cddyy 发表于 2015-5-9 22:48:39

查表法即可,统一放到到32BIT的精度应该足够使用了吧。

xyx2012xyx 发表于 2015-5-9 23:48:49

aureole 发表于 2015-5-9 18:50
你的dsp是定点的还是浮点的?这一点不说,很难判断怎么搞。总之一句话,优化代码要靠cpu特性(定点、浮点特 ...

用的是dsp28335,在10k周期中处理这么多正弦余弦变换

zxq6 发表于 2015-5-9 23:53:33

其实只需要一个象限的表就够了

xyx2012xyx 发表于 2015-5-9 23:53:33

cddyy 发表于 2015-5-9 22:48
查表法即可,统一放到到32BIT的精度应该足够使用了吧。

原先的设想是将360度生成个1000点的表,数据类型是float,不知这样可以不?

sddp001 发表于 2015-5-10 10:24:15

xyx2012xyx 发表于 2015-5-9 23:53
原先的设想是将360度生成个1000点的表,数据类型是float,不知这样可以不?

只需要取90就行了

mcu5i51 发表于 2015-5-10 10:55:55

四分之一的数据,可以加加减减,正正负负,以前画圆时就时这么干的

PEcontrol 发表于 2015-5-10 11:17:12

精度要求很高?不然没必要用float,用定点就行,反正最后定时器里面还是整型

XA144F 发表于 2015-5-10 12:00:33

28335的boot ROM数学表描述:
正余弦函数表:单精度浮点型,1282字,Q格式为Q30,内容为5/4周期正弦波的32位浮点采样,这个函数有助于产生准确的正弦波和进行32位FFT分析。
还有其他。

nengcai0313 发表于 2015-5-10 12:33:51

对精度要求不是特别特别严格的时候,可以使用多次泰特级数展开来模拟SIN,精度可以接受,速度比较快。
还有楼上@charlesg网友说的Cordic 算法,这个算法可以看这个博客的介绍:

三角函数计算,Cordic 算法入门

DOER 发表于 2015-5-10 19:23:45

nengcai0313 发表于 2015-5-10 12:33
对精度要求不是特别特别严格的时候,可以使用多次泰特级数展开来模拟SIN,精度可以接受,速度比较快。
还有 ...

学习了,原来如此!

sunnyqd 发表于 2015-5-10 20:13:22

查表,最快可以30~40个时钟周期完成

sunnyqd 发表于 2015-5-10 20:14:10

也就是在168M STM32F4上面,差不多0.3us求一次sin,cos,0.4us求一次atan2

信天游 发表于 2015-5-25 22:58:25

nengcai0313 发表于 2015-5-10 12:33
对精度要求不是特别特别严格的时候,可以使用多次泰特级数展开来模拟SIN,精度可以接受,速度比较快。
还有 ...

谢谢推荐的博客链接,已收藏{:victory:}

PANGKUN 发表于 2015-5-26 03:07:42

学习了,一直缺少这方面的知识

金色大元宝 发表于 2015-5-26 08:08:11

好资料。博客链接已经收藏。

eduhf_123 发表于 2015-5-26 11:21:13

Cordic博客链接已经收藏。

笑笑我笑了 发表于 2015-5-26 14:06:47

CORDIC算法只适合定点运算啊。

12fen 发表于 2015-5-26 17:52:05

查表,无敌模式{:lol:}

SMC 发表于 2015-5-27 22:34:23

查表+差值

xyx2012xyx 发表于 2015-6-3 21:05:08

sunnyqd 发表于 2015-5-10 20:14
也就是在168M STM32F4上面,差不多0.3us求一次sin,cos,0.4us求一次atan2

28335实测4次正弦或余弦计算消耗5-6us,2次atan2居然消耗18-20us,难道是哪里设置有问题,求教!

sunnyqd 发表于 2015-6-3 21:23:46

xyx2012xyx 发表于 2015-6-3 21:05
28335实测4次正弦或余弦计算消耗5-6us,2次atan2居然消耗18-20us,难道是哪里设置有问题,求教! ...

28335,150MHz的速度,查表法应该只需40个指令周期左右就可以完成了一次查表计算了啊

xyx2012xyx 发表于 2015-6-3 21:27:38

sunnyqd 发表于 2015-6-3 21:23
28335,150MHz的速度,查表法应该只需40个指令周期左右就可以完成了一次查表计算了啊 ...

我这个时间是做直接计算示波器实测时间,没有用查表方式,但感觉还是不太对,消耗这么多时间,特别是求解atan2的时候?

sunnyqd 发表于 2015-6-4 09:52:09

xyx2012xyx 发表于 2015-6-3 21:27
我这个时间是做直接计算示波器实测时间,没有用查表方式,但感觉还是不太对,消耗这么多时间,特别是求解 ...

直接计算肯定会耗时间的,就算是直接计算,最好也是用优化的泰勒展开,atan2用泰勒展开计算也应该在1us以内才对。除非你可能是直接用c库函数计算的
页: [1]
查看完整版本: 如何减少正弦、余弦的计算时间