Nous modifions la pile Bluetooth pour améliorer le son des casques 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 que possible sur les profils, les codecs et les appareils / en anglais

Certains utilisateurs d'écouteurs sans fil constatent une mauvaise qualité audio et un manque de hautes fréquences lors de l'utilisation du codec Bluetooth SBC standard, qui prend en charge tous les appareils audio. Une recommandation fréquente pour améliorer le son est d'acheter des appareils et des écouteurs qui prennent en charge les codecs aptX et LDAC. Ces codecs nécessitent des frais de licence, donc les appareils avec leur support sont plus chers.

Il s'avère que la faible qualité de SBC est due aux limitations artificielles des piles Bluetooth et des paramètres des écouteurs, et cette restriction peut être contournée sur tous les appareils existants par des modifications logicielles sur un smartphone ou un ordinateur.

Codec SBC

Le codec SBC a de nombreux paramètres différents qui sont cohérents pendant la phase d'établissement de la connexion. Parmi eux:

  • Nombre et type de canaux: stéréo mixte, stéréo, double canal, mono;
  • Nombre de bandes de fréquences: 4 ou 8;
  • Le nombre de blocs dans le package: 4, 8, 12, 16;
  • Algorithme d'allocation des bits de quantification: Loudness, SNR;
  • Valeur maximale et minimale du pool de bits utilisé en 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 implémenter tout.
En règle générale, les piles Bluetooth existantes conviennent du profil suivant: Stéréo mixte, 8 bandes, 16 blocs, Loudness, bitpool 2..53. Ce profil code l'audio 44,1 kHz avec un débit binaire de 328 kbps.
Le paramètre bitpool affecte directement le bitrate dans un seul profil: plus il est élevé, plus le bitrate est élevé et donc la qualité.
Cependant, le paramètre bitpool n'est pas lié à un profil spécifique; D'autres paramètres ont également un impact sur le débit binaire: type de canaux, nombre de bandes de fréquences, nombre de blocs. Vous pouvez augmenter le débit binaire indirectement en négociant des profils non standard sans modifier le pool de bits.

bitrate= frac8 timesframe length timessample ratesubbands timesblocks


Formule de bitrate SBC


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

Ces valeurs fixes, Bitpool et Bitrate, proviennent d'un tableau avec des valeurs recommandées pour un son de haute qualité. Mais la recommandation n'est pas une raison pour se limiter à ces valeurs.

Tableau de profil Bluetooth SBC

La spécification A2DP v1.2, qui était active de 2007 à 2015, exige que tous les périphériques 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 maximal. Ce profil limite le débit binaire maximal disponible à 320 kb / s pour le mode mono et à 512 kb / s pour les modes à deux canaux.


Il n'y a pas de limite de débit binaire dans la nouvelle version de la spécification. Il est supposé que les écouteurs modernes sortis après 2015 et prenant en charge EDR peuvent prendre en charge des débits allant jusqu'à 30730 kbps.

Pour une raison quelconque, les piles Bluetooth Linux que j'ai testées (PulseAudio), Android, Blackberry et macOS ont des limitations artificielles sur la valeur maximale du paramètre bitpool, ce qui affecte directement le débit binaire maximal. Mais ce n'est pas le plus gros problème, presque tous les écouteurs limitent également la valeur maximale du pool de bits à 53.
Comme je l'ai déjà réussi à m'assurer, la plupart des appareils fonctionnent bien sur une pile Bluetooth modifiée avec un débit binaire de 551 kbit / s, sans interruptions et grésillements. Mais un tel débit ne sera jamais négocié dans des conditions normales, sur des piles Bluetooth ordinaires.

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 à partir de l'interface.

Ajoutons un interrupteur à l'interface! J'ai créé des correctifs pour Android 8.1 et Android 9 qui ajoutent une prise en charge complète de Dual Channel à la pile, ajoutent le mode au menu de changement de mode dans les outils de développement et traitent SBC avec la prise en charge Dual Channel comme s'il s'agissait d'un codec supplémentaire comme aptX, AAC ou LDAC ( Android l'appelle HD Audio) en ajoutant une coche aux paramètres de l'appareil Bluetooth. Voici à quoi ça ressemble:

image

Patch pour Android 9
Patch pour Android 8.1

Lorsque la case est cochée, l'audio Bluetooth commence à être transmis avec un débit binaire de 551 kbps si le casque prend en charge une connexion à 3 Mbps, ou 452 kbps si le casque ne prend en charge que 2 Mbps.

Ce patch est inclus dans le firmware alternatif suivant:
  • LineageOS
  • Remix de résurrection
  • crDroid


D'où provenaient les 551 et 452 kbit / s?

La technologie Bluetooth split-air est conçue pour transférer efficacement de gros paquets de taille fixe. Les données sont transmises par des slots, le plus grand nombre de slots envoyés dans une transmission est de 5. Il existe également des modes de transmission qui utilisent 1 ou 3 slots, mais pas 2 ou 4. Dans 5 slots, vous pouvez transférer jusqu'à 679 octets à une vitesse de connexion de 2 Mbps et jusqu'à 1021 octets à une vitesse de 3 Mbps, et de 3 à 367 et 552 octets, respectivement.

image

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 transmises en même temps, ce qui réduit l'efficacité de la transmission.

image

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

\ begin {align *} framelength & = 4 + \ frac {subbands \ times channels} {2} + \\ & \ begin {cases} \ frac {blocks \ times channels \ times bitpool} {8} & \ text { si mode mono ou double canal} \\ \ frac {sous-bandes + blocs \ times bitpool} {8} & \ text {si mode stéréo commun} \\ \ frac {blocks \ times bitpool} {8} & \ text {si stéréo mode} \\ \ end {cases} \ end {align *}





Ainsi, dans une seule transmission Bluetooth à 5 emplacements, il est possible d'accueillir 4 trames audio:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 ( SBC) - (164*4) = 6 

Nous avons mis 11,7 ms de données audio dans le paquet d'envoi, qui sera transmis en 3,75 ms, et nous avons 6 octets inutilisés dans le paquet.
Si vous augmentez légèrement le bitpool, 4 images audio ne peuvent plus être regroupées 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 paquet et entraînera rapidement un bégaiement audio dans de mauvaises conditions radio.

De la même manière, un débit binaire de 551 kbit / s a ​​été sélectionné pour un EDR de 3 Mbps: avec Bitpool 47, 16 blocs dans une trame, 8 gammes de fréquences, la taille de trame est de 200 octets, avec un débit binaire de 551 kbit / s. 5 images ou 14,6 ms de musique tient dans un seul paquet.

L'algorithme de calcul de tous les paramètres SBC est assez compliqué, vous pouvez facilement vous embrouiller 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 concernant la qualité sonore du codec aptX, il peut produire des résultats moins bons sur certains fichiers que SBC avec un débit binaire standard de 328 kbps.

SBC alloue dynamiquement des bits de quantification pour les bandes de fréquences, fonctionnant de «bas en haut». Si le bitrate entier a été utilisé pour les fréquences basses et moyennes, les fréquences plus élevées seront «coupées» (il y aura du silence à la place).
aptX quantifie les bandes de fréquences avec le même nombre de bits en continu, c'est pourquoi il a un débit constant: 352 kbit / s pour 44,1 kHz, 384 kbit / s pour 48 kHz, et il ne peut pas "transférer des bits" à ces fréquences qui en ont le plus besoin. Contrairement à SBC, aptX ne «coupera» pas les fréquences, mais leur ajoutera du bruit de quantification, réduisant la plage dynamique de l'audio et introduisant parfois des grésillements caractéristiques. SBC, d'autre part, «dévore les détails» - élimine les zones les plus calmes.
Comparé au SBC 328k, aptX introduit en moyenne moins de distorsion dans la musique avec une large gamme de fréquences, mais parfois il gagne sur la musique avec une gamme de fréquences étroite et une large gamme dynamique.

Prenons un cas particulier. Spectrogramme pour l'enregistrement du piano:
image

L'énergie principale réside dans les fréquences de 0 à 4 kHz, et dure jusqu'à 10 kHz.
Le spectrogramme du fichier compressé dans aptX est le suivant:
image

Et il ressemble donc à SBC 328k.
image

On peut voir que le SBC 328k éteignait périodiquement complètement la plage au-dessus de 16 kHz et consommait tout le débit disponible pour les plages inférieures à cette valeur. Cependant, aptX a introduit plus de distorsion dans le spectre de fréquences entendu par l'oreille humaine, ce qui peut être vu sur le spectrogramme original soustrait du spectrogramme aptX (le plus brillant, le plus de distorsion):
image

Alors que le SBC 328k moins gâché le signal dans la plage de 0 à 10 kHz, et couper le reste -
image

Le bitrate SBC 485k était suffisant pour enregistrer toute la gamme de fréquences, sans déconnecter les bandes.
image

SBC 485k sur cette composition est nettement en avance sur aptX dans la plage de 0 à 15 kHz, et avec une différence plus petite mais toujours notable - 15 à 22 kHz (la plus sombre, la moins de distorsion):
image

Archive de l'audio original, SBC et aptX .

En passant au SBC à bits élevés, vous obtiendrez un son, souvent supérieur à aptX, sur tous les écouteurs. Sur les écouteurs prenant en charge une connexion EDR à 3 Mbps, le débit binaire de 551 Kbps produit un son comparable à aptX HD.

Puis-je en avoir plus?

Le patch pour Android a également une option pour augmenter encore le débit binaire pour les appareils EDR de 2 Mbps. Vous pouvez augmenter le débit binaire de 452 kbps à 595 kbps, au prix de réduire la stabilité de transmission dans des conditions radio complexes.
Réglez simplement la variable persist.bluetooth.sbc_hd_higher_bitrate sur 1:
 # setprop persist.bluetooth.sbc_hd_higher_bitrate 1 

Le correctif de débit binaire extrême n'a jusqu'à présent été accepté 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 centrales de voiture. Ce n'est pas surprenant - la norme prescrit son support dans tous les appareils de décodage. Il existe un petit nombre de périphériques sur lesquels ce mode pose problème, mais il s'agit d'instances uniques.
Plus de détails sur les appareils compatibles peuvent être trouvés sur w3bsit3-dns.com ou les développeurs xda .

Comparaison des différences sonores

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

Contactez les développeurs Android

J'ai écrit à de nombreux développeurs de la pile Google Bluetooth avec une demande d'envisager l'inclusion de correctifs dans la branche principale d'Android - AOSP, mais je n'ai reçu aucune réponse. Mes correctifs dans le système de correctifs Gerrit pour Android ont également été laissés sans commentaire par toute personne impliquée.
Je serais heureux si j'étais aidé en relation avec les développeurs de Google et la mise en œuvre de SBC HD dans Android. Le correctif 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 Android Q).

Conclusion

Les utilisateurs de smartphones avec LineageOS, Resurrection Remix et crDroid peuvent désormais se contenter 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 un correctif de Pali Rohár , qui, entre autres, ajoute la prise en charge des codecs aptX, aptX HD et FastStream.

Source: https://habr.com/ru/post/fr455316/


All Articles