Visualiser le volume des échantillons PCM

J’ai plusieurs morceaux audio PCM (G.711) dans mon application C ++. Je voudrais visualiser le volume audio différent dans chacun de ces morceaux.

Ma première tentative a été de calculer la moyenne des valeurs d’échantillon pour chaque bloc et de l’utiliser comme indicateur de volume, mais cela ne fonctionne pas bien. J’obtiens 0 pour les morceaux avec silence et les valeurs différentes pour les morceaux avec audio, mais les valeurs ne diffèrent que légèrement et ne semblent pas ressembler au volume réel.

Quel serait un meilleur algorithme pour calculer le volume?

J’entends que l’audio G.711 est PCM logarithmique. Comment devrais-je en tenir compte?

Notez que je n’ai pas travaillé avec l’audio G.711 PCM moi-même, mais je suppose que vous effectuez la conversion correcte de l’amplitude encodée en une amplitude réelle avant de traiter les valeurs.

Vous vous attendriez à ce que la valeur moyenne de la plupart des échantillons soit approximativement égale à zéro lorsque les formes d’onde du son oscillent de part et d’autre de zéro.

Un calcul de volume brut serait la valeur quadratique moyenne (RMS), c’est-à-dire une moyenne mobile du carré des échantillons et la racine carrée de cette moyenne. Cela vous donnera une quantité postive quand il y a du son; la quantité est liée à la puissance représentée dans la forme d’onde.

Pour quelque chose de mieux lié à la perception humaine du volume, vous pouvez explorer le type de techniques utilisées dans Replay Gain .

Si vous vous sentez ambitieux, vous pouvez télécharger la norme G.711 sur le site Web de l’UIT et passer les prochaines semaines (voire plus) à la mettre en œuvre.

Si vous êtes plus paresseux (ou plus raisonnable), vous pouvez télécharger G.191 à la place. Il inclut le code source pour compresser et décompresser les données codées G.711.

Une fois que vous l’avez décodé, la visualisation du volume devrait être beaucoup plus facile.