2010-06-30 54 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