Prije čitanja ovog članka preporučuje se upoznavanje s prethodnim člankom:
Neki korisnici bežičnih slušalica primjećuju nisku kvalitetu zvuka i manjak visokih frekvencija prilikom korištenja standardnog Bluetooth kodeka SBC, koji podržavaju svi audio uređaji. Česta preporuka za poboljšanje zvuka je kupnja uređaja i slušalica koje podržavaju kodeke aptX i LDAC. Ovi kodeci zahtijevaju licencne naknade, stoga uređaji s njihovom podrškom koštaju više.
Ispostavlja se da je niska kvaliteta SBC uzrokovana umjetnim ograničenjima Bluetooth stackova i postavkama slušalica, te se to ograničenje može zaobići na bilo kojim postojećim uređajima uz pomoć programske promjene pametnog telefona ili računala.
Kodek SBC
Kodek SBC ima mnogo različitih parametara koji se dogovaraju tijekom uspostave veze. Među njima:
- Broj i tip kanala: Joint Stereo, Stereo, Dual Channel, Mono;
- Broj frekvencijskih pojaseva: 4 ili 8;
- Broj blokova u paketu: 4, 8, 12, 16;
- Algoritam raspodjele bitova pri kvantizaciji: Loudness, SNR;
- Maksimalna i minimalna vrijednost bitpoola korištenih pri kvantizaciji: obično od 2 do 53.
Dekodirajući uređaj mora podržavati bilo koju kombinaciju ovih parametara. Kodirajući uređaj možda neće implementirati sve.
Postojeći Bluetooth stackovi obično dogovaraju sljedeći profil: Joint Stereo, 8 pojaseva, 16 blokova, Loudness, bitpool 2..53. Ovaj profil kodira 44.1 kHz audio s bitnom brzinom od 328 kbit/s.
Parametar bitpool izravno utječe na bitnu brzinu unutar jednog profila: što je viši, to je veća bitna brzina, a samim tim i kvaliteta.
Međutim, parametar bitpool nije vezan uz određeni profil; utjecaj na bitnu brzinu također značajno ovisi o drugim parametrima: tip kanala, broj frekvencijskih pojaseva, broj blokova. Bitnu brzinu moguće je povećati posredno, dogovorom nestandardnih profila, bez promjene bitpoola.
Formula za izračunavanje bitne brzine SBC
Na primjer, način Dual Channel kodira kanale odvojeno, koristeći cijeli bitpool za svaki od kanala. Prisili li uređaj da koristi Dual Channel umjesto Joint Stereo, dobit ćemo gotovo udvostručenu bitnu brzinu pri istoj maksimalnoj vrijednosti bitpoola: 617 kbit/s.
Po mom mišljenju, korištenje vrijednosti bitpool koja nije vezana uz profil tijekom pregovora predstavlja nedostatak A2DP standarda, što je dovelo do umjetnog ograničenja kvalitete SBC. Razumnije bi bilo pregovarati o bitrateu, a ne o bitpoolu.
Takve fiksne vrijednosti Bitpool i Bitrate potječu iz tablice s preporučenim vrijednostima za korištenje u visokokvalitetnom audiju. No preporuka nije isprika za ograničenje tih vrijednosti.
Specifikacija A2DP v1.2, koja je bila aktivna od 2007. do 2015. godine, propisuje da sve dekodirajuće uređaje moraju ispravno funkcionirati s bitrateom do 512 kbit/s:
Dekoder SNK-a mora podržavati sve moguće vrijednosti bitpool-a koje ne rezultiraju prekoračenjem maksimalnog bitratea. Ovaj profil ograničava dostupni maksimalni bitrate na 320kb/s za mono, i 512kb/s za dvo-kanalne mode.
U novoj verziji specifikacije ograničenje bitratea ne postoji. Predviđa se da moderni slušalice, objavljene nakon 2015. godine i koje podržavaju EDR, mogu podržavati bitrate do ≈730 kbit/s.
Iz nekog razloga, kod Bluetooth-stackova koje sam provjerio na Linuxu (PulseAudio), Androidu, Blackberryju i macOS-u postoje umjetna ograničenja maksimalne vrijednosti parametra bitpool, što izravno utječe na maksimalni bitrate. No, to nije najveći problem, gotovo sve slušalice također ograničavaju maksimalnu vrijednost bitpool-a na broj 53.
Kako sam već imao priliku uvjeriti se, većina uređaja izvrsno radi na modificiranom Bluetooth-stacku s bitrateom od 551 kbit/s, bez prekida i šumova. No, takav bitrate nikada neće biti dogovoren u uobičajenim uvjetima, na uobičajenim Bluetooth-stackovima.
Modificirajmo Bluetooth-stack
U bilo kojem Bluetooth-stacku koji je usklađen sa standardom A2DP postoji podrška za Dual Channel mod, ali aktivirati ga iz sučelja nije moguće.
Dodajmo preklopnik u sučelje! Napravio sam ispravke za Android 8.1 i Android 9, koje dodaju punu podršku za Dual Channel u stack, dodaju mod u izbornik prebacivanja moda u alate za programere, i obrađuju SBC s podrškom za Dual Channel kao da je to dodatni kodek, poput aptX, AAC ili LDAC (Android to naziva HD Audio), dodajući kvačicu u postavke Bluetooth uređaja. Ovako to izgleda:
Aktiviranjem kvačice, Bluetooth audio počinje se prenositi s bitrateom 551 kbit/s, ako slušalice podržavaju vezu na brzini od 3 mbit/s, ili 452 kbit/s, ako slušalice podržavaju samo 2 mbit/s.
Ovaj patch je uključen u sljedeće alternativne firmware-e:
- LineageOS
- Resurrection Remix
- crDroid
Kako su nastali 551 i 452 kbit/s?
Tehnologija podjele etera u Bluetooth-u namijenjena je učinkovitoj transmisiji velikih paketa fiksne veličine. Prijenos podataka odvija se u slotovima, a najveći broj slotova koji se šalju u jednom prijenosu je 5. Također postoje načini prijenosa koji koriste 1 ili 3 slota, ali ne 2 ili 4. U 5 slotova može se prenijeti do 679 bajtova pri brzini veze od 2 mbit/s i do 1021 bajta pri brzini od 3 mbit/s, a u 3 slota 367 i 552 bajta respektivno.
Ako želimo prenijeti manje podataka od 679 ili 1021 bajta, ali više od 367 ili 552 bajta, prijenos će i dalje zauzeti 5 slotova, a podaci će se prenositi za isto vrijeme, što smanjuje učinkovitost prijenosa.
SBC u načinu dual channel, na 44100 Hz audio s parametrima Bitpool 38, 16 blokova u okviru, 8 frekvencijskih opsega, kodira audio u okvire veličine 164 bajta, s bitrate-om od 452 kbit/s.
Audio mora biti inkapsulirano u protokole prijenosa L2CAP i AVDTP, koji uzimaju 16 bajtova od korisnog audio opterećenja.
Tako, u jednom Bluetooth prijenosu s 5 slotova uspijevamo smjestiti 4 audio okvira:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC zaglavlje) - (164*4) = 6 Smjestili smo 11.7 ms audio podataka u paket koji će se poslati za 3.75 ms, i ostalo nam je 6 neiskorištenih bajtova u pošiljci.
Ako malo povećamo bitpool, 4 audio okvira više se neće moći smjestiti u jedan paket. Morat ćemo slati po 3 okvira odjednom, što smanjuje učinkovitost prijenosa, smanjuje količinu prenesenog zvuka u jednom paketu i brže dovodi do preskakanja zvuka u lošim radio uvjetima.
Na sličan način je odabran bitrate od 551 kbit/s za EDR 3 mbit/s: s Bitpool 47, 16 blokova u okviru, 8 frekvencijskih opsega veličina okvira iznosi 200 bajtova, pri bitrate-u od 551 kbit/s. U jedan paket može stati 5 okvira ili 14.6 ms muzike.
Algoritam za izračun svih parametara SBC-a prilično je složen, lako se možete zbuniti ako brojite ručno, stoga sam napravio interaktivni kalkulator za pomoć zainteresiranim:
Zašto je sve ovo potrebno?
Unatoč uobičajenim mišljenjima o kvaliteti zvuka aptX kodeka, kod nekih datoteka može dati rezultate lošije od SBC-a sa standardnom brzinom prijenosa od 328 kbit/s.
SBC dinamički dodjeljuje kvantizacijske bitove za frekvencijske pojaseve, djelujući po načelu "od donjih prema gornjim". Ako se cijela brzina prijenosa koristi za donje i srednje frekvencije, gornje frekvencije će biti "izrezane" (umjesto njih će biti tišina).
aptX kvantizira frekvencijske pojaseve s istim brojem bitova stalno, zbog čega ima konstantnu brzinu prijenosa: 352 kbit/s za 44,1 kHz, 384 kbit/s za 48 kHz, i ne može "prenijeti bitove" na frekvencije koje su najviše potrebne. Za razliku od SBC-a, aptX neće "izrezati" frekvencije, već će dodati kvantizacijske šumove, smanjujući dinamički raspon audiozapis, i ponekad unoseći karakteristične šumove. SBC "oduzima detalje" — odbacuje najslabije dijelove.
U prosjeku, u usporedbi sa SBC-om 328k, aptX unosi manje izobličenja u glazbu s širokim frekvencijskim rasponom, ali na glazbi s uskim frekvencijskim rasponom i širokim dinamičkim rasponom, SBC 328k ponekad pobjeđuje.
Razmotrimo posebno slučaj. Spektrogram snimke igre na klaviru:
Glavna energija leži u frekvencijama od 0 do 4 kHz, a nastavlja se do 10 kHz.
Spektrogram datoteke komprimirane u aptX izgleda ovako:
A ovako izgleda SBC 328k.
Vidljivo je da je SBC 328k povremeno potpuno isključivao raspon iznad 16 kHz, i trošio cijelu dostupnu brzinu prijenosa na rasponima ispod te vrijednosti. Međutim, aptX je unio više izobličenja u spektar frekvencija koje ljudsko uho može čuti, što se može vidjeti na oduzetom originalnom spektrogramu iz spektrograma aptX (što je svjetlije, to su veća izobličenja):
Dok je SBC 328k manje pokvario signal u rasponu od 0 do 10 kHz, a ostatak - izrezivao:
Brzina prijenosa od 485k SBC-a bila je dovoljna da zadrži cijeli raspon frekvencija, bez isključivanja pojaseva.
SBC 485k na ovoj kompoziciji značajno nadmašuje aptX u rasponu 0-15 kHz, i s manjom, ali još uvijek primjetnom razlikom — u 15-22 kHz (što tamnije, to manje izobličenja):
.
Prelaskom na visokobitni SBC, dobit ćete zvuk koji često nadmašuje aptX na bilo kojim slušalicama. Na slušalicama koje podržavaju EDR vezu 3 Mbps, brzina prijenosa od 551 kbit/s daje zvuk usporediv s aptX HD.
Može li još više?
U Android zakrpi postoji opcija za još veće povećanje bitrate-a za EDR uređaje od 2 Mbps. Bitrate se može povećati sa 452 kbps na 595 kbps, uz cijenu smanjenja stabilnosti prijenosa u složenim radiouslovima.
Samo postavite varijablu persist.bluetooth.sbc_hd_higher_bitrate na vrijednost 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1Zakrpa za ekstremni bitrate trenutno je prihvaćena samo u LineageOS 15.1, ali ne i u 16.0.
Kompatibilnost s uređajima
SBC Dual Channel podržava gotovo sve slušalice, zvučnike i automobilske uređaje. Nije ni čudo — standard nalaže njegovu podršku u svim uređajima koji dekodiraju. Postoji mali broj uređaja na kojima ovaj način uzrokuje probleme, ali to su jedinstveni primjerci.
Detaljnije informacije o kompatibilnim uređajima možete pronaći na ili .
Poređenje razlika u zvuku
Napravio sam web servis koji kodira audio u SBC (kao i aptX i aptX HD) u stvarnom vremenu, direktno u pregledniku. Pomoću njega možete upoređivati zvuk različitih SBC profila i drugih kodeka, bez stvarnog prijenosa audija putem Bluetooth-a, na bilo kojim žičanim slušalicama, zvučnicima i vašoj omiljenoj muzici, kao i mijenjati parametre kodiranja tokom reprodukcije audija.
Kontakt s Android programerima
Pisao sam mnogim programerima Bluetooth stack-a iz Google-a, tražeći da razmotre uključivanje zakrpa u glavnu Android granu — AOSP, ali nisam dobio nijedan odgovor. Moje zakrpe u također su ostale bez komentara od strane bilo koga uključenog.
Bio bih zahvalan ako bi me povezali sa programerima iz Google-a i implementacijom SBC HD u Android. Zakrpa u gerrit-u je već zastarjela (to je jedna od ranih revizija), i ažuriraću je ako će programere zanimati moje promjene (teško mi je to ažurirati, nemam uređaje kompatibilne s Android Q).
Zaključak
Korisnici pametnih telefona s LineageOS, Resurrection Remix i crDroid firmware-ima već mogu uživati u poboljšanom kvalitetu zvuka, dovoljno je aktivirati opciju u postavkama Bluetooth uređaja. Korisnici Linux-a također mogu dobiti povećani bitrate SBS-a instalacijom , koja, osim svega ostalog, dodaje podršku za kodeke aptX, aptX HD i FastStream.
Izvor: habr.com
