Java中最快和最有效的音频上采样例程

Posted

技术标签:

【中文标题】Java中最快和最有效的音频上采样例程【英文标题】:Fastest and most efficient upsampling routine for Audio in Java 【发布时间】:2011-04-11 23:30:51 【问题描述】:

我需要将音频样本从 11025 和 22050 转换为 44100;我正在寻找最快和最好听的转换程序。我要求用纯 Java 给出答案,而不需要外部例程或库。源是一个代表左右声道的短值数组,像这样交错LRLRLRLR 我听说高斯变换是最好的,但它是 CPU 杀手。 更新 为了添加更多细节,我想要最好和最快的混合。答案将提供适合近实时通信的出色音频。 更新 2 我正在寻找一些简短的代码示例,应该是您音频大师的 ez 点

【问题讨论】:

我认为我需要的公式在此页面上,但我不是数学专家。有没有数学爱好者想发表评论? particle.kth.se/~lindsey/JavaCourse/Book/Part1/Tech/Chapter07/… 您必须在最快或最佳之间做出选择。 最快解决方案就像只是复制样本,而对于最好你可以想象任何量的计算,甚至可能是一个了解什么的人工智能听到并知道它应该听起来如何:) 你不可能同时需要两者。一个合理的约束(比如适合实时)可能会得到更多的答案。如果您准备使用特定的算法,请更改您的问题标题以反映这一点。 【参考方案1】:

您可以(最终)在用 0 填充每个其他样本后使用冷杉 - 您将上采样 2 或 4。这对于实时来说将非常快。大多数应用程序的音频质量都很好。

【讨论】:

我不确定,但是用零填充所有其他样本可能听起来很奇怪...它可能应该重复这些值。 即使在对嵌入的零应用 FIR (en.wikipedia.org/wiki/Finite_impulse_response) 过滤器之后,这听起来还是很奇怪吗? @Frank 和 Roland Illing 你可能没有意识到复制样本(假设信号上采样了一个已被零填充的整数)可以用一个非常简单的 fir 完美实现:所有值 = 1 ,长度=上采样量(在这种情况下为 2 或 4)。在实践中,最好使用更长的窗口函数(例如,sinc 或 Hamming)。过滤器填补了空白,并用作内插器。哪个功能“最好”取决于信号以及您想要(或不想要)的特性。【参考方案2】:

嗯,很难以足够慢的速度重新采样,以至于它不是实时的 :-) 最好且仍然快速的解决方案之一是进行正向 FFT,然后以您需要的任何采样率进行反向 FFT。

您可以自行实现,也可以复制粘贴任何 FFT 实现。

这可能会像 100 倍实时或更快,不确定您是否需要 1000 倍更快(在这种情况下,您可以使用线性或双三次插值):-)

【讨论】:

以上是关于Java中最快和最有效的音频上采样例程的主要内容,如果未能解决你的问题,请参考以下文章

音频格式转换器哪个最快最好用

如何在 AVCaptureSession 上设置音频采样率?

音频重采样实现原理

HarmonyOS之深入解析音频的功能和使用

C++ 将原始音频从 22050 上采样到 48000 Hz

语音处理:音频入门之基础概念总结