Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Antes de leer este artículo, se recomienda leer el artículo anterior: Audio vía Bluetooth: máximo detalle sobre perfiles, códecs y dispositivos

Algunos usuarios de auriculares inalámbricos informan de una mala calidad de sonido y falta de altas frecuencias cuando utilizan el códec Bluetooth SBC estándar, compatible con todos los dispositivos de audio. Una recomendación común para mejorar el sonido es comprar dispositivos y auriculares que admitan códecs aptX y LDAC. Estos códecs requieren tarifas de licencia, por lo que los dispositivos que los admiten son más caros.

Resulta que la baja calidad de SBC se debe a limitaciones artificiales de las pilas Bluetooth y la configuración de los auriculares, y esta limitación se puede evitar en cualquier dispositivo existente mediante cambios de software en un teléfono inteligente o una computadora.

Códec SBC

El códec SBC tiene muchos parámetros diferentes que se negocian durante la fase de configuración de la conexión. Entre ellos:

  • Número y tipo de canales: Estéreo conjunto, Estéreo, Doble canal, Mono;
  • Número de bandas de frecuencia: 4 u 8;
  • Número de bloques en el paquete: 4, 8, 12, 16;
  • Algoritmo de distribución de bits durante la cuantificación: sonoridad, SNR;
  • El valor máximo y mínimo del conjunto de bits utilizados durante la cuantificación (bitpool): generalmente de 2 a 53.

El dispositivo decodificador debe admitir cualquier combinación de estos parámetros. Es posible que el codificador no implemente todo.
Las pilas de Bluetooth existentes suelen coincidir en el siguiente perfil: Joint Stereo, 8 bandas, 16 bloques, Loudness, bitpool 2..53. Este perfil codifica audio de 44.1 kHz a una tasa de bits de 328 kbps.
El parámetro bitpool afecta directamente a la tasa de bits dentro de un perfil: cuanto mayor es, mayor será la tasa de bits y, por tanto, la calidad.
Sin embargo, el parámetro bitpool no está vinculado a un perfil específico; La tasa de bits también está influenciada en gran medida por otros parámetros: tipo de canales, número de bandas de frecuencia, número de bloques. Puede aumentar la tasa de bits indirectamente aceptando perfiles no estándar sin cambiar el bitpool.

Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Fórmula para calcular la tasa de bits SBC

Por ejemplo, el modo de canal dual codifica los canales por separado, utilizando todo el grupo de bits para cada canal. Al obligar al dispositivo a utilizar Dual Channel en lugar de Joint Stereo, obtenemos casi el doble de tasa de bits con el mismo valor máximo de bitpool: 617 kbps.
En mi opinión, el uso de un valor de bitpool no vinculado a un perfil en la etapa de negociación es un defecto del estándar A2DP, que condujo a una limitación artificial de la calidad del SBC. Tendría más sentido negociar la tasa de bits que el grupo de bits.

Estos valores fijos de Bitpool y Bitrate se originan a partir de una tabla con valores recomendados para su uso en audio de alta calidad. Pero una recomendación no es motivo para limitarse a estos valores.

Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

La especificación A2DP v1.2, que estuvo activa de 2007 a 2015, requiere que todos los dispositivos de decodificación funcionen correctamente con velocidades de bits de hasta 512 kbps:

El decodificador del SNK deberá admitir todos los valores posibles de bitpool que no excedan la velocidad de bits máxima. Este perfil limita la velocidad de bits máxima disponible a 320 kb/s para modos mono y 512 kb/s para modos de dos canales.

En la nueva versión de la especificación no hay límite en la tasa de bits. Se estima que los auriculares modernos lanzados después de 2015 que admiten EDR pueden admitir velocidades de bits de hasta ≈730 kbps.

Por alguna razón, las pilas Bluetooth de Linux (PulseAudio), Android, Blackberry y macOS que probé tienen límites artificiales en el valor máximo del parámetro bitpool, lo que afecta directamente 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, la mayoría de los dispositivos funcionan perfectamente con una pila Bluetooth modificada con una tasa de bits de 551 kbps, sin interrupciones ni crujidos. Pero esa tasa de bits nunca será constante en condiciones normales, en pilas Bluetooth normales.

Modificar la pila de Bluetooth

Cualquier pila Bluetooth que sea compatible con el estándar A2DP tiene soporte para el modo Dual Channel, pero no es posible activarlo desde la interfaz.

¡Agreguemos un interruptor a la interfaz! Creé parches para Android 8.1 y Android 9 que agregan soporte completo de doble canal a la pila, agregan un modo al menú de alternancia de modo en las herramientas de desarrollo y tratan los SBC habilitados para doble canal como si fueran un códec adicional como aptX. , AAC o LDAC (Android lo llama HD Audio) agregando una marca de verificación a la configuración del dispositivo Bluetooth. Esto es lo que parece:

Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Parche para Android 9
Parche para Android 8.1

Cuando la casilla de verificación está activada, el audio Bluetooth comienza a transmitirse a una tasa de bits 551 kbps, si los auriculares admiten una velocidad de conexión de 3 Mbit/s, o 452 kbps, si los auriculares sólo admiten 2 Mbit/s.

Este parche está incluido en los siguientes firmwares alternativos:

  • LineageOS
  • Resurrection Remix
  • crDroid

¿De dónde proceden 551 y 452 kbit/s?

La tecnología Bluetooth para compartir aire está diseñada para transmitir de manera eficiente paquetes grandes de tamaño fijo. La transferencia de datos se produce en ranuras, la mayor cantidad de ranuras enviadas en una transferencia es 5. También hay modos de transferencia que usan 1 o 3 ranuras, pero no 2 o 4. En 5 ranuras puede transferir hasta 679 bytes a una velocidad de conexión. de 2 Mbit/s y hasta 1021 bytes a una velocidad de 3 Mbit/s, y a 3 - 367 y 552 bytes, respectivamente.

Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Si queremos transferir menos datos de 679 o 1021 bytes, pero más de 367 o 552 bytes, la transferencia seguirá ocupando 5 ranuras y los datos se transferirán al mismo tiempo, lo que reduce la eficiencia de la transferencia.

Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

SBC en modo Dual Channel, a 44100 Hz de audio con Bitpool 38 parámetros, 16 bloques por cuadro, 8 rangos de frecuencia, codifica audio en cuadros de 164 bytes, con un bitrate de 452 kbps.
El audio debe encapsularse en los protocolos de transferencia L2CAP y AVDTP, que toman 16 bytes de la carga útil de audio.

Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Así, una transmisión Bluetooth con 5 ranuras puede alojar 4 cuadros de audio:

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

Introducimos 11.7 ms de datos de audio en el paquete que se envía, que se transmitirá en 3.75 ms, y nos quedan 6 bytes no utilizados en el paquete.
Si aumenta un poco el bitpool, ya no será posible empaquetar 4 fotogramas de audio en un solo paquete. Tendrá que enviar 3 fotogramas a la vez, lo que reduce la eficiencia de la transmisión, reduce la cantidad de audio transmitido por fotograma y provocará más rápidamente una tartamudez del audio en malas condiciones de radio.

Del mismo modo, para EDR 551 Mbit/s se seleccionó una tasa de bits de 3 kbit/s: con Bitpool 47, 16 bloques por cuadro, 8 rangos de frecuencia, el tamaño de la trama es de 200 bytes, con una tasa de bits de 551 kbit/s. Un paquete contiene 5 fotogramas o 14.6 ms de música.

El algoritmo para calcular todos los parámetros de SBC es bastante complejo, puedes confundirte fácilmente si cuentas manualmente, así que hice una calculadora interactiva para ayudar a los interesados: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

¿Por qué es necesario todo esto?

Contrariamente a la creencia popular sobre la calidad del sonido del códec aptX, en algunos archivos puede producir resultados peores que SBC con una tasa de bits estándar de 328 kbps.

El SBC asigna dinámicamente bits de cuantificación a bandas de frecuencia de menor a mayor. Si se utilizó toda la tasa de bits para las frecuencias bajas y medias, las frecuencias altas se “cortarán” (en su lugar habrá silencio).
aptX cuantifica bandas de frecuencia con la misma cantidad de bits todo el tiempo, por lo que tiene una tasa de bits constante: 352 kbps para 44.1 kHz, 384 kbps para 48 kHz, y no puede "desplazar bits" a aquellas frecuencias que más las necesitan. . A diferencia de SBC, aptX no "cortará" frecuencias, sino que les agregará ruido de cuantificación, reduciendo el rango dinámico del audio y, a veces, introduciendo crujidos característicos. SBC “come detalles”: descarta las zonas más tranquilas.
En promedio, en comparación con el SBC 328k, aptX introduce menos distorsión en música con un amplio rango de frecuencia, pero en música con un rango de frecuencia estrecho y un amplio rango dinámico, el SBC 328k a veces gana.

Consideremos un caso especial. Espectrograma de una grabación de piano:
Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

La energía principal se encuentra en las frecuencias de 0 a 4 kHz y continúa hasta los 10 kHz.
El espectrograma de un archivo comprimido en aptX se ve así:
Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Y así es como se ve el SBC 328k.
Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Se puede ver que el SBC 328k periódicamente apagaba por completo el rango por encima de 16 kHz y gastaba toda la tasa de bits disponible en rangos por debajo de este valor. Sin embargo, aptX introdujo más distorsión en el espectro de frecuencia audible para el oído humano, como se puede ver en el espectrograma original restado del espectrograma de aptX (cuanto más brillante, más distorsión):
Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Mientras que el SBC 328k estropeaba menos la señal en el rango de 0 a 10 kHz y cortaba el resto:
Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

La tasa de bits de 485k del SBC fue suficiente para preservar todo el rango de frecuencia, sin desactivar bandas.
Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

El SBC 485k está significativamente por delante del aptX en esta pista en el rango de 0-15 kHz, con una diferencia menor pero aún notable de 15-22 kHz (cuanto más oscuro, menor distorsión):
Modificamos la pila Bluetooth para mejorar el sonido en auriculares sin códecs AAC, aptX y LDAC

Archivo de audio original, SBC y aptX..

Al cambiar a un SBC de alta tasa de bits, obtendrás un audio que a menudo supera a aptX en cualquier auricular. En los auriculares que admiten conectividad EDR de 3 Mbps, una tasa de bits de 551 kbps produce un sonido comparable al de aptX HD.

¿Puedes hacer aún más?

El parche de Android también incluye una opción para aumentar aún más la tasa de bits para dispositivos EDR de 2 Mbps. Puede aumentar la tasa de bits de 452 kbit/s a 595 kbit/s, a costa de reducir la estabilidad de la transmisión en condiciones de radio difíciles.
Basta con establecer la variable persist.bluetooth.sbc_hd_higher_bitrate en 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Hasta ahora, el parche de tasa de bits extrema solo se ha adoptado en LineageOS 15.1, pero no en 16.0.

Compatibilidad de dispositivos

SBC Dual Channel es compatible con casi todos los auriculares, parlantes y unidades principales de automóvil. No es de extrañar: el estándar requiere su compatibilidad con cualquier dispositivo de decodificación. Hay una pequeña cantidad de dispositivos en los que este modo causa problemas, pero se trata de casos aislados.
Puede encontrar más detalles sobre los dispositivos compatibles en 4pda o xda-developers.

Comparación de diferencias de sonido.

Creé un servicio web que codifica audio en SBC (así como en aptX y aptX HD) en tiempo real, directamente en el navegador. Con él, puede comparar el sonido de diferentes perfiles SBC y otros códecs, sin tener que transmitir audio a través de Bluetooth, en auriculares con cable, parlantes y su música favorita, y también cambiar los parámetros de codificación directamente mientras reproduce audio.
btcodecs.valdikss.org.ru/sbc-encoder

Póngase en contacto con los desarrolladores de Android

Escribí a muchos desarrolladores de pilas de Bluetooth en Google pidiéndoles que consideraran incluir parches en la rama principal de Android: AOSP, pero no recibí una sola respuesta. Mis parches en Sistema de parches Gerrit para Android También se mantuvo sin comentarios de ninguno de los involucrados.
Me encantaría poder obtener ayuda para ponerme en contacto con los desarrolladores de Google y llevar SBC HD a Android. El parche en gerrit ya está desactualizado (esta es una de las primeras revisiones), y 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 teléfonos inteligentes con LineageOS, Resurrection Remix y firmware crDroid pueden disfrutar de una calidad de sonido mejorada ahora mismo, simplemente active la opción en la configuración del dispositivo Bluetooth. Los usuarios de Linux también pueden obtener una mayor tasa de bits de SBC instalando parche de Pali Rohar, que, entre otras cosas, añade soporte para los códecs aptX, aptX HD y FastStream.

Fuente: habr.com

Añadir un comentario