Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Antes de ler este artigo, recoméndase que lea o artigo anterior: Audio por Bluetooth: detalles máximos sobre perfís, códecs e dispositivos

Algúns usuarios de auriculares sen fíos informan de mala calidade de son e falta de altas frecuencias cando usan o códec Bluetooth SBC estándar, que é compatible con todos os dispositivos de audio. Unha recomendación común para mellorar o son é comprar dispositivos e auriculares compatibles con códecs aptX e LDAC. Estes códecs requiren taxas de licenza, polo que os dispositivos que os admiten son máis caros.

Acontece que a baixa calidade do SBC débese a limitacións artificiais das pilas Bluetooth e das configuracións dos auriculares, e esta limitación pódese evitar en calquera dispositivo existente mediante cambios de software nun teléfono intelixente ou ordenador.

Códec SBC

O códec SBC ten moitos parámetros diferentes que se negocian durante a fase de configuración da conexión. Entre eles:

  • Número e tipo de canles: Estéreo conxunto, Estéreo, Canle dual, Mono;
  • Número de bandas de frecuencia: 4 ou 8;
  • Número de bloques no paquete: 4, 8, 12, 16;
  • Algoritmo para distribuír bits durante a cuantización: Loudness, SNR;
  • O valor máximo e mínimo do conxunto de bits utilizado durante a cuantización (bitpool): normalmente de 2 a 53.

O dispositivo de decodificación debe admitir calquera combinación destes parámetros. É posible que o codificador non implemente todo.
As pilas Bluetooth existentes adoitan coincidir no seguinte perfil: Estéreo conxunto, 8 bandas, 16 bloques, Loudness, bitpool 2..53. Este perfil codifica audio de 44.1 kHz a unha taxa de bits de 328 kbps.
O parámetro bitpool afecta directamente a taxa de bits dentro dun perfil: canto maior sexa, maior será a taxa de bits e, polo tanto, a calidade.
Non obstante, o parámetro bitpool non está vinculado a un perfil específico; A taxa de bits tamén está moi influenciada por outros parámetros: tipo de canles, número de bandas de frecuencia, número de bloques. Pode aumentar a taxa de bits indirectamente, acordando perfís non estándar, sen cambiar o bitpool.

Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Fórmula para calcular a taxa de bits SBC

Por exemplo, o modo Dual Channel codifica as canles por separado, utilizando todo o conxunto de bits para cada canle. Ao forzar o dispositivo a usar Dual Channel en lugar de Joint Stereo, obtemos case o dobre da taxa de bits co mesmo valor máximo de bitpool: 617 kbps.
Na miña opinión, o uso dun valor de bitpool non ligado a un perfil na fase de negociación é un fallo no estándar A2DP, o que levou a unha limitación artificial da calidade SBC. Tería máis sentido negociar bitrate en lugar de bitpool.

Estes valores fixos de Bitpool e Bitrate orixínanse dunha táboa con valores recomendados para usar para audio de alta calidade. Pero unha recomendación non é un motivo para limitarse a estes valores.

Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

A especificación A2DP v1.2, que estivo activa de 2007 a 2015, require que todos os dispositivos de decodificación funcionen correctamente con taxas de bits de ata 512 kbps:

O decodificador do SNK admitirá todos os valores de bitpool posibles que non superen a taxa de bits máxima. Este perfil limita a taxa de bits máxima dispoñible a 320 kb/s para os modos mono e 512 kb/s para os modos de dúas canles.

Na nova versión da especificación non hai límite na taxa de bits. Estímase que os auriculares modernos lanzados despois de 2015 que admiten EDR poden soportar taxas de bits de ata ≈730 kbps.

Por algún motivo, as pilas Bluetooth de Linux (PulseAudio), Android, Blackberry e macOS que probei teñen límites artificiais sobre o valor máximo do parámetro bitpool, que afecta directamente á taxa de bits máxima. Pero este non é o maior problema; case todos os auriculares tamén limitan o valor máximo de bitpool a 53.
Como xa vin, a maioría dos dispositivos funcionan perfectamente nunha pila Bluetooth modificada cunha taxa de bits de 551 kbps, sen interrupcións nin crepitacións. Pero tal taxa de bits nunca será consistente en condicións normais, nas pilas Bluetooth habituais.

Modificando a pila Bluetooth

Calquera pila Bluetooth compatible co estándar A2DP ten soporte para o modo de canle dual, pero non é posible activalo desde a interface.

Engademos un alternador á interface! Fixen parches para Android 8.1 e Android 9 que engaden compatibilidade completa de Dual Channel á pila, engaden un modo ao menú de alternancia do modo nas ferramentas de desenvolvemento e tratan os SBC habilitados para Dual Channel como se fosen un códec adicional como aptX. , AAC ou LDAC (Android chama a este Audio HD) engadindo unha marca de verificación á configuración do dispositivo Bluetooth. Este é o que parece:

Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Parche para Android 9
Parche para Android 8.1

Cando a caixa de verificación está activada, o audio Bluetooth comeza a transmitirse a unha taxa de bits 551 kbps, se os auriculares admiten unha velocidade de conexión de 3 Mbit/s, ou 452 kbps, se os auriculares só admiten 2 Mbit/s.

Este parche está incluído nos seguintes firmwares alternativos:

  • LineageOS
  • Remix de Resurrección
  • crDroid

De onde veñen os 551 e 452 kbit/s?

A tecnoloxía de compartición de aire Bluetooth está deseñada para transmitir de forma eficiente paquetes grandes de tamaño fixo. A transferencia de datos prodúcese en slots, o maior número de slots enviados nunha transferencia é 5. Tamén hai modos de transferencia que usan 1 ou 3 slots, pero non 2 ou 4. En 5 slots pode transferir ata 679 bytes a unha velocidade de conexión de 2 Mbit/s e ata 1021 bytes a unha velocidade de 3 Mbit/s, e a 3 - 367 e 552 bytes, respectivamente.

Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Se queremos transferir menos datos de 679 ou 1021 bytes, pero máis de 367 ou 552 bytes, a transferencia aínda levará 5 slots e os datos serán transferidos ao mesmo tempo, o que reduce a eficiencia da transferencia.

Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

SBC en modo de canle dual, audio a 44100 Hz con parámetros Bitpool 38, 16 bloques por fotograma, 8 rangos de frecuencia, codifica o audio en fotogramas de 164 bytes, cunha taxa de bits de 452 kbps.
O audio debe estar encapsulado nos protocolos de transferencia L2CAP e AVDTP, que levan 16 bytes da carga útil de audio.

Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Así, unha transmisión Bluetooth con 5 ranuras pode acomodar 4 cadros de audio:

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

Encaixamos 11.7 ms de datos de audio no paquete que se envía, que se transmitirán en 3.75 ms, e quedan 6 bytes sen utilizar no paquete.
Se aumentas un pouco o bitpool, xa non será posible agrupar 4 fotogramas de audio nun só paquete. Terás que enviar 3 fotogramas á vez, o que reduce a eficiencia da transmisión, reduce a cantidade de audio transmitido por fotograma e provocará un tartamudeo de audio máis rápido en malas condicións de radio.

Do mesmo xeito, seleccionouse unha taxa de bits de 551 kbit/s para EDR 3 Mbit/s: con Bitpool 47, 16 bloques por fotograma, 8 rangos de frecuencia, o tamaño da fotograma é de 200 bytes, cunha taxa de bits de 551 kbit/s. Un paquete contén 5 fotogramas ou 14.6 ms de música.

O algoritmo para calcular todos os parámetros SBC é bastante complexo, podes confundirte facilmente se contas manualmente, polo que fixen unha calculadora interactiva para axudar aos interesados: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Por que é necesario todo isto?

Ao contrario da crenza popular sobre a calidade do son do códec aptX, nalgúns ficheiros pode producir resultados peores que SBC cunha taxa de bits estándar de 328 kbps.

O SBC asigna de forma dinámica os bits de cuantización ás bandas de frecuencia de forma baixa a alta. Se se utilizou toda a taxa de bits para as frecuencias baixas e medias, as frecuencias altas "cortaranse" (haberá silencio no seu lugar).
aptX cuantifica bandas de frecuencia co mesmo número de bits todo o tempo, polo que ten unha taxa de bits constante: 352 kbps para 44.1 kHz, 384 kbps para 48 kHz, e non pode "desplazarse" a aquelas frecuencias que máis o necesitan. . A diferenza de SBC, aptX non "cortará" as frecuencias, senón que lles engadirá ruído de cuantificación, reducindo o rango dinámico do audio e, ás veces, introducindo un crepitado característico. SBC "come detalles": descarta as zonas máis tranquilas.
De media, en comparación co SBC 328k, aptX introduce menos distorsión na música cunha ampla gama de frecuencias, pero en música cun rango de frecuencia estreito e un amplo rango dinámico, o SBC 328k ás veces gaña.

Consideremos un caso especial. Espectrograma dunha gravación tocando un piano:
Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

A principal enerxía reside en frecuencias de 0 a 4 kHz, e continúa ata 10 kHz.
O espectrograma dun ficheiro comprimido en aptX ten o seguinte aspecto:
Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

E así é o que parece SBC 328k.
Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Pódese ver que o SBC 328k desactivaba periódicamente completamente o rango superior a 16 kHz e gastaba toda a taxa de bits dispoñible en intervalos por debaixo deste valor. Non obstante, aptX introduciu máis distorsión no espectro de frecuencia audible para o oído humano, como se pode ver no espectrograma orixinal subtraído do espectrograma aptX (canto máis brillante, máis distorsión):
Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Mentres que o SBC 328k estropeou o sinal menos no rango de 0 a 10 kHz e cortou o resto:
Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

A taxa de bits de 485k do SBC foi suficiente para preservar todo o rango de frecuencias, sen desactivar as bandas.
Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

SBC 485k está significativamente por diante de aptX nesta pista no rango de 0-15 kHz, e cunha diferenza menor, pero aínda notable, en 15-22 kHz (canto máis escuro, menos distorsión):
Modificamos a pila Bluetooth para mellorar o son dos auriculares sen códecs AAC, aptX e LDAC

Arquivo de audio orixinal, SBC e aptX.

Ao cambiar a un SBC de alta taxa de bits, obterás un audio que a miúdo supera a aptX en calquera auricular. Nos auriculares que admiten conectividade EDR de 3 Mbps, unha taxa de bits de 551 kbps produce un son comparable ao aptX HD.

Podes facer aínda máis?

O parche de Android tamén inclúe unha opción para aumentar aínda máis a taxa de bits dos dispositivos EDR de 2 Mbps. Pode aumentar a taxa de bits de 452 kbit/s a 595 kbit/s, a costa de reducir a estabilidade da transmisión en condicións de radio difíciles.
É suficiente establecer a variable persist.bluetooth.sbc_hd_higher_bitrate en 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

O parche de taxa de bits extrema ata agora só se adoptou en LineageOS 15.1, pero non en 16.0.

Compatibilidade de dispositivos

SBC Dual Channel é compatible con case todos os auriculares, altofalantes e unidades principais do coche. Non é de estrañar: o estándar require o seu soporte en calquera dispositivo de decodificación. Hai un número reducido de dispositivos nos que este modo causa problemas, pero son casos illados.
Podes atopar máis detalles sobre dispositivos compatibles en 4pda ou XDA-developers.

Comparación de diferenzas sonoras

Fixen un servizo web que codifica audio para SBC (así como aptX e aptX HD) en tempo real, directamente no navegador. Con el, podes comparar o son de diferentes perfís SBC e outros códecs, sen realmente transmitir audio a través de Bluetooth, en auriculares con cable, altofalantes e a túa música favorita, e tamén cambiar os parámetros de codificación directamente mentres reproduces audio.
btcodecs.valdikss.org.ru/sbc-encoder

Contacte cos programadores de Android

Escribín a moitos desenvolvedores de pilas de Bluetooth en Google pedíndolles que considerasen incluír parches na rama principal de Android: AOSP, pero non recibín unha soa resposta. Os meus parches Sistema de parches Gerrit para Android tamén permaneceu sen comentarios de ninguén implicado.
Estaría encantado se puidese obter axuda para poñerme en contacto cos desenvolvedores de Google e levar SBC HD a Android. O parche en gerrit xa está desactualizado (esta é unha das primeiras revisións), e actualizarei se os desenvolvedores están interesados ​​nos meus cambios (non me resulta doado actualizalo, non teño dispositivos compatibles con Android Q). ).

Conclusión

Os usuarios de teléfonos intelixentes con firmware LineageOS, Resurrection Remix e crDroid poden gozar dunha calidade de son mellorada agora mesmo, só tes que activar a opción na configuración do dispositivo Bluetooth. Os usuarios de Linux tamén poden aumentar a taxa de bits SBC ao instalar parche de Pali Rohar, que, entre outras cousas, engade soporte para códecs aptX, aptX HD e FastStream.

Fonte: www.habr.com

Engadir un comentario