如何量化浮点[-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]
为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 );
}