字节到 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的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 int[] 转换为 byte[]

C# char*如何转换string

将 sbyte[] 固定为字符串 C#

C#基本的值类型

C#基本的值类型

如何将 C# 类字符串变量传递给 sbyte* 参数?