Zpět na domů

AGC pro Linux ALSA: implementace a nastavení

Článek popisuje implementaci AGC pro normalizaci hlasitosti v VoIP systémech na Linux ALSA. Srovnávají se pluginy speex, FFmpeg dynaudnorm a vlastní kód C++20. Dosažena latence 400 ms při +3% CPU.

AGC v akci: od speex k C++20 pro VoIP
Advertisement 728x90

Automatická regulace zesílení zvuku: Implementace AGC pro vestavěné systémy

Algoritmus AGC (Automatic Gain Control) normalizuje úroveň signálu v reálném čase a eliminuje potřebu ručního nastavování. V komunikačních systémech na Linuxu s ALSA řeší problém nerovnoměrné hlasitosti z různých zdrojů. Implementace je zaměřena na formát S16_LE, 8000 Hz, mono, se zpožděním do 500 ms a zátěží CPU pod 3 %.

Cíl — zpracování krátkých hlasových přenosů bez průměrování celého souboru. Testování zahrnuje subjektivní (srozumitelnost řeči) i objektivní (snížení dynamického rozsahu) kritéria.

Analýza hotových řešení: AI a pluginy

Model Nvidia studiovoice normalizuje hlasitost a potlačuje šumy, ale vyžaduje resamplování z 48 kHz na 8 kHz, což zvyšuje zpoždění. Lokální použití není možné kvůli závislostem.

Google AdInline article slot

Plugin ALSA speex (založený na speexdsp) se aktivuje parametry agc on a agc_level (1–32768). Konfigurace v /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émy: počáteční útlum, efekt „praskání“ kvůli underrun, nedokumentované frames a filter_length. Řešení — odmítnutí.

FFmpeg dynaudnorm: Rozbor algoritmu

Filtr dynaudnorm je ideální: ffmpeg -f alsa -i dev_in -filter:a "dynaudnorm=f=20:g=33:m=100:c=1" output.wav.

Google AdInline article slot

Parametry:

  • f=20 — rámec 20 ms pro krátké přenosy;
  • g=33 — gaussovské vyhlazování (vyvážení zpoždění a plynulosti);
  • m=100 — max. zesílení (vázáno na úroveň hlasitosti);
  • c=1 — DC-korekce (odstraňuje posun způsobený rušením).

Algoritmus:

  • Vstupní rámec velikosti F;
  • DC-korekce;
  • Hledání maxima;
  • Výpočet koeficientu zesílení;
  • Gaussův filtr pro vyhlazování;
  • Zesílení a výstup.

Filtr nepotlačuje šumy. Alternativy: afftdn, anlmdn, arnndn ve FFmpeg nebo ALSA rnnoise na RNN.

Google AdInline article slot

Vlastní implementace v C++20

Prototyp v Python/Jupyter simuluje real-time: zpracování bufferů po 20 ms bez načítání celého souboru. Oscilogramy potvrzují kompresi dynamického rozsahu.

Výsledek: C++20, třídy AutomaticGainControl a GaussianFilter. Struktura projektu:

  • libagc — statická knihovna;
  • agc_pipe — utilita pro potrubí;
  • ALSA-plugin libasound_module_pcm_agc.so.

Možnosti agc_pipe:

Povolené možnosti:

-h [ --help ] Zobrazit nápovědu

-m [ --msec ] arg (=20) Délka rámu v ms

-c [ --channel ] arg (=1) Počet kanálů k filtrování

-r [ --rate ] arg (=8000) Vzorkovací frekvence

-f [ --filter ] arg (=13) Velikost gaussova filtru

-p [ --peak ] arg (=0.950000) Max. hodnota špičky

-g [ --gain ] arg (=100) Max. hodnota zesílení

-v [ --verbose ] Zapnout podrobné logy

Test: arecord -D <input> -f S16_LE -t raw | ./agc_pipe -f 7 -g 99 | aplay -D <output> -f S16_LE -t raw.

Výkon: +3 % CPU při jednom zdroji, zpoždění ~400 ms (FrameLenMs=20, FilterSize=13). Používá std::span pro bezpečnost.

Co je důležité

  • AGC snižuje dynamický rozsah bez ztráty srozumitelnosti řeči;
  • DC-korekce je nezbytná pro odstranění hardwarových artefaktů;
  • Gaussův filtr zajišťuje plynulé přechody a minimalizuje přetížení;
  • Implementace v C++20 s OOP překonává FFmpeg v podpoře a rozšiřitelnosti;
  • Vhodné pro vestavěné VoIP: nízká zátěž, malé zpoždění.

— Editorial Team

Advertisement 728x90

Číst dál