【问题标题】:Convert IEEE float to TI TMS320C30 32bits float in python在python中将IEEE浮点数转换为TI TMS320C30 32位浮点数
【发布时间】:2013-07-24 12:02:45
【问题描述】:

我需要按照以下约定将 python 浮点数转换为 TI DSP TMS320C30 浮点数表示:

http://www.ti.com/lit/an/spra400/spra400.pdf#page=13

我尝试了一些方法,但似乎无法完全理解所提出的算法。 我还找到了该算法的C version,但看起来它是在 TI DSP 中运行的版本,所以有些操作我无法弄清楚(例如反转符号)。

我在下面有一个非常幼稚的实现,但是它不起作用...

# see http://www.ti.com/lit/an/spra400/spra400.pdf

import math

def twos_comp(val, bits):
    """compute the 2's complement of int value val"""
    if( (val&(1<<(bits-1))) != 0 ):
        val = val - (1<<bits)
    return val

def float_to_ti( f ):
    m,e = math.frexp( f )
    # print m, e,
    mantissa = int(str(m)[2:])
    exponent = twos_comp((e - 127), 8) if e != 0 else (-128)
    sign = 1 if f < 0 else 0
    # print sign, mantissa, exponent
    return ((sign << 30) + (exponent << 24) + mantissa) & 0xffffffff

一些期望值的例子:

# Float     TI Decimal value of the resulting 32bits
#################################################
# 0.0         2147483648
# 1.0         0
# 100         105381888
# 0.000021    4029688104
# 10          52428800
# -1.0        4286578688
# -10.0       65011712
# -0.0021     4160118745
# -84.5487    114747153

我认为这归结为 python 返回尾数/有效数的方式,但我不确定。
您将如何从这里开始?

注意:我发现this question 可能是相关的,我会查看结构包并解包..

仅供参考:我使用加载到 DSP 中的 C 程序检索了理论值,如下所示:

{
  float f = -1.0; printf("F: %f -> %u", f, *(unsigned int*)&f);
  f = -10.0;      printf("F: %f -> %u", f, *(unsigned int*)&f);
  f = -0.0021;    printf("F: %f -> %u", f, *(unsigned int*)&f);
  f = -84.5487;   printf("F: %f -> %u", f, *(unsigned int*)&f);
}

工作实施

按照 Armin 的回答,我得到了负数:

def float_to_ti(f):
    m, e = math.frexp(f)
    ma = m
    m = abs(m * 2)
    e -= 1
    sign = (math.copysign(1.0, f) < 0)
    man = int((m - 1.0) * (1 << 23))
    if sign:
        man *= -1
    if e == 0 and sign == 1:
        e = 255
    if f == 0.0:
        return (128 << 24) | (sign << 23)
    return ((e & 0xff) << 24) | (sign << 23) | man & 0x7fffff

【问题讨论】:

    标签: python floating-point signal-processing ieee-754 texas-instruments


    【解决方案1】:

    以下代码通过了您的测试:

    def float_to_ti( f ):
        m, e = math.frexp(f)
        m *= 2
        e -= 1
        sign = (math.copysign(1.0, f) < 0)
        if f == 0.0:
            return (128 << 24) | (sign << 23)
        if sign:
            m += 2.0
            if m == 1.0:
                m = 0.0
                e -= 1
        else:
            m -= 1.0
        assert 0.0 <= m < 1.0
        return ((e & 0xff) << 24) | (sign << 23) | int(m * (1 << 23) + 0.5)
    

    注意不同的顺序(指数、符号、尾数)。另请注意, math.freexp() 不会返回任何 IEEE 格式的内容,因此此代码无需担心任何 IEEE 详细信息:(e &amp; 0xff) 将指数(作为有符号字符)转换为无符号数。最后,请注意 C30 格式不支持非规范化,这意味着它的尾数的最高位是隐含的(因此m - 1.0)。

    【讨论】:

    • 好的,调整以支持负值的新测试。我认为“正常”浮点数很好,但可能仍然不适用于 +/-INF、NAN 和 -0.0 等特殊值。 (破解一些奇怪的随机规范很有趣 :-)
    • 我对它进行了调整,并提出了另一个版本,略短一些。它也通过了我的桌子。
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多