Avant de lire cet article, il est recommandé de consulter l'article précédent :
Certains utilisateurs d'écouteurs sans fil signalent une mauvaise qualité sonore et un manque d'aigus lors de l'utilisation du codec Bluetooth standard SBC, pris en charge par tous les appareils audio. Un conseil courant pour améliorer la qualité sonore est d'acheter des appareils et des écouteurs prenant en charge les codecs aptX et LDAC. Ces codecs nécessitent des redevances de licence, c'est pourquoi les appareils les prenant en charge sont plus coûteux.
Il s'avère que la mauvaise qualité du SBC est due à des limitations artificielles des piles Bluetooth et des réglages des écouteurs, et cette limitation peut être contournée sur tous les appareils existants par des modifications logicielles du smartphone ou de l'ordinateur.
Codec SBC
Le codec SBC possède de nombreux paramètres différents qui sont négociés lors de l'établissement de la connexion. Parmi eux :
- Nombre et type de canaux : Joint Stereo, Stereo, Dual Channel, Mono;
- Nombre de bandes de fréquence : 4 ou 8;
- Nombre de blocs par paquet : 4, 8, 12, 16;
- Algorithme de répartition des bits lors de la quantification : Loudness, SNR;
- Valeur maximale et minimale du pool de bits utilisés lors de la quantification (bitpool) : généralement, de 2 à 53.
L'appareil décodeur doit prendre en charge n'importe quelle combinaison de ces paramètres. L'appareil encodeur peut ne pas réaliser tous.
Les piles Bluetooth existantes négocient généralement le profil suivant : Joint Stereo, 8 bandes, 16 blocs, Loudness, bitpool 2..53. Ce profil encode de l'audio à 44,1 kHz avec un débit binaire de 328 kbit/s.
Le paramètre bitpool influence directement le débit binaire au sein d'un même profil : plus il est élevé, plus le débit binaire est élevé, et par conséquent la qualité.
Cependant, le paramètre bitpool n'est pas lié à un profil spécifique ; d'autres paramètres tels que le type de canaux, le nombre de bandes de fréquence et le nombre de blocs ont également un impact considérable sur le débit binaire. Il est possible d'augmenter le débit binaire de manière indirecte en négociant des profils non standards, sans modifier le bitpool.
Formule de calcul du débit binaire SBC
Par exemple, le mode Dual Channel code les canaux séparément, utilisant l'ensemble du bitpool pour chacun des canaux. En forçant l'appareil à utiliser Dual Channel au lieu de Joint Stereo, nous obtiendrons presque un double bitrate avec la même valeur maximale de bitpool : 617 kbps.
À mon avis, l'utilisation d'une valeur de bitpool non liée au profil lors de l'accord est une lacune de la norme A2DP, qui a conduit à une limitation artificielle de la qualité SBC. Il aurait été plus judicieux de négocier le bitrate, et non le bitpool.
Ces valeurs fixes de Bitpool et de Bitrate proviennent d'un tableau avec des valeurs recommandées pour un audio haute qualité. Mais une recommandation ne doit pas nous limiter à ces valeurs.
La spécification A2DP v1.2, qui a été active de 2007 à 2015, exige que tous les appareils de décodage fonctionnent correctement avec des bitrates jusqu'à 512 kbps :
Le décodeur de la SNK doit prendre en charge toutes les valeurs de bitpool possibles qui ne dépassent pas le bitrate maximal. Ce profil limite le bitrate maximum disponible à 320 kbps pour le mono, et 512 kbps pour les modes à deux canaux.
Dans la nouvelle version de la spécification, il n'y a pas de limite au bitrate. Il est supposé que les écouteurs modernes, sortis après 2015 et supportant l'EDR, peuvent supporter des bitrates jusqu'à environ 730 kbps.
Pour une raison quelconque, les stacks Bluetooth Linux (PulseAudio), Android, Blackberry et macOS que j'ai vérifiés ont des limites artificielles sur la valeur maximale du paramètre bitpool, qui affecte directement le bitrate maximum. Mais ce n'est pas le plus gros problème, presque tous les écouteurs limitent aussi la valeur maximale du bitpool à 53.
Comme j'ai pu le constater, la plupart des appareils fonctionnent très bien avec un stack Bluetooth modifié à un bitrate de 551 kbps, sans interruptions ni grésillements. Mais un tel bitrate ne sera jamais négocié dans des conditions normales, sur des stacks Bluetooth standards.
Modifier le stack Bluetooth
Dans tout stack Bluetooth compatible avec la norme A2DP, il y a un support pour le mode Dual Channel, mais il n'est pas possible de l'activer depuis l'interface.
Ajoutons un interrupteur à l'interface ! J'ai créé des patchs pour Android 8.1 et Android 9, qui ajoutent un support complet du Dual Channel dans la pile, intègrent un mode dans le menu de sélection de mode dans les outils de développement, et gèrent le SBC avec prise en charge du Dual Channel comme s'il s'agissait d'un codec supplémentaire, comme aptX, AAC ou LDAC (Android appelle cela HD Audio), en ajoutant une case à cocher dans les paramètres des appareils Bluetooth. Voici à quoi cela ressemble :
Lorsque la case est cochée, l'audio Bluetooth commence à être transmis avec un débit de 551 kbit/s, si les écouteurs prennent en charge une connexion à 3 Mbit/s, ou 452 kbit/s, si les écouteurs ne prennent en charge que 2 Mbit/s.
Ce patch est inclus dans les firmwares alternatifs suivants :
- LineageOS
- Resurrection Remix
- crDroid
D'où viennent les 551 et 452 kbit/s ?
La technologie de multiplexage dans Bluetooth est conçue pour transmettre efficacement de grands paquets de taille fixe. La transmission des données se fait par tranches, le nombre maximum de tranches envoyées en une seule transmission étant de 5. Il existe également des modes de transmission utilisant 1 ou 3 tranches, mais pas 2 ou 4. Avec 5 tranches, il est possible de transmettre jusqu'à 679 octets à une vitesse de connexion de 2 Mbit/s et jusqu'à 1021 octets à une vitesse de 3 Mbit/s, tandis qu'avec 3 tranches, on peut transmettre 367 et 552 octets respectivement.
Si nous voulons transmettre moins de données que 679 ou 1021 octets, mais plus que 367 ou 552 octets, la transmission occupera tout de même 5 tranches, et les données seront transférées dans le même laps de temps, ce qui réduit l'efficacité de la transmission.
Le SBC en mode Dual Channel, sur de l'audio à 44100 Hz avec des paramètres Bitpool 38, 16 blocs par trame, 8 bandes de fréquence, code l'audio en trames de 164 octets, avec un débit de 452 kbit/s.
L'audio doit être encapsulé dans les protocoles de transmission L2CAP et AVDTP, qui prennent 16 octets de la charge audio utile.
Ainsi, dans une transmission Bluetooth avec 5 tranches, nous pouvons intégrer 4 trames audio :
679 (EDR 2 Mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (en-tête SBC) - (164*4) = 6 Nous avons intégré 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 nous augmentons légèrement le bitpool, il ne sera plus possible d'emballer 4 trames audio dans un seul paquet. Nous devrons envoyer 3 trames à la fois, ce qui réduit l'efficacité de la transmission, diminue la quantité d'audio transmise par paquet, et entraîne plus rapidement des coupures audio en cas de mauvaises conditions radio.
De la même manière, un débit binaire de 551 kbit/s a été choisi pour un EDR de 3 Mbit/s : avec un Bitpool de 47, 16 blocs dans le cadre, et 8 bandes de fréquences, cela donne une taille de cadre de 200 octets, avec un débit binaire de 551 kbit/s. Une seule trame contient 5 cadres ou 14,6 ms de musique.
L'algorithme de calcul de tous les paramètres SBC est suffisamment complexe, il est facile de se perdre en comptant manuellement, c'est pourquoi j'ai créé un calculateur interactif pour aider ceux qui s'y intéressent :
Pourquoi tout cela est-il nécessaire ?
Contrairement à la croyance populaire sur la qualité sonore du codec aptX, sur certains fichiers, il peut donner des résultats pires que le SBC avec un débit binaire standard de 328 kbit/s.
Le SBC attribue dynamiquement des bits de quantification aux bandes de fréquences, fonctionnant selon le principe « des basses vers les aigus ». Si tout le débit binaire est utilisé pour les basses et les médiums, les hautes fréquences seront « coupées » (à la place, il y aura du silence).
L'aptX quantifie les bandes de fréquences avec le même nombre de bits en permanence, ce qui lui confère un débit binaire constant : 352 kbit/s pour 44,1 kHz, 384 kbit/s pour 48 kHz, et il ne peut pas « transférer des bits » vers les fréquences qui en ont le plus besoin. Contrairement au SBC, l'aptX ne « coupera » pas les fréquences, mais ajoutera des bruits de quantification, réduisant la plage dynamique de l'audio, et provoquant parfois des crépitements caractéristiques. Le SBC, quant à lui, « consomme des détails » — il rejette les passages les plus silencieux.
En moyenne, comparé au SBC 328k, l'aptX introduit moins de distorsions dans la musique à large gamme de fréquences, mais sur la musique avec une gamme de fréquences étroite et une large plage dynamique, le SBC 328k l'emporte parfois.
Considérons un cas particulier. Le spectrogramme d'un enregistrement de piano :
L'énergie principale se situe dans les fréquences de 0 à 4 kHz, et se prolonge jusqu'à 10 kHz.
Le spectrogramme d'un fichier compressé en aptX apparaît comme suit :
Voici à quoi ressemble le SBC 328k.
On peut voir que le SBC 328k désactivait périodiquement complètement la plage au-dessus de 16 kHz, et dépensait tout le débit binaire disponible sur les plages en dessous de cette valeur. Cependant, l'aptX a introduit plus de distorsions dans le spectre des fréquences audible par l'oreille humaine, ce qui est visible sur le spectrogramme original soustrait du spectrogramme aptX (plus la couleur est lumineuse, plus les distorsions sont importantes) :
Alors que le SBC 328k a moins détérioré le signal dans la plage de 0 à 10 kHz, et le reste — l'a coupé :
Un débit de 485k SBC a suffi à préserver toute la gamme de fréquences sans coupure.
Le SBC 485k sur cette composition surpasse nettement aptX dans la plage de 0 à 15 kHz, avec une différence moindre mais toujours notable — de 15 à 22 kHz (plus la fréquence est basse, moins il y a de distorsion) :
.
En passant à un SBC haute définition, vous obtiendrez un son souvent supérieur à celui de l'apx, sur n'importe quel casque. Sur des casques prenant en charge la connexion EDR 3 Mbps, un débit de 551 kbps offre un son comparable à aptX HD.
Peut-on aller encore plus loin ?
Le patch pour Android comprend également une option pour augmenter encore le débit pour les appareils EDR 2 Mbps. Le débit peut être porté de 452 kbps à 595 kbps, au prix d'une diminution de la stabilité de transmission dans des conditions radio complexes.
Il suffit de définir la variable persist.bluetooth.sbc_hd_higher_bitrate à 1 :
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1Le patch pour le débit extrême a été accepté uniquement dans LineageOS 15.1, mais pas dans la version 16.0.
Compatibilité avec les appareils
Le SBC Dual Channel est pris en charge par presque tous les casques, haut-parleurs et autoradios. Il n'est pas étonnant que la norme exige son soutien dans tous les dispositifs de décodage. Il existe quelques appareils sur lesquels ce mode pose des problèmes, mais ce sont des cas isolés.
Pour plus de détails sur les appareils compatibles, consultez ou .
Comparaison des différences sonores
J'ai créé un service web qui encode de l'audio en SBC (ainsi qu'en aptX et aptX HD) en temps réel, directement dans le navigateur. Avec cela, vous pourrez comparer le son de différents profils SBC et d'autres codecs, sans transmission audio réelle via Bluetooth, sur n'importe quel casque filaire, haut-parleur, et votre musique préférée, tout en modifiant les paramètres d'encodage en temps réel.
Contactez les développeurs Android
J'ai écrit à de nombreux développeurs de la pile Bluetooth de Google, leur demandant de considérer l'inclusion de patchs dans la branche principale d'Android — AOSP, mais je n'ai reçu aucune réponse. Mes patchs dans sont également restés sans commentaire de quiconque impliqué.
Je serais ravi si l'on pouvait m'aider concernant les développeurs de Google et l'implémentation de SBC HD sur Android. Le patch dans gerrit est déjà obsolète (c'est l'une des premières révisions), et je vais le mettre à jour si les développeurs s'intéressent à mes modifications (il m'est difficile de le mettre à jour, je n'ai pas d'appareils compatibles avec Android Q).
Conclusion
Les utilisateurs de smartphones avec les versions de LineageOS, Resurrection Remix et crDroid peuvent bénéficier d'une qualité sonore améliorée dès maintenant, 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 amélioré en installant , qui, entre autres, ajoute la prise en charge des codecs aptX, aptX HD et FastStream.
Source : habr.com
