iPhone - AVAudioPlayer - конвертируйте уровень в децибелах в проценты - PullRequest
4 голосов
/ 03 октября 2009

Мне нравится обновлять существующее приложение для iPhone, которое использует AudioQueue для воспроизведения аудиофайлов. Уровни (peakPowerForChannel, averagePowerForChannel) были линейными от 0,0f до 1,0f.

Теперь мне нравится использовать более простой класс AVAudioPlayer, который работает нормально, единственная проблема заключается в том, что уровни, которые теперь находятся в децибелах, не линейны от -120.0f до 0.0f.

Кто-нибудь имеет формулу, чтобы преобразовать ее обратно в линейные значения между 0.0f и 1.0f?

Спасибо

Tom

Ответы [ 3 ]

12 голосов
/ 03 октября 2009

Несколько примеров Apple используют следующую формулу для преобразования децибел в линейный диапазон (от 0,0 до 1,0):

double percentage = pow (10, (0.05 * power));

, где power - это значение, которое вы получаете от одного из различных методов или функций измерителя уровня, таких как AVAudioPlayer's averagePowerForChannel:

4 голосов
/ 14 июня 2016

Математика за преобразованием линейных и логарифмических значений:

1. Линейный в децибел (логарифмический):

decibelValue = 20.0f * log10(linearValue)

Примечание: лог - база 10

Предположим, что линейное значение в виде процентного диапазона от [0 (мин. Об.) До 100 (макс. Об.)], Тогда значение децибела для половины объема (50%) равно

decibelValue = 20.0f * log10(50.0f/100.0f) = -6 dB

Полный объем:

decibelValue = 20.0f * log10(100.0f/100.0f) = 0 dB

Отключение звука:

decibelValue = 20.0f * log10(0/100.0f) = -infinity 

2. Децибел (логарифмический) в линейный:

LinearValue = pow(10.0f, decibelValue/20.0f)
2 голосов
/ 24 апреля 2013

Apple использует справочную таблицу в SpeakHere выборке, которая преобразует значение из дБ в линейное значение, отображаемое на индикаторе уровня.

Я вылепил их расчет в маленькой рутине; см здесь .

...