Prima di leggere questo articolo, è consigliabile familiarizzare con l'articolo precedente:
Alcuni utenti di cuffie wireless segnalano una bassa qualità audio 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 è acquistare dispositivi e cuffie che supportano i codec aptX e LDAC. Questi codec richiedono diritti di licenza, quindi i dispositivi che li supportano costano di più.
Si scopre che la bassa qualità dell'SBC è dovuta a limitazioni artificiali degli stack Bluetooth e delle impostazioni delle cuffie, e questa limitazione può essere superata su qualsiasi dispositivo esistente, tramite modifiche software su uno smartphone o un computer.
Codec SBC
Il codec SBC ha numerosi parametri diversi che vengono concordati durante la fase di connessione. Tra questi ci sono:
- Numero e tipo di canali: Joint Stereo, Stereo, Dual Channel, Mono;
- Numero di bande: 4 o 8;
- Numero di blocchi nel pacchetto: 4, 8, 12, 16;
- Algoritmo di distribuzione dei bit durante la quantizzazione: Loudness, SNR;
- Il valore massimo e minimo del pool di bit utilizzati nella quantizzazione (bitpool): di solito, da 2 a 53.
Il dispositivo di decodifica deve supportare qualsiasi combinazione di questi parametri. Il dispositivo di codifica potrebbe non implementare tutti.
Le attuali stack Bluetooth in genere concordano sul 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 kbps.
Il parametro bitpool influisce direttamente sul bitrate all'interno di un profilo: più è alto, maggiore è il bitrate e, di conseguenza, la qualità.
Tuttavia, il parametro bitpool non è legato a un profilo specifico; anche altri parametri hanno un notevole impatto sul bitrate: tipo di canali, numero di bande di frequenza, numero di blocchi. È possibile aumentare il bitrate indirettamente, concordando profili non standard, senza modificare il bitpool.
Formula per il calcolo del bitrate SBC
Ad esempio, la modalità Dual Channel codifica i canali separatamente, utilizzando l'intero bitpool per ognuno di essi. Costringendo il dispositivo a utilizzare Dual Channel invece di Joint Stereo, otterremo quasi il doppio del bitrate con lo stesso valore massimo di bitpool: 617 kbps.
A mio avviso, l'uso di un valore di bitpool non legato al profilo durante la negoziazione è una lacuna nello standard A2DP, che ha portato a un'inesistente limitazione della qualità SBC. Sarebbe stato più saggio negoziare il bitrate invece del bitpool.
Valori fissi di Bitpool e Bitrate derivano da una tabella con valori raccomandati per l'uso in audio di alta qualità. Tuttavia, una raccomandazione non è un motivo per limitarsi a questi valori.
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 del SNK deve supportare tutti i valori di bitpool possibili che non superino il bitrate massimo. Questo profilo limita il bitrate massimo disponibile a 320 kb/s per modalità mono e 512 kb/s per modalità stereo.
Nella nuova versione della specifica, la limitazione del bitrate è assente. Si presume che le cuffie moderne, rilasciate dopo il 2015 e che supportano EDR, possano gestire bitrate fino a circa 730 kbit/s.
Per qualche motivo, i stack Bluetooth di Linux (PulseAudio), Android, Blackberry e macOS che ho verificato presentano limitazioni artificiali sul valore massimo del parametro bitpool, che influisce direttamente sul bitrate massimo. Ma questo non è il problema più grande, poiché quasi tutte le cuffie limitano anche il valore massimo del bitpool a 53.
Come ho già potuto verificare, la maggior parte dei dispositivi funziona in modo eccellente su uno stack Bluetooth modificato con un bitrate di 551 kbit/s, senza interruzioni o disturbi. Tuttavia, tale bitrate non sarà mai coerente in condizioni normali, sugli stack Bluetooth standard.
Stack Bluetooth modificabile
In qualsiasi stack Bluetooth compatibile con lo standard A2DP, è presente il supporto per la modalità Dual Channel, ma attivarla dall'interfaccia non è possibile.
Aggiungiamo un interruttore all'interfaccia! Ho creato delle patch per Android 8.1 e Android 9 che aggiungono il supporto completo per il Dual Channel nel protocollo, inseriscono una modalità nel menu di commutazione delle modalità negli strumenti per sviluppatori e gestiscono l'SBC con supporto Dual Channel come se fosse un codec aggiuntivo, simile a aptX, AAC o LDAC (Android lo chiama HD Audio), aggiungendo un'opzione nelle impostazioni del dispositivo Bluetooth. Ecco come appare:
Quando l'opzione è attivata, l'audio Bluetooth inizia a essere trasmesso con un bitrate 551 kbit/s, se le cuffie supportano una connessione a 3 mbit/s, oppure 452 kbit/s, se le cuffie supportano solo 2 mbit/s.
Questa patch è inclusa nelle seguenti alternative firmware:
- LineageOS
- Resurrection Remix
- crDroid
Da dove vengono 551 e 452 kbit/s?
La tecnologia di separazione dell'aria nel Bluetooth è progettata per una trasmissione efficiente di grandi pacchetti di dimensioni fisse. La trasmissione dei dati avviene a slot, con il numero massimo di slot inviati in un'unica trasmissione pari a 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 Mbit/s e fino a 1021 byte a una velocità di 3 Mbit/s, mentre con 3 slot si possono trasmettere 367 e 552 byte rispettivamente.
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 trasmessi nel medesimo tempo, il che riduce l'efficacia della trasmissione.
SBC in modalità Dual Channel, su audio a 44100 Hz con parametri Bitpool 38, 16 blocchi nel frame, 8 bande di frequenza, codifica l'audio in frame di dimensione 164 byte, con un bitrate di 452 kbit/s.
L'audio deve essere incapsulato nei protocolli di trasmissione L2CAP e AVDTP, che sottraggono 16 byte dal carico audio utile.
Così, in una trasmissione Bluetooth con 5 slot riescono a essere contenuti 4 frame audio:
679 (EDR 2 Mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (intestazione SBC) - (164*4) = 6 Abbiamo incluso 11,7 ms di dati audio nel pacchetto inviata, che sarà trasmesso in 3,75 ms, e ci sono rimasti 6 byte non utilizzati nel pacchetto.
Se aumentiamo leggermente il bitpool, non sarà più possibile racchiudere 4 fotogrammi audio in un unico pacchetto. Sarà necessario inviare 3 fotogrammi alla volta, il che riduce l'efficienza della trasmissione, diminuisce la quantità di audio trasmesso per pacchetto e porterà più rapidamente a salti audio in presenza di condizioni radio avverse.
Allo stesso modo è stato scelto un bitrate di 551 kbit/s per EDR di 3 Mbit/s: con un Bitpool di 47, 16 blocchi nel fotogramma e 8 bande di frequenza, otteniamo una dimensione del fotogramma di 200 byte, con un bitrate di 551 kbit/s. In un pacchetto possono essere inclusi 5 fotogrammi o 14,6 ms di musica.
L'algoritmo per il calcolo di tutti i parametri SBC è abbastanza complesso e si può facilmente confondere se si calcola manualmente, quindi ho creato un calcolatore interattivo per aiutare chi è interessato:
A cosa serve tutto questo?
Contrariamente alla credenza comune sulla qualità audio del codec aptX, su alcuni file potrebbe fornire risultati peggiori rispetto a SBC con un bitrate standard di 328 kbit/s.
SBC assegna dinamicamente i bit di quantizzazione per le bande di frequenza, seguendo il principio "dal basso verso l'alto". Se l'intero bitrate viene utilizzato per le frequenze basse e medie, le frequenze alte verranno "tagliate" (al loro posto ci sarà silenzio).
aptX quantizza le bande di frequenza con lo stesso numero di bit in modo costante, il che gli conferisce un bitrate fisso: 352 kbit/s per 44.1 kHz, 384 kbit/s per 48 kHz, e non può "trasferire bit" a quelle frequenze che ne hanno più bisogno. A differenza di SBC, aptX non "taglierà" le frequenze, ma aggiungerà loro rumori di quantizzazione, riducendo la gamma dinamica dell'audio e talvolta introducendo caratteristici schiocchi. SBC, invece, "consuma dettagli" — scarta le parti più silenziose.
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 una vasta gamma dinamica, SBC 328k vince talvolta.
Consideriamo un caso specifico. Lo spettrogramma di una registrazione di un gioco al pianoforte:
L'energia principale si trova nelle frequenze da 0 a 4 kHz e continua fino a 10 kHz.
Lo spettrogramma di un file compresso in aptX appare come segue:
Ecco come appare il SBC 328k.
Si può notare che il SBC 328k disattivava completamente il range sopra i 16 kHz di tanto in tanto, utilizzando tutta la larghezza di banda disponibile per le gamme inferiori a questo valore. Tuttavia, l'aptX introduce più distorsioni nel range udibile delle frequenze, come si può vedere nel grafico spettrale originale sottratto dal grafico spettrale aptX (più è luminoso, maggiori sono le distorsioni):
Mentre il SBC 328k ha rovinato meno il segnale nella gamma da 0 a 10 kHz, il resto è stato tagliato:
La larghezza di banda di 485k del SBC è stata sufficiente per mantenere l'intero intervallo di frequenze, senza disattivare bande.
Il SBC 485k in questo brano supera notevolmente l'aptX nella gamma da 0-15 kHz, con una differenza minore, ma comunque evidente — nella gamma da 15-22 kHz (più scuro è, meno distorsioni ci sono):
.
Passando a un SBC ad alta larghezza di banda, otterrete un suono che spesso supera l'aptX, su qualsiasi cuffia. Su cuffie che supportano la connessione EDR a 3 Mbps, la larghezza di banda di 551 kbps offre un suono paragonabile all'aptX HD.
Si può fare di più?
Nell'aggiornamento per Android è disponibile anche un'opzione per aumentare ulteriormente il bitrate per i dispositivi EDR a 2 Mbit/s. È possibile aumentare il bitrate da 452 kbit/s a 595 kbit/s, a scapito della stabilità della trasmissione in condizioni radio difficili.
Basta impostare la variabile persist.bluetooth.sbc_hd_higher_bitrate a 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1L'aggiornamento per bitrate estremi è stato accettato solo in LineageOS 15.1, ma non in 16.0.
Compatibilità con i dispositivi
SBC Dual Channel è supportato praticamente da tutte le cuffie, altoparlanti e autoradio. Non è una sorpresa: lo standard prevede il suo supporto in tutti i dispositivi di decodifica. Ci sono pochi dispositivi che presentano problemi con questa modalità, ma si tratta di casi isolati.
Per ulteriori dettagli sui dispositivi compatibili, puoi consultare o .
Confronto delle differenze sonore
Ho creato un servizio web che codifica l'audio in SBC (e anche aptX e aptX HD) in tempo reale, direttamente nel browser. Con questo strumento potrai confrontare il suono di diversi profili SBC e altri codec, senza trasmettere effettivamente l'audio via Bluetooth, su qualsiasi cuffia cablata, altoparlante e la tua musica preferita, oltre a modificare i parametri di codifica durante la riproduzione dell'audio.
Contatto con gli sviluppatori Android
Ho scritto a molti sviluppatori del stack Bluetooth di Google, chiedendo di considerare l'inclusione delle patch nel ramo principale di Android — AOSP, ma non ho ricevuto alcuna risposta. Le mie patch in non hanno ricevuto commenti da parte di nessuno coinvolto.
Sarei grato se potessi facilitare i contatti con gli sviluppatori di Google per l'implementazione di SBC HD in Android. La patch in gerrit è già obsoleta (è una delle prime revisioni) e la aggiornerò se gli sviluppatori sono interessati alle mie modifiche (mi risulta difficile aggiornarla, 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à del suono migliorata; è sufficiente attivare l'opzione nelle impostazioni del dispositivo Bluetooth. Gli utenti Linux possono anche ottenere un bitrate SBC elevato, installando , che, tra le altre cose, aggiunge supporto ai codec aptX, aptX HD e FastStream.
Fonte: habr.com
