我需要规范化8位音频.wav文件。
我使用NAudio将文件加载到byte[]
。我成功地将其转换为sbyte[]
并恢复了正弦位。然后我将这个数组(转换为float
)相乘以得到标准化值(0-255)硬限制。
现在我需要将它保存为byte[]
以让NAudio写它。问题是,如果我只是演员,
source[i] = (byte)normalizedFloatArray[i];
结果保存的.wav看起来像这样!哎哟。
“高飞浪潮”
问题出在哪里?
答案 0 :(得分:2)
我认为这是因为字节如何转换为sbyte。例如:
sbyte b1 = 100;
sbyte b2 = -100;
Console.WriteLine("{0} = {1}", b1, (byte)b1);
Console.WriteLine("{0} = {1}", b2, (byte)b2);
这输出以下内容:
100 = 100
-100 = 156
因此,如果您的wave以sbytes显示以下内容:
{ 0, 50, 100, 50, 0, -50, -100, -50, 0 }
输出将以字节为单位:
{ 0, 50, 100, 50, 206, 156, 206, 0 }
答案 1 :(得分:1)
将byte
投放到sbyte
会导致大于sbyte.MaxValue
的正值溢出并变为负值,这可能不是您想要的。例如,虽然(sbyte)127
产生127
,但(sbyte)128
产生-128
。您可能希望将值范围从[0, 255]
转换为[-128, 127]
,在这种情况下,您可以简单地将每个byte
偏移-128
:
signedByte = (sbyte)(unsignedByte + sbyte.MinValue)