2013-11-26 130 views
3

首先,我得到了一個項目來更改WAVE文件的頻率,我需要在Java中這樣做。將音頻採樣字節數組更改爲頻率

我已經在java中使用AudioSystem來獲取音頻數據的字節(不包括文件頭)。現在我得到一組數據字節,我想從時域將其更改爲頻域,並且在操作頻率後,我想將其更改回時域。下面的代碼:

public byte[] getWAVByte(){ 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 

    try{ 
     File f = new File("audio.wav"); 
     AudioInputStream in = AudioSystem.getAudioInputStream(f); 

     int read; 

     byte[] buff = new byte[(int)f.length()]; 
     while ((read = in.read(buff)) > 0) 
     { 
      out.write(buff, 0, read); 
     } 
     out.flush(); 
     byte[] audioBytes = out.toByteArray(); 

     return audioBytes; 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

} 

現在,我已經在audioBytes字節數組,我想把它變成在頻域的字節另一個數組。我已經讀過你可以用傅里葉變換來完成它,但是我的老師說它非常複雜,並且不在我的項目範圍內。那麼還有其他方法可以做到嗎?或者是否有任何Java庫可以幫助我獲得頻域中的字節數組?

+2

[使用Java中的傅立葉變換處理音頻數據](http://stackoverflow.com/questions/962426/proce在音頻數據使用傅立葉變換在Java) – Bludzee

+1

你說「我有一個項目來改變一個WAVE文件的頻率」正確的方式來做到這一點並不簡單,你似乎想要一個音高偏移,簡單而不正確的方法是以不同的採樣率播放您的音頻,但這會改變音頻的速度,您可以在頻域中執行此操作,並且您需要計算FFT ... – ederwander

+0

是的,我已嘗試過改變採樣率,但它變得更快,對我來說變得相當嘈雜。 我也試圖通過改變每兩個字節到一個短的類型操縱數據字節,並操縱它,然後把它變回字節,但它似乎改變幅度(它變得更響,如果我多了兩個,聲音褪色如果我將它除以兩) – catherine

回答

0

Stephan M. Bernsee寫在頻域如何做,你可以找到你的源代碼下載在C中,一個人做了一個端口到Java到你的運氣!

http://svn.assembla.com/svn/mm1ws08/Abgabe2/src/Effects/PitchShift.java

是啊,如果你多或者你你只是增加或減少的幅度信號,改變頻率的時域的字節數組將一個值,你需要找到聲門位置點擊,申請一個居中的窗口覆蓋每個聲門位置,現在將每個窗口移動到新的時間位置,在這一步中,您可以添加或排除某個窗口,這將更改信號的頻率,並最終在所有窗口聲門上進行重疊添加,這種方法被稱爲PSOLA