Contrôle automatique de gain pour systèmes embarqués : implémentation Linux ALSA
L'algorithme AGC (Contrôle automatique de gain) normalise les niveaux de signal audio en temps réel, rendant inutiles les réglages manuels. Dans les systèmes de communication Linux sous ALSA, il corrige les variations de volume provenant de sources hétérogènes. Cette implémentation cible le format S16_LE, 8000 Hz, mono, avec une latence maximale de 500 ms et une utilisation CPU inférieure à 3 %.
L'objectif est de traiter des transmissions vocales courtes sans moyenne sur fichier complet. Les tests évaluent des critères subjectifs (intelligibilité de la parole) et objectifs (réduction de la dynamique).
Analyse des solutions prêtes à l'emploi : IA et plugins
Le modèle studiovoice de Nvidia normalise le volume et supprime le bruit, mais nécessite un rééchantillonnage de 48 kHz à 8 kHz, augmentant la latence. L'utilisation locale est impossible en raison des dépendances.
Le plugin ALSA speex (basé sur speexdsp) s'active avec agc on et agc_level (1–32768). Configuration dans /etc/asound.conf :
pcm.agc_pcm {
type speex
agc on
agc_level 23400
slave.pcm "dev_out"
}
pcm.test_agc {
type plug
slave.pcm agc_pcm
}
Test : arecord -D dev_in | aplay -D test_agc. Problèmes : fondu initial, "craquements" dus aux sous-débits, paramètres frames et filter_length non documentés. Verdict : acceptable.
FFmpeg dynaudnorm : décryptage de l'algorithme
Le filtre dynaudnorm est idéal : ffmpeg -f alsa -i dev_in -filter:a "dynaudnorm=f=20:g=33:m=100:c=1" output.wav.
Paramètres :
f=20— trame de 20 ms pour transmissions courtes ;g=33— lissage gaussien (équilibre latence/lissité) ;m=100— gain max (lié au niveau sonore) ;c=1— correction CC (supprime le décalage des interférences).
Algorithme :
- Trame d'entrée de taille F ;
- Correction CC ;
- Détection de pic ;
- Calcul du coefficient de gain ;
- Filtre gaussien pour lissage ;
- Application du gain et sortie.
Le filtre ne supprime pas le bruit. Alternatives : filtres FFmpeg afftdn, anlmdn, arnndn, ou rnnoise ALSA avec RNN.
Implémentation personnalisée en C++20
Prototype Python/Jupyter simule le traitement temps réel : tampons de 20 ms sans charger le fichier entier. Visualisation oscilloscope confirme la compression de dynamique.
Version finale : C++20 avec classes AutomaticGainControl et GaussianFilter. Structure du projet :
libagc— bibliothèque statique ;agc_pipe— utilitaire de tuyau ;- Plugin ALSA
libasound_module_pcm_agc.so.
Options agc_pipe :
Options autorisées :
-h [ --help ] Afficher l'aide
-m [ --msec ] arg (=20) Durée trame en ms
-c [ --channel ] arg (=1) Canaux à filtrer
-r [ --rate ] arg (=8000) Fréquence d'échantillonnage
-f [ --filter ] arg (=13) Taille filtre gaussien
-p [ --peak ] arg (=0.950000) Pic max
-g [ --gain ] arg (=100) Gain max
-v [ --verbose ] Logs verbeux
Test : arecord -D <input> -f S16_LE -t raw | ./agc_pipe -f 7 -g 99 | aplay -D <output> -f S16_LE -t raw.
Performances : +3 % CPU pour une source, ~400 ms latence (FrameLenMs=20, FilterSize=13). Utilise std::span pour sécurité.
Points clés
- L'AGC réduit la dynamique sans dégrader la clarté vocale ;
- La correction CC est indispensable pour éliminer les artefacts matériels ;
- Le filtrage gaussien assure des transitions fluides, minimisant les coupures ;
- L'implémentation OOP C++20 surpasse FFmpeg en maintenabilité et extensibilité ;
- Idéal pour VoIP embarqué : faible charge CPU, latence minimale.
— Editorial Team
Aucun commentaire pour le moment.