我喜欢更新使用 AudioQueue 播放音频文件的现有 iPhone 应用程序。水平(peakPowerForChannel,averagePowerForChannel)是线性的,从 0.0f 到 1.0f。
现在我喜欢使用更简单的 AVAudioPlayer 类,它工作得很好,唯一的问题是现在以分贝为单位的级别,而不是从 -120.0f 到 0.0f 的线性。
有没有人将其转换回 0.0f 和 1.0f 之间的线性值的公式?
谢谢
汤姆
我喜欢更新使用 AudioQueue 播放音频文件的现有 iPhone 应用程序。水平(peakPowerForChannel,averagePowerForChannel)是线性的,从 0.0f 到 1.0f。
现在我喜欢使用更简单的 AVAudioPlayer 类,它工作得很好,唯一的问题是现在以分贝为单位的级别,而不是从 -120.0f 到 0.0f 的线性。
有没有人将其转换回 0.0f 和 1.0f 之间的线性值的公式?
谢谢
汤姆
几个 Apple 示例使用以下公式将分贝转换为线性范围(从 0.0 到 1.0):
double percentage = pow (10, (0.05 * power));
您从各种电平表方法或函数之一获得的值在哪里power
,例如 AVAudioPlayer 的averagePowerForChannel:
线性和对数值转换背后的数学:
1. 线性到分贝(对数):
decibelValue = 20.0f * log10(linearValue)
注意:对数以 10 为底
假设百分比形式的线性值范围从 [ 0 (min vol) 到 100 (max vol)] 那么一半音量(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)
Apple 在他们的SpeakHere示例中使用了一个查找表,该表将 dB 转换为电平表上显示的线性值。
我在一个小程序中塑造了他们的计算;看这里。