2015-07-23 7 views
0

Я пытаюсь получить мощность звука, зацикливаясь на звуковых образцах и получая среднюю мощность на канал.Как я могу нормализовать значение децибела и сделать его между 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 - Не стесняйтесь писать код в Obective-C

ответ

0

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

Как ваш код вида намекая на функции для превращения цифрового уровня в дБ

dB = 20 * log10(ffs); 

поэтому при FFS = 1,0, дБ 0 и при FFS == 0, то дБ -inf.

Вам просто нужно пойти в другую сторону.

var power = exp(10, dB/20); 
+0

Я действительно не понимаю, что вы имеете в виду. Что такое log10 (ffs)? –

+0

Моя точка зрения заключается в том, что значение dB, с которого вы начинаете, уже применяло 'log10', так что вы снова вызываете' log10', что является полной противоположностью тому, что вы хотите - функция 'exp' с базой 10. – jaket