A cikk elolvasása előtt ajánlott megismerkedni a korábbi írással:
Néhány vezeték nélküli fülhallgató felhasználója a hangminőség alacsony szintjét és a magas frekvenciák hiányát tapasztalja az összes audioeszközt támogató szabványos Bluetooth-SBC kodek használatakor. A hangjavítás gyakori ajánlása a kodekek, például az aptX és LDAC támogatásával rendelkező eszközök és fülhallgatók vásárlása. Ezek a kodekek licencdíjakat igényelnek, így a támogatott eszközök drágábbak.
Kiderült, hogy az SBC alacsony minősége a Bluetooth-stack-ek és a fülhallgatók beállításainak műszaki korlátozásaival függ össze, amit bármely meglévő eszközön szoftveres módosításokkal meg lehet kerülni.
SBC kodek
Az SBC kodeknek számos különböző paramétere van, amelyek a kapcsolat létrehozásakor kerülnek kibővítésre. Ezek közé tartozik:
- A csatornák száma és típusa: Joint Stereo, Stereo, Dual Channel, Mono;
- A frekvenciasávok száma: 4 vagy 8;
- A blokkok száma a csomagban: 4, 8, 12, 16;
- A bitek elosztási algoritmus a kvantálás során: Loudness, SNR;
- A kvantálásnál használt bitek maximális és minimális mértéke (bitpool): általában 2 és 53 között.
A dekódoló eszköznek támogatnia kell ezen paraméterek bármely kombinációját. A kódoló eszköz nem biztos, hogy mindet megvalósítja.
A jelenlegi Bluetooth-stack-ek általában a következő profilt döntenek el: Joint Stereo, 8 sáv, 16 blokk, Loudness, bitpool 2..53. Ez a profil 44,1 kHz-es hangot kódol 328 kbit/s bitrátával.
A bitpool paraméter közvetlen hatással van a bitráta mértékére egy adott profilon belül: minél magasabb, annál magasabb a bitráta, így a minőség is javul.
A bitpool paraméter azonban nem kötődik konkrét profillal; a bitártre más paraméterek, például a csatornák típusa, a frekvenciasávok száma és a blokkok száma is jelentős hatással vannak. A bitráta emelhető közvetve, nem szabványos profilokkal való egyetértéssel, anélkül, hogy megváltoztatnánk a bitpool-t.
Az SBC bitráta számítási képlete
Például a Dual Channel mód a csatornákat külön-külön kódolja, maximálisan felhasználva a bitpool teljes mértékét mindkét csatorna esetében. Ha ráírjuk az eszközt, hogy a Dual Channel-t használja a Joint Stereo helyett, majdnem megduplázódik a bitráta ugyanazon bitpool maximális értéknél: 617 kbit/s.
Véleményem szerint a profilhoz nem kötött bitpool érték alkalmazása az A2DP szabvány tárgyalásának fázisában a szabvány hiányossága, ami a SBC minőségének mesterséges korlátozásához vezetett. Ésszerűbb lett volna a bitrate-et egyeztetni, nem pedig a bitpool-t.
Az ilyen fix Bitpool és Bitrate értékek a magas minőségű audio használatára ajánlott értékekre vonatkozó táblázatból erednek. De az ajánlás nem ok arra, hogy ezekre az értékekre korlátozódjunk.
A 2007 és 2015 között érvényes A2DP v1.2 specifikáció előírja, hogy minden dekódoló eszköznek helyesen kell működnie 512 kbit/s bitráta szintig:
A SNK dekóderének támogatnia kell az összes lehetséges bitpool értéket, amely nem eredményez a maximális bitráta túllépését. Ez a profil a maximális bitráta elérhetőségét mono esetén 320 kbit/s-ra, míg kétcsatornás üzemmódban 512 kbit/s-ra korlátozza.
Az új specifikációs verzióban a bitráta korlátozása megszűnt. Feltételezhető, hogy a 2015 után kiadott, EDR-t támogató modern fejhallgatók támogatják a bitrátákat ≈730 kbit/s-ig.
Valamiért a tesztelt Linux (PulseAudio), Android, Blackberry és macOS Bluetooth-stackjein mesterséges korlátozások vannak érvényben a bitpool paraméter maximális értékére, amely közvetlen hatással van a maximális bitrátára. De ez nem a legnagyobb probléma, szinte minden fejhallgató is maximum 53-ra korlátozza a bitpool értékét.
Ahogy már tapasztaltam, a legtöbb eszköz jól működik egy módosított Bluetooth-stackkel 551 kbit/s bitráta mellett, megszakítások és recsegés nélkül. De ilyen bitráta soha nem lesz egyeztetve normál körülmények között, a szokásos Bluetooth-stackeken.
Módosítható Bluetooth-stack
Bármely Bluetooth-stackben, ami kompatibilis az A2DP szabvánnyal, van támogatás a Dual Channel mode-hoz, de ezt az interfészen keresztül aktiválni nem lehet.
Adjunk hozzá egy kapcsolót az interfészhez! Készítettem javításokat Android 8.1 és Android 9 számára, amelyek teljes körű támogatást nyújtanak a Dual Channel számára a stackben, a módosítást a fejlesztői eszközök menüjében lehetőségként kínálják, és az SBC-t úgy kezelik, mint egy további kodeket, például aptX, AAC vagy LDAC (az Android ezt HD Audio-nak nevezi), hozzáadva egy pipát a Bluetooth-eszköz beállításaihoz. Így néz ki:
A pipa aktiválása után a Bluetooth-audio 551 kbit/s bitrátával kezd el terjedni 551 kbit/s, ha a fejhallgatók 3 Mbit/s sebességgel csatlakozásra képesek, vagy 452 kbit/s, ha a fejhallgató csak 2 mbit/s-t támogat.
Ez a javítás a következő alternatív firmware-ekbe van beépítve:
- LineageOS
- Resurrection Remix
- crDroid
Honnan származik az 551 és 452 kbit/s?
A Bluetooth spektrumelválasztás technológiája a nagy méretű rögzített csomagok hatékony átvitelére szolgál. Az adatátvitel slotokban történik, a maximálisan átküldhető slotok száma egy átvitel során — 5. Léteznek olyan átvitel módok is, amelyek 1 vagy 3 slotot használnak, de nem 2 vagy 4. 5 slotban akár 679 byte átküldésére van lehetőség 2 mbit/s sebességgel, és akár 1021 byte átküldésére 3 mbit/s sebességgel, míg 3 slotban 367 és 552 byte átküldésére.
Ha kevesebb adatot szeretnénk átküldeni, mint 679 vagy 1021 byte, de többet, mint 367 vagy 552 byte, akkor az átvitel továbbra is 5 slotba fog telni, és az adatátvitel időtartama ugyanannyi marad, ami csökkenti az átvitel hatékonyságát.
Az SBC Dual Channel módban, 44100 Hz audio mellett, 38-as Bitpool paraméterekkel, 16 blokkal egy keretben, 8 frekvenciatartománnyal, 164 byte méretű keretekként kódolja az audio adatokat, 452 kbit/s bitrátával.
Az audio-nak az L2CAP és AVDTP átviteli protokollokba kell beágyazódnia, amelyek 16 byte-ot vonnak el a hasznos audio terheléstől.
Így egy Bluetooth átvitel során 5 slotba 4 audio keret fér el:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC fejléce) - (164*4) = 6 11.7 ms audio adatot sikerült elhelyeznünk az elküldött csomagban, amely 3.75 ms alatt lesz átküldve, és 6 kihasználatlan byte maradt a csomagban.
Ha egy kicsit megemeljük a bitpool-t, már nem lehet 4 audio keretet egy csomagba sűríteni. Három keretet kell egyszerre küldeni, ami csökkenti az átvitel hatékonyságát, csökkenti az egy csomagban átküldhető audio mennyiségét, és hamarabb vezethet audio szaggatáshoz gyenge rádiófeltételek mellett.
Hasonló módon került meghatározásra az 551 kbit/s bitráta EDR 3 mbit/s esetén: 47-es Bitpool-lal, 16 blokkal egy keretben, 8 frekvenciatartománnyal a keret mérete 200 byte, 551 kbit/s bitrátával. Egy csomagba 5 keret vagy 14.6 ms zene fér el.
A SBC összes paraméterének kiszámítási algoritmusa meglehetősen bonyolult, könnyen összezavarodhatunk, ha kézzel számolunk, ezért készítettem egy interaktív kalkulátort az érdeklődők számára:
Miért van szükség minderre?
AptX codec körüli széles körű vélemények ellenére, bizonyos fájlok esetében rosszabb eredményeket adhat, mint az SBC, amelynek standard bitrateszáma 328 kbit/s.
Az SBC dinamikusan osztja ki a kvantálás biteket a frekvenciasávok között, az alsó frekvenciáktól a magasabbak felé haladva. Ha az összes bitrátát az alsó és közép frekvenciákra fordítják, a felső frekvenciák "levágódnak" (helyettük csend lép fel).
Az aptX konstans bitrátát biztosít, mivel a frekvenciasávokat folyamatosan ugyanannyi biten kvantálja: 352 kbit/s a 44.1 kHz-hez, 384 kbit/s a 48 kHz-hez, és nem tudja "átvinni a biteket" a szükséges frekvenciákra. Az SBC-vel ellentétben az aptX nem vágja le a frekvenciákat, hanem kvantálási zajokat ad hozzá, csökkentve az audio dinamika tartományát, és időnként jellegzetes sistergéseket hozva létre. Az SBC viszont "eltünteti a részleteket" – eldobja a legcsendesebb részeket.
Átlagosan az SBC 328k-hoz képest az aptX kevesebb torzítást visz a széles frekvenciasávú zenébe, ám a keskeny frekvenciasávú és széles dinamika tartományú zenék esetében az SBC 328k néha előnyben van.
Nézzük meg egy konkrét esetet. Egy zongora előadás hangfelvételének spektrogrammája:
A fő energia a 0 és 4 kHz közötti frekvenciákon található, és 10 kHz-ig folytatódik.
Az aptX-ben tömörített fájl spektrogrammája így néz ki:
Ez pedig az SBC 328k.
Látható, hogy az SBC 328k időszakosan teljesen lekapcsolta a 16 kHz feletti sávot, és az összes rendelkezésre álló bitrátát az alacsonyabb tartományokra költötte. Azonban az aptX nagyobb torzítást hozott a hallható emberi fül által érzékelt frekvenciaspektrumban, amit a kivont eredeti spektrogram és az aptX spektrogram közötti különbség mutat (minél világosabb, annál több torzítás):
Míg az SBC 328k kevésbé rontotta el a jelet a 0 és 10 kHz közötti tartományban, a többit levágta:
Az 485k bitráta elegendő volt az SBC számára, hogy megőrizze az összes frekvenciasávot anélkül, hogy lekapcsolta volna a sávokat.
Az SBC 485k ezen a kompozíción jelentősen megelőzi az aptX-et a 0-15 kHz tartományban, és kisebb, de még mindig észlelhető különbséggel a 15-22 kHz tartományban (minél sötétebb, annál kevesebb torzítás):
.
Ha magas bitrátás SBC-re vált, a hangzás gyakran felülmúlja az aptX-et bármilyen fejhallgatón. Az EDR 3 Mbit/s csatlakozást támogató fejhallgatókon a 551 kbit/s bitráta hangzása összehasonlítható az aptX HD-vel.
Lehetne még többet is?
Az Android patch-ben található egy opció, amely lehetővé teszi a bitráta további növelését EDR eszközök esetén 2 Mbit/s sebességgel. A bitrátát 452 kbit/s-ról 595 kbit/s-ra lehet emelni, cserébe a stabilitás csökkenésével a bonyolult rádiókörülmények között.
Elég csak a persist.bluetooth.sbc_hd_higher_bitrate változót 1 értékre állítani:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1A magas bitráta patch még csak a LineageOS 15.1-ben került elfogadásra, de a 16.0 esetében nem.
Kompatibilitás eszközökkel
A SBC Dual Channel-t gyakorlatilag minden fejhallgató, hangszóró és autós fejegység támogatja. Nem meglepő, hiszen a szabvány előírja a támogatását bármilyen dekódoló eszközön. Csak néhány eszköz van, ahol ez a mód problémákat okoz, de ezek egyedi esetek.
A kompatibilis eszközökkel részletesebben megismerkedhet vagy .
A hangkülönbségek összehasonlítása
Készítettem egy webszolgáltatást, amely valós időben kódolja az audiót SBC-be (valamint aptX és aptX HD) közvetlenül a böngészőben. Ezzel összehasonlíthatja a különböző SBC profilok hangzását és más kodekeket anélkül, hogy ténylegesen audiót közvetítene Bluetooth-on, bármilyen vezetékes fejhallgatón, hangszórón és kedvenc zenéin, valamint módosíthatja a kódolási paramétereket, miközben az audiót lejátsza.
Kapcsolat a Android fejlesztőivel
Sok Bluetooth-stack fejlesztőhöz írtam a Google-tól, kérve, hogy fontolják meg a patch-ek beillesztését az Android fő ágba — AOSP, de egyetlen választ sem kaptam. A patch-eim szintén kommentár nélkül maradt senki részéről, aki a dologban érintett.
Örülnék, ha segíthetnének a Google fejlesztőivel való kapcsolatfelvételben és az SBC HD megvalósításában az Android-on. A Gerrit-en lévő patch már elavult (ez az egyik korai verzió), és frissíteni fogom, ha a fejlesztőket érdeklik a módosításaim (nehéz frissítenem, mivel nincs Android Q-val kompatibilis eszközöm).
Zárás
A LineageOS, Resurrection Remix és crDroid rom-ot futtató okostelefonok felhasználói már most is élvezhetik a javított hangminőséget, elég, ha aktiválják az opciót a Bluetooth eszköz beállításaiban. A Linux felhasználói szintén magasabb SBC bitrátát érhetnek el , amely, többek között, hozzáadja az aptX, aptX HD és FastStream kodekek támogatását.
Forrás: habr.com
