16+位音频格式如何工作?

时间:2013-01-06 23:09:19

标签: java audio bytearray wav

我正在尝试用Java编写一些基本的声音编辑程序,但是我的16位WAVE文件格式遇到了很多麻烦。

当我问Java它认为我的声音文件有多少样本时,它给了我一个我预期的两倍的数字。当我告诉Java生成80000字节样本的正弦波时,它播放1秒而不是2秒(即使采样率约为每秒40000)。

经过一些搜索,我意识到我的文件的“帧大小”是2,“样本”实际上是2个字节而不是1个,这被称为16位音频文件。作为实验,我将声音文件写入一个字节数组,将每隔一个字节设置为0,然后播放结果。当我只保留奇数样本时,声音文件会播放一些静态噪音。当我只保留偶数时,静态噪声就会在没有声音文件的情况下自行播放。这让我觉得偶数字节包含奇数字节中静态的精确倒数,其中包含要播放的实际声音。当一起回放时,偶数字节使奇数字节中的静态静音,这增加了声音的保真度。

This website对16位声音编码的基础知识有很好的解释。但是,对我来说,继续开始逐字节编辑文件并不是很好。如何在保持较高保真度的同时对16位(或更大)声音文件进行逐字节编辑?对每个样本16位而不是仅仅8位编码声音的公式是什么?

1 个答案:

答案 0 :(得分:0)

  

如何对16位(或更大)声音文件进行逐字节编辑...?

这个问题没有任何意义。当你说“逐字节编辑”时,你真的应该说“逐个样本”。在这种情况下,每个样本都是16位(或两个字节),将样本分开是没有意义的。这就像尝试在文本编辑器中仅编辑每个字母的上半部分一样。

数字音频流的单个通道是一系列数字(例如,样本)。每个样本表示在某个时刻由声波施加在麦克风振膜上的压力。在8位声音文件中,只有256个可能的值,而在16位声音文件中,有65536个可能的值。 16位文件的分辨率要高得多。

  

这让我觉得偶数字节包含奇数字节中静态的精确倒数,其中包含要播放的实际声音。

有一个真实的核心。信号处理中“噪声”的定义是您听到的内容与您想要听到的内容之间的差异。当你将所有奇数字节清零时,你正在踩踏每个样本的低阶。通过更改样本,您引入了一些您不想听到的内容(即噪音)。当你将偶数字节清零时,你会杀死所有高阶位,因此杀死了大部分信号。保留在低位字节中的是您在第一次实验中引入的噪声的精确倒数。 (你的耳朵无法分辨出给定声波与同一声波的倒数之间的差异。)

样本值与压力之间没有绝对映射,但您应该知道以下几点:

1)样品是签名还是未签名?每个样本的值必须介于最小值和最大值之间。如果(16位)采样有符号,则最小值为-32768(0x8000),最大值为32767(0x7FFF),0位于中间。如果样本是无符号的,则最小值为0,最大值为65535(0xFFFF)。弄错了,你会马上知道,因为你会听到的只是巨大的噪音。

2)样品是否呈线性?样本值始终与某些内容成比例。如果它们与声压级成正比,则称为“线性编码”。但它们可能与声压的对数或声压的某些其他函数成比例。非线性编码几乎总是8位,并且它们通常仅在诸如电话之类的专门应用中遇到。如果您正在处理16位或更大的样本,那么它们几乎肯定是线性的。