Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Před přečtením tohoto článku se doporučuje přečíst si předchozí článek: Zvuk přes Bluetooth: co nejvíce podrobností o profilech, kodecích a zařízeních

Někteří uživatelé bezdrátových sluchátek hlásí špatnou kvalitu zvuku a nedostatek vysokých frekvencí při použití standardního kodeku Bluetooth SBC, který podporují všechna zvuková zařízení. Častým doporučením pro zlepšení zvuku je nákup zařízení a sluchátek s podporou kodeků aptX a LDAC. Tyto kodeky vyžadují licenční poplatky, takže zařízení, která je podporují, jsou dražší.

Ukazuje se, že nízká kvalita SBC je způsobena umělým omezením Bluetooth stacků a nastavení sluchátek a toto omezení lze obejít na jakémkoli existujícím zařízení softwarovými změnami smartphonu nebo počítače.

Kodek SBC

Kodek SBC má mnoho různých parametrů, které se vyjednávají během fáze nastavování připojení. Mezi nimi:

  • Počet a typ kanálů: Joint Stereo, Stereo, Dual Channel, Mono;
  • Počet frekvenčních pásem: 4 nebo 8;
  • Počet bloků v balení: 4, 8, 12, 16;
  • Algoritmus pro distribuci bitů během kvantizace: Loudness, SNR;
  • Maximální a minimální hodnota skupiny bitů použitých při kvantizaci (bitpool): obvykle od 2 do 53.

Dekódovací zařízení musí podporovat jakoukoli kombinaci těchto parametrů. Kodér nemusí implementovat vše.
Stávající sady Bluetooth se obvykle shodují na následujícím profilu: Joint Stereo, 8 pásem, 16 bloků, Loudness, bitpool 2..53. Tento profil kóduje zvuk 44.1 kHz při datovém toku 328 kbps.
Parametr bitpool přímo ovlivňuje datový tok v rámci jednoho profilu: čím vyšší je, tím vyšší je datový tok a tím i kvalita.
Parametr bitpool však není vázán na konkrétní profil; Přenosová rychlost je také do značné míry ovlivněna dalšími parametry: typem kanálů, počtem frekvenčních pásem, počtem bloků. Datový tok můžete zvýšit nepřímo, odsouhlasením nestandardních profilů, bez změny bitpoolu.

Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Vzorec pro výpočet bitrate SBC

Například režim Dual Channel kóduje kanály samostatně, přičemž pro každý kanál využívá celý bitpool. Tím, že zařízení přinutíme používat Dual Channel místo Joint Stereo, získáme téměř dvojnásobný datový tok se stejnou maximální hodnotou bitpoolu: 617 kbps.
Podle mého názoru je použití neprofilové bitpoolové hodnoty ve fázi vyjednávání chybou standardu A2DP, která vedla k umělému omezení kvality SBC. Bylo by moudřejší vyjednat bitrate, ne bitpool.

Tyto pevné hodnoty Bitpool a Bitrate pocházejí z tabulky doporučených hodnot pro vysoce kvalitní zvuk. Ale doporučení není důvodem k tomu, abyste se omezovali na tyto hodnoty.

Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Specifikace A2DP v1.2, která byla aktivní v letech 2007 až 2015, vyžaduje, aby všechna dekódovací zařízení fungovala správně s datovými toky až 512 kbps:

Dekodér SNK musí podporovat všechny možné hodnoty bitového fondu, které nevedou k překročení maximální bitové rychlosti. Tento profil omezuje dostupnou maximální přenosovou rychlost na 320 kb/s pro mono a 512 kb/s pro dvoukanálové režimy.

V nové verzi specifikace není žádný limit datového toku. Předpokládá se, že moderní sluchátka vydaná po roce 2015 a podporující EDR mohou podporovat přenosové rychlosti až ≈730 kbps.

Z nějakého důvodu mají mnou testované zásobníky Bluetooth pro Linux (PulseAudio), Android, Blackberry a macOS umělé limity maximální hodnoty parametru bitpool, který přímo ovlivňuje maximální bitrate. To ale není největší problém, téměř všechna sluchátka také omezují maximální bitpool hodnotu na 53.
Jak jsem již viděl, většina zařízení funguje perfektně na upraveném Bluetooth stacku s datovým tokem 551 kbps, bez přerušení a praskání. Ale takový datový tok nebude nikdy konzistentní za normálních podmínek, na běžných Bluetooth stackech.

Úprava zásobníku Bluetooth

V každém Bluetooth stacku, který je kompatibilní se standardem A2DP, existuje podpora pro režim Dual Channel, ale není možné ji aktivovat z rozhraní.

Pojďme přidat přepínač do rozhraní! Vytvořil jsem záplaty pro Android 8.1 a Android 9, které do zásobníku přidávají plnou podporu Dual Channel, přidávají režim do nabídky přepínání režimů ve vývojářských nástrojích a zacházejí s SBC s podporou Dual Channel, jako by to byl další kodek jako aptX, AAC. nebo LDAC (Android tomu říká HD Audio) přidáním zaškrtnutí do nastavení Bluetooth zařízení. Vypadá to takto:

Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Oprava pro Android 9
Oprava pro Android 8.1

Když je zaškrtávací políčko aktivováno, zvuk Bluetooth se začne přenášet bitovou rychlostí 551 kbps, pokud sluchátka podporují rychlost připojení 3 Mbit/s, popř 452 kbps, pokud sluchátka podporují pouze 2 Mbit/s.

Tato oprava je součástí následujících alternativních firmwarů:

  • LineageOS
  • Vzkříšení Remix
  • crDroid

Kde se vzalo 551 a 452 kbit/s?

Technologie air-splitting v Bluetooth je navržena tak, aby efektivně přenášela velké pakety pevné velikosti. Přenos dat probíhá ve slotech, největší počet slotů odeslaných při jednom přenosu je 5. Existují také přenosové režimy, které využívají 1 nebo 3 sloty, ale ne 2 nebo 4. V 5 slotech lze přenést až 679 bajtů rychlostí připojení 2 Mbps a až 1021 bajtů při rychlosti 3 Mbps, respektive 3 - 367 a 552 bajtů.

Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Pokud chceme přenést méně dat než 679 nebo 1021 bajtů, ale více než 367 nebo 552 bajtů, bude přenos stále trvat 5 slotů a data budou přenesena za stejnou dobu, což snižuje efektivitu přenosu.

Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

SBC v režimu Dual Channel, při 44100 Hz zvuku s parametry Bitpool 38, 16 bloků na snímek, 8 frekvenčních rozsahů, kóduje zvuk do 164 bajtových snímků s bitovou rychlostí 452 kbps.
Zvuk musí být zapouzdřen v přenosových protokolech L2CAP a AVDTP, které odebírají 16 bajtů z užitečného obsahu zvuku.

Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

V jednom přenosu Bluetooth s 5 sloty je tedy možné osadit 4 zvukové rámce:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (заголовок SBC) - (164*4) = 6

Do odesílaného paketu vměstnáme 11.7 ms audio dat, která se přenesou za 3.75 ms a v paketu nám zbývá 6 nevyužitých bajtů.
Pokud bitpool trochu zvednete, nebude již možné zabalit 4 audiorámce do jednoho balíčku. Budete muset posílat 3 snímky najednou, což snižuje efektivitu přenosu, snižuje množství zvuku přenášeného na snímek a rychleji vede k zasekávání zvuku ve špatných rádiových podmínkách.

Stejně tak byl zvolen datový tok 551 kbps pro EDR 3 Mbps: s Bitpool 47, 16 bloků na snímek, 8 frekvenčních pásem, je získána velikost rámce 200 bajtů s bitovou rychlostí 551 kbps. Jedno balení obsahuje 5 snímků nebo 14.6 ms hudby.

Algoritmus pro výpočet všech parametrů SBC je poměrně složitý, při ručním počítání se můžete snadno zmást, proto jsem vytvořil interaktivní kalkulačku, která zájemcům pomůže: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Proč je to všechno nutné?

Na rozdíl od všeobecného přesvědčení o kvalitě zvuku kodeku aptX může u některých souborů poskytovat horší výsledky než SBC se standardní bitovou rychlostí 328 kbps.

SBC dynamicky přiděluje kvantizační bity do frekvenčních pásem způsobem zdola nahoru. Pokud byl celý datový tok použit pro spodní a střední frekvence, budou horní frekvence „odříznuty“ (místo toho bude ticho).
aptX kvantuje frekvenční pásma stále stejným počtem bitů, a proto má konstantní datový tok: 352 kbps pro 44.1 kHz, 384 kbps pro 48 kHz a neumí „bit-shift“ na ty frekvence, které je nejvíce potřebují. . Na rozdíl od SBC nebude aptX „ořezávat“ frekvence, ale přidá k nim kvantizační šum, čímž sníží dynamický rozsah zvuku a někdy zavede charakteristické praskání. SBC „žere detaily“ – vyřadí nejtišší oblasti.
V průměru ve srovnání s SBC 328k přináší aptX menší zkreslení u hudby s širokým rozsahem, ale u hudby s úzkým rozsahem a vysokým dynamickým rozsahem SBC 328k někdy vyhrává.

Podívejme se na zvláštní případ. Spektrogram klavírní nahrávky:
Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Hlavní energie leží ve frekvencích od 0 do 4 kHz a pokračuje až do 10 kHz.
Spektrogram souboru komprimovaného v aptX vypadá takto:
Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

A takto vypadá SBC 328k.
Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Je vidět, že SBC 328k periodicky úplně vypínal rozsah nad 16 kHz a utratil veškerý dostupný datový tok na rozsahy pod touto hodnotou. Nicméně aptX zavedlo větší zkreslení do frekvenčního spektra slyšitelného lidským uchem, jak lze vidět na odečteném původním spektrogramu od spektrogramu aptX (čím jasnější, tím větší zkreslení):
Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Zatímco SBC 328k kazil signál méně v rozsahu od 0 do 10 kHz a zbytek odřízl:
Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

485k bitrate SBC stačilo k zachování celého frekvenčního rozsahu, bez deaktivace pásem.
Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

SBC 485k je na této stopě výrazně před aptX v rozsahu 0-15 kHz, s menším, ale stále znatelným rozdílem 15-22 kHz (čím tmavší, tím menší zkreslení):
Úprava zásobníku Bluetooth pro zlepšení zvuku ve sluchátkách bez kodeků AAC, aptX a LDAC

Archiv původního zvuku, SBC a aptX.

Přepnutím na SBC s vysokým datovým tokem získáte zvuk, který často překonává aptX na jakýchkoli sluchátkách. Na sluchátkách, která podporují konektivitu 3 Mb/s EDR, poskytuje přenosová rychlost 551 kb/s zvuk srovnatelný s aptX HD.

Dokážete ještě víc?

Oprava pro Android také obsahuje možnost dalšího zvýšení bitrate pro 2 Mbps EDR zařízení. Můžete zvýšit bitrate ze 452 kbit/s na 595 kbit/s, za cenu snížení stability přenosu v obtížných rádiových podmínkách.
Proměnnou persist.bluetooth.sbc_hd_higher_bitrate stačí nastavit na 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Oprava pro extrémní datový tok je akceptována pouze v LineageOS 15.1, ale ne v 16.0.

Kompatibilita zařízení

SBC Dual Channel podporují téměř všechna sluchátka, reproduktory a hlavní jednotky automobilu. Není se čemu divit – standard vyžaduje jeho podporu v jakýchkoli dekódovacích zařízeních. Existuje malý počet zařízení, na kterých tento režim způsobuje problémy, ale jedná se o izolované případy.
Další informace o kompatibilních zařízeních viz W4bsitXNUMX-dns.com nebo XDA-developers.

Porovnání zvukových rozdílů

Vytvořil jsem webovou službu, která kóduje zvuk do SBC (stejně jako aptX a aptX HD) v reálném čase, přímo v prohlížeči. S ním můžete porovnávat zvuk různých profilů SBC a dalších kodeků, aniž byste skutečně přenášeli zvuk přes Bluetooth, na jakýchkoli kabelových sluchátkách, reproduktorech a své oblíbené hudbě a také měnit parametry kódování přímo při přehrávání zvuku.
btcodecs.valdikss.org.ru/sbc-encoder

Kontaktujte vývojáře Android

Napsal jsem mnoha vývojářům Bluetooth stacku ve společnosti Google a požádal je, aby zvážili zahrnutí oprav do hlavní větve Androidu - AOSP, ale nedostal jsem jedinou odpověď. Moje náplasti dovnitř Systém záplat Gerrit pro Android také zůstal bez komentáře od kohokoli zúčastněného.
Byl bych rád, kdybych mohl získat nějakou pomoc, jak se spojit s vývojáři v Google a přinést SBC HD do Androidu. Záplata v gerritu je již zastaralá (jedná se o jednu z prvních revizí) a pokud budou mít vývojáři zájem o mé změny, aktualizuji ji (není pro mě snadné ji aktualizovat, nemám zařízení kompatibilní s Android Q ).

Závěr

Uživatelé chytrých telefonů s LineageOS, Resurrection Remix a firmwarem crDroid si mohou vychutnat vylepšenou kvalitu zvuku právě teď, stačí aktivovat možnost v nastavení zařízení Bluetooth. Uživatelé Linuxu mohou také získat zvýšenou bitovou rychlost SBC instalací nášivka od Pali Rohar, který mimo jiné přidává podporu pro kodeky aptX, aptX HD a FastStream.

Zdroj: www.habr.com

Přidat komentář