2010-09-14 68 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倍(在這種情況下,你可以去爲線性或雙三次插值):-)