我工作的一个项目,其中包括计算一个正弦波作为一个控制回路的输入。
正弦波的频率为280赫兹,控制回路每30微秒运行一次,所有内容都用 C 语言写成 手臂皮质 -M7。
目前,我们只是在做:
double time;
void control_loop() {
time += 30e-6;
double sine = sin(2 * M_PI * 280 * time);
...
}
出现了两个问题:
- 当长时间运行时,
time
会变大。突然之间,正弦函数的计算时间急剧增加(见图)。为什么会这样?这些函数通常是如何实现的?有没有办法规避这一点(没有明显的精度损失) ,因为速度是我们的一个巨大因素?我们正在使用 math.h (Arm GCC)中的 sin。
- 我一般如何处理时间?当长时间运行时,变量
time
将不可避免地达到双精度的极限。即使使用计数器 time = counter++ * 30e-6;
也只能改善这一点,但它并不能解决问题。因为我肯定不是第一个想要长时间生成正弦波的人,所以必须有一些想法/论文/... 关于如何快速和精确地实现这个。