【发布时间】:2015-05-11 04:02:31
【问题描述】:
我在嵌入式系统中有一个算法,需要使用 Q15 定点算法计算 sin(theta)、sin(2*theta)、sin(3*theta) 等。 sin(theta) 和 cos(theta) 是使用 LUT/插值组合生成的,但我使用 Chebyshev 方法来计算高阶正弦,如下所示(伪代码):
sinN1 = Comes from Q15 LUT/interp algorithm
cosN1 = Comes from Q15 LUT/interp algorithm
sinN2 = (cosN1*sinN1)>>14;
sinN3 = (cosN1*sinN2)>>14 - sinN1;
sinN4 = (cosN1*sinN3)>>14 - sinN2;
....
问题在于,在某些情况下,此方法产生的结果可能会溢出 Q15 变量。例如,让我们考虑当 theta =2.61697 时:
sinN1 (Q15) = int(2**15*sin(2.61697)) = 16413
cosN1 (Q15) = int(2**15*cos(2.61697)) = -28361
sinN2 = (-28361*16413)>>14 = -28412 # OK
sinN3 = (-28361*-28412)>>14 - 16413 = 32768 # OVERFLOW BY 1
..
我似乎从来没有溢出超过一两个 LSB。它似乎是复合量化的神器。我使用的是 ARM Cortex M4 处理器,所以我可以用相对较少的指令添加饱和逻辑,但是我正在做很多实时流 DSP,延迟要求非常低,所以我需要尽可能多地节省 CPU所以我想知道是否有更优雅的方式来处理这个问题。
【问题讨论】:
-
您可能会使用无符号算术,因为 +/- 将通过检查象限来确定。可能有其他方法来估计函数和/或调整系数。您没有给出正在估计的实际功能吗?
标签: arm fixed-point trigonometry cortex-m