【问题标题】:What does the raw data in a .wav file mean?.wav 文件中的原始数据是什么意思?
【发布时间】:2020-06-20 19:47:05
【问题描述】:

所以我试图从 .wav 文件中提取不同样本的幅度,以便能够根据时间重建波形。在研究 .wav 文件的格式时,我发现了一些非常有用的信息。但是,当涉及到原始数据部分时,我感到很困惑。我发现的文章说,“在 16 位 PCM 的情况下,16 位样本存储为 2 的补码无符号整数,范围从 0 到 65535"。我很困惑,因为如果文件没有符号,我不知道文件如何区分正振幅和负振幅。例如,如果一个振幅是 5,表示为二进制的 00000000 00000101,那么使用 2 的补码 -5应该表示为 11111111 11111011 ,它是十进制的 65531 作为整数。这让我认为 -5 的幅度被认为比 +5 幅度大得多。显然这不是它的工作原理,所以我做错了什么?另外,当我将 .wav 文件保存到二进制数组并输出值时,我得到负数!如果文章说只应该存储 0 到 65535 之间的值,这些负数是从哪里来的。只是很困惑,真的需要把事情弄清楚。我所指的文章的链接附在下面。作者所说的引述在页面的最底部。谢谢。

http://www.ievs.ch/projects/var/upload/Documentation%20Microsoft%20Wave%20File%20Format.pdf

【问题讨论】:

  • 1111111111111011 不是 -5 和 65531 - 如果解释为有符号整数(它是),它是 -5,如果解释为无符号整数(它不是),它是 65531。
  • “2's-complement unsigned”在术语上不是矛盾的吗?
  • @kaya3。但是根据文章,它被存储为无符号整数,这就是我感到困惑的地方。文章是不是不正确?
  • 正如 khelwood 所说,没有“二进制补码无符号整数”之类的东西,所以这篇文章明显不正确。

标签: java audio wav twos-complement javax.sound.sampled


【解决方案1】:

我建议通过AudioSystem 方法将.wav 数据导入Java,而不是尝试处理原始字节。一旦引入,利用适当的AudioFormat,就无需处理数据的标头或任何类型的数据包组织信息。

当我以这种方式引入数据时,解码后的 PCM 将存储为签名短裤。因此它的范围从 -32768 到 32767。如果是 16 位编码,则从两个字节中获取值,按bigEndian 标志指定的顺序组装。

https://docs.oracle.com/javase/9/docs/api/javax/sound/sampled/AudioFormat.html

第二个问题是单个 PCM 值可能不应被视为音量的有用指示。相反,音量通常是通过对信号进行RMS (root-mean-square) 分析来确定的。

周期函数在所有时间上的 RMS 等于 一个时期的功能。连续函数的 RMS 值或 信号可以通过取一个样本的 RMS 来近似,包括 等距观察。

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多