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.

[参考译文] TMS320F28069:提高数字以高效供电

Guru**** 2530350 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/604361/tms320f28069-raising-numbers-to-powers-efficiently

器件型号:TMS320F28069

大家好、

标准数学库"pow()函数编译为大量代码。  我没有尝试在 RTOS 中使用它、因此执行时间不是问题、但我的程序代码空间不足以允许它。

我正在使用 IQMath 库来处理该项目中的绝大多数 DSP 工作、我发现它在空间和时间方面都很高效。  但是、我在这里看不到允许我将数字提升到功率的函数。  我只是错过了吗?

 ^项之一是:10 μ A (20/40)

通过编程方式,它如下所示: x=pow( 10,(20/40));

这将编译并执行它是可以的、但我没有足够的可用内存来使用它。

是否有更好的方法来解决此问题?

谢谢、

Robin

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

    Robin、

    正确的是、IQ 数学库中没有功耗函数。  您可以尝试将基值更改为"e"、然后使用自然对数。  

    我没有尝试过任何操作、但您的代码看起来类似于:

    结果= IQexp (10 * IQlog (20/40));

    这两个函数占用218个字的程序空间。

    此致、

    Richard

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

    您好 Richard、

    感谢您的回复。

    请原谅我、我在数学部门很薄弱、但下面的公式:

    结果= IQexp (10 * IQlog (20/40));

    似乎与此公式不同:

    ^= 10k Ω(20/40)

    例如

    ^μ s (20/40)= 3.162

    IQexp (10 * IQlog (20/40))= 0.0009766

    此外、在代码中实现日志函数时会崩溃。  在 C 语言中运行时、我使用_IQlog (20/40)。  没有编译器错误或警告、但当它到达这一行代码时、执行会导致暂停。

    IQMathLib.h 的第4689行将_IQlog()替换为 log()。  log()位于 math.h 中,定义为使用双浮点值。  我尝试使用 double 和_IQ 类型、但无法使用20/40表达式运行。  当使用0.5来代替20/40表达式时、它们也不运行。

    奇怪的是、当我输入数字10来代替0.5时、线路确实会运行、但结果错误。  log (10.0)的结果应该是2.303、但我得到-0.6931 (奇怪的是 、它是2的自然对数)。

    所以;

    1. 我应用的数学方法是否不正确?
    2. 是否知道为什么我看不到 log()函数的预期结果?

    谢谢、

    Robin

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

    尊敬的 Robin:

    很抱歉耽误你的时间。  数学是可行的、但我也遇到了一些意外的代码问题。  现在仍在进行中、我会尽快返回给您。

    感谢您的耐心等待。

    此致、

    Richard

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

    ^的差异是、一个计算10 μ s (0.5)= 3.162、而另一个计算(0.5)^10 = 0.0009766。 您要求前者。 方法是正确的;我在答复中将模数和指数置于错误的舍入位置。

    我具有的变量声明和代码为:

    _IQ 结果;
    _IQ 模量=_IQ (10.0);
    _iq expnt =_IQ (0.5);

    MAIN ()

    结果=_IQexp (_IQmpy (expnt、_IQlog (modulus)));

    这在我的机器上工作正常。 您能否尝试一下、让我知道您找到的内容?

    您应该会看到结果3.162277281。 如果您遇到其他问题、可能是 IQ 数学表未加载到链接器文件中的正确位置。 IQNexp()函数使用位于地址0x3FEAf0的内部 ROM 中的查找表。 有关如何配置表的详细信息、请参阅 IQmath 用户指南中的第3.3节。

    此致、

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

    您好 Richard、

    它工作正常。

    感谢你的帮助。

    Robin