Как я могу нормализовать значение децибел и сделать его между 0 и 1

Я пытаюсь получить мощность звука, зацикливая образцы звука и получая среднюю мощность на канал.

Я хочу получить значение от 0 до 1, которое отражает интенсивность воспроизводимого звука. Прямо сейчас я получаю дБ (значение в децибелах), которое представляет собой значение с плавающей запятой от -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)
}

Я не уверен, что значение дБ, которое я получаю, является точным, или я делаю что-то неправильно?

прямо сейчас я получаю значения от 0 до 190, используя код, который я нашел, но для меня это не имеет особого смысла.

Что мне нужно, так это нормализовать значения дБ, которые я получаю в диапазоне от 0 до 1.

EDIT. Не стесняйтесь писать код на Objective-C


person Emad Abdulrahim    schedule 23.07.2015    source источник


Ответы (1)


averagePowerForChannel возвращает значение в дБ, где 0 dB представляет цифровую полную шкалу. Если вам нужно значение от 0 до 1, то шкала дБ, безусловно, вам не подходит.

Поскольку ваш код как бы намекает на функцию преобразования цифрового уровня в дБ,

dB = 20 * log10(ffs);

поэтому, когда ffs = 1,0, дБ равен 0, а когда ffs == 0, тогда дБ равен -inf.

Просто нужно идти другим путем.

var power = exp(10, dB/20);
person jaket    schedule 23.07.2015
comment
Я не очень понимаю, что вы имеете в виду. Что такое log10(ffs)? - person Emad Abdulrahim; 24.07.2015
comment
Я хочу сказать, что значение дБ, с которого вы начинаете, уже было применено log10, поэтому вы снова вызываете log10, что является полной противоположностью того, что вы хотите - функция exp с основанием 10. - person jaket; 24.07.2015