C# 如何将浮点[-a;&x2B;a]范围量化到字节
我有一个生成的噪声样本数组,我需要将它们转换为PCM格式8,16,32位。我知道如何在范围为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] 所以楼
[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 );
}