【问题标题】:How to quantize float [-a;+a] range to byte如何将浮点 [-a;+a] 范围量化为字节
【发布时间】:2014-03-20 17:22:20
【问题描述】:

我有一组生成的噪声样本,我需要将它们转换为 8、16、32 位的 PCM 格式。我知道当范围为[0;max] 时该怎么做,但当下限为负数时会出现问题。

这就是我对[0,max] 范围的处理方式:

byte quantize(double sample, double max_value)
{
    return (byte)((sample / max_value) * 255.0);
}

【问题讨论】:

  • 也许你应该展示你是如何为[0,max]做的,以及它对[-a,a]有何不同
  • byte quantize(double sample, double max_value) { return (byte)((sample / max_value) * 255.0); }
  • 将其添加到问题中。
  • 你能不能把a加到samplemax_value上?
  • @Snakerek 您接受的答案是错误的。它确实将连续范围划分为 256 个大小相等的块。它将连续范围划分为 255 个大小相等的块,获得 255 值的唯一方法是将最大值作为输入。我的答案可能看起来更复杂是有原因的:因为它需要正确完成。

标签: c# signal-processing


【解决方案1】:

x 成为[-a, a]
然后(x+a)/2a[0,1]
所以256(x+a)/2a[0,256]
所以floor(256(x+a)/2a){0, 1, 2, ..., 256}
如果你得到256,夹到255

通用功能:

//Map x in [0,1] to {0, 1, ..., 255}
byte quantize(double x)
{
    x = (int)Math.Floor(256 * x);
    if (x < 0) return 0;
    else if (x > 255) return 255;
    else return (byte)x;
}

//Map x in [min,max] to {0, 1, ..., 255}
byte quantize(double x, double min, double max)
{
    return quantize((x - min) / (max - min));
}

【讨论】:

  • 非常感谢。在您的解释之后不需要代码,但谢谢。
【解决方案2】:

由于您可以对[0,max] 范围而不是[a,b] 执行此操作,因此请移动样本和范围。 (注意,这里假设量化是线性的。)

// from question.
byte quantize(double sample, double max_value)
{
    return (byte)((sample / max_value) * 255.0);
}


byte quantize( double sample, double min, double max )
{
    return quantize( sample - min, max - min );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2020-03-15
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多