2012-01-07 2 views
2

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

Я не могу использовать какие-либо приложения на Торговой площадке, так как я не могу быть уверен, что пользователь установит его на своем телефоне, например. 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 
+0

Я предполагаю, что вы пытаетесь получить уровень сигнала в дБ? В этом случае 0db является максимальным, а все остальное отрицательным. Однако, если вы пытаетесь измерить SPL, это невозможно. Ваше приложение не знает о микрофоне, структуре усиления в аудиоустройстве и т. Д. Вам нужно будет предоставить свой собственный метод калибровки. – Brad

+0

Если все остальное отрицательно, как я могу получить от него значение дБ? – Neeta

+0

это * есть * действительный, но не уровень звукового давления ... скорее, это уровень сигнала относительно номинального (0 дБ, наивысший отображаемый уровень сигнала). Уровень звукового давления, измеренный в дБ, полностью отличается от уровня сигнала, измеренного в дБ. Измерения в дБ являются просто измерениями относительно чего-то другого. Опять же, без калибровки микрофона/устройства вы не можете преобразовать уровень сигнала в SPL. – Brad

ответ

1

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

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

EDIT (на основе сотрудничества и дополнительный код):

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

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

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

EDIT (на основе последней версии кода):

Поскольку размер выборки составляет 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); 

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

+0

У меня есть необработанные байты pcm, как эта ссылка, которую вы указали, но когда я использую вашу формулу, она выходит с бесконечностью:/Поскольку я записываю, я использую последние 2 байтовых значения в массиве байтов, это неправильно? – Neeta

+0

, если вы используете getAudioFormat, который скажет вам, есть ли звук 8 бит или 16 бит ... оттуда, вы знаете, если вы должны использовать только 1 байт или 2. Вероятно, вы должны отлаживать, посмотрев, какое значение вы получаете в данных , сделайте математику вручную и убедитесь, что ваш код делает правильную вещь (сообщение, если вы не уверены) – Matthieu

+0

Я обнаружил, что получаю звук в 16 бит. Я скопировал формулы, которые я использую выше, и я не уверен, что мои результаты верны. – Neeta

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

  • Нет связанных вопросов^_^