如何将float [-a; + a]范围量化为byte

时间:2014-03-20 17:22:21

标签: c# signal-processing

我有一系列生成的噪音样本,我需要将它们转换为PCM格式8,16,32bit。我知道当范围是[0;max]时如何做,但是当下限为负时会有问题。

这就是我对范围[0,max]

的处理方式
byte quantize(double sample, double max_value)
{
    return (byte)((sample / max_value) * 255.0);
}

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:0)

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