C# 如何将浮点[-a;&x2B;a]范围量化到字节

C# 如何将浮点[-a;&x2B;a]范围量化到字节,c#,signal-processing,C#,Signal Processing,我有一个生成的噪声样本数组,我需要将它们转换为PCM格式8,16,32位。我知道如何在范围为[0;max]时执行此操作,但在下限为负值时有问题 这是我在[0,max]范围内执行此操作的方式: byte quantize(double sample, double max_value) { return (byte)((sample / max_value) * 255.0); } 设为x在[-a,a] 然后(x+a)/2a位于[0,1] 所以256(x+a)/2a在[0256] 所以楼

我有一个生成的噪声样本数组,我需要将它们转换为PCM格式8,16,32位。我知道如何在范围为
[0;max]
时执行此操作,但在下限为负值时有问题

这是我在
[0,max]
范围内执行此操作的方式:

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

设为
x
[-a,a]

然后
(x+a)/2a
位于
[0,1]

所以
256(x+a)/2a
[0256]

所以
楼层(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,1]中的x映射到{0,1,…,255}
字节量化(双x)
{
x=(int)数学楼层(256*x);
如果(x<0)返回0;
如果(x>255),则返回255;
否则返回(字节)x;
}
//将[min,max]中的x映射到{0,1,…,255}
字节量化(双x、双最小、双最大)
{
返回量化((x-min)/(max-min));
}

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


也许你应该展示你如何为
[0,max]
做这件事,以及
[-a,a]
字节量化(双采样,双最大值){返回(字节)((采样/最大值)*255.0);}
将其添加到问题中。你能不能不将
a
添加到
样本
最大值
?@Snakerek你接受的答案是错误的。它不会将连续范围划分为256个大小相等的块。它将连续范围划分为255个大小相等的块,获得255值的唯一方法是准确地给出最大值作为输入。我的答案看起来可能更复杂,这是有原因的:因为这需要正确地完成。非常感谢。在您的解释之后,代码不是必需的,但是谢谢。
// 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 );
}