【问题标题】:bytes to sbytes and back - C# NAudio字节到 sbytes 并返回 - 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[]。工作。

标签: c# naudio


【解决方案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 表示。我用它来使答案更笼统。
猜你喜欢
  • 2013-03-03
  • 2017-11-22
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多