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

Prima di leggere questo articolo, si consiglia di leggere l'articolo precedente: Audio via Bluetooth: massimi dettagli su profili, codec e dispositivi

Alcuni utenti di cuffie wireless segnalano una scarsa qualità del suono e la mancanza di alte frequenze quando utilizzano il codec Bluetooth SBC standard, supportato da tutti i dispositivi audio. Una raccomandazione comune per migliorare il suono è acquistare dispositivi e cuffie che supportino i codec aptX e LDAC. Questi codec richiedono costi di licenza, quindi i dispositivi che li supportano sono più costosi.

Si scopre che la bassa qualità di SBC è dovuta a limitazioni artificiali degli stack Bluetooth e delle impostazioni delle cuffie e questa limitazione può essere aggirata su qualsiasi dispositivo esistente modificando il software su uno smartphone o un computer.

Codec SBC

Il codec SBC ha molti parametri diversi che vengono negoziati durante la fase di configurazione della connessione. Tra loro:

  • Numero e tipologia di canali: Joint Stereo, Stereo, Dual Channel, Mono;
  • Numero di bande di frequenza: 4 o 8;
  • Numero di blocchi nella confezione: 4, 8, 12, 16;
  • Algoritmo per la distribuzione dei bit durante la quantizzazione: Loudness, SNR;
  • Il valore massimo e minimo del pool di bit utilizzati durante la quantizzazione (bitpool): solitamente da 2 a 53.

Il dispositivo di decodifica deve supportare qualsiasi combinazione di questi parametri. Il codificatore potrebbe non implementare tutto.
Gli stack Bluetooth esistenti in genere concordano sul seguente profilo: Joint Stereo, 8 bande, 16 blocchi, Loudness, bitpool 2..53. Questo profilo codifica l'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 quindi la qualità.
Tuttavia, il parametro bitpool non è legato ad un profilo specifico; Il bitrate è largamente influenzato anche da altri parametri: tipo di canali, numero di bande di frequenza, numero di blocchi. Puoi aumentare il bitrate indirettamente, concordando profili non standard, senza modificare il bitpool.

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

Formula per calcolare il bitrate SBC

Ad esempio, la modalità Dual Channel codifica i canali separatamente, utilizzando l'intero bitpool per ciascun canale. Forzando il dispositivo a utilizzare Dual Channel anziché Joint Stereo, otteniamo quasi il doppio del bitrate con lo stesso valore massimo di bitpool: 617 kbps.
A mio avviso, l’utilizzo di un valore bitpool non legato ad un profilo in fase di negoziazione è un difetto dello standard A2DP, che ha portato ad una limitazione artificiale della qualità SBC. Avrebbe più senso negoziare il bitrate piuttosto che il bitpool.

Questi valori fissi di Bitpool e Bitrate provengono da una tabella con valori consigliati da utilizzare per audio di alta qualità. Ma una raccomandazione non è un motivo per limitarsi a questi valori.

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

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

Il decoder dell'SNK deve supportare tutti i possibili valori di bitpool che non superino il bit rate massimo. Questo profilo limita il bit rate massimo disponibile a 320 kb/s per la modalità mono e 512 kb/s per le modalità a due canali.

Nella nuova versione delle specifiche non c'è limite al bitrate. Si stima che le cuffie moderne rilasciate dopo il 2015 che supportano EDR possano supportare velocità in bit fino a ≈730 kbps.

Per qualche motivo, gli stack Bluetooth Linux (PulseAudio), Android, Blackberry e macOS che ho testato presentano limiti artificiali sul valore massimo del parametro bitpool, che influisce direttamente sul bitrate massimo. Ma questo non è il problema più grande; quasi tutte le cuffie limitano anche il valore massimo del bitpool a 53.
Come ho già visto, la maggior parte dei dispositivi funziona perfettamente su uno stack Bluetooth modificato con un bitrate di 551 kbps, senza interruzioni o crepitii. Ma un bitrate di questo tipo non sarà mai coerente in condizioni normali, sui normali stack Bluetooth.

Modifica dello stack Bluetooth

Qualsiasi stack Bluetooth compatibile con lo standard A2DP supporta la modalità Dual Channel, ma non è possibile attivarla dall'interfaccia.

Aggiungiamo un interruttore all'interfaccia! Ho creato patch per Android 8.1 e Android 9 che aggiungono il supporto completo Dual Channel allo stack, aggiungono una modalità al menu di attivazione/disattivazione modalità negli strumenti di sviluppo e trattano gli SBC abilitati Dual Channel come se fossero un codec aggiuntivo come aptX , AAC o LDAC (Android lo chiama HD Audio) aggiungendo un segno di spunta alle impostazioni del dispositivo Bluetooth. Ecco come appare:

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

Patch per Android 9
Patch per Android 8.1

Quando la casella è attivata, l'audio Bluetooth inizia a essere trasmesso a un bitrate 551 kbps, se le cuffie supportano una velocità di connessione di 3 Mbit/s, oppure 452 kbps, se le cuffie supportano solo 2 Mbit/s.

Questa patch è inclusa nei seguenti firmware alternativi:

  • LineageOS
  • Remix di risurrezione
  • crDroid

Da dove vengono 551 e 452 kbit/s?

La tecnologia di condivisione dell'aria Bluetooth è progettata per trasmettere in modo efficiente pacchetti di grandi dimensioni di dimensioni fisse. Il trasferimento dei dati avviene negli slot, il numero massimo di slot inviati in un trasferimento è 5. Esistono anche modalità di trasferimento che utilizzano 1 o 3 slot, ma non 2 o 4. In 5 slot è possibile trasferire fino a 679 byte a una velocità di connessione di 2 Mbit/s e fino a 1021 byte alla velocità di 3 Mbit/s e rispettivamente a 3 - 367 e 552 byte.

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

Se vogliamo trasferire meno dati di 679 o 1021 byte, ma più di 367 o 552 byte, il trasferimento richiederà comunque 5 slot e i dati verranno trasferiti nello stesso tempo, il che riduce l'efficienza del trasferimento.

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

SBC in modalità Dual Channel, a 44100 Hz audio con parametri Bitpool 38, 16 blocchi per frame, 8 gamme di frequenza, codifica l'audio in frame da 164 byte, con un bitrate di 452 kbps.
L'audio deve essere incapsulato nei protocolli di trasferimento L2CAP e AVDTP, che richiedono 16 byte dal payload audio.

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

Pertanto, una trasmissione Bluetooth con 5 slot può ospitare 4 frame audio:

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

Inseriamo 11.7 ms di dati audio nel pacchetto inviato, che verrà trasmesso in 3.75 ms, e nel pacchetto rimangono 6 byte inutilizzati.
Se si aumenta leggermente il bitpool, non sarà più possibile racchiudere 4 frame audio in un unico pacchetto. Dovrai inviare 3 fotogrammi alla volta, il che riduce l'efficienza della trasmissione, riduce la quantità di audio trasmesso per fotogramma e porterà più rapidamente a balbettii dell'audio in cattive condizioni radio.

Allo stesso modo per EDR 551 Mbit/s è stato scelto un bitrate di 3 kbit/s: con Bitpool 47, 16 blocchi per frame, 8 range di frequenza, la dimensione del frame è di 200 byte, con un bitrate di 551 kbit/s. Un pacchetto contiene 5 fotogrammi o 14.6 ms di musica.

L'algoritmo per il calcolo di tutti i parametri SBC è piuttosto complesso, puoi facilmente confonderti se conti manualmente, quindi ho creato un calcolatore interattivo per aiutare chi è interessato: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Perché è necessario tutto questo?

Contrariamente alla credenza popolare sulla qualità del suono del codec aptX, su alcuni file può produrre risultati peggiori di SBC con un bitrate standard di 328 kbps.

L'SBC assegna dinamicamente i bit di quantizzazione alle bande di frequenza su base dal basso all'alto. Se tutto il bitrate è stato utilizzato per le frequenze basse e medie, le frequenze alte verranno “tagliate” (ci sarà invece silenzio).
aptX quantizza le bande di frequenza con lo stesso numero di bit in ogni momento, motivo per cui ha un bitrate costante: 352 kbps per 44.1 kHz, 384 kbps per 48 kHz e non può "spostare bit" su quelle frequenze che ne hanno più bisogno . A differenza di SBC, aptX non “taglierà” le frequenze, ma aggiungerà loro rumore di quantizzazione, riducendo la gamma dinamica dell'audio e talvolta introducendo un caratteristico crepitio. SBC "mangia dettagli": scarta le aree più silenziose.
In media, rispetto all'SBC 328k, aptX introduce meno distorsioni nella musica con un'ampia gamma di frequenze, ma nella musica con una gamma di frequenze ristretta e un'ampia gamma dinamica, l'SBC 328k a volte vince.

Consideriamo un caso speciale. Spettrogramma di una registrazione suonata al pianoforte:
Modifichiamo lo stack Bluetooth per migliorare il suono sulle 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.
Lo spettrogramma di un file compresso in aptX si presenta così:
Modifichiamo lo stack Bluetooth per migliorare il suono sulle cuffie senza codec AAC, aptX e LDAC

E questo è l'aspetto di SBC 328k.
Modifichiamo lo stack Bluetooth per migliorare il suono sulle cuffie senza codec AAC, aptX e LDAC

Si può vedere che l'SBC 328k disattiva periodicamente completamente la gamma superiore a 16 kHz e spende tutto il bitrate disponibile su gamme inferiori a questo valore. Tuttavia, aptX ha introdotto una maggiore distorsione nello spettro di frequenza udibile dall'orecchio umano, come si può vedere nello spettrogramma originale sottratto dallo spettrogramma aptX (più luminoso, maggiore è la distorsione):
Modifichiamo lo stack Bluetooth per migliorare il suono sulle cuffie senza codec AAC, aptX e LDAC

Mentre l'SBC 328k rovina meno il segnale nell'intervallo da 0 a 10 kHz e taglia il resto:
Modifichiamo lo stack Bluetooth per migliorare il suono sulle cuffie senza codec AAC, aptX e LDAC

Il bitrate di 485k dell'SBC è stato sufficiente a preservare l'intera gamma di frequenze, senza disabilitare le bande.
Modifichiamo lo stack Bluetooth per migliorare il suono sulle cuffie senza codec AAC, aptX e LDAC

L'SBC 485k è significativamente avanti rispetto a aptX su questa traccia nell'intervallo 0-15 kHz, con una differenza più piccola ma comunque evidente di 15-22 kHz (più scuro è minore la distorsione):
Modifichiamo lo stack Bluetooth per migliorare il suono sulle cuffie senza codec AAC, aptX e LDAC

Archivio di audio originale, SBC e aptX.

Passando a un SBC ad alto bitrate, otterrai un audio che spesso batte aptX su qualsiasi cuffia. Sulle cuffie che supportano la connettività EDR a 3 Mbps, un bitrate di 551 kbps produce un suono paragonabile a aptX HD.

Puoi fare ancora di più?

La patch Android include anche un'opzione per aumentare ulteriormente il bitrate per i dispositivi EDR a 2 Mbps. È possibile aumentare il bitrate da 452 kbit/s a 595 kbit/s, a scapito della stabilità della trasmissione in condizioni radio difficili.
È sufficiente impostare la variabile persist.bluetooth.sbc_hd_higher_bitrate su 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

La patch per il bitrate estremo è stata finora adottata solo nella LineageOS 15.1, ma non nella 16.0.

Compatibilità del dispositivo

SBC Dual Channel è supportato da quasi tutte le cuffie, gli altoparlanti e le unità principali dell'auto. Non c'è da stupirsi: lo standard richiede il suo supporto in qualsiasi dispositivo di decodifica. Esiste un numero limitato di dispositivi su cui questa modalità causa problemi, ma si tratta di casi isolati.
Maggiori dettagli sui dispositivi compatibili sono disponibili all'indirizzo 4pda o xda-developers.

Confronto delle differenze sonore

Ho creato un servizio web che codifica l'audio su SBC (così come su aptX e aptX HD) in tempo reale, direttamente nel browser. Con esso, puoi confrontare il suono di diversi profili SBC e altri codec, senza effettivamente trasmettere l'audio tramite Bluetooth, su cuffie cablate, altoparlanti e la tua musica preferita, e anche modificare i parametri di codifica direttamente durante la riproduzione dell'audio.
btcodecs.valdikss.org.ru/sbc-encoder

Contatta gli sviluppatori Android

Ho scritto a molti sviluppatori di stack Bluetooth presso Google chiedendo loro di prendere in considerazione l'inclusione di patch nel ramo principale di Android, AOSP, ma non ho ricevuto una sola risposta. Le mie toppe dentro Sistema di patch Gerrit per Android inoltre è rimasto senza commenti da parte di chiunque sia coinvolto.
Sarei felice se potessi ricevere aiuto per entrare in contatto con gli sviluppatori di Google e portare SBC HD su Android. La patch di Gerrit è già obsoleta (questa è una delle prime revisioni) e la aggiornerò se gli sviluppatori saranno interessati alle mie modifiche (non è facile per me aggiornarla, non ho dispositivi compatibili con Android Q ).

conclusione

Gli utenti di smartphone con LineageOS, Resurrection Remix e firmware crDroid possono godere subito di una migliore qualità del suono, basta attivare l'opzione nelle impostazioni del dispositivo Bluetooth. Gli utenti Linux possono anche ottenere un bitrate SBC maggiore installando toppa di Pali Rohar, che, tra le altre cose, aggiunge il supporto per i codec aptX, aptX HD e FastStream.

Fonte: habr.com

Aggiungi un commento