2010-06-30 111 views
4

首先,我正在研究一個小項目,以從一些聲音中查看譜圖。Java譜圖像:mp3和麥克風

我買了一個麥克風這方面的工作: alt text http://img25.imageshack.us/img25/4271/spectrumanalyzerfourier.png

上面的圖片只是我說話,並通過幾秒鐘的話筒喊。這對我來說很好。

但是,當我嘗試讀取MP3文件並製作它的譜圖時,它看起來有點不同。我嘗試了Aphex Twin - Windowlicker,你通常應該在譜圖中看到一張臉,或者至少有一些更暗的顏色。但它看起來並不那麼好: alt text http://img10.imageshack.us/img10/3475/aphextwinhmm.png

以下是我與麥克風:

byte tempBuffer[] = new byte[10000]; 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
counter = 20; 

// Microphone 
while (counter != 0) { 
int count = line.read(tempBuffer, 0, tempBuffer.length); 
if (count > 0) { 
    out.write(tempBuffer, 0, count); 
} 
counter--; 
} 
out.close(); 

// FFT code below ... 
byte audio[] = out.toByteArray(); 
// ... 

這就是我如何與MP3做到這一點:

我用相同的代碼做轉換和可視化只有音頻捕捉部分是不同的(我只調整了繪製方法中的高度,以查看是否有差異,但沒有一個):

byte tempBuffer[] = new byte[10000]; 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
FileInputStream input = null; 

File mp3 = new File("Aphex Twin - Widowlicker.mp3"); 
input = new FileInputStream(mp3); 
int len; 
while((len = input.read(tempBuffer)) > 0) { 
out.write(tempBuffer, 0, len); 
} 

out.close(); 
input.close(); 

// FFT code below ... 
byte audio[] = out.toByteArray(); 
// ... 

這將是很好,如果有人可以指出我在做什麼錯誤的MP3文件。

這是我的設置:

  • 採樣率:8
  • 通道:1(單聲道)
  • 簽署:真
  • 大端:每個樣本44100
  • 位真(我在Java中使用AudioFormat)
  • tempBuffer讀取音頻:10000(byte tempBuffer [] = new byte [10000]; )
  • 併爲FFT我分裂在4096 chuncks音頻(必須是2的冪)

順便說一句:這些設置確定或我應該使用16bps或立體聲或者是10000的緩衝太多或4096小/大?

在此先感謝

回答

3

MP3是壓縮音頻格式。您應先解壓縮數據,然後才能將其用作與麥克風數據相當的音頻流。原始的MP3數據具有最大熵,應該看起來很像白噪聲,它在你的光譜圖中是這樣做的。

+0

我總是得到GC OutOfMemoryException。我的緩衝區(10000)是否太大(做了一些研究,大部分人都是10000)。 我用MP3 SPI庫來解碼mp3(它現在正在工作,但仍然有太多的數據嗯) – juFo 2010-06-30 17:42:12