我有一系列生成的噪音样本,我需要将它们转换为PCM格式8,16,32bit。我知道当范围是[0;max]
时如何做,但是当下限为负时会有问题。
这就是我对范围[0,max]
:
byte quantize(double sample, double max_value)
{
return (byte)((sample / max_value) * 255.0);
}
答案 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 );
}