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.
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.
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.
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
Zatím žádné komentáře.