Формула для преобразования линейной амплитуды в децибелы, когда вы хотите использовать 1,0 в качестве эталона (для 0 дБ), равна
20 * log10(amp);
Так что я не уверен в намерении взглянуть на ваш код, но вы, вероятно, хотите
float db = 20 * log10([recorder averagePowerForChannel:0]);
Это будет идти от -infinity при амплитуде ноль, до 0 дБ при амплитуде 1.
Если вам действительно нужно, чтобы значение было между 0 и 120, вы можете добавить 120 и использовать функцию max в нуле.
Итак, после строки выше:
db += 120;
db = db < 0 ? 0 : db;
Формула, которую вы используете, похоже, является формулой для преобразования DB в amp, что, я думаю, противоположно тому, что вы хотите.
Редактировать: Я перечитал, и, возможно, у вас уже есть значение в децибелах.
Если это так, просто не конвертируйте в амплитуду и добавьте 120.
Смена
double peakPowerForChannel = pow(10, (0.05 * [recorder averagePowerForChannel:0]));
до
double peakPowerForChannel = [recorder averagePowerForChannel:0];
и с тобой все будет в порядке.