繁体   English   中英

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

[英]resample / upsample sound frames from 8Khz to 48Khz (Java/Android)

我正在尝试为 andriod 开发的应用程序以 48Khz(PCM 16 位和单声道)记录帧并将它们发送到网络。 此外,还有一个 8Khz 的传入音频流。 因此,我接收 8Khz 采样帧并播放它们(我的 AudioTrack 对象设置为 8Khz),但是在播放它们时,一切正常,但延迟很大。 大约需要 3 秒钟,直到你听到什么。

我认为如果我将接收到的帧从 8Khz 上采样到 48Khz 并播放它们,就不会有这么大的播放延迟。 事实上,当我以相同的速率记录和播放帧时,延迟非常低。 不好的是,我被迫这样做:发送到 48Khz 并接收到 8Khz。

如前所述,我试图将声音帧(16 位 PCM)从 8Khz 上采样到 48Khz。 有没有人知道 Java 中执行此操作的任何例程/库/API?

我知道有关对谨慎信号进行上采样的基础知识,但我认为设计和实现我自己的 FIR 滤波器并将其与音频流进行卷积......太过分了。 此外,这超出了我的知识范围。

所以……有人能帮我解决这个问题吗?? 有人知道我可以使用的 Java 库/例程吗? 任何建议或替代方案?

一个快速而肮脏的解决方案是线性插值。 由于您总是以六倍的系数进行采样,因此这真的很容易做到:

它有点像这样(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 这样的 ac 重采样库,并使用 JNI 从 java 调用它。 那会快很多。 编写 JNI 代码是大多数人回避的事情,但它很容易.. NDK 有很多示例。

http://www.mega-nerd.com/SRC/index.html

线性插值引入了伪影。 有一个很好的带有高质量重采样的 java 库 - JSSRC ( http://jssrc.khadkevich.org/ )。

该代码现已在 Github 上提供: https : //github.com/hutm/JSSRC

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

这个虽然工作得很好: https : //github.com/JorenSix/TarsosDSP

这是一个在 Android 上运行的大型纯 Java 库(没有 javax.sound 依赖项)并且可以做很多事情,但是如果你只使用包 be.tarsos.dsp.resample 中的 FilterKit、Resampler 和 SampelBuffers 类,它就可以工作非常好,易于使用。

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

至于 TarsosDPS 不需要 javax

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM