2009-10-16 100 views
6

嗨,我需要將wav音頻文件的採樣率從44.1kHz下采樣到8kHz。我必須用字節數組手動完成所有工作......這是爲了學術目的。Java - 下采樣wav音頻文件

我目前使用2個類Sink和Source來彈出和推送字節數組。一切都很順利,直到我到達需要使用線性插值對數據塊進行下采樣的部分。

由於我從44100下降採樣到8000赫茲,我如何內插一個字節數組,包含128萬000字節的東西?現在我彈出5,6或7個字節,取決於i%2 == 0,i%2 == 1和i%80 == 0,並將這5,6或7個字節的平均值推入新文件。

結果確實比原來的音頻文件要小,但它無法在Windows媒體播放器上播放(說閱讀文件時出現錯誤),雖然我可以聽到正確的音軌噪音。

因此,總結一下,我需要關於線性插值部分的幫助。提前致謝。

+0

如果您發佈了您現在使用的代碼,那麼我們可以更輕鬆地幫助您查找錯誤。 – 2009-10-16 18:56:49

回答

7

我認爲你不應該使用這些樣本的平均值,因爲這將是一箇中值濾波器,而不是完全的下采樣。只需使用每個5/6/7樣本並將其寫入新文件。

這可能會有一些別名僞影,但可能總體上是可識別的。

另一個更復雜的解決方案,但可能是一個更好的結果,質量明智的,將首先將您的樣本轉換爲使用FFT或DFT的頻率分佈,然後將其轉換回適當的採樣率。我已經做了這麼一段時間,但它確實可行。不過,您可能需要繞過一些才能正常工作。

另外,當沒有完全陣列的金融時報,而是在細分市場,你有段邊界爲0的問題。幾年前,當我玩這些東西,我沒有拿出一個可行的解決方案這個(因爲它也會產生文物),但是如果你閱讀正確的書籍可能有一個:-)

至於WMP抱怨文件:你確實修改相應的頭文件吧?

+0

平均值可能是一個糟糕的主意是的。如果您希望獲得的工件數量少於從櫻桃採摘樣本中獲得的工件數量,那麼您只需進行上採樣然後下采樣。 – 2009-10-16 19:00:25

+2

哇!非常感謝你「每使用5/5/6/7樣本並將其寫入新文件」就是糾正了我的整個問題! 不敢相信我花了幾個小時,而花了你2分鐘的時間寫出來!再次感謝! – 2009-10-16 19:01:19

+1

不客氣:-)如果你考慮一下,平均值是一個非常糟糕的主意。波形的完整整體形狀會丟失。這對我們來說真的很重要:) – Joey 2009-10-16 19:04:27