Получить значения децибел во время записи звука?

Есть ли способ получить значение звука в децибелах во время записи? я использую 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 ответ

Используя 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 подходить туда, где не должно быть.

Другие вопросы по тегам