2009-10-02 6 views
4

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

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

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

Благодаря

Том

+2

Вы, вероятно, следует добавить ядро ​​аудио теги к этому вопросу, чтобы сделать его более доступным для поиска для будущих читателей. Благодарю. – invalidname

ответ

12

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

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

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

+0

Я очень удивлен, что это стандартная формула dB = 20 * log (lvl) ...... – hyprfrcb

2

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

Я построил их расчет в небольшой рутине; см. here.

4

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

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

decibelValue = 20.0f * log(linearValue) 

Примечание: бревно основание 10

Пусть линейное значение в виде процентного диапазона от [0 (min vol) до 100 (max vol)], то decibelValue для половина объема (50%)

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

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

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

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

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

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

LinearValue = pow(10.0f, decibelValue/20.0f) 
+0

Я должен добавить, что вы должны использовать минимальное измеряемое значение вместо нуля. Известно, что 20.log10 (xmax/xmin) - это определение динамического диапазона. Следовательно. Уровень не слышимости - это фактически динамический диапазон, а не уровень. – hyprfrcb

+0

Какова релевантность '20.0'? – Matt