将字节转换为有符号字节并返回 - C# NAudio

3

我需要将一个8位音频.wav文件进行标准化处理。

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

现在,我需要将其保存回byte[],以便让NAudio编写它。问题是,如果我只是进行转换,

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

保存后的 .wav 文件看起来像这样!哎呀。 怪异的波形 “怪异的波形”
问题可能出在哪里?

能否请您发布将 byte 转换为 sbyte 的方法?我认为这个地方可能出了点问题。 - Lucas Trzesniewski
1
不要转换为 sbyte。转换为 float 并减去 127。 - Hans Passant
@HansPassant 他不应该减去128吗? sbyte 范围是[-128, 127]。 - Mike Strobel
嗯,这取决于原始信号是如何转换为字节的。实际上并不重要,它只是一个直流偏移量。 - Hans Passant
所有这些都是很好的信息。我最终采用了Hans Passant的策略,基本上放弃了转换。我只是减去了128,根据byte.MaxValue/2进行缩放,然后添加回128并写出新的byte[]。可行。 - TheBard
2个回答

2

我认为这是由于字节转换为有符号字节的方式所导致的。例如:

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 }

1
请花点时间阅读帮助中心中的编辑帮助。在Stack Overflow上,格式与其他网站不同。 - gunr2171
抱歉,这是我在这里的第一篇帖子。我已经修复了它。 - Stefan Baumann

1
byte 类型转换为 sbyte 类型,会导致正值大于 sbyte.MaxValue 的数值溢出并变成负值,这可能不是你想要的结果。例如,尽管 (sbyte)127 的值为 127,但 (sbyte)128 的值为 -128。如果你希望将数值范围从 [0, 255] 转换为 [-128, 127],则可以通过对每个 byte 进行减去 -128 来实现。
signedByte = (sbyte)(unsignedByte + sbyte.MinValue)

是的,你的转换看起来比我好看多了。我最后使用了一个float,但基本上做的是一样的。这个音频相关的东西真是有点棘手。再次感谢。 - TheBard
是的,如果你只打算使用float值,那么中间的sbyte表示是不必要的。我使用它来使答案更加通用化。 - Mike Strobel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接