Antes de leer este artículo, se recomienda leer el anterior: Audio a través de Bluetooth: información más detallada sobre perfiles, códecs y dispositivos /Algunos usuarios de auriculares inalámbricos notan una baja calidad de sonido y la falta de frecuencias altas cuando usan el códec SBC Bluetooth estándar, que es compatible con todos los auriculares y otros dispositivos de audio Bluetooth. Una recomendación común para obtener una mejor calidad de sonido es comprar dispositivos y auriculares compatibles con códecs aptX o LDAC. Estos códecs requieren tarifas de licencia, por eso los dispositivos con ellos son más caros.
Resulta que la baja calidad de SBC es causada por limitaciones artificiales de todas las pilas actuales de Bluetooth y la configuración de los auriculares, y esta limitación se puede eludir en cualquier dispositivo existente solo con modificación de software.
Códec Sbc
SBC tiene muchos parámetros diferentes que se negocian durante la fase de configuración de la conexión:
- Tipo y número de canal de audio: estéreo conjunto, estéreo, doble canal, mono;
- Número de bandas de frecuencia: 4 u 8;
- Número de bloques de audio en un paquete: 4, 8, 12, 16;
- Algoritmo de asignación de bits de cuantización: sonoridad, SNR;
- Conjunto de bits máximo y mínimo utilizado en el proceso de cuantización: generalmente 2-53.
Se requiere el decodificador para admitir cualquier combinación de estos parámetros. El codificador puede implementar solo una parte de ellos.
Las pilas Bluetooth existentes generalmente negocian el siguiente conjunto de opciones que llamo "perfil": Conjunto estéreo, 8 bandas, 16 bloques, Loudness, bitpool 2..53. Este perfil codifica audio estéreo de 44.1 kHz con velocidad de bits de 328 kbps.
Bitpool es un parámetro que cambia la tasa de bits de codificación: cuanto mayor es, mayor es la tasa de bits y, por lo tanto, la calidad. Pero el valor exacto de bitpool corresponde a la tasa de bits exacta solo dentro del perfil exacto.
La tasa de bits también se ve significativamente afectada por otros parámetros: tipo de canal de audio, número de bandas de frecuencia, número de bloques de audio. Puede aumentar la tasa de bits indirectamente negociando perfiles no estándar, sin cambiar la agrupación de bits.
Fórmula de cálculo de bitratePor ejemplo, el modo de doble canal codifica canales por separado, utilizando bitpool individual para cada canal, a diferencia de Stereo o Joint Stereo, que utilizan bitpool para ambos canales. Obligar al dispositivo a usar Dual Channel en lugar de Joint Stereo nos dará una tasa de bits casi duplicada de 617 kbps, con el mismo valor de bitpool de 53.
Para mí, parece que Bitpool debería ser una variable interna. Supongo que es un error de diseño de la especificación A2DP que el valor de bitpool no está vinculado a otros parámetros de códec y solo se define como una variable negociada independiente.
Los valores fijos de bitpool y bitrate se originaron en el perfil recomendado para audio de alta calidad. Pero la recomendación no debería ser la razón para establecer el límite de estos parámetros.

La especificación A2DP v1.2, que estuvo activa de 2007 a 2015, requiere que todos los decodificadores funcionen correctamente con velocidades de bits de hasta 512 kbps:
El decodificador del SNK admitirá todos los posibles valores de agrupación de bits que no den como resultado una velocidad de bits máxima. Este perfil limita la velocidad de bits máxima disponible a 320 kb / s para mono y 512 kb / s para modos de dos canales.
No hay límite de velocidad de bits establecido en la nueva versión de la especificación. Se supone que los auriculares modernos con compatibilidad EDR lanzados después de 2015 pueden admitir velocidades de bits de hasta 730 kbps.
Por alguna razón, todas las pilas de Bluetooth probadas actualmente (Linux (PulseAudio), Android, Blackberry y macOS) tienen restricciones artificiales del parámetro de bitpool máximo, que afecta directamente a la tasa de bits máxima. Pero este no es el mayor problema, casi todos los auriculares también limitan el valor máximo de bitpool a 53.
Como ya he visto en mis pruebas, la mayoría de los dispositivos funcionan bien en una pila Bluetooth modificada con una velocidad de bits de 551 kbps, sin interrupciones ni crepitaciones. Pero dicha tasa de bits nunca se negociará en condiciones normales, con pilas Bluetooth estándar.
Modificación de pila Bluetooth
Cada pila Bluetooth compatible con A2DP debe admitir el modo de doble canal, pero no hay forma de forzar el uso de este modo.
¡Agreguemos un interruptor a la interfaz de usuario! Hice parches para Android 8.1 y Android 9, que agregan soporte completo para Dual Channel en la pila y en el menú del desarrollador, y manejan el modo Dual Channel como un códec adicional de "Audio HD" como aptX, AAC o LDAC agregando una marca al Configuración del dispositivo Bluetooth Así es como se ve:
Android 9 parcheParche de Android 8.1Esta casilla de verificación alterna el modo de doble canal que está configurado para usar
551 kbps para dispositivos EDR de 3 Mb / s y
452 kbps para dispositivos EDR de 2 Mb / s.
Este parche se ha fusionado en los siguientes firmwares alternativos:
- LineageOS 15.1 (desde el 31 de marzo de 2019) y 16.0 (desde el 13 de mayo de 2019)
- Resurrection Remix (desde el 14 de mayo de 2019)
- crDroid (desde el 13 de mayo de 2019)
¿De dónde provienen 551 y 452 kbps?
La tecnología de división de tiempo de Bluetooth está diseñada para transmitir eficientemente paquetes grandes de tamaño fijo. La transferencia de datos se produce en ranuras, la mayor cantidad de ranuras enviadas en una transmisión es 5. También hay modos de transferencia que utilizan 1 o 3 ranuras, pero no 2 o 4. Puede transferir hasta 679 bytes en 5 ranuras, a una velocidad de conexión de 2 Mbps y hasta 1021 bytes a una velocidad de 3 Mbps. En 3 ranuras, la cantidad máxima de datos es de 367 y 552 bytes, respectivamente.

Si deseamos transferir menos datos de 679 o 1021 bytes pero más de 367 o 552 bytes, la transferencia todavía tomará 5 ranuras, y la transmisión tomará la misma cantidad de tiempo, lo que reduce la eficiencia de transmisión.

El audio codificado a 44100 Hz utilizando SBC en modo Dual Channel con bitpool = 38, 16 bloques en un cuadro, 8 bandas de frecuencia, produce un cuadro de audio de 164 bytes, con una tasa de bits de 452 kb / s.
La carga útil de audio debe encapsularse en los protocolos de transmisión L2CAP y AVDTP, que deducen 16 bytes de sobrecarga de la carga útil de audio.
\ begin {align *} framelength & = 4 + \ frac {subbands \ times canales} {2} + \\ & \ begin {cases} \ frac {blocks \ times canales \ times bitpool} {8} & \ text { si el modo mono o doble canal} \\ \ frac {subbands + blocks \ times bitpool} {8} & \ text {if modo estéreo conjunto} \\ \ frac {blocks \ times bitpool} {8} & \ text {if stereo modo} \\ \ end {cases} \ end {align *}
Una transmisión de audio de 5 ranuras puede contener hasta 4 cuadros de audio:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC header) - (164*4) = 6
Un solo paquete transmite hasta 11.7 ms de datos de audio, que se transmitirán en 3.75 ms, y nos quedan 6 bytes no utilizados en el paquete.
Si eleva ligeramente la agrupación de bits, 4 cuadros de audio ya no se pueden empaquetar en una sola transmisión. Tendrá que enviar 3 cuadros a la vez, lo que reduce la eficiencia de transmisión, reduce la cantidad de audio transmitido en un paquete y aumentará la posibilidad de que el audio tartamudee en condiciones de radio deficientes.
La velocidad de bits de 551 kbps para EDR 3 Mbps se seleccionó utilizando el mismo principio: con Bitpool 47, 16 bloques por cuadro, 8 bandas de frecuencia, el tamaño de cuadro es de 200 bytes, con una velocidad de bits de 551 kbps. La transmisión individual puede agrupar hasta 5 cuadros o 14,6 ms de música.
El algoritmo para calcular todos los parámetros SBC es bastante complicado, puede cometer un error fácilmente si trata de calcularlos todos manualmente, por lo que hice una calculadora interactiva para ayudar a aquellos que estén interesados:
btcodecs.valdikss.org.ru/sbc-bitrate-calculator¿Para qué es todo eso?
Contrariamente a la creencia popular de la calidad de sonido aptX, en algunos casos puede producir una peor calidad de audio que SBC con una tasa de bits estándar de 328k.
SBC asigna dinámicamente bits de cuantificación para bandas de frecuencia, actuando sobre una base "de abajo hacia arriba". Si se usó la tasa de bits completa para las frecuencias bajas y medias, las frecuencias superiores se "cortan" (silencian).
aptX cuantifica las bandas de frecuencia con el mismo número de bits constantemente, lo que lo convierte en un códec de velocidad de bits constante: 352 kbps para 44,1 kHz, 384 kbps para 48 kHz. No puede "transferir bits" a las frecuencias que más los necesitan. A diferencia de SBC, aptX no "cortará" las frecuencias, sino que les agregará ruido de cuantificación, reduciendo el rango dinámico del audio y, a veces, introduciendo crepitaciones. SBC, por el contrario, "come los detalles" - descarta las áreas más tranquilas.
En promedio, en comparación con SBC 328k, aptX produce menos distorsión en la música con un amplio rango de frecuencia, pero en música con un rango de frecuencia estrecho y un amplio rango dinámico, SBC 328k a veces gana.
Consideremos un caso especial, una grabación de piano. Aquí hay un espectrograma:

La mayor parte de la energía se ubica en las frecuencias de 0-4 kHz y dura hasta 10 kHz.
El espectrograma del archivo aptX se ve así:

Aquí está SBC 328k:

Se puede ver que el SBC 328k periódicamente corta por completo el rango por encima de 16 kHz, y utiliza todas las velocidades de bits disponibles para los rangos de frecuencia por debajo de este valor. Sin embargo, aptX introdujo más distorsiones en el espectro de frecuencia audible para el oído humano, que se puede ver en el espectrograma de audio original sustraído del espectrograma aptX (cuanto más brillante, más distorsión):

SBC 328k ha introducido menos distorsión a la señal en el rango de 0 a 10 kHz, y las frecuencias restantes se han cortado:

La tasa de bits de 485k fue suficiente para que SBC guardara todo el rango de frecuencia, sin cortar las bandas.

SBC 485k produce resultados mucho mejores en el rango de 0-15 kHz en esta muestra que aptX, y una diferencia menor pero aún notable a 15-22 kHz (cuanto más oscura, menos distorsión):
Archivo con audio original y archivos codificados con SBC / aptX .
Al cambiar a un SBC de alta tasa de bits, obtendrá un sonido que es superior a aptX la mayor parte del tiempo, en cualquier auricular. En auriculares con soporte EDR de 3 Mb / s, el SBC de 551 kb / s produce un sonido muy cercano al aptX HD.
¿Podemos ir aún más lejos?
El parche de Android tiene una opción adicional para aumentar aún más la tasa de bits para dispositivos EDR de 2 mbps. Puede aumentar la velocidad de bits de 452 kbps a 595 kbps, a costa de reducir la estabilidad de la transmisión en caso de condiciones de radio congestionadas.
Simplemente configure la variable persist.bluetooth.sbc_hd_higher_bitrate en 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1
El parche de velocidad de bits extrema actualmente se combina solo en LineageOS 15.1, pero no en 16.0.
Compatibilidad con los dispositivos.
SBC Dual Channel es compatible con casi todos los auriculares, altavoces y unidades principales del automóvil. Esto no es de extrañar: el estándar exige su soporte en cualquier dispositivo de decodificación. Hay un pequeño número de dispositivos en los que este modo causa problemas, pero estos son casos muy raros.
Se pueden encontrar más detalles sobre dispositivos compatibles en
w3bsit3-dns.com y
xda-developers .
Comparación de diferencia de sonido
Hice un servicio web que codifica audio a SBC (así como a aptX y aptX HD) en tiempo real, directamente en el navegador. Puede comparar el sonido de diferentes perfiles SBC y otros códecs sin transmitir audio a través de Bluetooth utilizando este servicio, en auriculares con cable, altavoces y en su música favorita. También puede cambiar los parámetros de codificación directamente durante la reproducción de audio.
btcodecs.valdikss.org.ru/sbc-encoderContactando a desarrolladores de Android
Intenté contactar a muchos desarrolladores de pila Bluetooth de Google, pidiéndoles que consideraran incluir mis parches en la rama principal de Android, AOSP, pero no recibí una sola respuesta. Mis parches en el
sistema de revisión de código Gerrit para Android tampoco han recibido ningún comentario de nadie involucrado en el desarrollo.
Me alegraría si alguien pudiera contarle a los desarrolladores de Google sobre esta implementación de SBC HD para Android. El parche gerrit ya está desactualizado (esta es una de las primeras revisiones), pero lo actualizaré si los desarrolladores están interesados en mis cambios (no es fácil para mí actualizarlo, no tengo dispositivos compatibles con Android Q) .
Conclusión
Los usuarios de Firmware LineageOS, Resurrection Remix y crDroid pueden mejorar la calidad de audio de Bluetooth marcando una casilla en la configuración del dispositivo Bluetooth. Los usuarios de Linux también pueden obtener una tasa de bits SBC más alta instalando
el parche de Pali Rohár , que, entre otras cosas, agrega soporte para los códecs aptX, aptX HD y FastStream.