11

假设我有一个 [0, 1] 范围内的浮点数,我想量化它并将其存储在一个无符号字节中。听起来很简单,但实际上它相当复杂:

显而易见的解决方案如下所示:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f);
}

到目前为止,这有效,我得到了从 0 到 255 的所有数字,但整数的分布并不均匀。该函数仅255在 a 恰好为时返回1.0f。不是一个好的解决方案。

如果我进行适当的舍入,我只是转移问题:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f + 0.5f);
}

这里的结果0只覆盖了浮动范围的一半,而不是任何其他数字。

如何进行浮点范围均匀分布的量化?理想情况下,如果我量化均匀分布的随机浮点数,我希望得到整数的均匀分布。

有任何想法吗?


顺便说一句:我的代码也在 C 中,问题与语言无关。对于非 C 语言的人:假设float转换会int截断浮点数。

编辑:因为我们在这里有些困惑:我需要一个映射,将最小的输入浮点数(0)映射到最小的无符号字符,并将我范围的最高浮点数(1.0f)映射到最高的无符号字节(255)。

4

2 回答 2

15

a * 256f用支票将 256 减少到 255 怎么样?所以像:

return (unsigned char) (min(255, (int) (a * 256f)));

(对于您平台上合适的 min 函数 - 我不记得它的 C 函数了。)

基本上你想将范围分成 256 个相等的部分,这就是应该做的。1.0 到 256 并需要向下舍入的边缘情况只是因为域在两端都包含在内。

于 2009-03-01T16:05:57.243 回答
1

我认为您正在寻找的是:

unsigned char QuantizeFloat (float a)
{
  return (unsigned char) (a * 256.0f);
}

这会将 [0, 1] 中的统一浮点值映射到 [0, 255] 中的统一字节值。[i/256, (i+1)/256[ (不包括 (i+1)/256) 中的所有值,对于 0..255 中的 i,都映射到 i。可能不希望的是 1.0f 映射到 256.0f ,它环绕到 0。

于 2009-03-01T16:45:10.127 回答