TI论坛
直播中

吴键洪

8年用户 208经验值
私信 关注
[问答]

请教DSP关于8次函数的计算问题

大家好!
       本人是DSP的初学者,目前在项目中遇到一个8次函数的计算问题,是一个1元最高8次(内涵全部0~8次)的累加运算,里面的常量据很大,超过32位,并且确定计算结果肯定在32位之内,结果不会溢出,floa肯定t够用。
       目前采用了两种方式实现,第一种是调用pow(a,b)函数,完成8次方到0次方的累加,是双精度的肯定够用,最后赋值保存成float,计算的结果正常。
       第二种方式是直接根据公式直接计算,只一个公式多次相乘并相加的型式,中间没有数据类型的转换,最后赋值保存成float,计算的结果正常且与方式一结果相同。
       目前有两个问题,第一个问题是,方式二中的一些常数貌似已经超过了32位float的范围,也没有类型转换但是结果是正确的,没有溢出的现象。
        第二个问题是我用反正器试运行计算了这两种方式的运行周期,同样是完成5组运算,第一种方式反而很慢,需要100000个运行周期都快到1ms了,可是第二种只需要40多个运行周期速度快的惊人!
        不知道什么原因,感觉既然DSP的math里提供了pow(a,b)函数,自然是很有优势的,可是为什么速度反而很慢?
         相比以上两种方式的运行时间当然越快越好,但是第一种方式的时间也是能接受的,目前不知道调用pow(a,b)函数的优势在哪里?还有就是第二种直接计算的风险是什么?会不会出现常数在运算中的溢出导致错误?
          期待大家能给我留言帮助我,谢谢!

回帖(8)

魏双艳

2018-9-11 10:47:53
您是指调用一次函数要那么多周期,还是包含了其他算法在内的周期?
如果调用一次函数要那么多周期,那只能请TI的专家解答,如果是包含了你自己的算法,则确认是否在一个大循环里面调用pow函数。
pow函数应该不是预编译函数,如果在循环里面多次调用,会有调用函数的时间开销。不知开优化能否让函数展开,这个得请TI专家解答,我也想知道答案。
举报

吴键洪

2018-9-11 10:53:03
引用: 60user128 发表于 2018-9-11 14:31
您是指调用一次函数要那么多周期,还是包含了其他算法在内的周期?
如果调用一次函数要那么多周期,那只能请TI的专家解答,如果是包含了你自己的算法,则确认是否在一个大循环里面调用pow函数。
pow函数应该不是预编译函数,如果在循环里面多次调用,会有调用函数的时间开销。不知开优化能否让函数展开,这个得请TI专家解答 ...

您好!
       感谢您的回复,我是要计算y = a1*x^8 + a2*x^7 + a3*x^6 + …… + a9;这么一个多项式,一共是5个这种公式,利用CCS的仿真,加入2个断点,第一个公式前加断点,第五个计算完成后加另一个断点,以此记录了以上时间。
        调用pow()函数 y = a1 * pow(x,8) + a2 * pow(x,7)  + …… + a9;这种计算的时间很长,反而是直接计算例如逐个提出x利用括号提取的方式,或者干脆直接 
y = a1  * x * x * x * x * x * x * x * x  ……的方式都要比调用pow()函数的方式快,而且快了很多!
        以上的几种计算方式结果都相同正确,因此我疑问pow()函数带来的优势,而且为什么math提供的函数会比简单计算来的慢呢?
举报

魏双艳

2018-9-11 11:11:19
引用: Jayden888 发表于 2018-9-11 14:36
您好!
       感谢您的回复,我是要计算y = a1*x^8 + a2*x^7 + a3*x^6 + …… + a9;这么一个多项式,一共是5个这种公式,利用CCS的仿真,加入2个断点,第一个公式前加断点,第五个计算完成后加另一个断点,以此记录了以上时间。
        调用pow()函数 y = a1 * pow(x,8) + a2 * pow(x,7)  + …… + a9;这 ...

你的X是怎么定义的,如果定义为int类型,或者直接写了个整数,那么y = a1  * x * x * x * x * x * x * x * x 这样的式子,肯定是按整数计算的,你前面提到float,那也就是float而已,会比int慢。而pow函数,我记得参数那里的定义是double,也就是说,不管你传递什么数给他,他都按double来算,如果double真的按64位定义的话,那就不是28035的事了,哪怕是long long的64位整形,也明显比32位慢很多。
举报

吴键洪

2018-9-11 11:29:52
引用: 60user128 发表于 2018-9-11 14:54
你的X是怎么定义的,如果定义为int类型,或者直接写了个整数,那么y = a1  * x * x * x * x * x * x * x * x 这样的式子,肯定是按整数计算的,你前面提到float,那也就是float而已,会比int慢。而pow函数,我记得参数那里的定义是double,也就是说,不管你传递什么数给他,他都按double来算,如果double真的按64位定义的 ...

感谢您的再次回复!
        您说的很有道理,我的变量x定义的全部都是float浮点型,pow()函数也的确强制成了double型!
        那我现在能不能这样理解,在我以上的几种计算方式里面实际影响运算速度的关键在于数据类型了?
        我现在用的芯片是28335,运算float的速度一定比定点的DSP快,所以运算的纠结在于数据类型和pow()函数的计算方式关系不大?
        也 不知我上面的理解对不对?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分