2010-09-14 70 views
4

我需要将音频采样从11025和22050转换为44100;我正在寻找最快和最好的冠冕堂皇的转换程序。我需要用纯Java来给出答案,而不需要外部例程或库。来源是代表左右声道的短数组的数组,像这样交错LRLRLRLR
我听说高斯转换是最好的,但它是一个cpu杀手。

更新
要添加更多的细节,我想一个最佳组合之间最快的。答案会给出适合接近实时通信的出色音频。
更新2
我正在寻找这一个有些短码的例子,应该是宰点对您的音频大师的用于Java音频的最快且最高效的升频采样例程

+0

我认为我需要的公式是在这个页面上,但我不是一个数学家伙。那里的任何数学爱好者都喜欢评论? http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Tech/Chapter07/genDists.html – 2010-09-14 18:09:19

+7

您将不得不在最快或最好之间做出选择。 *最快的*解决方案就像是复制样本,而*最好*你可以想象*任何*的计算量,甚至可能是一个理解所听到的声音并知道声音如何响应的AI。你不可能同时需要与此同时。一个合理的约束(如适合实时)可能会得到更多的答案。如果您为特定的algorytm设置,请更改您的问题标题以反映该问题。 – Durandal 2010-10-10 23:01:57

回答

1

你可以(最终)只使用一个FIR填充后每个其他样本都是0 - 您正在向上采样2或4.这对于实时来说会很快。音频质量对于大多数应用都会很好。

+0

我不确定,但用零填充每个其他样本可能听起来很奇怪* ...它应该可能重复值。 – Frank 2010-10-16 03:26:34

+0

即使在对嵌入的零应用FIR(http://en.wikipedia.org/wiki/Finite_impulse_response)过滤器后,这听起来不是很奇怪吗? – 2010-10-17 00:22:10

+0

@Frank和Roland如果你可能没有意识到复制样本(假设一个信号被零填充的整数上采样)可以用一个非常简单的fir完美实现:所有值= 1,长度=上采样量(2)在这种情况下为4)。在实践中,最好使用更长的窗口函数(例如sinc或Hamming)。滤波器填充间隙,并充当插补器。哪个功能是最好的取决于信号,以及你想要(或不要)的特性。 – justin 2010-10-19 06:47:10

1

嗯,这是很难重新取样,足够慢,所以它不实时:-) 其中一个最好的&仍然快速的解决方案是做前向FFT,然后做任何您需要的采样率反向FFT。

你可以自己实现这个,或者复制&粘贴任何FFT实现。

这可能会实现像100X实时或更快,不知道你需要快1000倍(在这种情况下,你可以去为线性或双三次插值):-)