Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Prima di leggere questo articolo, si consiglia di consultare l'articolo precedente: Audio tramite Bluetooth: tutto ciò che c'è da sapere su profili, codec e dispositivi

Alcuni utenti di cuffie wireless segnalano una bassa qualità del suono e una mancanza di alti quando utilizzano il codec Bluetooth standard SBC, supportato da tutti i dispositivi audio. Una raccomandazione comune per migliorare il suono è l'acquisto di dispositivi e cuffie con supporto per codec aptX e LDAC. Questi codec richiedono pagamenti di licenza, perciò i dispositivi che li supportano hanno un costo maggiore.

Si scopre che la bassa qualità dello SBC è dovuta a limitazioni artificiali negli stack Bluetooth e nelle impostazioni delle cuffie, e questa limitazione può essere aggirata su qualsiasi dispositivo esistente attraverso modifiche software allo smartphone o al computer.

Codec SBC

Il codec SBC ha molti diversi parametri che vengono negoziati durante la fase di collegamento. Tra questi:

  • Numero e tipo di canali: Joint Stereo, Stereo, Dual Channel, Mono;
  • Numero di bande di frequenza: 4 o 8;
  • Numero di blocchi per pacchetto: 4, 8, 12, 16;
  • Algoritmo di distribuzione dei bit durante la quantizzazione: Loudness, SNR;
  • Valore massimo e minimo del pool di bit utilizzato durante la quantizzazione (bitpool): generalmente, da 2 a 53.

Il dispositivo di decodifica deve supportare qualsiasi combinazione di questi parametri. Il dispositivo di codifica potrebbe non implementare tutti.
Gli stack Bluetooth esistenti tendono generalmente a negoziare il seguente profilo: Joint Stereo, 8 bande, 16 blocchi, Loudness, bitpool 2..53. Questo profilo codifica audio a 44.1 kHz con un bitrate di 328 kbit/s.
Il parametro bitpool influisce direttamente sul bitrate all'interno di uno stesso profilo: maggiore è, maggiore è il bitrate, e quindi la qualità.
Tuttavia, il parametro bitpool non è legato a un profilo specifico; anche altri parametri, come il tipo di canali, il numero di bande di frequenza e il numero di blocchi influenzano significativamente il bitrate. È possibile aumentare il bitrate indirettamente, negoziando profili non standard, senza modificare il bitpool.

Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Formula per il calcolo del bitrate SBC

Ad esempio, la modalità Dual Channel codifica i canali separatamente, utilizzando l'intero bitpool per ciascuno dei canali. Costringendo il dispositivo a utilizzare il Dual Channel invece del Joint Stereo, otteniamo quasi il doppio del bitrate mantenendo lo stesso valore massimo di bitpool: 617 kbit/s.
A mio avviso, l'utilizzo di un valore di bitpool non legato al profilo nella fase di accordo è una mancanza dello standard A2DP, che ha portato a una limitazione artificiale della qualità SBC. Sarebbe stato più sensato accordare il bitrate, piuttosto che il bitpool.

Questi valori fissi di Bitpool e Bitrate hanno origine da una tabella con valori raccomandati per l'uso di audio di alta qualità. Ma una raccomandazione non è un motivo per limitarsi a questi valori.

Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

La specifica A2DP v1.2, attiva dal 2007 al 2015, prescrive che tutti i dispositivi di decodifica funzionino correttamente con bitrate fino a 512 kbit/s:

Il decodificatore dello SNK deve supportare tutti i possibili valori di bitpool che non superano il bitrate massimo. Questo profilo limita il bitrate massimo disponibile a 320kb/s per mono e 512kb/s per modalità a due canali.

Nella nuova versione della specifica non ci sono limiti sul bitrate. Si presume che le moderne cuffie, rilasciate dopo il 2015 e che supportano EDR, possano supportare bitrate fino a ≈730 kbit/s.

Per qualche motivo, i pile Bluetooth Linux (PulseAudio), Android, Blackberry e macOS che ho verificato hanno limiti artificiali sul valore massimo del parametro bitpool, che influisce directement sul bitrate massimo. Ma questo non è il problema principale, quasi tutte le cuffie limitano anche il valore massimo del bitpool a 53.
Come ho già constatato, la maggior parte dei dispositivi funziona perfettamente su un stack Bluetooth modificato con un bitrate di 551 kbit/s, senza interruzioni o distorsioni. Ma tale bitrate non sarà mai accordato in condizioni normali, su stack Bluetooth normali.

Modifichiamo lo stack Bluetooth

In qualunque stack Bluetooth compatibile con lo standard A2DP, è presente il supporto per la modalità Dual Channel, ma attivarla dall'interfaccia non sembra possibile.

Aggiungiamo un interruttore nell'interfaccia! Ho creato patch per Android 8.1 e Android 9 che aggiungono il supporto completo per Dual Channel nello stack, aggiungono una modalità nel menu di commutazione della modalità negli strumenti per gli sviluppatori e gestiscono SBC con supporto Dual Channel come se fosse un codec aggiuntivo, come aptX, AAC o LDAC (Android lo chiama HD Audio), aggiungendo un segno nelle impostazioni del dispositivo Bluetooth. Ecco come appare:

Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Patch per Android 9
Patch per Android 8.1

Quando viene attivata la casella, l'audio Bluetooth inizia a essere trasmesso con un bit rate 551 kbps, se le cuffie supportano una connessione a 3 Mbps, oppure 452 kbps, se le cuffie supportano solo 2 Mbps.

Questa patch è inclusa nelle seguenti ROM alternative:

  • LineageOS
  • Resurrection Remix
  • crDroid

Da dove provengono 551 e 452 kbps?

La tecnologia di suddivisione del canale in Bluetooth è progettata per una trasmissione efficiente di grandi pacchetti di dimensioni fisse. La trasmissione dei dati avviene a slot, il numero massimo di slot inviati in un'unica trasmissione è 5. Ci sono anche modalità di trasmissione che utilizzano 1 o 3 slot, ma non 2 o 4. Con 5 slot è possibile trasmettere fino a 679 byte a una velocità di connessione di 2 Mbps e fino a 1021 byte a una velocità di 3 Mbps, mentre con 3 si possono trasmettere 367 e 552 byte rispettivamente.

Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Se vogliamo trasmettere meno dati di 679 o 1021 byte, ma più di 367 o 552 byte, la trasmissione occuperà comunque 5 slot, e i dati saranno inviati nello stesso tempo, riducendo l'efficacia della trasmissione.

Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

SBC in modalità Dual Channel, con audio a 44100 Hz con parametri Bitpool 38, 16 blocchi per frame, 8 bande di frequenza, codifica l'audio in frame di 164 byte, con un bit rate di 452 kbps.
L'audio deve essere incapsulato nei protocolli di trasmissione L2CAP e AVDTP, che occupano 16 byte del payload audio utile.

Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Così, in una trasmissione Bluetooth con 5 slot riusciamo a inserire 4 frame audio:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (intestazione SBC) - (164*4) = 6

Abbiamo inserito 11.7 ms di dati audio nel pacchetto inviato, che verrà trasmesso in 3.75 ms, e abbiamo 6 byte non utilizzati nel pacchetto.
Se aumentiamo leggermente il bitpool, non sarà più possibile inserire 4 frame audio in un unico pacchetto. Dovremo inviare 3 frame alla volta, il che riduce l'efficacia della trasmissione, diminuisce la quantità di audio trasmesso in un pacchetto e porterà più rapidamente a interruzioni audio in condizioni radio sfavorevoli.

Allo stesso modo è stata selezionata una bitrate di 551 kbit/s per EDR 3 Mbit/s: con Bitpool 47, 16 blocchi nel frame, 8 bande di frequenza si ottiene una dimensione del frame di 200 byte, con un bitrate di 551 kbit/s. In un pacchetto rientrano 5 frames o 14,6 ms di musica.

L'algoritmo per il calcolo di tutti i parametri SBC è piuttosto complesso; ci si può facilmente confondere se si calcola manualmente, quindi ho creato una calcolatrice interattiva per aiutare coloro che sono interessati: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

A cosa serve tutto questo?

Contrariamente alla credenza comune sulla qualità del suono del codec aptX, in alcuni file può fornire risultati inferiori a quelli di SBC con una bitrate standard di 328 kbit/s.

SBC assegna dinamicamente i bit di quantizzazione per le bande di frequenza, operando secondo il principio "dal basso all'alto". Se tutta la bitrate viene utilizzata per le frequenze basse e medie, le alte frequenze verranno "tagliate" (al loro posto ci sarà silenzio).
aptX quantizza le bande di frequenza con lo stesso numero di bit costantemente, il che porta a un bitrate costante: 352 kbit/s per 44,1 kHz, 384 kbit/s per 48 kHz, e non può "trasferire i bit" su quelle frequenze che ne hanno più bisogno. A differenza di SBC, aptX non "taglierà" le frequenze, ma aggiungerà ad esse rumori di quantizzazione, riducendo la gamma dinamica dell'audio, e talvolta introducendo caratteristici ticchettii. SBC, invece, "mangia i dettagli" — scarta i passaggi più silenziosi.
In media, rispetto a SBC 328k, aptX introduce meno distorsioni nella musica con un ampio intervallo di frequenze, ma nella musica con una gamma di frequenze ristretta e un'ampia gamma dinamica, SBC 328k a volte riesce a prevalere.

Consideriamo un caso specifico. La spettrogramma di una registrazione di piano:
Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

L'energia principale si trova nelle frequenze da 0 a 4 kHz, e continua fino a 10 kHz.
La spettrogramma di un file compresso in aptX appare come segue:
Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Ecco come appare SBC 328k.
Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Si può notare che SBC 328k disattivava periodicamente completamente la gamma sopra i 16 kHz, e spendeva tutta la bitrate disponibile su gamme inferiori a questo valore. Tuttavia, aptX ha introdotto più distorsioni nel campo delle frequenze udibili dall'orecchio umano, come si può vedere sullo spettrogramma originale sottratto dallo spettrogramma aptX (più è brillante, maggiori sono le distorsioni):
Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Mentre SBC 328k ha rovinato di meno il segnale nella gamma da 0 a 10 kHz, e ha tagliato il resto:
Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

La bitrate di 485k SBC è stata sufficiente per mantenere l'intero intervallo di frequenze, senza disattivare bande.
Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

SBC 485k in questo brano supera significativamente aptX nell'intervallo 0-15 kHz, e con una differenza minore, ma comunque notevole, tra 15-22 kHz (più è scuro, meno sono le distorsioni):
Modifichiamo lo stack Bluetooth per migliorare il suono delle cuffie senza codec AAC, aptX e LDAC

Archivio audio originale, SBC e aptX.

Passando a SBC ad alta bitrate, otterrete un suono che spesso supera aptX, su qualsiasi cuffia. Su cuffie che supportano la connessione EDR a 3 mbit/s, la bitrate di 551 kbit/s fornisce un suono comparabile a aptX HD.

E c'è di più?

Nel patch per Android c'è anche un'opzione per un ulteriore aumento della bitrate per dispositivi EDR a 2 mbit/s. È possibile aumentare la bitrate da 452 kbit/s a 595 kbit/s, a scapito della stabilità del segnale in condizioni radio complesse.
Basta impostare la variabile persist.bluetooth.sbc_hd_higher_bitrate a 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Il patch per bitrate estremo è stato adottato solo in LineageOS 15.1, non in 16.0.

Compatibilità con dispositivi

SBC Dual Channel è supportato praticamente da tutte le cuffie, altoparlanti e sistemi di autoradio. Non è una sorpresa: lo standard prevede il suo supporto in qualsiasi dispositivo di decodifica. Ci sono pochi dispositivi in cui questa modalità causa problemi, ma si tratta di casi isolati.
Maggiori dettagli sui dispositivi compatibili possono essere trovati su 4pda o xda-developers.

Confronto delle differenze audio

Ho creato un servizio web che codifica audio in SBC (così come aptX e aptX HD) in tempo reale, direttamente nel browser. Con questo servizio potrete confrontare il suono di diversi profili SBC e altri codec, senza una reale trasmissione audio via Bluetooth, su qualsiasi cuffia cablata, altoparlante e la vostra musica preferita, e potrete modificare le impostazioni di codifica mentre riproducete audio.
btcodecs.valdikss.org.ru/sbc-encoder

Contatto con gli sviluppatori di Android

Ho scritto a molti sviluppatori del stack Bluetooth di Google, chiedendo di considerare l'inclusione dei patch nel ramo principale di Android — AOSP, ma non ho ricevuto alcuna risposta. I miei patch in sistema di gestione patch Gerrit per Android sono rimasti anch'essi senza commenti da parte di chiunque.
Sarei felice se poteste aiutarmi con i sviluppatori di Google e l'implementazione di SBC HD su Android. Il patch set su gerrit è già obsoleto (è una delle prime revisioni), e lo aggiornerò se i sviluppatori sono interessati alle mie modifiche (non è facile per me aggiornarlo, non ho dispositivi compatibili con Android Q).

Conclusione

Gli utenti di smartphone con firmware LineageOS, Resurrection Remix e crDroid possono già godere di una qualità audio migliorata, basta attivare l'opzione nelle impostazioni del dispositivo Bluetooth. Gli utenti Linux possono anche ottenere un bit rate SBC aumentato, installando la patch di Pali Rohár, che, tra l'altro, aggiunge supporto per i codec aptX, aptX HD e FastStream.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster