Înainte de a citi acest articol, se recomandă să consultați articolul anterior:
Unii utilizatori de căști wireless menționează calitatea audio scăzută și lipsa frecvențelor înalte atunci când folosesc codec-ul standard Bluetooth SBC, care este acceptat de toate dispozitivele audio. O recomandare frecventă pentru îmbunătățirea sunetului este achiziționarea de dispozitive și căști care suportă codec-urile aptX și LDAC. Aceste codec-uri necesită plăți de licență, așadar dispozitivele care le suportă sunt mai scumpe.
Se pare că calitatea scăzută a SBC este cauzată de limitările artificiale ale stivelor Bluetooth și ale setărilor căștilor, iar această limitare poate fi depășită pe orice dispozitiv existent prin modificări software ale smartphone-ului sau computerului.
Codec-ul SBC
Codec-ul SBC are o mulțime de parametri diferiți care sunt conveniți în etapa de conectare. Printre aceștia se numără:
- Numărul și tipul canalelor: Joint Stereo, Stereo, Dual Channel, Mono;
- Numărul de benzi de frecvență: 4 sau 8;
- Numărul de blocuri din pachet: 4, 8, 12, 16;
- Algoritmul de distribuție a bitilor în timpul cuantificării: Loudness, SNR;
- Valoarea maximă și minimă a pool-ului de biți utilizat în timpul cuantificării (bitpool): de obicei, de la 2 la 53.
Dispozitivul de decodare trebuie să suporte orice combinație a acestor parametri. Dispozitivul de encodare poate să nu implementeze toate.
Stivele Bluetooth existente, în general, convenează următorul profil: Joint Stereo, 8 benzi, 16 blocuri, Loudness, bitpool 2..53. Acest profil codează audio de 44.1 kHz cu un bitrate de 328 kbps.
Parametrul bitpool influențează direct bitrate-ul în cadrul unui profil: cu cât este mai mare, cu atât este mai mare bitrate-ul și, prin urmare, și calitatea.
Cu toate acestea, parametrul bitpool nu este legat de un profil specific; influența asupra bitrate-ului este, de asemenea, semnificativ afectată de alți parametri: tipul canalelor, numărul de benzi de frecvență, numărul de blocuri. Se poate crește bitrate-ul indirect prin convenirea unor profili non-standard, fără a schimba bitpool.
Formula de calcul a bitrate-ului SBC
De exemplu, modul Dual Channel codează canalele separat, folosind întregul bitpool pentru fiecare dintre canale. Forțând dispozitivul să utilizeze Dual Channel în loc de Joint Stereo, vom obține aproape dublul bitrate-ului cu aceeași valoare maximă a bitpool-ului: 617 kbps.
În opinia mea, utilizarea unei valori de bitpool care nu este legată de profil la etapa de negociere este o deficiență a standardului A2DP, care a dus la limitarea artificială a calității SBC. Ar fi fost mai înțelept să se negocieze bitrate-ul, nu bitpool-ul.
Aceste valori fixe pentru Bitpool și Bitrate își au originea într-o tabelă cu valori recomandate pentru utilizarea în audio de înaltă calitate. Dar o recomandare nu este un motiv pentru a te limita la aceste valori.
Specificația A2DP v1.2, care a fost activă din 2007 până în 2015, prevede că toate dispozitivele de decodare trebuie să funcționeze corect cu bitrate-uri de până la 512 kbps:
Decodorul SNK trebuie să suporte toate valorile posibile de bitpool care nu rezultă într-o depășire a bitrate-ului maxim. Acest profil limitează bitrate-ul maxim disponibil la 320kbps pentru mono și 512kbps pentru moduri cu două canale.
În noua versiune a specificației, limita de bitrate nu mai există. Se presupune că căștile moderne, lansate după 2015 și care suportă EDR, pot susține bitrate-uri de până la ≈730 kbps.
Dintr-un anumit motiv, am constatat că majoritatea stivelor Bluetooth verificate de mine în Linux (PulseAudio), Android, Blackberry și macOS au limitări artificiale ale valorii maxime a parametrului bitpool, care influențează direct bitrate-ul maxim. Dar aceasta nu este cea mai mare problemă, aproape toate căștile limitează de asemenea valoarea maximă a bitpool-ului la 53.
Așa cum m-am convins, majoritatea dispozitivelor funcționează perfect pe o stivă Bluetooth modificată cu un bitrate de 551 kbps, fără întreruperi și zgomote. Dar un astfel de bitrate nu va fi niciodată negociat în condiții normale, pe stive Bluetooth obișnuite.
Modificarea stivei Bluetooth
În orice stivă Bluetooth compatibilă cu standardul A2DP, există suport pentru modul Dual Channel, dar activarea sa prin interfață nu este posibilă.
Să adăugăm un comutator în interfață! Am realizat patch-uri pentru Android 8.1 și Android 9, care adaugă suport complet pentru Dual Channel în stivă, adaugă modul în meniul de comutare a modului în instrumentele pentru dezvoltatori și procesează SBC cu suport pentru Dual Channel ca și cum ar fi un codec suplimentar, precum aptX, AAC sau LDAC (Android numește aceasta audio HD), adăugând un bifează în setările dispozitivului Bluetooth. Iată cum arată:
Când bifezi, audio Bluetooth începe să fie transmis cu bitrate-ul 551 kbps, dacă căștile suportă o conexiune la viteza de 3 Mbps, sau 452 kbit/s, dacă căștile suportă doar 2 Mbit/s.
Această actualizare este inclusă în următoarele firmware alternative:
- LineageOS
- Resurrection Remix
- crDroid
De unde provin 551 și 452 kbit/s?
Tehnologia de divizare a aerului în Bluetooth este destinată transmiterii eficiente a pachetelor mari de dimensiuni fixe. Tranzacția de date se efectuează pe sloturi, iar cea mai mare cantitate de sloturi trimise într-o singură transmisie este de 5. Există, de asemenea, moduri de transmisie care folosesc 1 sau 3 sloturi, dar nu 2 sau 4. În 5 sloturi, se pot transmite până la 679 de octeți la viteza de conectare de 2 Mbit/s și până la 1021 de octeți la viteza de 3 Mbit/s, iar în 3 sloturi - 367 și 552 de octeți, respectiv.
Dacă dorim să transmitem mai puține date decât 679 sau 1021 de octeți, dar mai mult decât 367 sau 552 de octeți, transmiterea va dura tot 5 sloturi, iar datele vor fi transmise în același timp, ceea ce reduce eficiența transmisiei.
SBC în modul Dual Channel, pe audio de 44100 Hz cu parametrii Bitpool 38, 16 blocuri în cadru, 8 benzi de frecvență, codifică audio în cadre de dimensiune 164 de octeți, cu un bit rate de 452 kbits.
Audio trebuie să fie încapsulat în protocoalele de transmisie L2CAP și AVDTP, care iau 16 octeți din sarcina utilă audio.
Astfel, într-o transmisie Bluetooth cu 5 sloturi, reușim să încadram 4 cadre audio:
679 (EDR 2 Mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (antet SBC) - (164*4) = 6 Am încadrat 11.7 ms de date audio în pachetul trimis, care va fi transmis în 3.75 ms, și ne-au rămas 6 octeți neutilizați în pachet.
Dacă ridicăm puțin bitpool-ul, 4 cadre audio deja nu vor putea fi împachetate într-un singur pachet. Va trebui să trimitem câte 3 cadre deodată, ceea ce reduce eficiența transmisiei, reduce cantitatea de audio transmisă într-un singur pachet și va duce mai repede la întreruperi audio în condiții proaste de radio.
În același mod a fost stabilit bit rate-ul de 551 kbit/s pentru EDR 3 Mbit/s: cu Bitpool 47, 16 blocuri în cadru, 8 benzi de frecvență, dimensiunea cadrului devine 200 de octeți, la un bit rate de 551 kbit/s. Într-un pachet se încadrează 5 cadre sau 14.6 ms de muzică.
Algoritmul de calcul al tuturor parametrilor SBC este destul de complex, se poate ușor confunda dacă se calculează manual, așa că am realizat un calculator interactiv pentru cei interesați:
De ce este necesar tot acest lucru?
Contrar opiniilor generale despre calitatea sunetului codec-ului aptX, în anumite fișiere acesta poate oferi rezultate mai slabe decât SBC cu un bit rate standard de 328 kbit/s.
SBC alocă dinamic biți de cuantizare pentru benzile de frecvență, funcționând pe principiul „de la cele inferioare către cele superioare”. Dacă tot bit rate-ul este utilizat pentru frecvențele joase și medii, frecvențele înalte vor fi „tăiate” (în locul acestora va fi liniște).
aptX cuantizează benzile de frecvență cu aceeași cantitate de biți constant, ceea ce îi conferă un bit rate fix: 352 kbit/s pentru 44.1 kHz, 384 kbit/s pentru 48 kHz, și nu poate „transfera biți” către frecvențele care au cea mai mare nevoie de ei. Spre deosebire de SBC, aptX nu va „tăia” frecvențele, ci va adăuga zgomote de cuantizare în acestea, reducând gama dinamică a audio și adesea aducând zama caracteristice de pocnituri. SBC „consume detalii” – elimină cele mai silențioase porțiuni.
În medie, comparativ cu SBC 328k, aptX introduce mai puține distorsiuni în muzica cu un interval larg de frecvențe, dar la muzica cu un interval restrâns de frecvențe și un interval dinamic larg, SBC 328k câteodată câștigă.
Să analizăm un caz specific. Spectrograma unui înregistrări de pian:
Energia principală se află în frecvențele de la 0 la 4 kHz și continuă până la 10 kHz.
Spectrograma fișierului comprimat în aptX arată astfel:
Iată cum arată SBC 328k.
Se observă că SBC 328k a dezactivat periodic complet gama de frecvențe de peste 16 kHz și a consumat întregul bit rate disponibil pentru benzile inferioare acestei valori. Totuși, aptX a introdus mai multe distorsiuni în spectrul de frecvențe perceput de urechea umană, ceea ce poate fi observat pe spectrograma originală scăzută din spectrograma aptX (cu cât este mai strălucitor, cu atât mai multe distorsiuni):
În timp ce SBC 328k a deteriorat mai puțin semnalul în banda de frecvențe de la 0 la 10 kHz, restul a fost tăiat:
Bit rate-ul de 485k SBC a fost suficient pentru a păstra întreaga gamă de frecvențe, fără a dezactiva benzile.
SBC 485k în această compoziție îl depășește semnificativ pe aptX în banda de frecvențe 0-15 kHz, și cu o diferență mai mică, dar totuși semnificativă, în 15-22 kHz (cu cât este mai închis, cu atât mai puține distorsiuni):
.
Schimbând la SBC cu bit rate înalt, veți obține un sunet adesea superior aptX, pe orice căști. Pe căștile care suportă conectivitatea EDR 3 mbit/s, bit rate-ul de 551 kbit/s oferă sunet comparabil cu aptX HD.
Se poate și mai mult?
În patch-ul pentru Android există și o opțiune pentru creșterea și mai mare a bitrate-ului pentru dispozitivele EDR de 2 Mbps. Bitrate-ul poate fi crescut de la 452 kbps la 595 kbps, cu prețul unei stabilități mai reduse a transmisiei în condiții radio dificile.
Este suficient să setați variabila persist.bluetooth.sbc_hd_higher_bitrate la valoarea 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1Patch-ul pentru bitrate extrem a fost acceptat până acum numai în LineageOS 15.1, dar nu și în 16.0.
Compatibilitate cu dispozitivele
SBC Dual Channel este suportat de aproape toate căștile, boxele și sistemele auto de head-unit. Nu este de mirare - standardul prevede suportul său în orice dispozitiv de decodare. Există un număr mic de dispozitive la care acest mod cauzează probleme, dar acestea sunt cazuri izolate.
Pentru mai multe detalii despre dispozitivele compatibile, puteți consulta sau .
Compararea diferențelor de sunet
Am realizat un serviciu web care codifică audio în SBC (dar și în aptX și aptX HD) în timp real, direct în browser. Cu ajutorul său, veți putea compara sunetul diferitelor profiluri SBC și altecodecuri, fără a transmite efectiv audio prin Bluetooth, pe orice căști sau boxe cu fir și muzica dvs. preferată, precum și să modificați parametrii de codificare în timpul redării audio.
Contact cu dezvoltatorii Android
Am scris multor dezvoltatori ai stack-ului Bluetooth de la Google, solicitându-le să ia în considerare includerea patch-urilor în ramura principală Android - AOSP, dar nu am primit niciun răspuns. Patch-urile mele în de asemenea, au rămas fără comentarii din partea celor implicați.
Aș fi bucuros dacă aș putea fi ajutat în contactul cu dezvoltatorii de la Google și în implementarea SBC HD în Android. Patch-ul din gerrit este deja învechit (este una dintre reviziile timpurii), și îl voi actualiza dacă dezvoltatorii sunt interesați de modificările mele (nu este ușor să îl actualizez, nu am dispozitive compatibile cu Android Q).
Concluzie
Utilizatorii de smartphone-uri cu ROM-uri LineageOS, Resurrection Remix și crDroid se pot bucura deja de calitate audio îmbunătățită, este suficient să activese opțiunea în setările dispozitivului Bluetooth. Utilizatorii Linux pot obține, de asemenea, un bitrate SBC crescut, prin instalarea , care, printre altele, adaugă suport pentru codec-urile aptX, aptX HD și FastStream.
Sursa: habr.com
