2009-10-02 8 views
4

J'aime mettre à jour une application iPhone existante qui utilise AudioQueue pour lire des fichiers audio. Les niveaux (peakPowerForChannel, averagePowerForChannel) étaient linéaires de 0.0f à 1.0f.iPhone - AVAudioPlayer - convertir le niveau de décibels en pourcentage

Maintenant, j'aime utiliser la classe plus simple AVAudioPlayer qui fonctionne bien, le seul problème est que les niveaux qui sont maintenant en décibel, ne sont pas linéaires de -120.0f à 0.0f.

Est-ce que quelqu'un a une formule pour le convertir en valeurs linéaires entre 0.0f et 1.0f?

Merci

Tom

+2

Vous devriez probablement ajouter la balise de noyau audio à cette question pour le rendre plus trouvable pour les futurs lecteurs. Merci. – invalidname

Répondre

12

Plusieurs exemples Apple utilisent la formule suivante pour convertir les décibels dans une plage linéaire (de 0,0 à 1,0):

double percentage = pow (10, (0.05 * power)); 

power est la valeur que vous obtenez à partir de l'une des diverses méthodes ou fonctions de mesure de niveau, telles que les fonctions averagePowerForChannel:

+0

Je suis assez surpris pour l'upvote, parce que c'est la formule standard dB = 20 * log (lvl) ...... – hyprfrcb

2

d'AVAudioPlayer Apple utilise un look la table dans leur échantillon SpeakHere qui convertit du dB à une valeur linéaire affichée sur un indicateur de niveau. J'ai moulé leur calcul dans un petit sous-programme; voir here.

4

Math derrière la conversion valeur linéaire et logarithmique:

1. linéaire à Décibel (logarithmique):

decibelValue = 20.0f * log(linearValue) 

Note: log base 10 est

Suppose la valeur linéaire sous forme de pourcentage va de [0 (min vol) à 100 (vol max)] puis la valeur decibelValue pour moitié du volume (50%) est

decibelValue = 20.0f * log(50.0f/100.0f) = -6 dB 

plein volume:

decibelValue = 20.0f * log(100.0f/100.0f) = 0 dB 

mute complète:

decibelValue = 20.0f * log(0/100.0f) = -infinity 

2. Decibel (logarithmique) à linéaire:

LinearValue = pow(10.0f, decibelValue/20.0f) 
+0

Je dois ajouter, que vous devez utiliser la valeur minimale mesurable au lieu de zéro. Sachez que 20.log10 (xmax/xmin) est la définition de la plage dynamique. Par conséquent. le niveau Non Audible est en fait la Plage Dynamique, pas -infty. – hyprfrcb

+0

Quelle est la pertinence de '20.0'? – Matt

Questions connexes