0

所以我试图从 .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

4

1 回答 1

0

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

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

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

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

一个周期函数的所有时间的 RMS 等于该函数一个周期的 RMS。连续函数或信号的 RMS 值可以通过取由等间距观测值组成的样本的 RMS 来近似。

于 2020-03-10T18:29:37.003 回答