Voir et mesurer le son — épisode 4/10. Une aiguille qui bouge lentement ne donne pas la même information qu’un crête-mètre numérique. Avec Dubstep armageddon, de Dmc Mystic, nous allons expliquer le rôle du VU-mètre, le choix de sa référence et l’influence de sa réponse temporelle. Nous construirons aussi un modèle calculable, dont les limites seront explicites.

Écouter le cas pratique

Ouvrir le MP3 original. Écoutez le début, puis le passage de 1:00 à 1:20, à réglage de volume constant. Comparez ensuite les indications calculées. Le nom de l’album inscrit dans les tags est Groove anomaly ; le fichier est stéréo, à 48 000 Hz.

1. Un VU-mètre ne mesure pas les crêtes instantanées

Le VU-mètre classique est un indicateur de niveau de programme à réponse relativement lente. Sa mécanique et son redresseur façonnent le mouvement de l’aiguille. Il laisse donc passer visuellement une partie des transitoires rapides qu’un détecteur de crête peut retenir.

L’AES décrit cette famille d’instruments comme des indicateurs à montée et descente de l’ordre de 300 ms. Elle précise également que le comportement réel du couple redresseur/mouvement n’équivaut pas exactement à un calcul RMS. Une aiguille dessinée sur un écran ne suffit pas à reproduire un VU normalisé : le détecteur, la réponse temporelle et l’étalonnage doivent être définis.

Le VU peut aider à suivre les variations soutenues et à régler un niveau de travail. Il ne remplace ni un crête-mètre pour surveiller les maxima, ni une mesure LUFS pour quantifier la sonie suivant un modèle perceptif.

2. Que représente le zéro ?

0 VU n’est pas 0 dBFS. Le premier est un repère de fonctionnement étalonné ; le second est une référence numérique de pleine échelle. Dans une chaîne analogique, un réglage courant relie 0 VU à +4 dBu, soit environ 1,228 V RMS. Cette association doit être vérifiée sur l’équipement : une tension physique ne se déduit pas d’un fichier MP3 sans connaître les convertisseurs et leurs réglages.

Dans un logiciel, on choisit un niveau numérique de référence. Les mentions « −18 dBFS = 0 VU » restent ambiguës si la documentation ne précise pas le signal et la convention RMS ou crête. Pour cet article, le repère est défini sans raccourci :

Une sinusoïde stable de 1 kHz, dont la crête vaut −18 dBFS, donne 0 sur notre modèle après stabilisation. Sa valeur RMS, rapportée à l’amplitude numérique 1, est −21,0103 dBFS. Une autre convention d’affichage RMS pourrait utiliser une référence sinusoïdale différente : il faut l’annoncer.

3. Les mesures réelles du MP3

Le signal a été décodé avec FFmpeg 6.1.1 en flottant 32 bits, sans traitement ni changement de fréquence. La durée PCM obtenue est 372,395833 s, pour 17 875 000 échantillons par canal. FFprobe indique une durée de 372,432 s et un débit audio d’environ 269 kbit/s.

Mesures sur l’ensemble du PCM décodé, silences compris
Grandeur Gauche Droite
Crête échantillon −0,028 dBFS +0,075 dBFS
Instant de la crête 198,594250 s 306,811917 s
RMS global, référence amplitude 1 −13,561 dBFS −13,558 dBFS
Échantillons avec |x| ≥ 1 0 1

La petite excursion positive du canal droit est conservée par le décodage flottant. Elle n’établit pas à elle seule un écrêtage du master ou une distorsion audible. Elle montre pourquoi une aiguille lente doit être complétée par un contrôle des crêtes. Il ne s’agit pas d’une valeur True Peak en dBTP.

Le journal signale aussi un commentaire ID3 mal formé qu’il ignore. Le décodage audio complet a réussi ; ce message de métadonnées ne doit pas être confondu avec une saturation du signal.

4. Construire un modèle pédagogique clairement défini

Pour isoler l’effet de l’inertie, nous appliquons un redressement idéal puis un lissage exponentiel du premier ordre. Ce modèle n’inclut ni la non-linéarité d’un redresseur réel ni une mécanique du second ordre. Il ne reproduit pas le dépassement transitoire et l’amortissement d’un mouvement VU normalisé.

Pour chaque canal : u[n] = |x[n]|, puis y[n] = αy[n−1] + (1−α)u[n], avec α = exp(−1 / (fsτ)) et une condition initiale y[−1] = 0.

Nous choisissons τ = 0,300 / ln(100) ≈ 0,065144 s. La réponse à un échelon continu atteint alors 99 % de sa valeur finale en 300 ms, puisque 1 − exp(−0,300 / τ) = 0,99. Une constante de temps de 300 ms serait un autre réglage : elle n’atteindrait qu’environ 63,2 % après 300 ms.

Réponse théorique du modèle à une impulsion rectangulaire de niveau constant
Durée de l’impulsion Niveau atteint avant son arrêt
10 ms 14,23 % du niveau final
50 ms 53,58 %
100 ms 78,46 %
300 ms 99,00 %

Ces pourcentages sont ceux de notre filtre face à un échelon DC, pas des spécifications complètes du VU matériel. Ils illustrent pourquoi une attaque courte et un son soutenu de même crête ne produisent pas la même excursion.

5. Étalonner le modèle avec une sinusoïde

La valeur moyenne de la sinusoïde redressée, de crête A, est 2A / π. Pour A = 10−18/20, notre référence vaut donc yref = (2/π) × 10−18/20. L’indication relative se calcule par I[n] = 20 log10(y[n] / yref).

Sur une sinusoïde stable de référence, la lecture se stabilise près de zéro, avec une faible ondulation résiduelle liée au redressement et à l’échantillonnage. Sur de la musique, cette indication ne correspond pas nécessairement à « RMS + 18 ». Le facteur de forme du signal change : la moyenne absolue et la moyenne quadratique sont deux opérations différentes.

6. Résultat sur Dubstep armageddon

Réponse du modèle lent gauche et droite, comparée avec et sans trim de mesure de moins six décibels
Simulation calculée sur le MP3 réel. Les unités sont des dB relatifs au repère défini, pas des résultats certifiés en VU. Traces affichées tous les 50 ms, après calcul du filtre à 48 kHz. La courbe orange applique uniquement un décalage de lecture de −6 dB ; le lecteur audio reste inchangé. Les valeurs sous −25 dB relatifs sont hors cadre.
Comparaison de deux passages, même référence de simulation
Passage Crête G / D en dBFS Médiane du modèle G / D, en dB relatifs
0:00–0:20 −2,812 / −2,811 +0,740 / +0,622
1:00–1:20 −1,017 / −0,548 +6,038 / +6,078

La médiane est calculée sur toutes les sorties du modèle dans chaque intervalle ; elle ne représente ni le maximum ni une moyenne du morceau. Le deuxième passage se situe nettement plus haut selon ce détecteur lent. Les maxima du modèle sur le fichier entier atteignent environ +12,72 dB relatifs.

Sur un cadran limité à +3, une partie de ces mouvements serait bloquée en haut de l’affichage. Ajouter un trim de mesure permet de ramener l’aiguille dans une zone lisible, sans toucher au son. Un trim de −6 dB décale ici les courbes de −6 dB ; les maxima restent vers +6,72, donc ce réglage ne suffit pas à faire tenir tout le morceau dans un cadran limité à +3. Un trim de −10 dB ramènerait le maximum du modèle vers +2,72.

Ce déplacement change la référence effective de l’indicateur. Il doit rester visible dans l’interface. Il n’est pas une consigne de normalisation ou de mastering, et ne change pas la crête réelle du fichier lu.

7. Reproduire la démonstration

Les exemples supposent une copie locale nommée dubstep-armageddon.mp3.

Décoder le fichier sans écrêter sa petite excursion flottante

ffmpeg -v warning -i dubstep-armageddon.mp3 -map 0:a:0 -c:a pcm_f32le -f f32le dubstep-armageddon.f32

Créer une tonalité d’étalonnage

ffmpeg -f lavfi -i "aevalsrc=0.125892541*sin(2*PI*1000*t):s=48000:d=2" -c:a pcm_f32le reference-1khz.wav

Cette tonalité est une sinusoïde de 1 kHz à −18 dBFS crête, conservée dans un WAV flottant. Le signal de test doit être envoyé au détecteur sans égalisation, normalisation ou gain non documenté. Vérifier seulement le zéro ne suffit pas : il faut aussi tester plusieurs niveaux et la réponse aux salves.

Calculer le modèle et exporter une lecture toutes les 50 ms

import numpy as np
from scipy.signal import lfilter

fs = 48000
x = np.fromfile("dubstep-armageddon.f32", dtype="<f4").reshape(-1, 2)
tau = 0.300 / np.log(100)
alpha = np.exp(-1 / (fs * tau))
y = lfilter([1 - alpha], [1, -alpha], np.abs(x), axis=0)
reference = (2 / np.pi) * 10 ** (-18 / 20)
indication = 20 * np.log10(np.maximum(y, 1e-20) / reference)
indices = np.arange(0, len(x), 2400)
resultat = np.column_stack((indices / fs, indication[indices]))
np.savetxt("modele-lent.csv", resultat, delimiter=",",
           header="temps_s,gauche_db_relatifs,droite_db_relatifs", comments="")

Ce script utilise NumPy et SciPy. Le résultat contient le temps, la lecture gauche et la lecture droite en dB relatifs. Le plancher numérique évite un logarithme de zéro ; il n’invente pas un bruit de fond dans le signal. Les fichiers bruts sont stéréo entrelacés et n’ont pas d’en-tête.

8. Trois contrôles à faire sur un indicateur à aiguille

  • Référence : un signal connu doit rejoindre le repère prévu, avec une convention crête/RMS explicite.
  • Temporalité : tester des salves de plusieurs durées, le retour et un éventuel dépassement ; vérifier un seul temps de montée ne prouve pas la conformité.
  • Protection contre les crêtes : conserver un indicateur rapide indépendant, avant une conversion ou un export.

Une simulation RMS lissée peut être utile, mais doit être nommée comme telle. De même, le filtre showvolume en mode RMS ne devient pas un VU normalisé simplement parce qu’on lui dessine une aiguille. Le modèle de cet article constitue un outil pour comprendre, avec une définition entièrement reproductible.

Références et méthode

Les mesures et les traces de simulation proviennent du MP3 fourni. Les informations de conception sont distinguées du modèle mathématique proposé ici. La couverture est une illustration, pas une capture de mesures. Prochain épisode : le RMS et le facteur de crête, pour comparer énergie moyenne et attaques.