Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Prieš skaitant šį straipsnį, rekomenduojama perskaityti ankstesnį straipsnį: Garsas per „Bluetooth“: maksimali informacija apie profilius, kodekus ir įrenginius

Kai kurie belaidžių ausinių naudotojai praneša apie prastą garso kokybę ir aukštų dažnių trūkumą, kai naudoja standartinį SBC Bluetooth kodeką, kurį palaiko visi garso įrenginiai. Įprasta garso gerinimo rekomendacija – įsigyti įrenginius ir ausines, palaikančius aptX ir LDAC kodekus. Šie kodekai reikalauja licencijavimo mokesčių, todėl juos palaikantys įrenginiai yra brangesni.

Pasirodo, žemą SBC kokybę lemia dirbtiniai „Bluetooth“ dėklų ir ausinių nustatymų apribojimai, o šį apribojimą galima apeiti bet kuriuose esamuose įrenginiuose, pakeitus programinę įrangą išmaniajame telefone ar kompiuteryje.

Kodekas SBC

SBC kodekas turi daug skirtingų parametrų, dėl kurių deramasi ryšio nustatymo etape. Tarp jų:

  • Kanalų skaičius ir tipas: bendras stereo, stereo, dviejų kanalų, mono;
  • Dažnių juostų skaičius: 4 arba 8;
  • Blokų skaičius pakuotėje: 4, 8, 12, 16;
  • Bitų paskirstymo kvantavimo metu algoritmas: Garsumas, SNR;
  • Didžiausia ir mažiausia bitų, naudojamų kvantavimo metu, reikšmė (bitpool): paprastai nuo 2 iki 53.

Dekodavimo įrenginys turi palaikyti bet kokį šių parametrų derinį. Kodavimo priemonė gali įgyvendinti ne viską.
Esami „Bluetooth“ paketai paprastai sutinka su šiuo profiliu: bendras stereofoninis ryšys, 8 juostos, 16 blokų, garsumas, 2...53 bitų pultas. Šis profilis koduoja 44.1 kHz garsą, kurio bitų sparta yra 328 kbps.
Bitpool parametras tiesiogiai veikia bitų spartą viename profilyje: kuo jis didesnis, tuo didesnis bitų sparta, taigi ir kokybė.
Tačiau bitpool parametras nėra susietas su konkrečiu profiliu; Didelę įtaką bitų spartai taip pat turi kiti parametrai: kanalų tipas, dažnių juostų skaičius, blokų skaičius. Padidinti bitų spartą galite netiesiogiai, susitarę dėl nestandartinių profilių, nekeisdami bitų telkinio.

Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

SBC bitų spartos skaičiavimo formulė

Pavyzdžiui, dviejų kanalų režimas koduoja kanalus atskirai, kiekvienam kanalui naudojant visą bitų grupę. Priversdami įrenginį naudoti dvigubą kanalą, o ne jungtinį stereofoninį, gauname beveik dvigubą bitų spartą su ta pačia maksimalia bitų telkinio reikšme: 617 kbps.
Mano nuomone, su profiliu nesusietos bitpool vertės naudojimas derybų etape yra A2DP standarto trūkumas, dėl kurio buvo dirbtinai apribota SBC kokybė. Būtų prasmingiau derėtis dėl bitų spartos, o ne dėl bitų srauto.

Šios fiksuotos „Bitpool“ ir „Bitrate“ reikšmės kyla iš lentelės su rekomenduojamomis vertėmis, skirtomis naudoti aukštos kokybės garsui. Tačiau rekomendacija nėra priežastis apsiriboti šiomis vertybėmis.

Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

A2DP v1.2 specifikacija, kuri buvo aktyvi 2007–2015 m., reikalauja, kad visi dekodavimo įrenginiai tinkamai veiktų su iki 512 kbps bitų sparta:

SNK dekoderis turi palaikyti visas galimas bitų telkinio reikšmes, kurios neviršija didžiausios bitų spartos. Šis profilis apriboja maksimalų bitų perdavimo spartą iki 320 kb/s monofoniniams režimams ir 512 kb/s dviejų kanalų režimams.

Naujoje specifikacijos versijoje duomenų perdavimo sparta neribojama. Skaičiuojama, kad šiuolaikinės po 2015 metų išleistos EDR palaikančios ausinės gali palaikyti iki ≈730 kbps bitų spartą.

Kažkodėl mano išbandyti Linux (PulseAudio), Android, Blackberry ir macOS Bluetooth stackai turi dirbtinius maksimalios bitpool parametro vertės apribojimus, kurie tiesiogiai veikia didžiausią bitų spartą. Bet tai nėra didžiausia problema, beveik visos ausinės taip pat riboja maksimalią bitpool reikšmę iki 53.
Kaip jau mačiau, dauguma įrenginių puikiai veikia modifikuotame „Bluetooth“ dėkle, kurio bitų sparta yra 551 kbps, be pertrūkių ar traškėjimo. Tačiau toks bitų dažnis niekada nebus pastovus įprastomis sąlygomis, naudojant įprastus „Bluetooth“ dėklus.

„Bluetooth“ krūvos keitimas

Bet kuris su A2DP standartu suderinamas „Bluetooth“ dėklas palaiko dviejų kanalų režimą, tačiau jo neįmanoma suaktyvinti iš sąsajos.

Pridėkime prie sąsajos jungiklį! Sukūriau „Android 8.1“ ir „Android 9“ pataisas, kurios papildo pilną dviejų kanalų palaikymą, prideda režimą į režimo perjungimo meniu kūrėjo įrankiuose ir traktuojau dviejų kanalų SBC taip, tarsi jie būtų papildomas kodekas, pvz., aptX. , AAC arba LDAC („Android“ tai vadina HD garsu), pažymėdami „Bluetooth“ įrenginio nustatymus. Štai kaip atrodo:

Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Pataisa, skirta „Android 9“.
Pataisa, skirta „Android 8.1“.

Suaktyvinus žymimąjį laukelį, „Bluetooth“ garsas pradedamas perduoti bitų greičiu 551 kbps, jei ausinės palaiko 3 Mbit/s ryšio greitį, arba 452 kbps, jei ausinės palaiko tik 2 Mbit/s.

Ši pataisa yra įtraukta į šias alternatyvias programinės įrangos versijas:

  • LineageOS
  • Prisikėlimo reliktas
  • „crDroid“

Iš kur atsirado 551 ir 452 kbit/s?

„Bluetooth“ oro dalijimosi technologija skirta efektyviai perduoti didelius fiksuoto dydžio paketus. Duomenų perdavimas vyksta lizdais, didžiausias per vieną perkėlimą siunčiamų lizdų skaičius yra 5. Taip pat yra perdavimo režimų, kuriuose naudojami 1 arba 3 lizdai, bet ne 2 ar 4. 5 lizduose ryšio greičiu galite perkelti iki 679 baitų 2 Mbit/s ir iki 1021 baito esant 3 Mbit/s greičiui, o 3 – atitinkamai 367 ir 552 baitais.

Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Jei norime perduoti mažiau nei 679 ar 1021 baitus duomenų, bet daugiau nei 367 ar 552 baitus, perkėlimas vis tiek užtruks 5 lizdus ir duomenys bus perduodami per tą patį laiką, o tai sumažina perdavimo efektyvumą.

Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

SBC dviejų kanalų režimu, 44100 Hz garsu su Bitpool 38 parametrais, 16 blokų viename kadre, 8 dažnių diapazonai, koduoja garsą į 164 baitų kadrus, 452 kbps bitų sparta.
Garsas turi būti įtrauktas į L2CAP ir AVDTP perdavimo protokolus, kurie iš garso apkrovos užima 16 baitų.

Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Taigi, vienas Bluetooth perdavimas su 5 lizdais gali talpinti 4 garso kadrus:

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

Į siunčiamą paketą talpiname 11.7 ms garso duomenų, kurie bus perduoti per 3.75 ms, o pakete liko 6 nepanaudoti baitai.
Jei šiek tiek pakelsite bitpool, nebebus galima supakuoti 4 garso kadrų į vieną paketą. Vienu metu turėsite siųsti 3 kadrus, o tai sumažina perdavimo efektyvumą, sumažina vienam kadrui perduodamo garso kiekį ir greičiau sukels garso trūkčiojimą prastomis radijo sąlygomis.

Lygiai taip pat EDR 551 Mbit/s buvo pasirinktas 3 kbit/s bitų greitis: su Bitpool 47, 16 blokų vienam kadrui, 8 dažnių diapazonai, kadro dydis 200 baitų, 551 kbit/s. Viename pakete yra 5 kadrai arba 14.6 ms muzikos.

Visų SBC parametrų skaičiavimo algoritmas yra gana sudėtingas, nesunkiai susipainiosite, jei skaičiuosite rankiniu būdu, todėl sukūriau interaktyvų skaičiuotuvą, kuris padėtų besidomintiems: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Kam viso to reikia?

Priešingai populiariems įsitikinimams apie aptX kodeko garso kokybę, kai kuriuose failuose jis gali duoti prastesnius rezultatus nei SBC, kai standartinis bitų dažnis yra 328 kbps.

SBC dinamiškai paskirsto kvantavimo bitus dažnių juostoms nuo žemo iki didelio. Jei visas bitų dažnis buvo naudojamas žemiems ir vidutiniams dažniams, aukšti dažniai bus „nukirsti“ (vietoj tyla).
aptX nuolat kvantuoja dažnių juostas su tuo pačiu bitų skaičiumi, todėl turi pastovų bitų spartą: 352 kbps, kai dažnis yra 44.1 kHz, 384 kbps, kai dažnis 48 kHz, ir negali „bitų poslinkio“ į tuos dažnius, kuriems jų labiausiai reikia. . Skirtingai nuo SBC, aptX ne „nukarpys“ dažnių, o pridės prie jų kvantavimo triukšmo, sumažindamas garso dinaminį diapazoną ir kartais įvesdamas būdingą traškėjimą. SBC „valgo detales“ – išmeta tyliausias vietas.
Vidutiniškai, palyginti su SBC 328k, aptX įveda mažiau iškraipymų plataus dažnių diapazono muzikoje, tačiau siauro dažnių diapazono ir plataus dinaminio diapazono muzikoje kartais laimi SBC 328k.

Panagrinėkime ypatingą atvejį. Grojančio pianinu įrašo spektrograma:
Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Pagrindinė energija slypi dažniuose nuo 0 iki 4 kHz ir tęsiasi iki 10 kHz.
AptX suspausto failo spektrograma atrodo taip:
Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Štai kaip atrodo SBC 328k.
Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Galima pastebėti, kad SBC 328k periodiškai visiškai išjungė diapazoną, viršijantį 16 kHz, ir išnaudojo visą turimą bitų spartą diapazonuose, mažesniuose už šią vertę. Tačiau aptX įnešė daugiau iškraipymų į žmogaus ausiai girdimą dažnių spektrą, kaip matyti iš aptX spektrogramos atimtoje pradinėje spektrogramoje (kuo ryškesnis, tuo didesnis iškraipymas):
Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Nors SBC 328k mažiau sugadino signalą diapazone nuo 0 iki 10 kHz, o likusią dalį nutraukė:
Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

485 XNUMX SBC bitų spartos pakako, kad būtų išsaugotas visas dažnių diapazonas, neišjungiant juostų.
Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

SBC 485k gerokai lenkia aptX šioje trasoje 0–15 kHz diapazone ir su mažesniu, bet vis tiek pastebimu skirtumu – 15–22 kHz (kuo tamsesnė, tuo mažiau iškraipymų):
Modifikuojame „Bluetooth“ paketą, kad pagerintume garsą ausinėse be AAC, aptX ir LDAC kodekų

Originalaus garso, SBC ir aptX archyvas.

Perjungę į didelės spartos SBC, gausite garsą, kuris dažnai pranoksta aptX bet kuriose ausinėse. Ausinėse, palaikančiose 3 Mbps EDR ryšį, 551 kbps bitų sparta sukuria garsą, panašų į aptX HD.

Ar galite padaryti dar daugiau?

„Android“ pataisa taip pat apima galimybę dar labiau padidinti 2 Mbps EDR įrenginių bitų spartą. Galite padidinti bitų spartą nuo 452 kbit/s iki 595 kbit/s, o tai sumažins perdavimo stabilumą sudėtingomis radijo ryšio sąlygomis.
Pakanka kintamąjį persist.bluetooth.sbc_hd_higher_bitrate nustatyti į 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Ekstremalus bitų spartos pleistras iki šiol buvo priimtas tik „LineageOS 15.1“, bet ne 16.0.

Įrenginio suderinamumas

SBC Dual Channel palaiko beveik visos ausinės, garsiakalbiai ir automobilio galvos blokai. Tai nenuostabu - standartas reikalauja jo palaikymo bet kuriuose dekodavimo įrenginiuose. Yra nedaug įrenginių, kuriuose šis režimas sukelia problemų, tačiau tai yra pavieniai atvejai.
Daugiau informacijos apie suderinamus įrenginius rasite adresu W4bsitXNUMX-dns.com arba XDA-Developers.

Garsų skirtumų palyginimas

Sukūriau žiniatinklio paslaugą, kuri koduoja garsą į SBC (taip pat aptX ir aptX HD) realiuoju laiku, tiesiai naršyklėje. Su juo galite palyginti skirtingų SBC profilių ir kitų kodekų garsą, neperduodami garso per „Bluetooth“, per bet kokias laidines ausines, garsiakalbius ir mėgstamą muziką, taip pat keisti kodavimo parametrus tiesiogiai leisdami garsą.
btcodecs.valdikss.org.ru/sbc-encoder

Susisiekite su „Android“ kūrėjais

Parašiau daugeliui „Google“ „Bluetooth“ dėklo kūrėjų, prašydamas apsvarstyti galimybę įtraukti pataisas į pagrindinę „Android“ šaką – AOSP, bet negavau nė vieno atsakymo. Mano pleistrai Gerrit pataisų sistema, skirta Android taip pat liko be jokių pastabų.
Būčiau laimingas, jei galėčiau sulaukti pagalbos susisiekiant su „Google“ kūrėjais ir įdiegiant SBC HD į „Android“. Gerrit pataisa jau pasenusi (tai viena iš ankstyvųjų versijų), ją atnaujinsiu, jei kūrėjai susidomės mano pakeitimais (man nelengva jį atnaujinti, neturiu su Android Q suderinamų įrenginių ).

išvada

Išmaniųjų telefonų su „LineageOS“, „Resurrection Remix“ ir „crDroid“ programine įranga naudotojai jau dabar gali mėgautis patobulinta garso kokybe, tereikia suaktyvinti parinktį „Bluetooth“ įrenginio nustatymuose. „Linux“ vartotojai taip pat gali padidinti SBC pralaidumą įdiegę pleistras iš Pali Rohar, kuri, be kita ko, palaiko aptX, aptX HD ir FastStream kodekus.

Šaltinis: www.habr.com

Добавить комментарий