因此,我试图从.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
答案 0 :(得分:0)
我建议通过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值或 信号的近似值可以通过以下公式得出: 等距观察。