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

Antes de ler este artigo, é recomendável que você leia o artigo anterior: Áudio via Bluetooth: o máximo possível sobre perfis, codecs e dispositivos / em inglês

Alguns usuários de fones de ouvido sem fio observam baixa qualidade de áudio e falta de altas frequências ao usar o codec SBC Bluetooth padrão, que suporta todos os dispositivos de áudio. Uma recomendação frequente para melhorar o som é comprar dispositivos e fones de ouvido compatíveis com os codecs aptX e LDAC. Esses codecs exigem taxas de licenciamento; portanto, os dispositivos com suporte são mais caros.

Acontece que a baixa qualidade da SBC é devido às limitações artificiais das pilhas Bluetooth e das configurações dos fones de ouvido, e essa restrição pode ser contornada em qualquer dispositivo existente por alterações de software em um smartphone ou computador.

SBC Codec

O codec SBC possui muitos parâmetros diferentes que são consistentes durante a fase de configuração da conexão. Entre eles estão:

  • Número e tipo de canais: Joint Stereo, Stereo, Dual Channel, Mono;
  • Número de bandas de frequência: 4 ou 8;
  • O número de blocos no pacote: 4, 8, 12, 16;
  • Algoritmo de alocação de bits de quantização: Loudness, SNR;
  • Valor máximo e mínimo do pool de bits usado na quantização (pool de bits): geralmente, de 2 a 53.


O dispositivo de decodificação deve suportar qualquer combinação desses parâmetros. O codificador pode não implementar tudo.
As pilhas Bluetooth existentes, por regra, concordam com o seguinte perfil: Conjunto Estéreo, 8 bandas, 16 blocos, Loudness, bitpool 2..53. Esse perfil codifica áudio de 44,1 kHz com uma taxa de bits de 328 kbps.
O parâmetro bitpool afeta diretamente a taxa de bits em um único perfil: quanto maior, maior a taxa de bits e, portanto, a qualidade.
No entanto, o parâmetro bitpool não está vinculado a um perfil específico; Outros parâmetros também afetam a taxa de bits: tipo de canais, número de faixas de frequência, número de blocos. 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


SBC Bitrate Formula


Por exemplo, o modo Dual Channel codifica os canais separadamente, usando o pool de bits inteiro para cada canal. Ao forçar o dispositivo a usar Dual Channel em vez de Joint Stereo, obtemos uma taxa de bits quase dupla com o mesmo valor máximo de pool de bits: 617 kbps.
Na minha opinião, o uso de um valor de bitpool sem perfil na fase de aprovação é uma falha no padrão A2DP, o que levou a uma limitação artificial da qualidade da SBC. Seria mais sensato concordar com a taxa de bits, não com o bitpool.

Esses valores fixos, Bitpool e Bitrate, são originários de uma tabela com valores recomendados para áudio de alta qualidade. Mas a recomendação não é um motivo para se limitar a esses valores.

Tabela de perfil Bluetooth SBC

A especificação A2DP v1.2, que estava ativa de 2007 a 2015, exige que todos os dispositivos de decodificação 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.


Não há limite de taxa de bits na nova versão da especificação. Supõe-se que os fones de ouvido modernos lançados após 2015 e com suporte ao EDR possam suportar taxas de bits de até ~ 730 kbps.

Por alguma razão, as pilhas Bluetooth do Linux que testei (PulseAudio), Android, Blackberry e macOS têm limitações artificiais no valor máximo do parâmetro bitpool, 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á consegui ter certeza, a maioria dos dispositivos funciona bem em uma pilha Bluetooth modificada com uma taxa de bits de 551 kbit / s, sem interrupções e estalos. Mas essa taxa de bits nunca será negociada em condições normais, em pilhas Bluetooth comuns.

Modificando a pilha Bluetooth

Qualquer pilha Bluetooth compatível com o padrão A2DP tem suporte para o modo Dual Channel, mas não é possível ativá-lo a partir da interface.

Vamos adicionar um switch à interface! Fiz patches para o Android 8.1 e Android 9 que adicionam suporte completo ao Dual Channel à pilha, adicionam modo ao menu de alternância de modo nas ferramentas do desenvolvedor e processam o SBC com suporte ao Dual Channel como se fosse um codec adicional como aptX, AAC ou LDAC ( O Android chama HD Audio) adicionando uma marca de seleção às configurações do dispositivo Bluetooth. Aqui está o que parece:

imagem

Patch para Android 9
Patch para Android 8.1

Quando a caixa de seleção está ativada, o áudio Bluetooth começa a ser transmitido com uma taxa de bits de 551 kbps se os fones de ouvido suportam uma conexão a 3 Mbps ou 452 kbps se os fones de ouvido suportam apenas 2 Mbps.

Este patch está incluído no seguinte firmware alternativo:
  • LineageOS
  • Remix da ressurreição
  • crDroid


De onde vieram 551 e 452 kbit / s?

A tecnologia de ar split Bluetooth foi projetada para transferir com eficiência grandes pacotes de tamanho fixo. Os dados são transmitidos por slots, o maior número de slots enviados em uma transmissão é 5. Existem também modos de transmissão que usam 1 ou 3 slots, mas não 2 ou 4. Em 5 slots, você pode transferir até 679 bytes a uma velocidade de conexão de 2 Mbps e até 1021 bytes a uma velocidade de 3 Mbps e em 3 - 367 e 552 bytes, respectivamente.

imagem

Se queremos transferir menos dados que 679 ou 1021 bytes, mas mais que 367 ou 552 bytes, a transferência ainda terá 5 slots e os dados serão transmitidos ao mesmo tempo, o que reduz a eficiência da transmissão.

imagem

O SBC no modo de canal duplo, no áudio 44100 Hz com parâmetros Bitpool 38, 16 blocos por quadro, 8 faixas de frequência, codifica o áudio em quadros de 164 bytes de tamanho, com uma taxa de bits de 452 kbps.
O áudio deve ser encapsulado nos protocolos de transferência L2CAP e AVDTP, que recebem 16 bytes da carga útil do á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 *}





Assim, em uma transmissão Bluetooth com 5 slots, é possível acomodar 4 quadros de áudio:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 ( SBC) - (164*4) = 6 

Colocamos 11,7 ms de dados de áudio no pacote de envio, que será transmitido em 3,75 ms e 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 empacotados em um pacote. Você terá que enviar 3 quadros por vez, o que reduz a eficiência da transmissão, reduz a quantidade de áudio transmitida por pacote e rapidamente leva a áudio gaguejante em más condições de rádio.

Da mesma forma, uma taxa de bits de 551 kbit / s foi selecionada para um EDR de 3 Mbps: com o Bitpool 47, 16 blocos em um quadro, 8 faixas de frequência, o tamanho do quadro é de 200 bytes, com uma taxa de bits de 551 kbit / s. 5 quadros ou 14,6 ms de música se encaixam em um pacote.

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

Por que tudo isso é necessário?

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

A SBC aloca dinamicamente bits de quantização para bandas de frequência, operando “de baixo para cima”. Se toda a taxa de bits foi usada para as frequências baixa e média, as frequências mais altas serão "cortadas" (haverá um silêncio).
O aptX quantiza faixas de frequência com o mesmo número de bits continuamente, e é por isso que ele tem uma taxa de bits constante: 352 kbit / s para 44,1 kHz, 384 kbit / s para 48 kHz e não pode "transferir bits" para essas frequências mais precisando 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 característicos. A SBC, por outro lado, “consome os detalhes” - descarta as áreas mais silenciosas.
Em comparação com o SBC 328k, em média, o aptX introduz menos distorção na música com uma ampla faixa de frequência, mas às vezes vence em músicas com uma faixa de frequência estreita e ampla faixa dinâmica.

Considere um caso especial. Espectrograma para gravação do piano:
imagem

A energia principal está nas frequências de 0 a 4 kHz e dura até 10 kHz.
O espectrograma do arquivo compactado no aptX é o seguinte:
imagem

E assim parece SBC 328k.
imagem

Pode-se observar que o SBC 328k periodicamente desligou completamente a faixa acima de 16 kHz e consumiu toda a taxa de bits disponível para faixas abaixo desse valor. No entanto, o aptX introduziu mais distorção no espectro de frequência ouvido pelo ouvido humano, que pode ser visto no espectrograma original subtraído do espectrograma aptX (quanto mais brilhante, mais distorção):
imagem

Enquanto o SBC 328k menos atrapalhou o sinal na faixa de 0 a 10 kHz e cortou o resto -
imagem

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

O SBC 485k nesta composição está significativamente à frente do aptX na faixa de 0 a 15 kHz e com uma diferença menor, mas ainda perceptível - 15 a 22 kHz (quanto mais escura, menos distorção):
imagem

Arquivo de áudio original, SBC e aptX .

Ao mudar para o SBC de alto nível, você obtém som, geralmente superior ao aptX, em qualquer fone de ouvido. Em fones de ouvido compatíveis com uma conexão EDR de 3 Mbps, a taxa de bits de 551 Kbps produz um som comparável ao aptX HD.

Posso ter mais?

O patch para Android também tem uma opção para aumentar ainda mais a taxa de bits dos dispositivos EDR em 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 condições complexas de rádio.
Basta definir a variável persist.bluetooth.sbc_hd_higher_bitrate como 1:
 # setprop persist.bluetooth.sbc_hd_higher_bitrate 1 

Até agora, o patch de taxa de bits extrema foi aceito apenas no LineageOS 15.1, mas não no 16.0.

Compatibilidade do dispositivo

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

Comparação das diferenças sonoras

Fiz um serviço da Web que codifica o áudio no SBC (assim como o aptX e o aptX HD) em tempo real, diretamente no navegador. Com ele, você pode comparar o som de vários perfis SBC e outros codecs, sem realmente transmitir áudio via Bluetooth, em qualquer fone de ouvido com fio, alto-falante e sua música favorita, além de alterar as configurações de codificação diretamente durante a reprodução de áudio.
btcodecs.valdikss.org.ru/sbc-encoder

Entre em contato com desenvolvedores do Android

Escrevi para muitos desenvolvedores da pilha do Google Bluetooth com um pedido para considerar a inclusão de patches no ramo principal do Android - AOSP, mas não recebi uma única resposta. Meus patches no sistema de patches Gerrit para Android também foram deixados sem comentários de qualquer pessoa envolvida.
Eu ficaria feliz se tivesse sido ajudado em conexão com os desenvolvedores do Google e a implementação do SBC HD no Android. O patch do gerrit já está desatualizado (esta é uma das primeiras revisões) e atualizo-o se os desenvolvedores estiverem interessados ​​em minhas alterações (não é fácil para mim atualizá-lo, não tenho dispositivos compatíveis com Android Q).

Conclusão

Os usuários de smartphones com LineageOS, Resurrection Remix e firmware crDroid podem se contentar com uma qualidade de som aprimorada agora, basta ativar a opção nas configurações do dispositivo Bluetooth. Os usuários do Linux também podem obter uma taxa de bits aumentada da SBC instalando um patch da Pali Rohár , que, entre outras coisas, adiciona suporte aos codecs aptX, aptX HD e FastStream.

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


All Articles