Как получить чтение децибел от iOS AVAudioRecorder в правильном масштабе?
Я пытаюсь получить уровень шума в моем приложении для iOS, используя AVAudioRecorder.
Код, который я использую:
[self.recorder updateMeters];
float decibels = [self.recorder averagePowerForChannel:0];
// 160+db here, to scale it from 0 to 160, not -160 to 0.
decibels = 160+decibels;
NSLog(@"Decibels: %.3f", decibels);
Показания, которые я получаю, когда телефон сидит на моем столе, составляют около 90-100 дБ.
Я проверил эту ссылку, и таблица, которую я там увидел, показывает, что:
Пылесос - 80дБ
Большой оркестр - 98дБ
Walkman на максимальном уровне - 100 дБ
Передние ряды рок-концерта - 110 дБ
Теперь, несмотря на то, что мой офис может показаться громким, он не возле сторожа на максимальном уровне.
Есть ли что-то, что я должен сделать здесь, чтобы получить правильные показания? Как кажется, микрофон моего iPhone очень чувствительный. Это iPhone4S, если это имеет значение.
1 ответ
Забудь мой предыдущий ответ. Я нашел лучшее решение (поправьте меня, если я ошибаюсь). Я думаю, что мы оба хотим достичь SPL децибела, но метод AveragePowerChannel дает нам выходное напряжение микрофона. Децибел SPL является логарифмической единицей, которая указывает отношение. Нам нужно преобразовать этот вывод в децибел SPL, что не так просто, потому что для этого вам нужны справочные значения. Другими словами, вам нужны значения DB SPL и соответствующие им значения напряжения. Вы также можете попытаться оценить их, сравнив свои результаты с таким приложением, как decibel Ultra. Чтобы перейти прямо к сути: вам нужна следующая формула:
SPL = 20 * log10(referenceLevel * powf(10, (averagePowerForChannel/20)) * range) + offset;
Вы можете установить referenceLevel на 5. Это дает мне хорошие результаты на моем iPhone. AveragePowerForChannel - это значение, которое вы получаете от метода averagePowerForChannel: метод и диапазон указывают верхний предел диапазона. Я установил это на 160. Наконец, смещение - это смещение, которое вы можете добавить, чтобы попасть в нужную область. Я добавил 50 здесь.
Тем не менее, если у кого-нибудь есть лучшее решение для этого. Было бы здорово!