如何量化浮点[-a;+a]范围到字节

本文关键字:到字节 范围 何量化 量化 | 更新日期: 2023-09-27 17:51:11

我有一个生成的噪声样本数组,我需要将它们转换为PCM格式8,16,32位。当范围为[0;max]时,我知道如何做到这一点,但当下限为负时,我会遇到问题。

这是我如何为范围[0,max]做的:

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

如何量化浮点[-a;+a]范围到字节

[-a, a]x
那么(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));
}

由于您可以对范围[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 );
}