生成音频波形

时间:2017-02-19 15:33:28

标签: java audio

这篇文章更多的是关于澄清而不是实现某种音频波形算法。我已经阅读过关于这个主题的无数帖子(无论是在SO上还是在网上),以及我收集到的内容:

  • 在16位WAV的上下文中,我想将每两个字节读取为short,这将导致-32768到32767之间的值。
  • 采样率为44.1kHz,我每隔一秒音频就有44,000个样本。

这很简单,但我有以下问题:

  • 以单声道呈现的WAV只有一个通道,即每帧两个字节的信息。在立体声中,这变成四个字节的信息。在我的情况下,我不需要显示两个频道,所以我只是跳过右边的频道而只读左边的?我读过的一些解决方案提到了左右声道的组合,但我不确定这是否是必需的。
  • 说我有一个两秒钟的音频文件,另一个是三十秒长的音频文件。如果我需要抓取至少800个样本来表示波形,那么沿文件长度抓取800个样本会引入准确性问题,例如: {2}用于第二个音频文件,(44,000 * 2) / 800用于第30个音频文件。

真的很感激解释!

1 个答案:

答案 0 :(得分:1)

这超出了我的专业领域,但我会试一试。

据我所知,您可能会跳过一些样本并保持合理的准确度 - 如果您跳过43 kHz文件中的所有其他样本,就好像您在22.05 kHz下录制原始样本一样。但是,根据Wikipedia,当您的采样频率小于您采样声音的某个分量的频率的两倍时,会遇到精度问题。除非你的音频中有高音调的铃铛和钹,否则在22.05 kHz时这可能不是什么大问题。但如果你每30秒只采样800次,那么处理器官的最低音符就不足以处理。

想象一下,你每秒采样800次,并且有800 Hz的声音(高于G或高于C的G#)。每次你采样,你都会得到那波在完全相同的点上。您正在采样的波形中的那个位置可能是峰值点,或者它可能是一个低点。如果不经常采样,你就不可能知道。

至于您是否只能采样一个频道,这取决于您是否可以忽略其他频道。想象一下立体声文件,右侧有声音,左侧有音乐。他们会有不同的波形图。如果您可以忽略音乐,那么您可以采样右侧而忽略左侧。如果你需要两者,那么你显然需要对两者进行抽样。