我需要将一个8位音频.wav文件进行标准化处理。
我使用NAudio将文件加载到一个byte[]
中。我成功地将其转换为sbyte[]
并恢复了正弦波。然后,我将这个数组乘以(转换为float
)以获得归一化值(0-255),并进行硬限制。
现在,我需要将其保存回byte[]
,以便让NAudio编写它。问题是,如果我只是进行转换,
source[i] = (byte)normalizedFloatArray[i];
保存后的 .wav 文件看起来像这样!哎呀。
![怪异的波形](https://istack.dev59.com/K7Qv9.webp)
问题可能出在哪里?
我认为这是由于字节转换为有符号字节的方式所导致的。例如:
sbyte b1 = 100;
sbyte b2 = -100;
Console.WriteLine("{0} = {1}", b1, (byte)b1);
Console.WriteLine("{0} = {1}", b2, (byte)b2);
100 = 100
-100 = 156
如果您的波形在sbytes中如下所示:
{ 0, 50, 100, 50, 0, -50, -100, -50, 0 }
{ 0, 50, 100, 50, 206, 156, 206, 0 }
byte
类型转换为 sbyte
类型,会导致正值大于 sbyte.MaxValue
的数值溢出并变成负值,这可能不是你想要的结果。例如,尽管 (sbyte)127
的值为 127
,但 (sbyte)128
的值为 -128
。如果你希望将数值范围从 [0, 255]
转换为 [-128, 127]
,则可以通过对每个 byte
进行减去 -128
来实现。signedByte = (sbyte)(unsignedByte + sbyte.MinValue)
float
值,那么中间的sbyte
表示是不必要的。我使用它来使答案更加通用化。 - Mike Strobel
byte
转换为sbyte
的方法?我认为这个地方可能出了点问题。 - Lucas Trzesniewskisbyte
范围是[-128, 127]。 - Mike Strobel