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