字节到sbytes和后面 - C#NAudio

时间:2014-08-22 16:19:08

标签: c# naudio

我需要规范化8位音频.wav文件。

我使用NAudio将文件加载到byte[]。我成功地将其转换为sbyte[]并恢复了正弦位。然后我将这个数组(转换为float)相乘以得到标准化值(0-255)硬限制。

现在我需要将它保存为byte[]以让NAudio写它。问题是,如果我只是演员,

source[i] = (byte)normalizedFloatArray[i];

结果保存的.wav看起来像这样!哎哟。

goofy wave

“高飞浪潮”

问题出在哪里?

2 个答案:

答案 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)