Před přečtením tohoto článku se doporučuje seznámit se s předchozím článkem:
Někteří uživatelé bezdrátových sluchátek si stěžují na nízkou kvalitu zvuku a nedostatek výšek při používání standardního Bluetooth kodeku SBC, který podporují všechna audio zařízení. Častým doporučením pro zlepšení zvuku je zakoupení zařízení a sluchátek s podporou kodeků aptX a LDAC. Tyto kodeky vyžadují licenční poplatky, takže zařízení s jejich podporou jsou dražší.
Ukazuje se, že nízká kvalita SBC je způsobena umělými omezeními Bluetooth sad a nastavení sluchátek, a toto omezení lze obejít na jakémkoli existujícím zařízení změnami v softwaru smartphonu nebo počítače.
Kodek SBC
Kodek SBC má mnoho různých parametrů, které se dohodnou během fáze spojení. Mezi nimi jsou:
- 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 paketu: 4, 8, 12, 16;
- Algoritmus distribuce bitů při kvantování: Loudness, SNR;
- Maximální a minimální hodnota bitpoolu používaná při kvantování: obvykle od 2 do 53.
Dekodující zařízení musí podporovat jakoukoli kombinaci těchto parametrů. Kódující zařízení nemusí implementovat všechny.
Existující Bluetooth sady obvykle dohodnou následující profil: Joint Stereo, 8 pásem, 16 bloků, Loudness, bitpool 2..53. Tento profil kóduje audio 44.1 kHz s bitrate 328 kbit/s.
Parametr bitpool přímo ovlivňuje bitrate v rámci jednoho profilu: čím je vyšší, tím vyšší je bitrate, a tím i kvalita.
Parametr bitpool však není vázán na konkrétní profil; vliv na bitrate má také do značné míry další parametry: typ kanálů, počet frekvenčních pásem, počet bloků. Bitrate lze zvýšit nepřímo prostřednictvím dohodnutí nestandardních profilů, aniž by došlo ke změně bitpoolu.
Vzorec pro výpočet bitrate SBC
Například režim Dual Channel kóduje kanály odděleně, přičemž využívá celý bitpool pro každý z kanálů. Když přinutíme zařízení používat Dual Channel místo Joint Stereo, získáme téměř dvojnásobný bitrate při stejné maximální hodnotě bitpoolu: 617 kbit/s.
Podle mého názoru použití hodnoty bitpool, která není vázaná na profil, během sjednávání, je nedostatkem standardu A2DP, který vedl k umělému omezení kvality SBC. Bylo by rozumnější sjednávat bitrate, nikoli bitpool.
Takové pevné hodnoty Bitpool a Bitrate vycházejí z tabulky doporučených hodnot pro použití s vysoce kvalitním audiozáznamem. Ale doporučení není důvod, proč se omezovat pouze těmito hodnotami.
Specifikace A2DP v1.2, která byla aktivní od roku 2007 do 2015, předepsala všem dekodérům správně pracovat s bitraty až do 512 kbit/s:
Dekodér SNK musí podporovat všechny možné hodnoty bitpool, které nepřesahují maximální bitrate. Tento profil omezuje dostupný maximální bitrate na 320 kb/s pro mono a 512 kb/s pro dvoukanálové režimy.
V nové verzi specifikace neexistuje žádné omezení bitrate. Předpokládá se, že moderní sluchátka uvedená na trh po roce 2015, která podporují EDR, mohou podporovat bitraty až přibližně 730 kbit/s.
Z nějakého důvodu mají ověřené Bluetooth stacky Linuxu (PulseAudio), Androidu, Blackberry a macOS umělá omezení maximální hodnoty parametru bitpool, který přímo ovlivňuje maximální bitrate. Ale to není největší problém, téměř všechna sluchátka také omezují maximální hodnotu bitpool na číslo 53.
Jak jsem již zjistil, většina zařízení funguje skvěle s modifikovaným Bluetooth stackem s bitrate 551 kbit/s, bez přerušení a praskání. Ale takový bitrate nikdy nebude sjednán za obvyklých podmínek, na obvyklých Bluetooth stackech.
Modifikujeme Bluetooth stack
V jakémkoli Bluetooth stacku, který je kompatibilní se standardem A2DP, existuje podpora režimu Dual Channel, ale aktivování tohoto režimu z rozhraní není možné.
Přidejme do rozhraní přepínač! Užil jsem patche pro Android 8.1 a Android 9, které přidávají plnou podporu Dual Channel do stacku, přidávají režim do menu pro přepínání režimů v nástroji pro vývojáře a zpracovávají SBC s podporou Dual Channel tak, jako by to byl další kodek, například aptX, AAC nebo LDAC (Android to nazývá HD Audio), přidávající zaškrtávací políčko do nastavení Bluetooth zařízení. Takto to vypadá:
Po aktivaci zaškrtávacího políčka se Bluetooth audio začne přenášet s bitrate 551 kbit/s, pokud sluchátka podporují připojení rychlostí 3 Mbit/s, nebo 452 kbps, pokud sluchátka podporují pouze 2 Mbps.
Tento patch je zahrnut v následujících alternativních firmwarech:
- LineageOS
- Resurrection Remix
- crDroid
Odkud pocházejí 551 a 452 kbps?
Technologie dělení kanálu v Bluetooth je určena k efektivnímu přenosu velkých paketů pevné velikosti. Přenos dat probíhá v intervalech, maximální počet intervalů odesílaných při jednom přenosu je 5. Existují také režimy přenosu, které používají 1 nebo 3 intervaly, ale ne 2 nebo 4. V 5 intervalech je možné přenést až 679 bytů při rychlosti připojení 2 Mbps a až 1021 bytů při rychlosti 3 Mbps, a v 3 intervalech 367 a 552 bytů.
Pokud chceme přenést méně dat než 679 nebo 1021 bytů, ale více než 367 nebo 552 bytů, pak přenos stále zabere 5 intervalů, přičemž data budou přenášena za stejný čas, což snižuje efektivitu přenosu.
SBC v režimu Dual Channel, na 44100 Hz audio s parametry Bitpool 38, 16 bloků ve framu, 8 frekvenčních pásem, kóduje audio do framů o velikosti 164 bytů, s bitrate 452 kbps.
Audio musí být zakomponováno do přenosových protokolů L2CAP a AVDTP, které spotřebovávají 16 bytů z užitečného audiovstupu.
Takže do jedné Bluetooth přenosu se 5 intervaly lze vejít 4 audioframy:
679 (EDR 2 Mbps DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (záhlaví SBC) - (164*4) = 6 Vložili jsme 11.7 ms audio dat do odesílaného paketu, který bude přenesen za 3.75 ms, a zůstalo nám 6 nevyužitých bytů v paketu.
Pokud trochu zvýšíme bitpool, 4 audioframy už nebude možné zabalit do jednoho paketu. Budeme muset odesílat po 3 framech najednou, což snižuje efektivitu přenosu, snižuje množství přenášeného audia na jeden paket a rychleji povede k zakolísání audia při špatných rádiových podmínkách.
Stejným způsobem byl určen bitrate 551 kbps pro EDR 3 Mbps: s Bitpool 47, 16 bloky ve framu, 8 frekvenčními pásmy dostáváme velikost framu 200 bytů, při bitrate 551 kbps. Do jednoho paketu se vejde 5 framů nebo 14.6 ms hudby.
Algoritmus pro výpočet všech parametrů SBC je dost složitý, snadno se v něm ztratit, když se počítá ručně, a proto jsem vytvořil interaktivní kalkulačku pro pomoc zájemcům:
Proč je to všechno potřeba?
Navzdory běžnému názoru na kvalitu zvuku kodeku aptX, může v některých souborech poskytovat horší výsledky než SBC se standardní bitovou rychlostí 328 kbit/s.
SBC dynamicky přiděluje kvantizační bity pro frekvenční pásma na principu „od spodního k vrchnímu“. Pokud byl veškerý bitový tok použit na nízké a střední frekvence, vrchní frekvence budou „odříznuty“ (místo toho bude ticho).
aptX kvantizuje frekvenční pásma jednotným počtem bitů neustále, což mu dává konstantní bitovou rychlost: 352 kbit/s pro 44,1 kHz, 384 kbit/s pro 48 kHz, a nemůže „přenést bity“ na ty frekvence, které je potřebují nejvíce. Na rozdíl od SBC aptX ne„odřízne“ frekvence, ale přidá do nich kvantizační šum, čímž snižuje dynamický rozsah zvuku a někdy přináší charakteristické praskání. SBC naopak „odsává detaily“ — odstraňuje nejtišší části.
Průměrně, ve srovnání se SBC 328k, aptX vnáší méně zkreslení do hudby s širokým frekvenčním rozsahem, ale u hudby s úzkým frekvenčním rozsahem a širokým dynamickým rozsahem občas vítězí SBC 328k.
Podívejme se na konkrétní případ. Spektrogram nahrávky hry na klavír:
Hlavní energie leží v frekvencích od 0 do 4 kHz, a pokračuje až do 10 kHz.
Spektrogram souboru komprimovaného v aptX vypadá následujícím způsobem:
A takto vypadá SBC 328k.
Je vidět, že SBC 328k občas zcela odpojuje rozsah nad 16 kHz a využívá veškerý dostupný bitový tok pro rozsahy pod touto hodnotou. Nicméně, aptX vnesl více zkreslení do slyšitelného spektra frekvencí, což lze vidět na vyčteném originálním spektrogramu ze spektrogramu aptX (čím jasnější, tím více zkreslení):
Zatímco SBC 328k méně pokazil signál v rozsahu od 0 do 10 kHz, ostatní — odřízl:
Bitrate 485k SBC stačilo, aby uchovalo celý frekvenční rozsah, bez odpojování pásmů.
SBC 485k v této skladbě výrazně převyšuje aptX v rozsahu 0-15 kHz, a s menším, ale stále patrným rozdílem — v 15-22 kHz (čím tmavší, tím méně zkreslení):
.
Přepnutím na vysokobitratový SBC získáte zvuk, který často překonává aptX, na jakýchkoli sluchátkách. Na sluchátkách podporujících připojení EDR 3 Mbit/s poskytuje bitrate 551 kbit/s zvuk srovnatelný s aptX HD.
Můžete to ještě vylepšit?
V patchi pro Android je také možnost pro další zvýšení bitrates pro zařízení EDR 2 Mbit/s. Je možné zvýšit bitrate z 452 kbit/s na 595 kbit/s, za cenu snížení stability přenosu v komplikovaných rádiových podmínkách.
Stačí nastavit proměnnou persist.bluetooth.sbc_hd_higher_bitrate na hodnotu 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1Patch pro extrémní bitrate byl zatím přijat pouze v LineageOS 15.1, nikoli v 16.0.
Kompatibilita se zařízeními
SBC Dual Channel podporuje prakticky všechna sluchátka, reproduktory a automobilové autorádia. Není divu — standard nařizuje jeho podporu v jakýchkoli dekodujících zařízeních. Existuje jen malé množství zařízení, na kterých tento režim způsobuje problémy, ale to jsou ojedinělé případy.
Podrobněji o kompatibilních zařízeních se můžete dozvědět na nebo .
Srovnání zvukových rozdílů
Vytvořil jsem webovou službu, která kóduje audio do SBC (také aptX a aptX HD) v reálném čase přímo v prohlížeči. Díky ní můžete porovnávat zvuk různých profilů SBC a dalších kodeků, bez skutečného přenosu audia přes Bluetooth, na jakýchkoli drátových sluchátkách, reproduktorech, a vaší oblíbené hudbě, a také měnit parametry kódování přímo během přehrávání audia.
Spojení s vývojáři Android
Psali jsme mnoha vývojářům Bluetooth stacku z Googlu s prosbou o zvážení zahrnutí patchů do hlavní větve Android — AOSP, ale nedostal jsem ani jednu odpověď. Moje patche v také zůstaly bez komentářů od kohokoli zapojeného.
Byl bych rád, kdybych dostal pomoc při spojení s vývojáři z Googlu a při zavádění SBC HD do Androidu. Patch v Gerritu je už zastaralý (to je jedna z prvních revizí), a já ho aktualizuji, pokud vývojáře zajímají mé změny (není pro mě snadné ho aktualizovat, nemám kompatibilní zařízení s Androidem Q).
Závěr
Uživatelé smartphonů s firmwarem LineageOS, Resurrection Remix a crDroid mohou již nyní těžit z vylepšené kvality zvuku, stačí aktivovat možnost v nastavení Bluetooth zařízení. Uživatelé Linuxu mohou také získat zvýšený bitrate SBC instalací , který mimo jiné přidává podporu kodeků aptX, aptX HD a FastStream.
Zdroj: habr.com
