Java谱图图像:mp3和麦克风

时间:2010-06-30 09:13:52

标签: java audio mp3 microphone

首先,我正在开展一个小项目,以便从某些声音中查看频谱。

我用麦克风工作了: 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做的方式:

我使用相同的代码进行转换和可视化,只有音频捕捉部分不同(我只调整了绘图方法中的高度以查看是否有差异,但没有一个):< / em>的

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文件中做错了,那就太好了。

这些是我的设置:

  • 采样率:44100
  • 每个样本的位数:8
  • 频道:1(单声道)
  • signed:true
  • big endian:true (我在Java中使用AudioFormat)
  • tempBuffer读取音频:10000(字节tempBuffer [] =新字节[10000];)
  • 对于FFT我将音频拆分为4096(必须是2的幂)

顺便说一句:这些设置是正常还是应该使用16bps或立体声,或者缓冲区是10000还是4096到小/大?

提前致谢

1 个答案:

答案 0 :(得分:3)

MP3是一种压缩音频格式。您应首先解压缩数据,然后才能将其用作与麦克风数据相当的音频流。原始MP3数据具有最大熵,应该看起来像白噪声,它可以用于谱图。