将声音帧从8KHz重新采样/上采样到48KHz(Java / Android)

6
我正在开发一个安卓应用程序,它以48Khz (PCM 16位和单声道)的速率记录帧并将其发送到网络。此外,还有一个8Khz的音频流输入。因此,我接收到的是8Khz采样的帧并播放它们(我的AudioTrack对象设置为8Khz),但是当播放它们时,一切都正常,但延迟非常大。需要大约3秒钟才能听到声音。
我认为,如果我将接收到的帧从8Khz上采样到48Khz并播放它们,就不会有这么大的播放延迟。事实上,当我以相同速率记录和播放帧时,延迟非常低。坏的是,我被迫以这种方式进行:发送到48Khz并接收到8Khz。
如前所述,我正在尝试将一个声音帧(16位PCM)从8Khz上采样到48Khz。有人知道在Java中可以完成这个任务的例程/库/API吗?
我知道有关上采样离散信号的基础知识,但我认为设计和实现自己的FIR滤波器并将其与音频流卷积...太多了。而且,这超出了我的知识范围。
那么...有人能帮助我吗?有人知道我可以使用的Java库/例程吗?有什么建议或替代方案吗?

4
@juergen,如果你要顶起一个老问题来修正“thanks in advanced”中的拼写错误,那么至少应该完全删除这个短语,因为它是没有价值的,并且修复其他的拼写错误。 - Nathan Tuggy
4个回答

5

一种快速而简单的解决方案是线性插值。由于您总是以6的倍数进行采样,因此这非常容易做到:

它的工作方式有点像这样(C代码,未经测试,我没有正确处理最后一次迭代,但我认为它显示了这个想法)。

void resample (short * output, short * input, int n)
{
  // output ought to be 6 times as large as input (48000/8000).

  int i;
  for (i=0; i<n-1; i++)
  {
    output[i*6+0] = input[i]*6/6 + input[i+1]*0/6;
    output[i*6+1] = input[i]*5/6 + input[i+1]*1/6;
    output[i*6+2] = input[i]*4/6 + input[i+1]*2/6;
    output[i*6+3] = input[i]*3/6 + input[i+1]*3/6;
    output[i*6+4] = input[i]*2/6 + input[i+1]*4/6;
    output[i*6+5] = input[i]*1/6 + input[i+1]*5/6;
  }

线性插值不会给你带来很好的音质,但它便宜且快速。如果您想改进,可以使用三次样条插值。
如果您想要快速高质量的重采样,我建议您使用Android-NDK编译类似libresample的C重采样库,并使用JNI从Java调用它。这将会更快。编写JNI代码是大多数人回避的事情,但它相当容易。NDK有许多关于此的示例。 http://www.mega-nerd.com/SRC/index.html

2

1
你帮我省去了很多麻烦。你提供的网站已经无法访问,这里是存档链接 https://web.archive.org/web/20130902203226/http://jssrc.khadkevich.org ,还有Github代码库链接 https://github.com/hutm/JSSRC。 - kc ochibili

1

我无法使大多数库正常工作(https://github.com/hutm/JSSRChttps://github.com/simingweng/android-pcm-resamplehttps://github.com/ashqal/android-libresample)。它们在生成的音频中都存在问题,或者仅仅无法从48000Hz转换为44100Hz(这是我所需要的)。

然而,这个库完美地工作: https://github.com/JorenSix/TarsosDSP

这是一个功能强大的纯Java库,适用于Android(没有javax.sound依赖),可以做很多事情。但如果你只使用be.tarsos.dsp.resample包中的FilterKit、Resampler和SampelBuffers类,它非常好用且易于使用。


0

TarsosDPS库对我的需求来说太重了,但我发现重新采样工具最初是作为一个更轻的3类库发布的:https://github.com/dnault/libresample4j

至于TarsosDPS,无需javax。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接