DSP

TI 中 acos()函数 存在 bug

2019-07-13 11:44发布

编写 DSP 程序时(TMS320F28335),如果直接调用系统自带的 acos 函数,有时会出现莫名其妙的错误 (如同步坐标系中的电流在稳态情况下本来是直流,但可能出现尖峰)。这是因为 acos() 函数存在 Bug 。理论上 acos(1)=π ,但 DSP 的计算结果可能是 0. 由于只有这一个点有错误,所以可以很容易将该 Bug 排除。 示意图
图 1:不同角度下的正弦和余弦值 图 1 给出了不同角度下的正弦和余弦值。显然,发生 Bug 的区域位于图中蓝 {MOD}区域内。如果计算正确的话,下列几个式子无法同时成立。 ar<0.95 br<0.05 |θ|<0.3or|θ2π|<0.3 其中, a, b 分别为横坐标和纵坐标,他们均可正可负; θ 是对应的角度值。 上述三个式子中的前两个条件将角度限制在了图 1 中的蓝 {MOD}区域内,而第三个条件又表示角度在 0 附近。因此,如果这几个条件同时满足,说明进入到了 Bug 中,这时候只需要将得到的数值强制变为 π 就好了。 因此,如果横坐标为 a 及纵坐标 b 已知,计算对应的角度值的程序如下: r = sqrt(a*a + b*b); theta = acos(a/r);// acos:0-PI if (b < 0) //PI-2*PI { theta = 2*PI - theta; } if ( (a/r<0.95) && ( (b/r<0.05) && (b/r>-0.05) ) && ( (theta<0.3) || ((2*PI - theta)<0.3) ) )//由于 theta 已限制在0-2pi,所以第三个表达式可简化 { theta = PI; } 经过排除 Bug 后的运行结果正常。 实际上,已经有人在 TI 的论坛上反馈过这个错误了,详情请点击链接博客地址