利用单片机计算复杂运算——算法优化
0赞
发表于 7/26/2012 11:38:05 PM
阅读(4112)
最近在用ADI单片机ADuC7026做一个程序,程序中涉及到大量的计算,以及数据的不断更新。利用中断10毫秒,然后对采集的数据进行结算,因为涉及到了正弦、余弦、正切、反余弦、反正切、大量的除法计算,这就不能保证在这个中断10毫秒之内完成这些计算,从而不能实现功能。
单片机的运行速度和BF系列的DSP是没有什么可比性的,尽管单片机中可以正常计算除法,但是通过测量可以发现,除法运算要比乘法运算慢个几十倍。这里可以跟大家说一下我是怎么来测量这个时间的。
可以现在写好的程序里加上一个除法,比如在主函数中加上y=2*x,这样的,然后在这个语句之前先进行置位,在乘法后面清楚置位,这里置位可以用引脚引出来,然后通过示波器来观察高电平的时间,你就会发现,乘法需要几十个微秒,但是除法要几百个微秒,更不用说正余弦了。所以如果计算量比较复杂,那么就只能通过算法来补偿了。
当年学数学的泰勒展开的时候,我还在想这东西有什么用啊,现在就能用上了。把正余弦、指数、各种的复杂的函数都用泰勒展开,MEMS的精度本来也不是很高,所以呢一般展开到第三项就可以了,这个都是很简单的,大家看看数学书,几行语句就能搞定这几个公式了。然后把这个封装到一个库函数里,当用的时候直接调用,那么一次运算就能节省下几十个微秒,多次计算节省下的时间就非常可观了。这也算是一种算法的优化。
这就是目前总结出来的东西。以后再更新啊~
