Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Avant de lire cet article, il est recommandé de lire l’article précédent : Audio via Bluetooth : autant de détails que possible sur les profils, les codecs et les appareils

Certains utilisateurs de casques sans fil signalent une qualité sonore médiocre et un manque de hautes fréquences lors de l'utilisation du codec Bluetooth SBC standard, pris en charge par tous les appareils audio. Une recommandation courante pour améliorer le son consiste à acheter des appareils et des écouteurs prenant en charge les codecs aptX et LDAC. Ces codecs nécessitent des frais de licence, de sorte que les appareils qui les prennent en charge sont plus chers.

Il s'avère que la faible qualité du SBC est due aux limitations artificielles des piles Bluetooth et des paramètres des écouteurs, et cette limitation peut être contournée sur n'importe quel appareil existant grâce à des modifications logicielles sur un smartphone ou un ordinateur.

Codec SBC

Le codec SBC possède de nombreux paramètres différents qui sont négociés lors de la phase d'établissement de la connexion. Parmi eux:

  • Nombre et type de canaux : Stéréo commun, Stéréo, Double canal, Mono ;
  • Nombre de bandes de fréquences : 4 ou 8 ;
  • Nombre de blocs dans le paquet : 4, 8, 12, 16 ;
  • Algorithme de répartition des bits lors de la quantification : Loudness, SNR ;
  • La valeur maximale et minimale du pool de bits utilisé lors de la quantification (bitpool) : généralement de 2 à 53.

Le dispositif de décodage doit prendre en charge toute combinaison de ces paramètres. L'encodeur peut ne pas tout implémenter.
Les piles Bluetooth existantes s'accordent généralement sur le profil suivant : Joint Stereo, 8 bandes, 16 blocs, Loudness, bitpool 2..53. Ce profil code l'audio à 44.1 kHz à un débit binaire de 328 kbps.
Le paramètre bitpool affecte directement le débit au sein d'un profil : plus il est élevé, plus le débit est élevé, et donc la qualité.
Cependant, le paramètre bitpool n’est pas lié à un profil spécifique ; Le débit est également largement influencé par d'autres paramètres : type de canaux, nombre de bandes de fréquences, nombre de blocs. Vous pouvez augmenter le débit indirectement, en convenant sur des profils non standards, sans changer le bitpool.

Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Formule de calcul du débit binaire SBC

Par exemple, le mode Dual Channel encode les canaux séparément, en utilisant l'intégralité du bitpool pour chaque canal. En forçant l'appareil à utiliser Dual Channel au lieu de Joint Stereo, nous obtenons presque le double du débit binaire avec la même valeur de bitpool maximale : 617 kbps.
À mon avis, l'utilisation d'une valeur de bitpool non liée à un profil au stade de la négociation est une faille dans la norme A2DP, qui a conduit à une limitation artificielle de la qualité du SBC. Il serait plus logique de négocier le débit plutôt que le bitpool.

Ces valeurs fixes de Bitpool et de Bitrate proviennent d'un tableau avec les valeurs recommandées à utiliser pour un audio de haute qualité. Mais une recommandation n’est pas une raison pour se limiter à ces valeurs.

Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

La spécification A2DP v1.2, active de 2007 à 2015, exige que tous les appareils de décodage fonctionnent correctement avec des débits allant jusqu'à 512 kbps :

Le décodeur du SNK doit prendre en charge toutes les valeurs de pool de bits possibles qui ne dépassent pas le débit binaire maximum. Ce profil limite le débit binaire maximum disponible à 320 Ko/s pour le mono et à 512 Ko/s pour les modes deux canaux.

Dans la nouvelle version de la spécification, il n'y a aucune limite sur le débit binaire. On estime que les écouteurs modernes sortis après 2015 et prenant en charge l'EDR peuvent prendre en charge des débits binaires allant jusqu'à ≈730 kbps.

Pour une raison quelconque, les piles Bluetooth Linux (PulseAudio), Android, Blackberry et macOS que j'ai testées ont des limites artificielles sur la valeur maximale du paramètre bitpool, ce qui affecte directement le débit binaire maximum. Mais ce n’est pas le plus gros problème : presque tous les casques limitent également la valeur maximale du bitpool à 53.
Comme je l'ai déjà vu, la plupart des appareils fonctionnent parfaitement sur une pile Bluetooth modifiée avec un débit de 551 kbps, sans interruption ni crépitement. Mais un tel débit ne sera jamais cohérent dans des conditions normales, sur des piles Bluetooth classiques.

Modification de la pile Bluetooth

Toute pile Bluetooth compatible avec la norme A2DP prend en charge le mode Dual Channel, mais il n'est pas possible de l'activer depuis l'interface.

Ajoutons une bascule à l'interface ! J'ai créé des correctifs pour Android 8.1 et Android 9 qui ajoutent la prise en charge complète du double canal à la pile, ajoutent un mode au menu bascule de mode dans les outils de développement et traitent les SBC compatibles double canal comme s'il s'agissait d'un codec supplémentaire comme aptX. , AAC ou LDAC (Android appelle cela HD Audio) en ajoutant une coche aux paramètres du périphérique Bluetooth. Voici à quoi cela ressemble :

Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Correctif pour Android 9
Correctif pour Android 8.1

Lorsque la case est cochée, l'audio Bluetooth commence à être transmis à un débit binaire 551 kbps, si les écouteurs prennent en charge une vitesse de connexion de 3 Mbit/s, ou 452 kbps, si les écouteurs ne prennent en charge que 2 Mbit/s.

Ce correctif est inclus dans les firmwares alternatifs suivants :

  • LineageOS
  • Resurrection Remix
  • CrDroid

D'où viennent les débits 551 et 452 kbit/s ?

La technologie Bluetooth Air Sharing est conçue pour transmettre efficacement de gros paquets de taille fixe. Le transfert de données s'effectue dans des emplacements, le plus grand nombre d'emplacements envoyés dans un transfert est de 5. Il existe également des modes de transfert qui utilisent 1 ou 3 emplacements, mais pas 2 ou 4. Dans 5 emplacements, vous pouvez transférer jusqu'à 679 octets à une vitesse de connexion. de 2 Mbit/s et jusqu'à 1021 octets à une vitesse de 3 Mbit/s, et à 3 - 367 et 552 octets, respectivement.

Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Si nous voulons transférer moins de données que 679 ou 1021 octets, mais plus de 367 ou 552 octets, le transfert prendra toujours 5 emplacements et les données seront transférées en même temps, ce qui réduit l'efficacité du transfert.

Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

SBC en mode Dual Channel, à 44100 38 Hz avec Bitpool 16 paramètres, 8 blocs par image, 164 plages de fréquences, code l'audio en images de 452 octets, avec un débit binaire de XNUMX kbps.
L'audio doit être encapsulé dans les protocoles de transfert L2CAP et AVDTP, qui prennent 16 octets de la charge utile audio.

Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Ainsi, une transmission Bluetooth avec 5 slots peut accueillir 4 trames audio :

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

Nous insérons 11.7 ms de données audio dans le paquet envoyé, qui sera transmis en 3.75 ms, et il nous reste 6 octets inutilisés dans le paquet.
Si vous augmentez un peu le bitpool, il ne sera plus possible de regrouper 4 images audio dans un seul package. Vous devrez envoyer 3 images à la fois, ce qui réduit l'efficacité de la transmission, réduit la quantité d'audio transmise par image et entraînera plus rapidement un bégaiement audio dans de mauvaises conditions radio.

De la même manière, un débit de 551 kbit/s a été retenu pour l'EDR 3 Mbit/s : avec Bitpool 47, 16 blocs par trame, 8 gammes de fréquences, la taille de trame est de 200 octets, avec un débit de 551 kbit/s. Un paquet contient 5 images ou 14.6 ms de musique.

L'algorithme de calcul de tous les paramètres SBC est assez complexe, vous pouvez facilement vous tromper si vous comptez manuellement, j'ai donc créé une calculatrice interactive pour aider les personnes intéressées : btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Pourquoi tout cela est-il nécessaire ?

Contrairement à la croyance populaire sur la qualité sonore du codec aptX, sur certains fichiers, il peut produire des résultats pires que SBC avec un débit standard de 328 kbps.

Le SBC attribue dynamiquement des bits de quantification aux bandes de fréquences de bas en haut. Si tout le débit a été utilisé pour les basses et moyennes fréquences, les hautes fréquences seront « coupées » (il y aura du silence à la place).
aptX quantifie les bandes de fréquences avec le même nombre de bits à tout moment, c'est pourquoi il a un débit binaire constant : 352 kbps pour 44.1 kHz, 384 kbps pour 48 kHz, et il ne peut pas « bit-shift » vers les fréquences qui en ont le plus besoin. . Contrairement à SBC, aptX ne « coupera » pas les fréquences, mais y ajoutera du bruit de quantification, réduisant ainsi la plage dynamique de l'audio et introduisant parfois des crépitements caractéristiques. SBC « mange les détails » - supprime les zones les plus calmes.
En moyenne, par rapport au SBC 328k, aptX introduit moins de distorsion dans la musique avec une large plage de fréquences, mais dans la musique avec une plage de fréquences étroite et une large plage dynamique, le SBC 328k gagne parfois.

Considérons un cas particulier. Spectrogramme d'un enregistrement de jeu de piano :
Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

L'énergie principale réside dans les fréquences de 0 à 4 kHz et se poursuit jusqu'à 10 kHz.
Le spectrogramme d'un fichier compressé en aptX ressemble à ceci :
Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Et voici à quoi ressemble le SBC 328k.
Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

On peut voir que le SBC 328k désactivait périodiquement complètement la plage supérieure à 16 kHz et dépensait tout le débit disponible sur les plages inférieures à cette valeur. Cependant, aptX a introduit davantage de distorsion dans le spectre de fréquences audible par l'oreille humaine, comme le montre le spectrogramme original soustrait du spectrogramme aptX (plus il est brillant, plus il y a de distorsion) :
Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Alors que le SBC 328k gâchait moins le signal dans la plage de 0 à 10 kHz, et coupait le reste :
Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Le débit binaire de 485k du SBC était suffisant pour préserver toute la gamme de fréquences, sans désactiver les bandes.
Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

SBC 485k est nettement en avance sur aptX sur cette piste dans la plage de 0 à 15 kHz, et avec une différence plus petite, mais toujours perceptible - dans 15 à 22 kHz (plus c'est sombre, moins il y a de distorsion) :
Nous modifions la pile Bluetooth pour améliorer le son sur les écouteurs sans codecs AAC, aptX et LDAC

Archive de l'audio original, SBC et aptX.

En passant à un SBC à haut débit, vous obtiendrez un son qui bat souvent aptX sur n'importe quel casque. Sur les écouteurs prenant en charge la connectivité EDR 3 Mbps, un débit binaire de 551 kbps produit un son comparable à aptX HD.

Pouvez-vous faire encore plus ?

Le correctif Android inclut également une option permettant d'augmenter davantage le débit binaire des appareils EDR à 2 Mbps. Vous pouvez augmenter le débit binaire de 452 kbit/s à 595 kbit/s, au prix d'une réduction de la stabilité de la transmission dans des conditions radio difficiles.
Il suffit de mettre la variable persist.bluetooth.sbc_hd_higher_bitrate à 1 :

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Le correctif de débit binaire extrême n’a jusqu’à présent été adopté que dans LineageOS 15.1, mais pas dans 16.0.

Compatibilité des appareils

SBC Dual Channel est pris en charge par presque tous les écouteurs, haut-parleurs et unités principales de voiture. Ce n'est pas étonnant : la norme exige sa prise en charge dans tous les appareils de décodage. Il existe un petit nombre d'appareils sur lesquels ce mode pose problème, mais il s'agit de cas isolés.
Plus de détails sur les appareils compatibles peuvent être trouvés sur 4pda ou xda-developers.

Comparaison des différences sonores

J'ai créé un service Web qui encode l'audio en SBC (ainsi qu'en aptX et aptX HD) en temps réel, directement dans le navigateur. Avec lui, vous pouvez comparer le son de différents profils SBC et d'autres codecs, sans réellement transmettre l'audio via Bluetooth, sur des écouteurs filaires, des haut-parleurs et votre musique préférée, et également modifier les paramètres d'encodage directement pendant la lecture audio.
btcodecs.valdikss.org.ru/sbc-encoder

Contacter les développeurs Android

J'ai écrit à de nombreux développeurs de piles Bluetooth chez Google pour leur demander d'envisager d'inclure des correctifs dans la branche principale d'Android - AOSP, mais je n'ai reçu aucune réponse. Mes patchs dans Système de correctifs Gerrit pour Android est également resté sans commentaire de la part des personnes impliquées.
Je serais heureux si je pouvais obtenir de l'aide pour entrer en contact avec les développeurs de Google et amener SBC HD sur Android. Le patch dans gerrit est déjà obsolète (c'est l'une des premières révisions), et je le mettrai à jour si les développeurs sont intéressés par mes modifications (ce n'est pas facile pour moi de le mettre à jour, je n'ai pas d'appareils compatibles avec Android Q ).

Conclusion

Les utilisateurs de smartphones dotés de LineageOS, Resurrection Remix et du micrologiciel crDroid peuvent dès maintenant profiter d'une qualité sonore améliorée, il suffit d'activer l'option dans les paramètres de l'appareil Bluetooth. Les utilisateurs de Linux peuvent également obtenir un débit binaire SBC accru en installant patch de Pali Rohar, qui, entre autres, ajoute la prise en charge des codecs aptX, aptX HD et FastStream.

Source: habr.com

Ajouter un commentaire