Obtenir le volume d'une piste avec RMS

15

J'essaie de calculer le volume d'une piste audio que j'ai stockée dans un tampon. Le tampon contient des données PCM du signal et je veux obtenir à quel point il est «fort» en utilisant Root Mean Squared. Je suppose que je peux le faire dans le domaine temporel au lieu de devoir passer au domaine fréquentiel. Quel serait le pseudo-code pour faire cela?

Dois-je simplement échantillonner pendant une seconde (audio [0] - audio [44099], audio [44099] - audio [88199] etc.) et calculer le RMS de ces valeurs? Donc, par exemple, dois-je faire ceci:

RMS=l'audio[0]2+l'audio[1]2+l'audio[2]2.....l'audio[44099]244100

pour chaque seconde?

XSL
la source
1
Il y a une parenthèse manquante dans l'expression ci-dessus - je l'ajouterais moi-même mais les modifications doivent être d'au moins 6 caractères apparemment ...
Paul R
3
@PaulR - Vous pouvez ajouter un <!-- html comment -->pour contourner la restriction de caractère dans le cas rare où une publication par ailleurs parfaite a une erreur minuscule mais très importante. Ce besoin se produit très rarement: il y a généralement plus de 6 caractères d'amélioration à faire. Par exemple, lorsqu'il manque des crochets, il est généralement préférable d'utiliser les constructions \sqrt{}et \frac{}{}dans TeX.
Kevin Vermeer
1
@Kevin: merci pour l'astuce - je vais utiliser votre suggestion de commentaire HTML à l'avenir.
Paul R
@PaulR - Cela a été discuté auparavant: La restriction est intentionnelle, conçue pour empêcher les modifications incomplètes ou inutiles (voir une défense ici ), mais a ses adversaires (voir la discussion ici ).
Kevin Vermeer
4
Notez que RMS seul ne vous dit pas le volume. Des fréquences extrêmement basses ou hautes ont un volume inférieur à 3 kHz de la même valeur RMS. Un filtre de pondération A vous donnera une estimation plus précise. gist.github.com/148112
endolith

Réponses:

12

Une autre chose est que la valeur RMS n'est pas très bien corrélée avec l'intensité sonore perçue. Vous voudrez peut-être plutôt l'appeler niveau ou volume. Il y a quelque chose appelé contours d'intensité égale qui quantifie la sensibilité de l'oreille à une fréquence particulière par rapport à une autre fréquence, voir l'article Wikipedia . Ces courbes dépendent du niveau. Par exemple, l'oreille est très sensible à une tonalité de 1 kHz par rapport à une tonalité de 100 Hz, comme le montre cette image (l'axe horizontal est la fréquence en Hz):

contours de l'intensité sonore égaux

L'une des choses relativement simples que vous pouvez faire est de filtrer vos données PCM avec une courbe de sonie inversée. Ou vous pouvez appliquer la pondération A standard, voir l'article Wikipedia sur les filtres de pondération . Ensuite, vous pouvez calculer la valeur RMS de la sortie du filtre pondéré à intensité égale.

niaren
la source
Je ne sais pas comment passer du code du demandeur à celui-ci. L'exemple de la question consiste à additionner les carrés des échantillons audio. La réponse consiste à appliquer un filtre aux fréquences, il semble donc que "filtrer vos données PCM avec une courbe de volume inversée" ne suffit pas. Vous devez d'abord avoir la valeur pour chaque fréquence, puis vous pouvez comprendre comment appliquer la courbe à droite? Mais c'est un grand pas oublié.
gman
@gman L'idée est de prétraiter l'audio avec un filtre puis d'utiliser le résultat comme dans la question (calcul RMS). Je ne suis pas sûr à 100% de ce que vous voulez dire. Vous ne savez pas comment faire le filtrage ou peut-être la conception du filtre?
niaren