如何标准化分贝值并使其介于 0 和 1 之间
How can I normalized decibel value and make it between 0 and 1
我正在尝试通过循环播放音频样本并获取每个通道的平均功率来获取音频的功率。
我想获得一个介于 0 和 1 之间的值,以反映正在播放的音频的强度。现在我得到 dB(分贝值),这是一个从 -160(接近静音)到 0(非常响亮)的浮点值。
这是我在Swift中编写的代码:
func configureAudio() {
audioController.play()
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
audioController.numberOfLoops = 0
audioController.meteringEnabled = true
var audTimer = CADisplayLink(target: self, selector: "monitorAudio")
audTimer.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
}
func monitorAudio() {
audioController.updateMeters()
var dB = Float(0)
for i in 0..<audioController.numberOfChannels {
dB += audioController.averagePowerForChannel(i)
}
dB /= Float(audioController.numberOfChannels)
//code that I copied from website but obviously it is not normalization
var power = (Int(log10(dB+161)/log10(1.5) * 100) - 1220) * 6
if power < 0 {
power = 0
}
println(power)
}
我不确定我得到的 dB 值是准确的还是我做错了什么?
现在我正在使用我找到的一些代码获得 0-190 之间的值,但这对我来说意义不大。
我需要的 是将我得到的 dB 值标准化为 0 - 1
编辑 - 随意用 Objective-C 编写代码
averagePowerForChannel
returns 一个 dB 值,其中 0 dB
表示数字满刻度。如果您想要 0 到 1 之间的值,那么 dB 肯定不适合您。
因为您的代码有点暗示将数字电平转换为 dB 的函数是
dB = 20 * log10(ffs);
所以当 ffs = 1.0 时,dB 为 0,当 ffs == 0 时,dB 为 -inf。
你只需要走另一条路。
var power = exp(10, dB/20);
我正在尝试通过循环播放音频样本并获取每个通道的平均功率来获取音频的功率。
我想获得一个介于 0 和 1 之间的值,以反映正在播放的音频的强度。现在我得到 dB(分贝值),这是一个从 -160(接近静音)到 0(非常响亮)的浮点值。
这是我在Swift中编写的代码:
func configureAudio() {
audioController.play()
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
audioController.numberOfLoops = 0
audioController.meteringEnabled = true
var audTimer = CADisplayLink(target: self, selector: "monitorAudio")
audTimer.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
}
func monitorAudio() {
audioController.updateMeters()
var dB = Float(0)
for i in 0..<audioController.numberOfChannels {
dB += audioController.averagePowerForChannel(i)
}
dB /= Float(audioController.numberOfChannels)
//code that I copied from website but obviously it is not normalization
var power = (Int(log10(dB+161)/log10(1.5) * 100) - 1220) * 6
if power < 0 {
power = 0
}
println(power)
}
我不确定我得到的 dB 值是准确的还是我做错了什么?
现在我正在使用我找到的一些代码获得 0-190 之间的值,但这对我来说意义不大。
我需要的 是将我得到的 dB 值标准化为 0 - 1
编辑 - 随意用 Objective-C 编写代码
averagePowerForChannel
returns 一个 dB 值,其中 0 dB
表示数字满刻度。如果您想要 0 到 1 之间的值,那么 dB 肯定不适合您。
因为您的代码有点暗示将数字电平转换为 dB 的函数是
dB = 20 * log10(ffs);
所以当 ffs = 1.0 时,dB 为 0,当 ffs == 0 时,dB 为 -inf。
你只需要走另一条路。
var power = exp(10, dB/20);