Получить значения децибел во время записи звука? - PullRequest
2 голосов
/ 07 января 2012

Есть ли способ получить значение звука в децибелах во время записи?Я использую MediaRecorder для записи звука в данный момент

Я не могу использовать какие-либо приложения на Marketplace, так как не могу быть уверен, что пользователь установит его на свой телефон, например Audalyzer

Я использую следующие формулы, но не уверен, что они правильные или мои результаты верны!

short data[] = new short[bufferSize];
read = recorder.read(data, 0, bufferSize);
double p2 = data[data.length-1];
System.out.println("p2: " + p2);
double decibel;

if (p2==0)
   decibel=Double.NEGATIVE_INFINITY;
else
   decibel = 20.0*Math.log10(p2/65535.0);
   System.out.println("p2/65535: " + (p2/65535.0));

System.out.println("decibel: " + decibel);

Текущие результаты:

    01-11 16:43:03.821: I/System.out(14530): p2: 0.0
01-11 16:43:03.821: I/System.out(14530): p2/65535: 0.0
01-11 16:43:03.821: I/System.out(14530): decibel: -Infinity
01-11 16:43:03.911: I/System.out(14530): p2: 0.0
01-11 16:43:03.911: I/System.out(14530): p2/65535: 0.0
01-11 16:43:03.911: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.001: I/System.out(14530): p2: 0.0
01-11 16:43:04.001: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.001: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.091: I/System.out(14530): p2: 0.0
01-11 16:43:04.091: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.091: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.191: I/System.out(14530): p2: 0.0
01-11 16:43:04.191: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.191: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.281: I/System.out(14530): p2: 0.0
01-11 16:43:04.281: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.281: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.371: I/System.out(14530): p2: 0.0
01-11 16:43:04.371: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.371: I/System.out(14530): decibel: -Infinity

1 Ответ

2 голосов
/ 07 января 2012

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

Этот , кажется, тоже относится к тому же вопросу (и имеет формулу для расчета)

РЕДАКТИРОВАТЬ (на основе комментариев и дополнительного кода):

Теперь, переменная data [], которую вы используете, объявлена ​​ли она как массив, байты или шорты? Это изменит то, какая из функций read () будет использоваться. Если вы объявите это как шорты, то это позаботится о ваших 16 битах. Если вы объявите его как массив байтов, вам придется объединить два последовательных байта.

Вам не нужно беспокоиться об отрицательных и положительных значениях, вы просто должны объявить data [] как массив «unsigned short».

Вы должны понимать, что значение в децибелах сравнивает ваш текущий объем с чем-то другим. Я не совсем эксперт, но я считаю, что большую часть времени вы сравниваете его с максимально возможной амплитудой. Я полагаю, что прямо сейчас вычисление, которое вы делаете, сравнивает две последовательные выборки, поэтому значение довольно низкое ... Вместо p1 используйте значение 65535 (это максимально возможное значение). Тогда вы должны увидеть, что значение децибела является отрицательным значением, когда ничего нет, и должно увеличиваться с шумом (но все равно оставаться отрицательным).

РЕДАКТИРОВАТЬ (на основе последнего кода):

Поскольку размер выборки составляет 16 бит, используйте шорты ...

short buffer[] = new short[bufferSize];
read = recorder.read(buffer, 0, bufferSize);
double p2 = data[data.length-1];
double decibel;
if (p2==0)
    decibel=Double.NEGATIVE_INFINITY;
else
    decibel = 20.0*Math.log10(p2/65535.0);

Попробуйте напечатать все значения по пути (data [data.length-1], p2, p2 / 65535, Math.log10 (p2 / 65535) ... и т. Д.)), Где вы найдете 0 подходит там, где не должно быть.

...