This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP-EXP430FR5994:比较 atan2与 QMath _Qatan2和 IQMath _IQatan2

Guru**** 2538950 points
Other Parts Discussed in Thread: MSPMATHLIB

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/696541/msp-exp430fr5994-comparing-atan2-with-qmath-_qatan2-and-iqmath-_iqatan2

器件型号:MSP-EXP430FR5994
主题中讨论的其他器件:MSPMATHLIB

您好!

我将 atan2函数的输出与 QMath _Qatan2和 IQMath _IQatan2函数进行比较、并在 IQatan2中看到45、135、225和315度的异常、但_Qatan2是可以的(请参阅下图)。 下面显示了我使用的例程。 我已经尝试了几个不同的值、分别针对 global_Q (6至8)和 global_IQ (22至24)。

我的代码是否有问题(可能)或_IQatan2是否有问题(不太可能)?

谢谢、

 Larry

void Test_Fixed_Point_Math ()
{

uint16_t i;
双倍 X;
双 Y;
双 θ;

_q _q_X;
_q _q_Y;
_q _q_theta;

_iq _iq_X;
_iq _iq_Y;
_iq _iq_theta;

const double Pi = 3.1415926536;

对于(I = 0;I < 361;I++)
{
X = cos ((float) i*PI/180);
y = sin ((float) i*PI/180);
Theta = atan2 (Y、X)* 180 / Pi;
如果(θ< 0)θ=θ+ 360;
printf ("%d "、i);
printf ("%f %f %f "、X、Y、theta);

_q_X =_Q (X);
_q_Y =_Q (Y);
_q_theta =_Qatan2 (_q_Y、_q_X);
Theta =_QTOF (_q_theta)* 180 / Pi;
如果(θ< 0)θ=θ+ 360;
printf ("%d %d %d %d %f "、_q_X、_q_Y、_q_theta、theta);
printf ("%f %f "、_QTOF (_q_X)、_QTOF (_q_Y));

_IQ_X =_IQ (X);
_IQ_Y =_IQ (Y);
_iq_theta =_IQatan2 (_IQ_Y、_IQ_X);
Theta =_IQtoF (_IQ_theta)* 180 / Pi;
如果(θ< 0)θ=θ+ 360;
printf ("%ld %ld %ld %f "、_IQ_X、_IQ_Y、_IQ_theta、theta);
printf ("%f %f "、_IQtoF (_IQ_X)、_IQtoF (_IQ_Y));

printf ("\n");
}
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只要_IQ_X 和_IQ_Y 值相同(符号除外、即45、135、225和315度)、就会出现上述问题。 如果我分别使用_IQcos 和_IQsin 计算_IQ_X 和_IQ_Y、而不是使用转换为 IQ 格式的 cos 和 sin 值(即 X 和 Y)(请参阅下面的代码片段)、则_IQ_X 和_IQ_Y 值不再相等、但现在在最后一位有所不同 (225度除外)使用24的 global_IQ (我没有检查任何其他),并且不会出现前面显示的异常。

    这是否表示 IQatan2有问题、或者我是否应该在代码中查找问题?

    // _q_X =_Q (X);
    // _q_Y =_Q (Y);
    _q_X =_qcos (_Q ((float) i*PI/180));
    _q_Y =_qsin (_Q ((float) i*PI/180));
    
    // _IQ_X =_IQ (X);
    // _IQ_Y =_IQ (Y);
    _iq_X =_IQcos (_IQ ((float) i*PI/180));
    _IQ_Y =_IQsin (_IQ ((float) I*PI/180));
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Larry、

    我将查看您的代码和 API、然后根据您的想法提供反馈。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Larry、

    如您的附加代码中所示、我想说问题来自您从 MSPMATHLIB 调用的 cos 和 sin 函数。 但是、有关 MSPMATHLIB 的文档不多、因此我只能检查 math.h 的源代码 它显示 cos 和 sin 函数的输入和输出是 double 类型、在 MSP430中定义为64位并对齐16位。 您还可以找到用于浮点输入和输出的 cosf/sinf 函数。 我建议您尝试使用 cosf 和 sinf 函数。 但我认为这不是根本原因。

    以 cos 函数为例。 我认为 cos、_Qcos 和_IQcos 函数之间存在不同的输出格式、这些格式来自不同的库。 当您使用与代码的 MID 变量相同的 COOS 输出格式(MSPMATHLIB 的函数)时、应该会有一些问题、因为您最终在 IQmathlib 中使用了这些函数。 两个数学库之间应该存在一些不匹配的情况。 因此、我建议您对整个代码使用相同的库 IQmathlib 来计算原始输入。

    正如我所建议的那样、它运行良好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wei、

    感谢您查看此内容。 由于我没有要检查的源代码、我运行了几个测试来查看我是否可以解决这个问题。 我的目的是删除_IQatan2参数的格式、作为一个问题。 首先、我将参数_IQ_X 和_IQ_Y 替换为相关四个角度本应使用的值(+/- 11863283、即转换为_IQ24格式的45/135/25/315度的余弦和正弦值)。 这四个角度的结果与我使用_IQ_X 和_IQ_Y 作为参数时的结果相同(即、不正确)。 然后、我将第一个参数中的最后一个数字从3更改为4、以便参数不会具有相同的值-这是有效的、返回的四个角度为45.000001、135.000004、224.999996和314.999999度。 出于兴趣、我还检查了_IQatan2PU 并发现了相同的问题、这并不奇怪。 这似乎表明,在两个论点相同的情况下(忽略符号)有一些有趣的事情。

    我无法解释这些结果、但正在发生一些奇怪的事情。 我怀疑这不是论点的格式。 我希望您能解释一下。

    谢谢、

    Larry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有任何人都有_IQatan2源代码、以便我可以尝试弄清造成这种情况的原因是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此问题未解决。 请参阅我的其他帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有人知道为什么会发生这种情况? 回顾我在网络上发现的一些 atan2近似函数表明、一些方法将计算范围限制在0至45度(即、其中 x = y)、所有其他角度都与该区域相关。 因此、x 和 y 相等的边沿值可能已发生错误。 有人吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Larry、

    很抱歉您迟到了。 我将与团队一起检查您的问题、并在稍后回复您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Larry、

    抱歉、我们没有提供 IQMathLib 的_IQatan2源代码。 如用户指南中所示、将在用户项目中链接的.lib 文件和.a 存档文件。

    到目前为止、我仍然不知道您的问题、因此我已经将您的问题发送给我们的软件团队。 如果我从我们的软件专家那里得到任何意见、我将跟踪此主题并回复您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wei、
    感谢持续的支持。 听起来 TI 没有为 IQmath 中的_IQatan2例程和其他例程编写代码。 如果这是真的、您知道谁做了吗?
    Larry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Larry、

    请注意、我们不会打开源代码、只会发布编译后的.lib 文件。

    我正在咨询我们的软件团队以了解您的问题。