【问题标题】:arctangent implementation in TMS320C55XTMS320C55X 中的反正切实现
【发布时间】:2021-07-18 21:56:35
【问题描述】:

我正在学习 TMS320C55x 中的反正切实现 这是源代码:


;* AR0   assigned to _x
;* AR1   assigned to _r
;* T0   assigned to _nx
        PSH     T3
     || BSET    FRCT            ;fractional mode
    SUB #1, T0          ;nx-1
    MOV T0, BRC0        ;repeat nx times
        MOV     #2596 << #16, AC3       ; AC3.Hi = C5
        MOV #-9464 << #16, AC1  ; AC1.Hi = C3
    MOV #32617 << #16, AC2  ; AC2.Hi = C1
*
* Note: loading T3 on the instruction before a multiply that uses it will
* cause a 1-cycle delay.
*
    MPYMR   T3=*AR0+, AC3, AC0      ; (Prime the Pump)
    
     || RPTBLOCAL   loop1-1
            MACR    AC0, T3, AC1, AC0
            MPYR    T3, AC0
          ||MOV *AR0+, T1               ; (for next iteration)
            MACR    AC0, T3, AC2, AC0
            MPYR    T3, AC0
              ||MOV T1, T3
            MOV HI(AC0), *AR1+      ;save result
          ||MPYR    T1, AC3, AC0            ; (for next iteration)
loop1:

        POP     T3
     || BCLR    FRCT            ;return to standard C
    MOV #0, T0          ;return OK value (no possible error)
     || RET

其中 _x 是输入向量,_r 是输出。 nx 是元素的数量。 问题是关于分配给 AC3、AC1、AC2 的常量。我猜这是多项式逼近的系数,但我不明白如何计算它们

【问题讨论】:

  • 这个程序集对我来说是未知的......所以我只能猜测 tan 和 arctan 通常由 Chebyshev polynomialsCORDIC 计算......也许你应该稍微对齐代码以便它的更具可读性和描述非标准助记符,甚至将代码转换为方程式……还有什么数据类型?固定点?

标签: math assembly trigonometry numerical-methods


【解决方案1】:

我不遵循汇编代码,但我可以猜到这些魔法系数是从哪里来的。

代码 cmets 建议 C1C3C5 是多项式逼近的系数,而 arctan 是奇函数,因此它围绕 0 的泰勒展开式确实只有 @987654332 的奇次幂@。比较泰勒展开式y = x - 1/3 x^3 + 1/5 x^5 - 1/7 x^7 + ... 中的C1 = 326171,并给出计算上下文,这进一步表明计算结果按2^15 = 32768 缩放。

事实证明,y = (32617 x - 9464 x^3 + 2596 x^5) / 32768 实际上是arctan(x) 在区间[-1, 1] 上的一个很好的近似值。如下所示(在wolfram alpha 中验证)近似的最大绝对误差小于1/1000,并且在与y = ±π/4 对应的端点x = ±1 处可以忽略不计,这在图形计算中可能是可取的。

至于实际如何导出系数,粗多项式仅使用 9 个控制点 gives 和多项式 y = 32613 x - 9443 x^3 + 2573 x^5 最佳拟合,其系数已经接近发布代码中使用的系数。更多的控制点和/或额外的条件来最小化端点的误差会导致系数略有不同,但是如果没有任何文档或关于那里实际使用的优化标准的线索,很难猜测如何精确匹配代码中的那些.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多