Modificações da pilha Bluetooth para melhorar a qualidade do áudio em fones de ouvido sem codecs AAC, aptX ou LDAC

Antes de ler este artigo, é recomendável ler o anterior: Áudio por Bluetooth: informações mais detalhadas sobre perfis, codecs e dispositivos /

Alguns usuários de fones de ouvido sem fio observam baixa qualidade de som e falta de altas frequências ao usar o codec Bluetooth SBC padrão, suportado por todos os fones de ouvido e outros dispositivos de áudio Bluetooth. Uma recomendação comum para obter melhor qualidade de som é comprar dispositivos e fones de ouvido com suporte a codecs aptX ou LDAC. Esses codecs exigem taxas de licenciamento, por isso os dispositivos com eles são mais caros.

Acontece que a baixa qualidade do SBC é causada por limitações artificiais de todas as pilhas atuais e configurações de fones de ouvido Bluetooth, e essa limitação pode ser contornada em qualquer dispositivo existente apenas com modificação de software.

Codec Sbc

O SBC possui muitos parâmetros diferentes que são negociados durante a fase de configuração da conexão:

  • Tipo e número do canal de áudio: Joint Stereo, Stereo, Dual Channel, Mono;
  • Número de bandas de frequência: 4 ou 8;
  • Número de blocos de áudio em um pacote: 4, 8, 12, 16;
  • Algoritmo de alocação de bits de quantização: Loudness, SNR;
  • Conjunto de bits máximo e mínimo usado no processo de quantização: geralmente 2-53.


O decodificador é necessário para suportar qualquer combinação desses parâmetros. O codificador pode implementar apenas uma parte deles.
As pilhas Bluetooth existentes geralmente negociam o seguinte conjunto de opções que chamo de "perfil": Conjunto Estéreo, 8 bandas, 16 blocos, Loudness, bitpool 2..53. Esse perfil codifica áudio estéreo de 44,1 kHz com taxa de bits de 328 kbps.
Bitpool é um parâmetro que altera a taxa de bits de codificação: quanto maior, maior a taxa de bits e, portanto, a qualidade. Mas o valor exato do bitpool corresponde à taxa de bits exata apenas dentro do perfil exato.
A taxa de bits também é significativamente afetada por outros parâmetros: tipo de canal de áudio, número de bandas de frequência, número de blocos de áudio. Você pode aumentar a taxa de bits indiretamente negociando perfis não padrão, sem alterar o pool de bits.

bitrate= frac8 timesframe length timessample ratesubbandas timesblocks


Fórmula de cálculo da taxa de bits


Por exemplo, o modo Dual Channel codifica os canais separadamente, usando o pool de bits individual para cada canal, diferentemente de Stereo ou Joint Stereo, que usam o pool de bits para ambos os canais. Forçar o dispositivo a usar o Dual Channel em vez do Joint Stereo nos proporcionará uma taxa de bits quase duplicada de 617 kbps, com o mesmo valor de bitpool de 53.
Para mim, parece que o bitpool deve ser uma variável interna. Suponho que seja uma falha de design da especificação A2DP que o valor do bitpool não esteja vinculado a outros parâmetros do codec e definido apenas como uma variável negociada independente.

Valores fixos de bitpool e taxa de bits originados no perfil recomendado para áudio de alta qualidade. Mas a recomendação não deve ser o motivo para definir o limite desses parâmetros.

Tabela de perfis Bluetooth SBC

A especificação A2DP v1.2, que estava ativa de 2007 a 2015, exige que todos os decodificadores funcionem corretamente com taxas de bits de até 512 kbps:

O decodificador do SNK deve suportar todos os valores possíveis de pool de bits que não resultem em excesso da taxa de bits máxima. Esse perfil limita a taxa de bits máxima disponível a 320kb / s para modos mono e 512kb / s para modos de dois canais.


Nenhum limite de taxa de bits indicado na nova versão da especificação. Supõe-se que fones de ouvido modernos com suporte a EDR lançado após 2015 possam suportar taxas de bits de até 730 kbps.

Por alguma razão, todas as pilhas Bluetooth atualmente testadas (Linux (PulseAudio), Android, Blackberry e macOS) têm restrições artificiais do parâmetro bitpool máximo, o que afeta diretamente a taxa de bits máxima. Mas esse não é o maior problema, quase todos os fones de ouvido também limitam o valor máximo de bitpool a 53.
Como já vi nos meus testes, a maioria dos dispositivos funciona bem em uma pilha Bluetooth modificada com uma taxa de bits de 551 kbps, sem interrupções e estalos. Mas essa taxa de bits nunca será negociada em condições normais, com pilhas Bluetooth padrão.

Modificação de pilha Bluetooth

Toda pilha Bluetooth compatível com A2DP deve suportar o modo Dual Channel, mas não há como forçar o uso desse modo.

Vamos adicionar uma opção à interface do usuário! Fiz patches para o Android 8.1 e Android 9, que adicionam suporte completo ao Dual Channel na pilha e no menu do desenvolvedor e lidam com o modo Dual Channel como um codec "HD Audio" adicional, como aptX, AAC ou LDAC, adicionando um tique no Configurações do dispositivo Bluetooth Veja como é:

imagem

Patch do Android 9
Patch do Android 8.1

Essa caixa de seleção alterna o modo de canal duplo, configurado para usar 551 kbps para dispositivos EDR de 3 Mb / s e 452 kbps para dispositivos EDR de 2 Mb / s.

Esse conjunto de patches foi mesclado nos seguintes firmwares alternativos:
  • LineageOS 15.1 (desde 31 de março de 2019) e 16.0 (desde 13 de maio de 2019)
  • Remix da ressurreição (desde 14 de maio de 2019)
  • crDroid (desde 13 de maio de 2019)


De onde vieram 551 e 452 kbps?

A tecnologia de divisão de tempo Bluetooth foi projetada para transmitir com eficiência grandes pacotes de tamanho fixo. A transferência de dados ocorre em slots, o maior número de slots enviados em uma transmissão é 5. Também há modos de transferência usando 1 ou 3 slots, mas não 2 ou 4. Você pode transferir até 679 bytes em 5 slots, a uma velocidade de conexão de 2 Mbps e até 1021 bytes a uma velocidade de 3 Mbps. Em 3 slots, a quantidade máxima de dados é 367 e 552 bytes, respectivamente.

imagem

Se quisermos transferir menos dados que 679 ou 1021 bytes, mas mais que 367 ou 552 bytes, a transferência ainda terá 5 slots e a transmissão levará a mesma quantidade de tempo, o que reduz a eficiência da transmissão.

imagem

O áudio de 44100 Hz codificado usando SBC no modo de canal duplo com bitpool = 38, 16 blocos em um quadro, 8 bandas de frequência, produz um quadro de áudio de 164 bytes, com taxa de bits de 452 kb / s.
A carga útil de áudio deve ser encapsulada nos protocolos de transmissão L2CAP e AVDTP, que deduzem 16 bytes de sobrecarga da carga útil de áudio.

\ begin {align *} comprimento do quadro & = 4 + \ frac {sub-bandas \ times canais} {2} + \\ & \ begin {cases} \ frac {blocos \ times canais \ times bitpool} {8} e \ text { se modo mono ou duplo canal} \\ \ frac {sub-bandas + blocos \ times bitpool} {8} e \ text {se modo estéreo conjunto} \\ \ frac {blocks \ times bitpool} {8} & \ text {if stereo modo} \\ \ end {cases} \ end {align *}





Uma transmissão de áudio de 5 slots pode conter até 4 quadros de áudio:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC header) - (164*4) = 6 

Um único pacote transmite até 11,7 ms de dados de áudio, que serão transmitidos em 3,75 ms, e ainda temos 6 bytes não utilizados no pacote.
Se você aumentar levemente o pool de bits, 4 quadros de áudio não poderão mais ser agrupados em uma única transmissão. Você precisará enviar três quadros por vez, o que reduz a eficiência da transmissão, reduz a quantidade de áudio transmitida em um pacote e aumenta a chance de interrupção do áudio em condições de rádio ruins.

A taxa de bits de 551 kbps para EDR de 3 Mbps foi selecionada usando o mesmo princípio: com Bitpool 47, 16 blocos por quadro, 8 bandas de frequência, o tamanho do quadro é de 200 bytes, com uma taxa de bits de 551 kbps. A transmissão única pode agrupar até 5 quadros ou 14,6 ms de música.

O algoritmo para calcular todos os parâmetros da SBC é bastante complicado, você pode facilmente cometer um erro se tentar calcular todos eles manualmente, por isso criei uma calculadora interativa para ajudar os interessados:
btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Para que serve tudo isso?

Ao contrário da crença popular da qualidade do som do aptX, em alguns casos, pode produzir pior qualidade de áudio que o SBC com uma taxa de bits padrão de 328k.

A SBC aloca dinamicamente os bits de quantização para as bandas de frequência, atuando "de baixo para cima". Se toda a taxa de bits foi usada para as frequências inferior e média, as frequências superiores são "cortadas" (silenciadas).
O aptX quantiza constantemente as bandas de frequência com o mesmo número de bits, o que o torna um codec de taxa de bits constante: 352 kbps para 44,1 kHz, 384 kbps para 48 kHz. Não pode "transferir bits" para frequências que mais precisam deles. Diferentemente do SBC, o aptX não "corta" as frequências, mas adiciona ruído de quantização a elas, reduzindo a faixa dinâmica do áudio e, às vezes, introduzindo estalidos. A SBC, pelo contrário, “come os detalhes” - descarta as áreas mais silenciosas.
Em média, comparado ao SBC 328k, o aptX faz menos distorção na música com uma ampla faixa de frequência, mas na música com uma faixa de frequência estreita e uma ampla faixa dinâmica, o SBC 328k às vezes vence.

Vamos considerar um caso especial, uma gravação de piano. Aqui está um espectrograma:
imagem

A maior parte da energia localiza-se nas frequências de 0 a 4 kHz e dura até 10 kHz.
O espectrograma do arquivo aptX se parece com o seguinte:
imagem

Aqui está o SBC 328k:
imagem

Pode-se observar que o SBC 328k periodicamente corta completamente a faixa acima de 16 kHz e usa todas as taxas de bits disponíveis para as faixas de frequência abaixo desse valor. No entanto, o aptX introduziu mais distorções no espectro de frequência audível pelo ouvido humano, o que pode ser visto no espectrograma de áudio original subtraído do espectrograma aptX (quanto mais brilhante, mais distorção):
imagem

O SBC 328k introduziu menos distorção no sinal na faixa de 0 a 10 kHz, e as demais frequências foram cortadas:
imagem

A taxa de bits de 485k foi suficiente para a SBC salvar toda a faixa de frequência, sem cortar as faixas.
imagem

O SBC 485k produz resultados muito melhores no intervalo de 0 a 15 kHz nesta amostra do que o aptX, e uma diferença menor, mas ainda perceptível, de 15 a 22 kHz (quanto mais escura, menos distorção):
imagem

Arquive com áudio original e arquivos codificados em SBC / aptX .

Ao mudar para um SBC de alta taxa de bits, você obtém um som superior ao aptX na maioria das vezes, em qualquer fone de ouvido. Em fones de ouvido com suporte a EDR de 3 Mb / s, o SBC de 551 kb / s produz um som muito próximo ao aptX HD.

Podemos ir ainda mais longe?

O patchset do Android tem uma opção adicional para aumentar ainda mais a taxa de bits dos dispositivos EDR de 2 mbps. Você pode aumentar a taxa de bits de 452 kbps para 595 kbps, com o custo de reduzir a estabilidade da transmissão em caso de condições de rádio congestionadas.
Basta definir a variável persist.bluetooth.sbc_hd_higher_bitrate como 1:
 # setprop persist.bluetooth.sbc_hd_higher_bitrate 1 

O patch de taxa de bits extrema atualmente é mesclado apenas no LineageOS 15.1, mas não no 16.0.

Compatibilidade com os dispositivos

O SBC Dual Channel é suportado por quase todos os fones de ouvido, alto-falantes e unidades de cabeça do carro. Isso não é de admirar - o padrão exige seu suporte em qualquer dispositivo de decodificação. Há um pequeno número de dispositivos nos quais esse modo causa problemas, mas esses são casos muito raros.
Mais detalhes sobre dispositivos compatíveis podem ser encontrados em w3bsit3-dns.com e xda-developers .

Comparação da diferença sonora

Eu criei um serviço da Web que codifica áudio para SBC (e também para o aptX e aptX HD) em tempo real, diretamente no navegador. Você pode comparar o som de diferentes perfis SBC e outros codecs sem realmente transmitir áudio via Bluetooth usando este serviço, em qualquer fone de ouvido com fio, alto-falante e na sua música favorita. Você também pode alterar os parâmetros de codificação diretamente durante a reprodução de áudio.
btcodecs.valdikss.org.ru/sbc-encoder

Entrando em contato com desenvolvedores do Android

Tentei entrar em contato com muitos desenvolvedores de pilha Bluetooth do Google, pedindo que eles considerassem incluir meus patches na filial principal do Android - AOSP, mas não recebi uma única resposta. Meus patches no sistema de revisão de código Gerrit para Android também não receberam comentários de ninguém envolvido no desenvolvimento.
Ficaria feliz se alguém pudesse falar aos desenvolvedores do Google sobre esta implementação do SBC HD para Android. O patchset gerrit já está desatualizado (esta é uma das primeiras revisões), mas atualizá-lo-ei se os desenvolvedores estiverem interessados ​​em minhas alterações (não é fácil atualizá-lo, não tenho dispositivos compatíveis com Android Q) .

Conclusão

Os usuários dos firmwares LineageOS, Resurrection Remix e crDroid podem melhorar a qualidade do áudio Bluetooth marcando uma caixa de seleção nas configurações do dispositivo Bluetooth. Os usuários do Linux também podem obter uma taxa de bits mais alta da SBC instalando o patch da Pali Rohár , que, entre outras coisas, adiciona suporte aos codecs aptX, aptX HD e FastStream.

Source: https://habr.com/ru/post/pt456476/


All Articles