Я использую класс AudioRecord, чтобы проанализировать сырые данные pcm байты, как это прибывает в микрометр.
Таким образом, это работает приятно. Теперь я должен преобразовать pcm байты в децибел.
У меня есть формула, которая берет звук, предуверенный в Pa в дб.
дб = 20 * log10 (Pa/ref Pa)
Таким образом, вопросом являются байты, я получаю от магнитофона от буфера, что является им, это амплитудное звуковое давление Паскаля или что.
Я попробовал к помещению значения в te формулу, но это возвращается с очень высоким дб, таким образом, я не думаю его право
спасибо
Предупреждение: я мало знаю об Android.
Ваше устройство, вероятно, записывает в моно со скоростью 44 100 выборок в секунду (возможно, меньше), используя два байта на выборку. Итак, ваш первый шаг - объединить пары байтов в исходных данных в двухбайтовые целые числа (я не знаю, как это делается в Android).
Затем вы можете вычислить значение в децибелах (относительно пика) каждой выборки, сначала взяв нормализованное абсолютное значение выборки и передав его функции Db:
float Db = 20 * log10(ABS(sampleVal) / 32768)
Значение около пика (например, +32767 или -32768) будет иметь значение Db около 0. Значение 3277 (0,1) будет иметь значение Db -20; значение 327 (0,01) будет иметь значение Db -40 и т. д.
Эталонное давление в расчетах Leq (уровень звукового давления) составляет 20 микропаскалей (среднеквадратичное значение). Для измерения абсолютных уровней Leq необходимо откалибровать микрофон с помощью калибратора. Большинство калибраторов подходят для микрофонных капсюлей 1/2" или 1/4", поэтому у меня есть сомнения по поводу калибровки микрофона на телефоне Android. В качестве альтернативы вы можете использовать чувствительность микрофона (Па/мВ), а затем откалибровать уровень напряжения, поступающего в АЦП. Еще менее надежные результаты можно получить, сравнив значения Android с измеренным уровнем звука диффузного стационарного звукового поля с помощью измерителя уровня звука. Обратите внимание, что при расчетах Leq обычно используются среднеквадратичные значения. Значение одного образца мало что значит.
Проблема скорее всего в определении «эталонного» звукового давления на микрофоне. Я понятия не имею, что это будет и есть ли в наличии.
Единственное звуковое приложение, которое я когда-либо использовал, определяло 0 дБ как «полную громкость», когда выборки были на + или - максимальном значении (в 16 битах без знака это были бы 0 и 65 535). Чтобы поместить это в базу данных, я, вероятно, сделал бы что-то вроде этого:
// 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 между нулевыми пересечениями, опять же то, о чем я мог только догадываться, потому что я понятия не имел, как это на самом деле работает .
Я поддержал мой счетчик звука прямо рядом с микрофоном на моем Google Ion и пошел «Woooooo!» и отметил, что отсечение произошло примерно на 105 дБ звукового давления. Надеюсь это поможет.