如何将分贝值标准化并使其在0和1之间

时间:2015-07-23 21:32:30

标签: ios audio avaudioplayer decibel

我试图通过循环音频样本并获得每个频道的平均功率来获得音频的力量。

我想得到一个介于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之间

编辑 - 随意在Obective-C中编写代码

1 个答案:

答案 0 :(得分:0)

averagePowerForChannel返回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);