Voir et mesurer le son — épisode 9/10. Un waveform situe les amplitudes dans le temps. Un spectre montre comment la puissance se répartit en fréquence. Un spectrogramme ajoute l’évolution temporelle. Avec Drumstep electra dj spin a track radio edit, de Dmc Mystic, nous allons relier ces représentations à un MP3 réel et détailler les paramètres qui rendent leur lecture fiable.

Écouter le passage étudié

Ouvrir le MP3 original. Pour l’exercice, écoutez 1:00–1:20, puis consultez le spectrogramme de ce même passage. Le spectre moyen, lui, concerne le morceau entier : ces deux graphiques ne couvrent donc pas la même durée.

1. Trois représentations complémentaires

Quelle information chaque vue conserve-t-elle ?
Vue Axes et codage Usage principal
Waveform Temps et amplitude Situer les événements et les niveaux
Spectre Fréquence et amplitude ou puissance, selon la convention Examiner la répartition fréquentielle d’un intervalle
Spectrogramme Temps, fréquence et intensité par couleur Observer l’évolution des composantes fréquentielles

Une FFT fournit une représentation complexe contenant amplitude et phase. Un graphique d’amplitude ou de puissance n’en montre qu’une partie. Une courbe moyenne ne permet pas de reconstruire le morceau ni d’identifier automatiquement ses instruments.

2. De la fenêtre temporelle à la FFT

Pour N valeurs pondérées par une fenêtre w[n], la transformée discrète s’écrit X[k] = Σx[n]w[n] exp(−j2πkn/N). La FFT est un algorithme efficace pour calculer cette transformée. La fréquence associée au bin k est f[k] = kfs/N.

Deux grandeurs sont essentielles : la durée de fenêtre T = N/fs et l’espacement des bins Δf = fs/N. Cet espacement n’est pas, à lui seul, une garantie de séparation de deux sons proches : la largeur du lobe principal de la fenêtre et le rapport de niveaux interviennent aussi.

Exemples à la fréquence native de ce fichier : 44 100 Hz
N Durée de fenêtre Espacement des bins
1 024 23,22 ms 43,07 Hz
2 048 46,44 ms 21,53 Hz
4 096 92,88 ms 10,77 Hz
8 192 185,76 ms 5,38 Hz

Une fenêtre longue affine la grille fréquentielle mais mélange davantage d’événements dans le temps. Une fenêtre courte distingue mieux des attaques rapprochées, avec une grille fréquentielle plus large. Ajouter des zéros avant la FFT densifie la grille affichée sans apporter la durée d’observation qui manque : ce n’est pas une résolution physique supplémentaire.

3. Pourquoi une fenêtre de Hann ?

Couper un signal en segments peut créer une discontinuité aux extrémités, qui étale son contenu dans la transformée. La fenêtre de Hann atténue les bords du segment et modifie cet étalement spectral. Le compromis est une largeur de lobe principal plus grande qu’avec une fenêtre rectangulaire.

La fenêtre ne supprime pas magiquement toute fuite spectrale. Elle doit être accompagnée d’une normalisation adaptée si l’on veut mesurer amplitude ou puissance. Le recouvrement entre segments augmente le nombre d’observations ; il ne raccourcit pas la durée de chaque fenêtre.

4. Conditions du cas pratique

FFprobe relève un MP3 stéréo à 44 100 Hz, avec un débit audio indiqué de 320 kbit/s. Les tags identifient l’album Groove galaxy, piste 12/15. La fréquence de Nyquist est 22 050 Hz ; elle ne signifie pas que le morceau contient une énergie importante jusqu’à cette borne.

Le fichier a été décodé avec FFmpeg 6.1.1 en flottant 32 bits, sans gain, effet ni rééchantillonnage ajouté. Le PCM comporte 10 198 656 échantillons par canal, soit 231,262041 s. Les résultats concernent ce décodage du MP3, pas un master antérieur à son encodage.

Le journal signale un commentaire ID3 mal formé qu’il ignore. Ce message de tag ne sert pas à interpréter le spectre ; le décodage audio complet a réussi.

5. Spectre moyen : densité de puissance et méthode de Welch

Nous utilisons la méthode de Welch : les périodogrammes de segments fenêtrés sont moyennés. Paramètres : Hann, 4 096 points, recouvrement de 2 048 points, sans retrait de moyenne par segment, densité unilatérale et moyenne arithmétique des puissances. Les deux canaux sont calculés séparément.

L’axe vertical du spectre est 10 log10(P), avec P exprimé en amplitude numérique au carré par hertz. La référence est 1²/Hz. Ce n’est pas un simple niveau de crête en dBFS, ni une mesure acoustique calibrée en dB SPL. Une densité s’intègre sur une bande ; son seul maximum ne donne pas la puissance totale du morceau.

Spectre moyen gauche droite du morceau et spectrogramme de vingt secondes avec fréquences logarithmiques
Haut : densités de puissance moyennes gauche et droite sur le morceau entier. Bas : spectrogramme de 1:00 à 1:20 ; la puissance des deux canaux est moyennée, sans sommation mono. Les couleurs du bas sont normalisées au maximum de densité de cet extrait et bornées à −70 dB relatifs.

6. Ce que les calculs montrent sur ce morceau

Sur la densité moyenne des puissances gauche et droite, le bin le plus élevé entre 20 Hz et 20 kHz se situe à 64,60 Hz. Cette valeur dépend de la grille de 10,77 Hz et de la fenêtre ; elle ne doit pas être présentée comme une fréquence fondamentale exacte de la composition.

Répartition estimée par intégration des bins de la densité moyenne G/D
Bande analysée Part de la puissance spectrale totale estimée
20–80 Hz 46,54 %
80–250 Hz 26,64 %
250 Hz–2 kHz 16,94 %
2–8 kHz 7,33 %
8–20 kHz 2,53 %

Le dénominateur couvre toutes les fréquences de 0 à 22 050 Hz. Les bandes du tableau ne couvrent donc pas exactement tout le domaine ; les bornes hautes sont exclues pour ne pas compter deux fois un bin. L’intégration utilise la somme des densités multipliée par Δf, sans interpolation des frontières. Ces chiffres sont des estimations issues du découpage choisi.

Ils révèlent une forte concentration de puissance numérique dans les basses fréquences. Ils ne représentent ni la part de sonie perçue ni un objectif d’égalisation. Une bande étroite très forte et une large bande modérée peuvent produire des sommes comparables tout en sonnant différemment.

7. Spectrogramme : suivre le temps et les fréquences

Le passage de vingt secondes est analysé avec une Hann de 2 048 points et un recouvrement de 1 536 points. Le pas vaut donc 512 échantillons, soit 11,61 ms. La durée de chaque fenêtre reste 46,44 ms : le pas entre colonnes ne constitue pas la résolution temporelle complète.

Dans la vue du bas, une structure horizontale persistante indique une concentration d’énergie autour d’une fréquence ; une structure verticale peut signaler un événement bref réparti sur une large bande. Des groupes de lignes espacées peuvent correspondre à des harmoniques. Aucun de ces motifs ne suffit, seul, à nommer un instrument ou à isoler une voix.

L’axe fréquentiel est logarithmique, ce qui donne plus de place visuelle aux basses. La couleur est une échelle de puissance relative : changer la palette ou le seuil d’affichage peut rendre certains détails plus visibles sans modifier le son. Normaliser séparément deux images à leur propre maximum empêcherait de comparer directement leurs couleurs comme des niveaux absolus.

8. Reproduire les visuels

Les commandes utilisent une copie locale nommée drumstep-electra.mp3.

Décoder les valeurs flottantes

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

Créer une image d’analyse avec FFmpeg

ffmpeg -i drumstep-electra.mp3 -filter_complex "[0:a:0]atrim=start=60:end=80,asetpts=PTS-STARTPTS,showspectrumpic=s=1200x700:mode=separate:color=magma:scale=log:fscale=log:win_func=hann:legend=1[v]" -map "[v]" -frames:v 1 spectrogramme-60-80.png

Cette commande génère un spectrogramme FFmpeg de l’extrait, avec canaux séparés. Son algorithme de mise à l’échelle et sa présentation ne sont pas ceux de la figure SciPy intégrée à cet article : ne comparez pas les couleurs entre ces deux rendus comme une mesure absolue commune.

Recalculer les données du spectre et du spectrogramme

import numpy as np
from scipy.signal import welch, spectrogram

fs = 44100
x = np.fromfile("drumstep-electra.f32", dtype="<f4").reshape(-1, 2)
f, puissance = welch(x, fs=fs, window="hann", nperseg=4096,
                     noverlap=2048, detrend=False, scaling="density", axis=0)
np.savetxt("spectre-moyen.csv", np.column_stack((f, puissance)),
           delimiter=",", header="frequence_hz,gauche,droite", comments="")
extrait = x[60*fs:80*fs]
f2, temps, densite = spectrogram(extrait, fs=fs, window="hann",
                                nperseg=2048, noverlap=1536,
                                detrend=False, scaling="density",
                                mode="psd", axis=0)
puissance_stereo = densite.mean(axis=1)
np.savez("spectrogramme.npz", frequence=f2, temps=temps+60,
         puissance=puissance_stereo)

La sortie du spectrogramme a ici la forme fréquence × canal × temps. La moyenne est effectuée sur les puissances des canaux ; elle ne représente pas une conversion mono. Le fichier brut doit être lu avec sa fréquence et son nombre de canaux connus.

9. Les pièges d’interprétation

  • Confondre spectre et sonie : une puissance brute dans les graves n’a pas la même signification qu’une mesure LUFS.
  • Déduire la qualité d’un MP3 d’une coupure haute : un filtrage peut venir de l’encodeur, de la source ou du traitement ; l’image seule ne reconstitue pas cet historique.
  • Mesurer une fréquence au pixel près : la grille, la fenêtre et le redimensionnement limitent la précision.
  • Comparer des réglages différents : taille FFT, normalisation, référence, durée et palette doivent être documentées.

Le spectre moyen sert à comparer des répartitions ; le spectrogramme sert à les situer dans le temps. L’écoute permet de relier ces observations aux événements musicaux, sans transformer une image en verdict artistique.

Sources et vérification

Les visuels et les chiffres sont calculés sur le fichier fourni. La commande FFmpeg a été exécutée pour vérifier sa compatibilité avec la version utilisée. La couverture est illustrative. Prochain épisode : stéréo, corrélation et compatibilité mono.