2016-05-08 1 views
1

Je crée de l'audio dynamiquement (avec WebAudio), en commençant par les oscillateurs de base (sine/square/etc) et en appliquant diverses modulations. Naturellement, lorsque je change la hauteur des signaux, le volume apparent change, avec des hauteurs plus fortes et des basses plus faibles.Comment préserver le volume d'un signal dynamique dont la hauteur varie?

Ma question est la suivante: y a-t-il une façon standard de traiter le signal pour garder un volume (vaguement) constant lorsque son pitch change? Bien sûr, je pourrais juste ajouter un nœud de gain et le manipuler de manière ad hoc, mais je suppose qu'il y a une chose standard à faire ici (que j'ai cherché mais que je ne trouve pas).

Merci!

+0

Jetez un coup d'œil aux [courbes de Fletcher-Munson] (https://en.wikipedia.org/wiki/Fletcher%E2%80%93Munson_curves) et à d'autres résultats similaires. Vous pouvez essayer d'approximer ce que vous pensez que la sortie dB SPL des haut-parleurs est un ajustement de vos volumes de ton à partir de là. Sinon, si vous ne ressentez pas le besoin d'être aussi scientifique, vous pouvez simplement appliquer quelque chose ressemblant à la courbe de Fletcher-Munson pour obtenir un réglage de volume suffisant pour les volumes d'écoute typiques. – Linuxios

+0

@Linuxios Merci, ouais - quand il n'y avait pas de réponses j'ai fini par trouver ces courbes, en ajustant une ligne à une, et en ajustant en fonction du résultat. Je posterai la formule que j'ai trouvée en guise de réponse. – fenomas

Répondre

2

Comme il n'y a apparemment pas d'approche standard de cela, voici la « solution » Je piraté sur:

function getVolumeAdjustment(freq) { 
    var x = Math.log(freq) 
    var db = 3.4 * x * x - 49.3 * x + 217 
    return db - 45 
} 

db se rapproche vaguement 40-phon Equal Loudness contour, au moins que j'eyeballed à partir de l'image sur wikipedia. Je soustrais alors 45 de sorte que j'ai un ajustement de volume (allant de -6 à 15 ou plus) à appliquer à chaque tonalité donnée en fonction de sa fréquence.

Cela semble fonctionner fondamentalement - toujours heureux d'entendre de meilleures réponses cependant.

+0

Remarque importante: le contour à volume égal indique les volumes relatifs en dB SPL (niveau de pression acoustique), qui est un volume réel. De toute évidence, il n'y a pas de moyen garanti de convertir dBFS (dB numérique) en dB SPL réel ou vice versa, mais il est bon de se rappeler qu'ils * sont * différentes unités qui ne sont pas converties ici. – Linuxios