2010-06-30 3 views
4

Прежде всего, я работаю над небольшим проектом, чтобы увидеть спектр из некоторых звуков.Java spectrogram images: 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.

Это мои настройки:

  • Частота дискретизации: 44100
  • бит на сэмпл: 8
  • Каналы: 1 (моно)
  • подписанного: истинный
  • большой Endian: истинный (я использую AudioFormat в Java)
  • tempBuffer для чтения аудио: 10000 (байт tempBuffer [] = новый байт [10000];)
  • и для FFT я разделить аудио в chuncks 4096 (должен быть мощностью 2)

Кстати: эти настройки нормально, или я должен использовать 16bps или стерео или 10000 для слишком много буфера или 4096 на малый/большой?

Заранее спасибо

ответ

3

MP3 - это сжатый аудиоформат. Сначала вы должны распаковать данные, прежде чем сможете использовать их в качестве аудиопотока, сравнимого с данными вашего микрофона. Необработанные данные в формате MP3 имеют максимальную энтропию и должны сильно напоминать белый шум, который он делает в вашей спектрограмме.

+0

Я всегда получаю исключение GC OutOfMemoryException. Является ли мой буфер (10000) слишком большим (некоторые исследования и большинство людей принимают 10000). Я использовал MP3 SPI-библиотеку для декодирования mp3 (теперь он работает, но все еще имеет слишком много данных хмм) – juFo

Смежные вопросы