Avant de lire cet article, il est recommandé de lire le précédent: Audio via Bluetooth: informations les plus détaillées sur les profils, les codecs et les appareils /Certains utilisateurs d'écouteurs sans fil notent une faible qualité sonore et un manque de hautes fréquences lorsqu'ils utilisent le codec Bluetooth SBC standard, qui est pris en charge par tous les écouteurs et autres appareils audio Bluetooth. Une recommandation courante pour obtenir une meilleure qualité sonore est d'acheter des appareils et des écouteurs avec prise en charge des codecs aptX ou LDAC. Ces codecs nécessitent des frais de licence, c'est pourquoi les appareils avec eux sont plus chers.
Il s'avère que la faible qualité de SBC est causée par des limitations artificielles de toutes les piles Bluetooth actuelles et de la configuration des écouteurs, et cette limitation peut être contournée sur tout appareil existant avec une modification logicielle uniquement.
Codec Sbc
SBC a beaucoup de paramètres différents qui sont négociés pendant la phase d'établissement de la connexion:
- Type et numéro de canal audio: Stéréo mixte, Stéréo, Double canal, Mono;
- Nombre de bandes de fréquences: 4 ou 8;
- Nombre de blocs audio dans un paquet: 4, 8, 12, 16;
- Algorithme d'allocation des bits de quantification: Loudness, SNR;
- Pool de bits maximum et minimum utilisé dans le processus de quantification: généralement 2-53.
Le décodeur doit prendre en charge toute combinaison de ces paramètres. L'encodeur ne peut en implémenter qu'une partie.
Les piles Bluetooth existantes négocient généralement l'ensemble d'options suivant que j'appelle «profil»: Stéréo mixte, 8 bandes, 16 blocs, Loudness, bitpool 2..53. Ce profil code l'audio stéréo 44,1 kHz avec un débit binaire de 328 kbps.
Bitpool est un paramètre qui modifie le débit de codage: plus il est élevé, plus le débit est élevé, et donc la qualité. Mais la valeur exacte du pool de bits ne correspond au débit exact que dans le profil exact.
Le débit binaire est également significativement affecté par d'autres paramètres: type de canal audio, nombre de bandes de fréquences, nombre de blocs audio. Vous pouvez augmenter le débit binaire indirectement en négociant des profils non standard, sans modifier le pool de bits.
Formule de calcul du débit binairePar exemple, le mode Dual Channel code les canaux séparément, en utilisant un bitpool individuel pour chaque canal, contrairement à Stereo ou Joint Stereo, qui utilisent bitpool pour les deux canaux. Forcer l'appareil à utiliser Dual Channel au lieu de Joint Stereo nous donnera un débit binaire presque doublé de 617 kbps, avec la même valeur de pool de bits de 53.
Pour moi, il estime que Bitpool devrait être une variable interne. Je suppose que c'est une erreur de conception de spécification A2DP que la valeur du pool de bits n'est pas liée à d'autres paramètres de codec et uniquement définie comme une variable négociée indépendante.
Les valeurs fixes de pool de bits et de débit proviennent du profil recommandé pour un son de haute qualité. Mais la recommandation ne devrait pas être la raison de fixer la limite de ces paramètres.

La spécification A2DP v1.2, qui était active de 2007 à 2015, nécessite que tous les décodeurs 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.
Aucune limite de débit binaire indiquée dans la nouvelle version de la spécification. Il est supposé que les écouteurs modernes avec prise en charge EDR publiés après 2015 peuvent prendre en charge des débits allant jusqu'à 730 kbps.
Pour une raison quelconque, toutes les piles Bluetooth actuellement testées (Linux (PulseAudio), Android, Blackberry et macOS) ont des restrictions artificielles du paramètre de pool de bits maximal, 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à vu dans mes tests, la plupart des appareils fonctionnent correctement sur une pile Bluetooth modifiée avec un débit binaire de 551 kbps, sans interruptions ni grésillements. Mais un tel débit ne sera jamais négocié dans des conditions normales, avec des piles Bluetooth en stock.
Modification de la pile Bluetooth
Chaque pile Bluetooth compatible A2DP devrait prendre en charge le mode Dual Channel, mais il n'y a aucun moyen de forcer l'utilisation de ce mode.
Ajoutons un interrupteur à l'interface utilisateur! J'ai fait des correctifs pour Android 8.1 et Android 9, qui ajoutent une prise en charge complète de Dual Channel dans la pile et dans le menu développeur, et gèrent le mode Dual Channel comme un codec "HD Audio" supplémentaire comme aptX, AAC ou LDAC en ajoutant une coche à la Paramètres de l'appareil Bluetooth Voici à quoi cela ressemble:
Patch Android 9Correctif Android 8.1Cette case à cocher bascule le mode Dual Channel qui est configuré pour utiliser
551 kbps pour les appareils EDR 3 Mb / s et
452 kbps pour les appareils EDR 2 Mb / s.
Ce patchset a été fusionné dans les firmwares alternatifs suivants:
- LineageOS 15.1 (depuis le 31 mars 2019) et 16.0 (depuis le 13 mai 2019)
- Resurrection Remix (depuis le 14 mai 2019)
- crDroid (depuis le 13 mai 2019)
D'où venaient les 551 et 452 kbps?
La technologie Bluetooth à répartition dans le temps est conçue pour transmettre efficacement de gros paquets de taille fixe. Le transfert de données se produit dans des emplacements, le plus grand nombre d'emplacements envoyés dans une transmission est de 5. Il existe également des modes de transfert utilisant 1 ou 3 emplacements, mais pas 2 ou 4. Vous pouvez transférer jusqu'à 679 octets dans 5 emplacements, à une vitesse de connexion de 2 Mbps, et jusqu'à 1021 octets à une vitesse de 3 Mbps. Dans 3 emplacements, la quantité maximale de données est respectivement de 367 et 552 octets.

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

44100 Hz audio codé en utilisant SBC en mode Dual Channel avec bitpool = 38, 16 blocs dans une trame, 8 bandes de fréquences, produit une trame audio de 164 octets, avec un débit binaire de 452 kb / s.
La charge utile audio doit être encapsulée dans les protocoles de transmission L2CAP et AVDTP, qui déduisent 16 octets de surcharge 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 *}
Une transmission audio à 5 emplacements peut contenir jusqu'à 4 trames audio:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC header) - (164*4) = 6
Un seul paquet transmet jusqu'à 11,7 ms de données audio, qui seront transmises en 3,75 ms, et il nous reste 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 une seule transmission. Vous devrez envoyer 3 images à la fois, ce qui réduit l'efficacité de la transmission, réduit la quantité d'audio transmis dans un paquet et augmentera les chances de bégaiement audio dans de mauvaises conditions radio.
Le débit binaire de 551 kbps pour EDR 3 Mbps a été sélectionné selon le même principe: avec Bitpool 47, 16 blocs par trame, 8 bandes de fréquence, la taille de trame est de 200 octets, avec un débit binaire de 551 kbps. La transmission unique peut regrouper jusqu'à 5 images ou 14,6 ms de musique.
L'algorithme de calcul de tous les paramètres SBC est assez compliqué, vous pouvez facilement faire une erreur si vous essayez de les calculer tous manuellement, j'ai donc fait une calculatrice interactive pour aider ceux qui s'intéressent:
btcodecs.valdikss.org.ru/sbc-bitrate-calculatorÀ quoi ça sert?
Contrairement à la croyance populaire en matière de qualité sonore aptX, dans certains cas, il peut produire une qualité audio pire que SBC avec un débit binaire standard de 328k.
SBC alloue dynamiquement des bits de quantification pour les bandes de fréquences, agissant sur une base "de bas en haut". Si le bitrate entier a été utilisé pour les fréquences inférieures et moyennes, les fréquences supérieures sont "coupées" (réduites au silence).
aptX quantifie constamment les bandes de fréquences avec le même nombre de bits, ce qui en fait un codec à débit binaire constant: 352 kbps pour 44,1 kHz, 384 kbps pour 48 kHz. Il ne peut pas "transférer des bits" aux 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. SBC, au contraire, «mange les détails» - élimine les zones les plus calmes.
En moyenne, par rapport au SBC 328k, aptX produit moins de distorsion dans la musique avec une large gamme de fréquences, mais sur la musique avec une gamme de fréquences étroite et une large gamme dynamique, le SBC 328k gagne parfois.
Prenons un cas particulier, un enregistrement de piano. Voici un spectrogramme:

La plupart de l'énergie se situe dans les fréquences 0-4 kHz et dure jusqu'à 10 kHz.
Le spectrogramme du fichier aptX ressemble à ceci:

Voici SBC 328k:

On peut voir que le SBC 328k coupe périodiquement complètement la gamme au-dessus de 16 kHz et utilise tous les débits disponibles pour les gammes de fréquences inférieures à cette valeur. Cependant, aptX a introduit plus de distorsions dans le spectre de fréquences audibles par l'oreille humaine, ce qui peut être vu sur le spectrogramme audio original soustrait du spectrogramme aptX (le plus brillant, le plus de distorsion):

Le SBC 328k a introduit moins de distorsion du signal dans la plage de 0 à 10 kHz, et les fréquences de repos ont été coupées:

Un débit de 485k était suffisant pour que SBC enregistre toute la gamme de fréquences, sans couper les bandes.

Le SBC 485k produit des résultats bien meilleurs dans la plage de 0 à 15 kHz sur cet échantillon que aptX, et une différence plus petite mais toujours perceptible à 15-22 kHz (la plus sombre, la moins de distorsion):
Archive avec audio original et fichiers encodés SBC / aptX .
En passant à un SBC à haut débit, vous obtiendrez un son supérieur à aptX la plupart du temps, sur n'importe quel casque. Sur les casques avec prise en charge EDR 3 Mb / s, le SBC 551 kb / s produit un son très proche de l'aptX HD.
Pouvons-nous aller encore plus loin?
Le jeu de correctifs Android a une option supplémentaire pour augmenter encore le débit binaire pour les appareils EDR 2 Mbps. Vous pouvez faire passer le débit binaire de 452 kbps à 595 kbps, au prix de réduire la stabilité de la transmission en cas de conditions radio encombrées.
Définissez simplement la variable persist.bluetooth.sbc_hd_higher_bitrate sur 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1
Le patch de débit binaire extrême est actuellement fusionné uniquement dans LineageOS 15.1, mais pas dans 16.0.
Compatibilité avec les 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 étonnant - la norme impose sa prise en charge dans tous les appareils de décodage. Il existe un petit nombre d'appareils sur lesquels ce mode pose des problèmes, mais ce sont des cas très rares.
Plus de détails sur les appareils compatibles peuvent être trouvés sur
w3bsit3-dns.com et les
développeurs xda .
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. Vous pouvez comparer le son de différents profils SBC et d'autres codecs sans transmettre réellement audio via Bluetooth à l'aide de ce service, sur n'importe quel casque filaire, haut-parleurs et sur votre musique préférée. Vous pouvez également modifier les paramètres d'encodage directement pendant la lecture audio.
btcodecs.valdikss.org.ru/sbc-encoderContacter les développeurs Android
J'ai essayé de contacter de nombreux développeurs de piles Bluetooth de Google, leur demandant d'envisager d'inclure mes correctifs dans la branche principale d'Android - AOSP, mais je n'ai reçu aucune réponse. Mes correctifs dans le
système de révision de code Gerrit pour Android n'ont reçu aucun commentaire de la part des personnes impliquées dans le développement.
Je serais heureux si quelqu'un pouvait parler aux développeurs de Google de cette implémentation de SBC HD pour Android. Le jeu de patchs gerrit est déjà obsolète (c'est l'une des premières révisions), mais 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 des firmwares LineageOS, Resurrection Remix et crDroid peuvent améliorer la qualité audio Bluetooth en cochant une case dans les paramètres de l'appareil Bluetooth. Les utilisateurs de Linux peuvent également obtenir un débit binaire SBC plus élevé en installant
le correctif de Pali Rohár , qui, entre autres, ajoute la prise en charge des codecs aptX, aptX HD et FastStream.