Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

Antes de ler este artigo, é recomendável revisar o artigo anterior: Áudio via Bluetooth: detalhes sobre perfis, codecs e dispositivos

Alguns usuários de fones de ouvido sem fio relatam baixa qualidade sonora e falta de agudos ao utilizar o codec Bluetooth padrão SBC, que é suportado por todos os dispositivos de áudio. Uma recomendação comum para melhorar a qualidade do som é adquirir dispositivos e fones que suportem os codecs aptX e LDAC. Esses codecs exigem royalties, portanto, dispositivos que os suportam tendem a ser mais caros.

Aparentemente, a baixa qualidade do SBC é causada por limitações artificiais dos stacks Bluetooth e das configurações dos fones, e essa limitação pode ser contornada em qualquer dispositivo existente, por meio de alterações de software no smartphone ou computador.

Codec SBC

O codec SBC possui vários parâmetros diferentes que são acordados na fase de estabelecimento da conexão. Entre eles:

  • Número e tipo de canais: Joint Stereo, Stereo, Dual Channel, Mono;
  • Número de faixas de frequência: 4 ou 8;
  • Número de blocos por pacote: 4, 8, 12, 16;
  • Algoritmo de distribuição de bits durante a quantização: Loudness, SNR;
  • Valor máximo e mínimo do pool de bits utilizados na quantização (bitpool): normalmente, de 2 a 53.

O dispositivo decodificador deve suportar qualquer combinação desses parâmetros. O dispositivo codificador pode não implementar todos.
Os stacks Bluetooth existentes geralmente acordam o seguinte perfil: Joint Stereo, 8 faixas, 16 blocos, Loudness, bitpool 2..53. Este perfil codifica áudio a 44,1 kHz com uma taxa de bits de 328 kbps.
O parâmetro bitpool afeta diretamente a taxa de bits dentro de um perfil: quanto maior, maior a taxa de bits, e, consequentemente, a qualidade.
No entanto, o parâmetro bitpool não está ligado a um perfil específico; a influência sobre a taxa de bits também é em grande parte determinada por outros parâmetros: tipo de canais, número de faixas de frequência, número de blocos. Aumentar a taxa de bits pode ser feito indiretamente, acordando perfis não padrão, sem alterar o bitpool.

Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

Fórmula para calcular a taxa de bits do SBC

Por exemplo, o modo Dual Channel codifica os canais separadamente, utilizando todo o bitpool para cada um deles. Forçando o dispositivo a usar Dual Channel em vez de Joint Stereo, alcançamos quase o dobro da taxa de bits com o mesmo valor máximo de bitpool: 617 kbps.
Na minha opinião, a utilização de um valor de bitpool não associado ao perfil na fase de negociação é uma falha do padrão A2DP, que levou a uma limitação artificial da qualidade SBC. Seria mais sensato negociar a taxa de bits, e não o bitpool.

Esses valores fixos de Bitpool e Bitrate têm origem em uma tabela com valores recomendados para áudio de alta qualidade. Mas uma recomendação não é motivo para se limitar a esses valores.

Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

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

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

Na nova versão da especificação, a limitação de taxa de bits foi removida. Suppose-se que fones de ouvido modernos, lançados após 2015 e que suportam EDR, possam suportar taxas de bits de até ≈730 kbit/s.

Por algum motivo, as pilhas Bluetooth do Linux (PulseAudio), Android, Blackberry e macOS que verifiquei têm limitações artificiais no valor máximo do parâmetro bitpool, que impacta diretamente na taxa máxima de bits. Mas isso não é o maior problema, quase todos os fones de ouvido também limitam o valor máximo de bitpool a 53.
Como já constatei, a maioria dos dispositivos funciona perfeitamente em uma pilha Bluetooth modificada com uma taxa de bits de 551 kbit/s, sem interrupções ou estalos. Mas essa taxa de bits nunca será negociada em condições normais, em pilhas Bluetooth convencionais.

Modificando a pilha Bluetooth

Em qualquer pilha Bluetooth compatível com o padrão A2DP, existe suporte para o modo Dual Channel, mas ativá-lo através da interface não é possível.

Vamos adicionar um interruptor à interface! Eu fiz patches para Android 8.1 e Android 9, que adicionam suporte total ao Dual Channel na pilha, adicionam o modo ao menu de alternância nos tools de desenvolvedor e tratam SBC com suporte a Dual Channel como se fosse um codec adicional, como aptX, AAC ou LDAC (o Android chama isso de HD Audio), adicionando uma opção nas configurações do dispositivo Bluetooth. Veja como é:

Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

Patch para Android 9
Patch para Android 8.1

Ao ativar a opção, o áudio Bluetooth começa a ser transmitido com uma taxa de bits de 551 kbit/s, se os fones de ouvido suportarem uma conexão a 3 Mbit/s, ou 452 kbit/s, se os fones de ouvido suportarem apenas 2 mbit/s.

Este patch está incluído nas seguintes firmwares alternativas:

  • LineageOS
  • Resurrection Remix
  • crDroid

De onde vieram 551 e 452 kbit/s?

A tecnologia de divisão de canal no Bluetooth é projetada para transmissão eficiente de grandes pacotes de tamanho fixo. A transmissão de dados ocorre em slots, sendo o maior número de slots enviados em uma única transmissão — 5. Existem também modos de transmissão que utilizam 1 ou 3 slots, mas não 2 ou 4. Nos 5 slots, é possível transmitir até 679 bytes a uma velocidade de conexão de 2 mbit/s e até 1021 bytes a uma velocidade de 3 mbit/s, enquanto que em 3 slots são 367 e 552 bytes, respectivamente.

Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

Se quisermos transmitir menos dados do que 679 ou 1021 bytes, mas mais do que 367 ou 552 bytes, a transmissão ainda ocupará 5 slots, e os dados serão transmitidos no mesmo tempo, o que reduz a eficiência da transmissão.

Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

SBC em modo Dual Channel, com áudio a 44100 Hz com parâmetros Bitpool 38, 16 blocos por quadro, 8 faixas de frequência, codifica o áudio em quadros de 164 bytes, com uma taxa de bits de 452 kbit/s.
O áudio deve ser encapsulado em protocolos de transmissão L2CAP e AVDTP, que consomem 16 bytes da carga útil de áudio.

Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

Dessa forma, em uma transmissão Bluetooth com 5 slots, conseguimos acomodar 4 quadros de áudio:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (cabeçalho SBC) - (164*4) = 6

Conseguimos colocar 11,7 ms de dados de áudio no pacote enviado, que será transmitido em 3,75 ms, e temos 6 bytes não utilizados no pacote.
Se aumentarmos um pouco o bitpool, 4 quadros de áudio já não poderão ser empacotados em um único pacote. Teremos que enviar 3 quadros por vez, o que reduz a eficiência da transmissão, diminui a quantidade de áudio transmitido em um único pacote e resultará em gagueiras rapidamente sob condições de rádio ruins.

Da mesma forma, a taxa de bits de 551 kbit/s foi escolhida para EDR 3 mbit/s: com Bitpool 47, 16 blocos por quadro, 8 faixas de frequência, o tamanho do quadro é de 200 bytes, com taxa de bits de 551 kbit/s. Em um único pacote cabem 5 quadros ou 14,6 ms de música.

O algoritmo para calcular todos os parâmetros do SBC é bastante complexo, podendo ser fácil se confundir ao contar manualmente, por isso fiz uma calculadora interativa para ajudar os interessados: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Para que tudo isso serve?

Ao contrário da crença popular sobre a qualidade de som do codec aptX, em alguns arquivos, ele pode apresentar resultados piores do que o SBC com uma taxa de bits padrão de 328 kbps.

O SBC aloca dinamicamente os bits de quantização para as faixas de frequência, operando sob o princípio de "de baixo para cima". Se toda a taxa de bits for utilizada nas frequências baixas e médias, as frequências altas serão "cortadas" (em vez delas, haverá silêncio).
O aptX quantiza as faixas de frequência com a mesma quantidade de bits de forma constante, o que resulta em uma taxa de bits fixa: 352 kbps para 44,1 kHz, 384 kbps para 48 kHz, e ele não pode "transferir bits" para as frequências que mais precisam. Ao contrário do SBC, o aptX não "corta" as frequências, mas adiciona a elas ruídos de quantização, reduzindo o alcance dinâmico do áudio e, às vezes, introduzindo estalos característicos. O SBC, por sua vez, "remove detalhes" - descartando as partes mais silenciosas.
Em média, em comparação com o SBC 328k, o aptX introduz menos distorções na música com uma ampla faixa de frequência, mas em músicas com uma faixa de frequência estreita e um amplo alcance dinâmico, o SBC 328k às vezes sai ganhando.

Consideremos um caso específico. A espectrograma de uma gravação de piano:
Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

A maior energia está nas frequências de 0 a 4 kHz, e se estende até 10 kHz.
O espectrograma de um arquivo comprimido em aptX é o seguinte:
Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

E assim se apresenta o SBC 328k.
Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

É visível que o SBC 328k desativou periodicamente completamente a faixa acima de 16 kHz, utilizando toda a taxa de bits disponível nas faixas abaixo deste valor. No entanto, o aptX introduziu mais distorções no espectro de frequências audíveis ao ouvido humano, como pode ser visto no espectrograma original subtraído do espectrograma aptX (quanto mais brilhante, mais distorções):
Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

Enquanto o SBC 328k prejudicou menos o sinal na faixa de 0 a 10 kHz, e o restante foi cortado:
Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

A taxa de bits de 485k do SBC foi suficiente para preservar toda a faixa de frequências, sem desativar faixas.
Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

O SBC 485k nesta composição supera significativamente o aptX na faixa de 0-15 kHz, e com uma diferença menor, mas ainda perceptível - de 15-22 kHz (quanto mais escuro, menos distorções):
Modificamos a pilha Bluetooth para melhorar o som em fones de ouvido sem os codecs AAC, aptX e LDAC

Arquivos de áudio originais, SBC e aptX.

Ao mudar para um SBC de alta taxa de bits, você obterá um som que muitas vezes supera o aptX em qualquer fone de ouvido. Em fones de ouvido que suportam conexão EDR de 3 Mbps, a taxa de bits de 551 kbps proporciona um som comparável ao aptX HD.

E é possível ainda mais?

O patch para Android também possui uma opção para aumentar ainda mais a taxa de bits para dispositivos EDR 2 Mbps. É possível aumentar a taxa de bits de 452 kbps para 595 kbps, embora isso possa reduzir a estabilidade da transmissão em condições de rádio difíceis.
Basta definir a variável persist.bluetooth.sbc_hd_higher_bitrate como 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

O patch para taxa de bits extrema foi aceito apenas no LineageOS 15.1, mas não na 16.0.

Compatibilidade com dispositivos

O SBC Dual Channel é suportado praticamente por todos os fones de ouvido, alto-falantes e sistemas de som automotivos. Isso não é surpresa — o padrão exige suporte em quaisquer dispositivos de decodificação. Há um pequeno número de dispositivos onde esse modo causa problemas, mas são casos isolados.
Para mais detalhes sobre dispositivos compatíveis, consulte 4pda ou xda-developers.

Comparação de diferenças de som

Criei um serviço web que codifica áudio em SBC (assim como aptX e aptX HD) em tempo real, diretamente no navegador. Com ele, você poderá comparar o som de vários perfis SBC e outros codecs, sem transmissão real de áudio via Bluetooth, em quaisquer fones de ouvido com fio, alto-falantes e sua música favorita, além de ajustar as configurações de codificação durante a reprodução do áudio.
btcodecs.valdikss.org.ru/sbc-encoder

Contato com os desenvolvedores do Android

Entrei em contato com diversos desenvolvedores do stack Bluetooth do Google, pedindo para considerar a inclusão dos patches na ramificação principal do Android — AOSP, mas não recebi resposta. Meus patches em sistema de gerenciamento de patches Gerrit para Android também não tiveram comentários de ninguém envolvido.
Ficaria feliz se pudesse ser ajudado a entrar em contato com os desenvolvedores do Google e implementar o SBC HD no Android. O patch no Gerrit já está desatualizado (é uma das versões iniciais), e eu o atualizarei se os desenvolvedores se interessarem pelas minhas alterações (não é fácil para mim atualizá-lo, não tenho dispositivos compatíveis com Android Q).

Conclusão

Usuários de smartphones com ROMs LineageOS, Resurrection Remix e crDroid já podem desfrutar de melhor qualidade de som agora, basta ativar a opção nas configurações do dispositivo Bluetooth. Usuários de Linux também podem obter uma taxa de bits SBC aumentada, instalando o patch de Pali Rohár, que, entre outras coisas, adiciona suporte para os codecs aptX, aptX HD e FastStream.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster