Изображения спектрограммы Java: mp3 и микрофон - PullRequest
4 голосов
/ 30 июня 2010

Прежде всего, я работаю над небольшим проектом, чтобы увидеть спектр некоторых звуков.

Я получил это, работая с микрофоном: альтернативный текст http://img25.imageshack.us/img25/4271/spectrumanalyzerfourier.png

Изображение вышеэто просто я разговариваю и кричу через микрофон на несколько секунд.Это выглядит хорошо для меня.

Но когда я пытаюсь прочитать файл MP3 и сделать его изображение на спектрограмме, это выглядит немного иначе.Я попробовал Aphex Twin - Windowlicker, где вы обычно должны видеть лицо на изображении спектрограммы или, по крайней мере, некоторые более темные цвета.Но это выглядит не очень хорошо: альтернативный текст 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 (моно)
  • со знаком: true
  • big endian: true (я использую AudioFormat в Java)
  • tempBuffer для чтения аудио: 10000 (байт tempBuffer [] = новый байт [10000];)
  • и для FFT Iразделить аудио на куски по 4096 (должно быть степень 2)

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

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

1 Ответ

3 голосов
/ 30 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...