short2、10 位整数、5 位分数、1 个符号位

short2, 10 bit integer, 5 bit fraction, one sign bit

提问人:Robinson 提问时间:9/20/2023 最后编辑:Christoph RackwitzRobinson 更新时间:9/20/2023 访问量:74

问:

NVIDIA 的光流库文档指出,流向量“由 32 位值表示,每个水平和垂直组合都是 16 位值。最低的 5 位保存小数值,然后是 10 位整数值,最高有效位是符号位”。

因此,使用 short2 类型:

struct __device_builtin__ __align__(4) short2
{
    short x, y;
};

如何提取两个带有正确符号的浮点数?我在这里的尝试,我觉得并不那么令人信服。至少我的运动矢量看起来不对劲。我不确定的一件事是这是否是两个人的赞美。文件没有说。

struct MotionVector {
    float x;
    float y;
};

float ExtractSingleMotionValue(short value) {
    bool isNegative = (value & 0x8000) != 0; // Check the sign bit

    // Clear the sign bit
    value = value & 0x7FFF;

    // Extract integer part (10 bits)
    int intPart = (value >> 5);

    // Extract fractional part (5 bits)
    float fracPart = value & 0x001F;
    fracPart /= 32;  // Convert fractional part to actual decimal

    float result = intPart + fracPart;

    if (isNegative) {
        result = -result;
    }

    return result;
}

MotionVector ExtractMotionVector(short2 value) {
    MotionVector mv;

    mv.x = ExtractSingleMotionValue(value.x);
    mv.y = ExtractSingleMotionValue(value.y);

    return mv;
}

谁能提供一些建议?我真的不喜欢我的解决方案。我敢肯定那里有一条线。

C++ 数学 NVIDIA 定点 OpticalFlow

评论

1赞 Christoph Rackwitz 9/20/2023
x/32.f, y/32.f-- 让我知道这对你来说是否足够了
2赞 Eljay 9/20/2023
目前尚不清楚“定点”数字是 2s 补码(如 )还是符号位标志(如 )。如果是 2s 补码,Christoph 的评论对正面和负面都有效。如果它“像浮点数”,那么你需要检查并屏蔽符号位,并将结果乘以符号位是否表示负数。intfloat-1.0f
1赞 Christoph Rackwitz 9/20/2023
他们是英伟达。他们不会做任何傻事。我敢打赌它是 x/32.f,因为它是定点格式,就像图像处理中一样
0赞 Robinson 9/20/2023
它是 CUDA,我知道 GPU 有 16 位浮点类型。可能不是这样。我想知道这是否是__half。抓挠那个。IEEE® 754 是尾数,指数,而不是定点。
1赞 Christoph Rackwitz 9/20/2023
不。绝对不可以。他们不谈论指数和尾数。

答:

2赞 Christoph Rackwitz 9/20/2023 #1

https://docs.nvidia.com/video-technologies/optical-flow-sdk/nvofa-programming-guide/index.html#generating-flow-vectors

流矢量由一个 32 位值预发,每个水平和垂直组合都是 16 位值。最低的 5 位保存小数值,后跟 10 位整数值,最高有效位是符号位。

这是一种定点格式。所有部分都是尾数*。小数点固定为 5 个小数位。25 = 32。这是必需的“移位”/除数。

这样解释:

short x_raw;
float x_pixels = x_raw * (1.f / 32);

*) 我们不要争论这个标志......好的,让我们

当然,他们没有具体说明负值是如何表示的。根据我的经验,二的补码是显而易见的选择,因此代码简洁,算术中不需要杂技。任何其他形式都是战争罪。

这不是浮点格式。没有提到指数或尾数。

评论

0赞 Robinson 9/20/2023
好的,我已经这样做了,所以我必须在其他地方有一个错误,因为我的向量仍然都是歪斜的。我会继续努力。
2赞 Christoph Rackwitz 9/20/2023
请随时发布这种情况,包括任何原始数据。原始数据与格式无关。每个人都有办法读取原始数据。
0赞 Robinson 9/20/2023
四处挖掘,我在他们的示例中发现了一些代码,这就是他们有效地做的事情,例如: flowData[2 * linearIndex] = (float)(_flowVectors[linearIndex].flowx / float(1 << 5));