Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Înainte de a citi acest articol, vă recomandăm să citiți articolul anterior: Audio prin Bluetooth: cât mai multe detalii posibil despre profiluri, codecuri și dispozitive

Unii utilizatori de căști wireless raportează o calitate slabă a sunetului și lipsa frecvențelor înalte atunci când folosesc codecul Bluetooth SBC standard, care este acceptat de toate dispozitivele audio. O recomandare comună pentru îmbunătățirea sunetului este să achiziționați dispozitive și căști care acceptă codecuri aptX și LDAC. Aceste codecuri necesită taxe de licență, astfel încât dispozitivele care le acceptă sunt mai scumpe.

Se pare că calitatea scăzută a SBC se datorează limitărilor artificiale ale stivelor Bluetooth și setărilor căștilor, iar această limitare poate fi ocolită pe orice dispozitiv existent prin modificări de software la un smartphone sau computer.

Codec SBC

Codecul SBC are mulți parametri diferiți care sunt negociați în timpul fazei de configurare a conexiunii. Printre ei:

  • Numărul și tipul canalelor: Joint Stereo, Stereo, Dual Channel, Mono;
  • Număr de benzi de frecvență: 4 sau 8;
  • Număr de blocuri din pachet: 4, 8, 12, 16;
  • Algoritm pentru distribuirea biților în timpul cuantizării: Loudness, SNR;
  • Valoarea maximă și minimă a pool-ului de biți utilizat în timpul cuantizării (bitpool): de obicei, de la 2 la 53.

Dispozitivul de decodare trebuie să accepte orice combinație a acestor parametri. Este posibil ca codificatorul să nu implementeze totul.
Stivele Bluetooth existente sunt de obicei de acord cu următorul profil: Stereo comun, 8 benzi, 16 blocuri, Loudness, bitpool 2..53. Acest profil codifică audio de 44.1 kHz la o rată de biți de 328 kbps.
Parametrul bitpool afectează direct rata de biți dintr-un profil: cu cât este mai mare, cu atât rata de biți este mai mare și, prin urmare, calitatea.
Cu toate acestea, parametrul bitpool nu este legat de un profil specific; Rata de biți este influențată în mare măsură și de alți parametri: tipul canalelor, numărul de benzi de frecvență, numărul de blocuri. Puteți crește bitrate-ul indirect, căzând de acord asupra profilurilor non-standard, fără a schimba bitpool-ul.

Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Formula pentru calcularea ratei de biți SBC

De exemplu, modul Dual Channel codifică canalele separat, folosind întreg pool-ul de biți pentru fiecare canal. Forțând dispozitivul să utilizeze Dual Channel în loc de Joint Stereo, obținem aproape dublu rata de biți cu aceeași valoare maximă a pool-ului de biți: 617 kbps.
În opinia mea, utilizarea unei valori bitpool care nu este legată de un profil în etapa de negociere este un defect al standardului A2DP, care a condus la o limitare artificială a calității SBC. Ar fi mai logic să negociezi rata de biți, mai degrabă decât bitpool.

Aceste valori fixe Bitpool și Bitrate provin dintr-un tabel cu valori recomandate pentru utilizare pentru audio de înaltă calitate. Dar o recomandare nu este un motiv pentru a te limita la aceste valori.

Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Specificația A2DP v1.2, care a fost activă din 2007 până în 2015, necesită ca toate dispozitivele de decodare să funcționeze corect cu rate de biți de până la 512 kbps:

Decodorul SNK va accepta toate valorile posibile ale pool-ului de biți care nu depășesc rata maximă de biți. Acest profil limitează rata de biți maximă disponibilă la 320 kb/s pentru modurile mono și 512 kb/s pentru modurile cu două canale.

În noua versiune a specificației nu există o limită a ratei de biți. Se estimează că căștile moderne lansate după 2015 care acceptă EDR pot suporta rate de biți de până la ≈730 kbps.

Din anumite motive, stivele Linux (PulseAudio), Android, Blackberry și macOS Bluetooth pe care le-am testat au limite artificiale asupra valorii maxime a parametrului bitpool, care afectează direct rata maximă de biți. Dar aceasta nu este cea mai mare problemă, de asemenea, aproape toate căștile limitează valoarea maximă a grupului de biți la 53.
După cum am văzut deja, majoritatea dispozitivelor funcționează perfect pe o stivă Bluetooth modificată cu un bitrate de 551 kbps, fără întreruperi sau crack-uri. Dar un astfel de bitrate nu va fi niciodată consistent în condiții normale, pe stive Bluetooth obișnuite.

Modificarea stivei Bluetooth

Orice stivă Bluetooth care este compatibilă cu standardul A2DP are suport pentru modul Dual Channel, dar nu este posibilă activarea acestuia din interfață.

Să adăugăm o comutare la interfață! Am creat patch-uri pentru Android 8.1 și Android 9 care adaugă suport complet Dual Channel la stivă, adaugă un mod la meniul de comutare a modurilor din instrumentele de dezvoltare și tratează SBC-urile activate pentru Dual Channel ca și cum ar fi un codec suplimentar, cum ar fi aptX , AAC sau LDAC (Android numește acest HD Audio) adăugând o bifă la setările dispozitivului Bluetooth. Cam asa arata:

Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Patch pentru Android 9
Patch pentru Android 8.1

Când caseta de selectare este activată, sunetul Bluetooth începe să fie transmis la o rată de biți 551 kbps, dacă căștile acceptă o viteză de conectare de 3 Mbit/s sau 452 kbps, dacă căștile acceptă doar 2 Mbit/s.

Acest patch este inclus în următoarele firmware-uri alternative:

  • LineageOS
  • Învierea lui Remix
  • crDroid

De unde au venit 551 și 452 kbit/s?

Tehnologia de partajare a aerului Bluetooth este concepută pentru a transmite eficient pachete mari de dimensiuni fixe. Transferul de date are loc în sloturi, cel mai mare număr de sloturi trimise într-un transfer este de 5. Există și moduri de transfer care folosesc 1 sau 3 sloturi, dar nu 2 sau 4. În 5 sloturi puteți transfera până la 679 de octeți la o viteză de conexiune de 2 Mbit/s și până la 1021 de octeți la o viteză de 3 Mbit/s și la 3 - 367 și, respectiv, 552 de octeți.

Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Dacă dorim să transferăm mai puține date de 679 sau 1021 de octeți, dar mai mult de 367 sau 552 de octeți, transferul va dura totuși 5 sloturi și datele vor fi transferate în același timp, ceea ce reduce eficiența transferului.

Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

SBC în modul Dual Channel, la 44100 Hz audio cu Bitpool 38 de parametri, 16 blocuri pe cadru, 8 game de frecvență, codifică audio în cadre de 164 de octeți, cu un bitrate de 452 kbps.
Audio-ul trebuie să fie încapsulat în protocoale de transfer L2CAP și AVDTP, care iau 16 octeți din încărcătura utilă audio.

Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Astfel, o transmisie Bluetooth cu 5 sloturi poate găzdui 4 cadre audio:

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

Introducem 11.7 ms de date audio în pachetul trimis, care vor fi transmise în 3.75 ms, iar în pachet avem 6 octeți neutilizați.
Dacă ridicați puțin bitpool-ul, nu va mai fi posibil să împachetați 4 cadre audio într-un singur pachet. Va trebui să trimiteți câte 3 cadre odată, ceea ce reduce eficiența transmisiei, reduce cantitatea de sunet transmisă pe cadru și va duce mai rapid la bâlbâială audio în condiții radio proaste.

În același mod, a fost selectat un bitrate de 551 kbit/s pentru EDR 3 Mbit/s: cu Bitpool 47, 16 blocuri pe cadru, 8 game de frecvență, dimensiunea cadrului este de 200 de octeți, cu un bitrate de 551 kbit/s. Un pachet conține 5 cadre sau 14.6 ms de muzică.

Algoritmul de calcul al tuturor parametrilor SBC este destul de complex, te poți încurca ușor dacă numeri manual, așa că am realizat un calculator interactiv pentru a-i ajuta pe cei interesați: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

De ce este nevoie de toate acestea?

Spre deosebire de credința populară despre calitatea sunetului codec-ului aptX, pe unele fișiere poate produce rezultate mai proaste decât SBC cu un bitrate standard de 328 kbps.

SBC alocă dinamic biți de cuantificare benzilor de frecvență pe o bază de la joasă la înaltă. Dacă toată rata de biți a fost folosită pentru frecvențele joase și medii, frecvențele înalte vor fi „decuplate” (în schimb va fi liniște).
aptX cuantifică benzi de frecvență cu același număr de biți tot timpul, motiv pentru care are o rată de biți constantă: 352 kbps pentru 44.1 kHz, 384 kbps pentru 48 kHz și nu se poate „deplasa” la acele frecvențe care au cel mai mult nevoie de ele. . Spre deosebire de SBC, aptX nu va „taia” frecvențele, ci le va adăuga zgomot de cuantizare, reducând intervalul dinamic al sunetului și, uneori, introducând un trosnet caracteristic. SBC „mănâncă detalii” - renunță la cele mai liniștite zone.
În medie, în comparație cu SBC 328k, aptX introduce mai puțină distorsiune în muzica cu o gamă largă de frecvențe, dar în muzica cu o gamă îngustă de frecvență și o gamă dinamică largă, SBC 328k uneori câștigă.

Să luăm în considerare un caz special. Spectrograma unei înregistrări cântând la pian:
Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Energia principală se află în frecvențe de la 0 la 4 kHz și continuă până la 10 kHz.
Spectrograma unui fișier comprimat în aptX arată astfel:
Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Și așa arată SBC 328k.
Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Se poate observa că SBC 328k a oprit periodic complet intervalul de peste 16 kHz și a cheltuit toată rata de biți disponibilă pe intervale sub această valoare. Cu toate acestea, aptX a introdus mai multă distorsiune în spectrul de frecvență audibil de urechea umană, așa cum se poate observa în spectrograma originală scăzută din spectrograma aptX (cu cât este mai luminos, cu atât mai multă distorsiune):
Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

În timp ce SBC 328k a stricat semnalul mai puțin în intervalul de la 0 la 10 kHz și a întrerupt restul:
Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Rata de biți de 485k a SBC a fost suficientă pentru a păstra întreaga gamă de frecvență, fără a dezactiva benzile.
Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

SBC 485k este semnificativ înaintea aptX pe această piesă în intervalul 0-15 kHz, cu o diferență mai mică, dar totuși vizibilă de 15-22 kHz (cu cât este mai întunecat, cu atât mai puțină distorsiune):
Modificăm stiva Bluetooth pentru a îmbunătăți sunetul la căști fără codecuri AAC, aptX și LDAC

Arhivă audio originală, SBC și aptX.

Trecând la un SBC cu rată de biți mare, veți obține un sunet care bate adesea aptX pe orice căști. La căștile care acceptă conectivitate EDR de 3 Mbps, o rată de biți de 551 kbps produce un sunet comparabil cu aptX HD.

Poți să faci și mai mult?

Patch-ul Android include, de asemenea, o opțiune de creștere a ratei de biți pentru dispozitivele EDR de 2 Mbps. Puteți crește rata de biți de la 452 kbit/s la 595 kbit/s, cu prețul reducerii stabilității transmisiei în condiții radio dificile.
Este suficient să setați variabila persist.bluetooth.sbc_hd_higher_bitrate la 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Patch-ul cu rata de biți extremă a fost adoptat până acum doar în LineageOS 15.1, dar nu și în 16.0.

Compatibilitate dispozitiv

SBC Dual Channel este acceptat de aproape toate căștile, difuzoarele și unitățile principale ale mașinii. Nu este de mirare - standardul necesită suport pentru orice dispozitiv de decodare. Există un număr mic de dispozitive pe care acest mod provoacă probleme, dar acestea sunt cazuri izolate.
Mai multe detalii despre dispozitivele compatibile pot fi găsite la W4bsitXNUMX-dns.com sau XDA-developers.

Comparația diferențelor de sunet

Am realizat un serviciu web care codifică audio în SBC (precum și aptX și aptX HD) în timp real, chiar în browser. Cu acesta, puteți compara sunetul diferitelor profiluri SBC și al altor codecuri, fără a transmite efectiv audio prin Bluetooth, pe orice căști cu fir, difuzoare și muzica preferată și, de asemenea, puteți schimba parametrii de codificare direct în timpul redării audio.
btcodecs.valdikss.org.ru/sbc-encoder

Contactați dezvoltatorii Android

Le-am scris multor dezvoltatori de stivă Bluetooth de la Google, cerându-le să ia în considerare includerea patch-urilor în ramura principală Android - AOSP, dar nu am primit niciun răspuns. Peticele mele în Sistem de corecție Gerrit pentru Android de asemenea, a rămas fără comentarii din partea vreunui implicat.
M-aș bucura dacă aș putea obține ajutor pentru a intra în contact cu dezvoltatorii de la Google și pentru a aduce SBC HD pe Android. Patch-ul din gerrit este deja depășit (aceasta este una dintre revizuirile timpurii), și îl voi actualiza dacă dezvoltatorii sunt interesați de modificările mele (nu îmi este ușor să-l actualizez, nu am dispozitive compatibile cu Android Q ).

Concluzie

Utilizatorii de smartphone-uri cu firmware LineageOS, Resurrection Remix și crDroid se pot bucura de o calitate îmbunătățită a sunetului chiar acum, trebuie doar să activați opțiunea din setările dispozitivului Bluetooth. Utilizatorii Linux pot obține, de asemenea, o rată de biți SBC crescută prin instalare petice de la Pali Rohar, care, printre altele, adaugă suport pentru codecuri aptX, aptX HD și FastStream.

Sursa: www.habr.com

Adauga un comentariu