Před přečtením tohoto článku se doporučuje přečíst si předchozí článek:
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.
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.
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:
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ů.
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.
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.
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:
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:
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:
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í):
Zatímco SBC 328k kazil signál méně v rozsahu od 0 do 10 kHz a zbytek odřízl:
485k bitrate SBC stačilo k zachování celého frekvenčního rozsahu, bez deaktivace pásem.
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í):
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
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.
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ř
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í
Zdroj: www.habr.com