2010-05-27 3 views
8

Я использую класс AudioRecord для анализа необработанных байтов pcm, как это происходит в микрофоне.Android PCM Bytes

Так что это хорошо работает. Теперь мне нужно преобразовать байты pcm в decibel.

У меня есть формула, которая воспринимает звуковое давление в Па в дБ.

дБ = 20 * log10 (Па/исх Па)

Таким образом, вопрос байты я получаю от audiorecorder из буфера, что это является его амплитуда звукового давления паскаль или что.

Я попытался положить значение в тэ формулу, но она возвращается с очень высота дБ, так что я не думаю, что его правая

благодаря

+0

1+ Оцените это всем, чтобы получить дополнительную информацию. Спасибо всем. – Terrance

+0

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

ответ

11

Отказ от ответственности: я мало знаю об Android.

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

Вы можете вычислить значение децибел (относительно пика) каждого образца первой принимает нормализованное абсолютное значение образца и передать его в вашу функцию Db:

float Db = 20 * log10(ABS(sampleVal)/32768) 

Значение вблизи пика (например, +32767 или -32768) будет иметь значение Db около 0. Значение 3277 (0,1) будет иметь значение Db -20; значение 327 (.01) будет иметь значение Db -40 и т. д.

+0

Hi Черт возьми, все это работает с этой формулой. Значения составляют +32767 или -32768. – Pintac

+0

Один вопрос только для того, чтобы поместить мой разум в res. Какая единица измерения - sampleValue – Pintac

+4

Строго говоря, значение выборки представляет собой мгновенный выход напряжения от микрофона (где +32767 представляет максимальное положительное напряжение, а -32768 - минимальное отрицательное напряжение). Из-за того, как работают микрофоны, это напряжение связано с * изменениями * в звуковом давлении из местного среднего значения - когда микрофон записывает звук, давление воздуха вокруг микрофона слегка увеличивается вверх и вниз, что перемещает мембрану назад и вперед, создавая переменное положительное, а затем отрицательное напряжение. АЦП (аналого-цифровой преобразователь) считывает это напряжение 44100 раз в секунду ... – MusiGenesis

1

Проблема, скорее всего, определение «эталонного» звукового давления на микрофоне. Я понятия не имею, что это будет или если он доступен.

Единственное аудиоприложение, которое я когда-либо использовал, определял 0db как «полный том», когда образцы находились в значении + или - max (в беззнаковых 16 бит, которые были бы 0 и 65535). Для того, чтобы получить это в БД я бы, вероятно, сделать что-то вроде этого:

// assume input_sample is in the range 0 to 65535 
sample = (input_sample * 10.0) - 327675.0 
db = log10(sample/327675.0) 

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

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

+1

Закрыть, кроме образцов PCM * * подписан * 16-разрядный (так что вам не требуется вычитание смещения). Также - по крайней мере в моей юниверсе - вы не можете взять журнал отрицательного числа. :) – MusiGenesis

+0

Ха-ха, хорошие моменты. Они всегда подписываются? Я, конечно же, думал, что когда-то мне приходилось иметь дело с данными PCM, которые были неподписанными (возможно, это было бы неправильно, конечно). –

+0

Я должен был сказать, что PCM * обычно * подписан - 1-байтовый формат для PCM и RAW PCM (например, то, с чем вы, вероятно, работали), без знака, но они довольно редки в дикой природе (CD-звук подписан). – MusiGenesis

2

Расчетное давление в расчетах уровня Leq (уровень звукового давления) составляет 20 микропаскалей (среднеквадратичное значение). Чтобы измерить абсолютные уровни Leq, вам необходимо выполнить калибровку микрофона с помощью калибратора. Большинство калибраторов подходят для капсул с микрофоном 1/2 "или 1/4", поэтому я сомневаюсь в калибровке микрофона на телефоне Android. В качестве альтернативы вы можете использовать чувствительность микрофона (Pa/mV), а затем откалибровать уровень напряжения, поступающего в АЦП. Еще менее надежные результаты можно сравнить со сравнением значений Android с измеренным уровнем звука диффузного стационарного звукового поля с помощью измерителя уровня звука. Обратите внимание, что в расчетах Leq вы обычно используете значения RMS. Значение одного образца мало значит.

+0

Что я на самом деле хочу делать с db, - это выяснить громкость (нагрузка) звука, если она выше определенного объема (loadness in db). Я хочу что-то сделать. У меня есть справочная таблица db's http://en.wikipedia.org/wiki/Sound_pressure#Examples_of_sound_pressure_and_sound_pressure_levels – Pintac

+1

Так или иначе вам нужно будет откалибровать систему. По крайней мере, вам нужно будет сравнить ваши рассчитанные значения с известным уровнем звука. Значения, приведенные в записи в Википедии, являются, скорее всего, A-взвешенными уровнями звука, где уровень звука в каждой октавной полосе взвешен, чтобы привести к общему значению. Лек обычно указывается для каждой октавной полосы. – Han

+0

значение выборки, которое я получаю, составляет от +32767 до -32768, какой единицей является это амплитудное звуковое давление вольт-ват ... – Pintac

2

Я держал свой измеритель уровня звука рядом с микрофоном на моем Google-ионе и пошел «Woooooo!'и отметил, что отсечение произошло около 105 дБ spl. Надеюсь это поможет.

1

Единицы - это единицы, которые используются для эталонного чтения. В формуле чтение делится на контрольное показание, поэтому единицы сокращаются и больше не имеют значения.

Другими словами, децибелы - это способ сравнения двух вещей, это не абсолютное измерение. Когда вы видите, что оно используется так, как будто оно абсолютное, тогда сравнение происходит с самым тихим звуком, который слышит средний человек.

В нашем случае это сравнение с максимальным показанием ручек устройства (таким образом, каждое другое показание отрицательное или меньше максимального).