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.

[参考译文] TMS320F28034:从 IQNmpyI32int()获取整数和小数部分

Guru**** 2541140 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/905617/tms320f28034-obtaining-both-integer-and-fractional-portion-from-iqnmpyi32int

器件型号:TMS320F28034

我有一个函数、用于对具有大整数的_iq18类型进行多项运算。 我需要结果的整数部分和小数部分进行后续计算。 当前代码如下所示:

int32计数= 320000;
_iq18分频器=_IQ (0.667);
int32 intResult =_IQ18mpyI32int (分频器、计数);
_iq18余数=_IQ18mpyI32frac (分频器、计数); 

根据 IQ 库上的文档、_IQNmpyI32int()和 _IQNmpyI32frac()每个都需要20个周期才能完成。 此代码位于持续重复的紧密循环中、因此我想尽可能减少执行周期的数量。 是否有任何方法来优化此代码? 我怀疑 _IQNmpyI32int()和 _IQNmpyI32frac()正在执行非常相似的计算;因此,如果有一些余地,我可以将它们"组合",我觉得我可以压缩一点 CPU 时间。  

我想使用 plain _IQNmpyI32(),然后从结果中提取整数和小数分量。 `、`s计数`通常计算为一个非常大的数字、因此`计数`和`计算器的乘积将超过_IQ18类型的范围。

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

    请给我一天左右的时间来分析这个问题、然后返回给您。

    谢谢、

    Sira

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

    您好、cneshi、

    IQ 数值是转换为整数的实数* 2^N。  反向转换将是(浮点) Iq /2^N 因此、实际的非 IQ 整数部分是

    intResult = youriq /2^18 = youriq >> 18;

    IQ 余数

    余数= youriq -(intResult << 18);

    对于配备桶形换挡器的机器、不应花费太多时间。  C2000是此类机器之一、它可以非常 快速地将32位整数移位如此多的位位置。

    但是、您的数字溢出存在问题。 分频器为(int)(0.667 * 2^18)= 174850。 您可以验证该 IQ 数字除 以2^18的值、得到0.66699981689453125。 不完全是 0.667、但非常接近。

    结果 IQ 的整数表示 应是

    174850 * 320000 = 55952000000、不能容纳32位变量! 您需要选择不同的 IQ 格式或以某种方式拆分计算、以免发生溢出。

    如果它是64位整数、那么 intResult 将是55952000000 >> 18 = 213439

    IQ 余数55952000000 -(213439 << 18)= 246784。 同样、要检查它的值、请除以2^18、得到0.94140625。 没关系吗? 是、自0.66699981689453125 * 320000 = 213439.94140625起。

    希望这对您有所帮助

    Edward

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

    实际上、由于所需的动态范围、IQNmpyI32在您的情况下不起作用。

    您是对的-_FRAC 和_int 函数有一些通用部分。 我们不会发布 IQMath 库的汇编实现。 如果您有兴趣在组合这两个函数的汇编中创建自定义函数并在您的应用中使用它、我可以检查我是否可以在专用通道上向您发布这两个函数的源代码。

    谢谢、

    Sira

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

    哦、我有点遗漏了原始主题。  两个单独的乘法函数、一个用于整数部分、另一个用于小数部分、比我们在这里需要的多2倍。  我认为它应该是单倍乘

    _iq _IQmpyl32 (_IQ A、长 B)

    然后提取整数和小数部分、就像我所写的那样

    _iq18结果= _IQ18mpyl32 (标量、计数);

    int32 intResult =结果>> 18;

    _iq18余数=结果-(intResult << 18);

     

    但32000* IQ18 (0.667) 溢出。

     

    此致、

    Edward

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

    如果您能向我指出正确的方向、说明如何实现这样一个非常棒的定制函数!

    谢谢、

    Dave

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

    Dave、

    请通过此 URL 请求 IQMath 库源代码。 您 可以忽略此表单中与签署协议相关的问题。

    https://www.ti.com/licreg/docs/swlicexportcontrol.tsp?form_type=1∏_no=C2000-IQMATH-SOURCE-CODE&ref_url=&form_id=167029

    谢谢、

    Sira