( locsemege | 2019. 10. 15., k – 21:00 )

Köszönöm a hozzászólásod, ez legalább konstruktív volt.

Az elején szerintem tévedsz, a többiben igazad van. Amikor a 11 Hz hibáról beszélünk, az a 44.1 kHz-hez képest értendő, ami 249 ppm. Az más kérdés, hogy a példám valóban túlzó, nagyjából 50 ppm a reális. Ennek megfelelően egy nagyon mély hang lejátszása is csak 50 ppm relatív hibával történne, amit nem hallunk meg. Akkor maradna meg Hz-re pontosan a hibánk, ha kevernénk a frekvenciát. Az analóg FM rádiók esetében épp ezt csinálják: 90 MHz környékéről lekeverik a vivőt 10.7 MHz-re, de a frekvencia löket ugyanúgy 300 kHz marad, ami viszont a 10.7 MHz-es középfrekvenciára relatív sokkal nagyobb, mint az eredeti 90 MHz-ez vivőhöz arányítva. Így könnyebb lesz demodulálni.

A másik, hogy írtam, valóban más oka van az intenzív recsegés-ropogásnak, mert néhány percenként lehetne a frekvenciahiba miatt egy reccsenés. Viszont nem úgy tűnik, hogy ez hálózati hiba, a csomagvesztés is logolásra kerül. Sajnos a pulseaudio, a hangkártya és annak kernel modulja az a három összetevő, ahol valami nincs rendben, s ebből jön a baj. Illetve a Linux kernel ütemezőjét is ide vehetjük még. Tapasztalatom szerint, ha a pulseaudio viszonylag sok futásidőt visz, akkor szétesik a hangja. Ha kell újramintavételeznie, akkor sok futásidőt eszik. Márpedig az Opus codec 48 kHz-es stream-et állít elő és ilyet fogad, a hangkártya meg 44.1 kHz-ről megy. Mehetne hardware-esen 48 kHz-ről, de akkor a legtöbb egyéb hanganyagnál kellene a resampling: csöbörből vödörbe.

Ezért döntöttem úgy, hogy a kliens oldalon újramintavételezek: a hangszervertől 44.1 kHz-es stram-et kérek, az Opus codec-nek 48 kHz-eset adok, és ilyet fogadok tőle. Lineáris interpolációt írni nem túl bonyolult. Tudom, a harmonikusok elnyomására kellene mindenféle szűrés, de beszédhang átvitelénél első közelítésben sebességre gyúrok, nem hangminőségre. Szerintem bőven rendben lesz a minőség.

Ezzel tehát semmit nem oldok meg, csak egy workaround, leveszem a pulseaudio-ról a resampling terhét, s az jótékonyan hat majd várhatóan a lelkére.

Aztán van az elméleti fejtegetés a problémára. Itt sokféle megoldás lehetséges. Gondolkodtam azon, hogy egy analóg átvitel mitől jó, míg egy mintavett digitális átvitellel mi a baj. Hát az, hogy a mintavételnek szinkronban kellene történnie, ugyanakkor nem visszük át az órajelet, s a küldő és fogadó oldalon eltérően telik az idő.

Az újramintavételezés a tökéletes megoldás, de ha van mód arra, hogy finoman állítsuk a lejátszóban a mintavételi frekvenciát, akkor lehet integráló szabályozót csinálni, ahol a szabályozó hibajele az optimális buffer telítettségtől való eltérés. Aztán egy másik megközelítés, hogy időbélyeggel látjuk el az adatcsomagokat, s erre szabályozunk. További megoldás, hogy nem nyúlunk a sebességhez, csak néha eldobunk egy-egy mintát, vagy beálmodunk egyet-egyet. Például két szomszédos minta közé azok átlagát, vagy egyszerűen az egyiket megismételjük. Nem teljes buffert, csak egy-egy hangmintát.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE