字节到 sbytes 并返回 - C# NAudio
Posted
技术标签:
【中文标题】字节到 sbytes 并返回 - C# NAudio【英文标题】:bytes to sbytes and back - C# NAudio 【发布时间】:2014-08-22 16:19:07 【问题描述】:我需要标准化一个 8 位音频 .wav 文件。
我使用 NAudio 将文件加载到 byte[]
。我成功地将其转换为sbyte[]
并恢复了正弦位。然后我将此数组相乘(转换为float
)以获得硬限制的标准化值(0-255)。
现在我需要将其保存为 byte[]
以让 NAudio 编写它。问题是,如果我只是投射,
source[i] = (byte)normalizedFloatArray[i];
生成的保存的 .wav 看起来像这样!哎哟。
“傻浪”
问题可能出在哪里?
【问题讨论】:
能否请您发布从byte
转换为sbyte
的方式?我认为此时可能有问题。
不要转换为 sbyte。转换为浮点数并减去 127。
@HansPassant 他不应该减去 128 吗? sbyte
范围是 [-128, 127]。
嗯,取决于原始信号如何转换为字节。在实践中没关系,它只是一个直流偏移。
所有这些都是很棒的信息。我最终使用了 Hans Passant 的策略,基本上放弃了选角。我只是减去 128,根据 byte.MaxValue/2 进行缩放,然后加回 128 并写出新的 byte[]。工作。
【参考方案1】:
我认为这是因为字节如何转换为 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
【讨论】:
花点时间阅读帮助中心的editing help。 Stack Overflow 上的格式与其他网站不同。 对不起,这是我在这里的第一篇文章。我修好了【参考方案2】:将byte
转换为sbyte
会导致大于sbyte.MaxValue
的正值溢出并变为负值,这可能不是您想要的。例如,(sbyte)127
产生 127
,(sbyte)128
产生 -128
。您可能希望将值范围从[0, 255]
转换为[-128, 127]
,在这种情况下,您可以简单地将每个byte
偏移-128
:
signedByte = (sbyte)(unsignedByte + sbyte.MinValue)
【讨论】:
是的,你的演员阵容看起来比我的好看。我最终使用了一个浮点数,但基本上做了同样的事情。这个音频的东西很棘手。再次感谢。 是的,如果您只使用float
值,则不需要中间的sbyte
表示。我用它来使答案更笼统。以上是关于字节到 sbytes 并返回 - C# NAudio的主要内容,如果未能解决你的问题,请参考以下文章