Modificando 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: detalhes máximos sobre perfis, codecs e dispositivos

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

Acontece que a baixa qualidade do SBC se deve a limitações artificiais de pilhas Bluetooth e configurações de fones de ouvido, e essa limitação pode ser contornada em qualquer dispositivo existente por meio de alterações de software em um smartphone ou computador.

Codec SBC

O codec SBC possui muitos parâmetros diferentes que são negociados durante a fase de configuração 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 do pacote: 4, 8, 12, 16;
  • Algoritmo para distribuição de bits durante a quantização: Loudness, SNR;
  • O valor máximo e mínimo do pool de bits usado durante a quantização (bitpool): 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 normalmente concordam com o seguinte perfil: Joint Stereo, 8 bandas, 16 blocos, Loudness, bitpool 2..53. Este perfil codifica áudio de 44.1 kHz a uma taxa de bits de 328 kbps.
O parâmetro bitpool afeta diretamente a taxa de bits dentro de um perfil: quanto maior for, maior será a taxa de bits e, portanto, a qualidade.
No entanto, o parâmetro bitpool não está vinculado a um perfil específico; A taxa de bits também é amplamente influenciada por outros parâmetros: tipo de canais, número de bandas de frequência, número de blocos. Você pode aumentar a taxa de bits indiretamente, concordando com perfis não padrão, sem alterar o bitpool.

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

Fórmula para calcular a taxa de bits SBC

Por exemplo, o modo Dual Channel codifica canais separadamente, usando todo o bitpool para cada canal. Ao forçar o dispositivo a usar Dual Channel em vez de Joint Stereo, obtemos 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 vinculado a um perfil na fase de negociação é uma falha do padrão A2DP, que levou a uma limitação artificial da qualidade do SBC. Faria mais sentido negociar a taxa de bits em vez do bitpool.

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

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

A especificação A2DP v1.2, que esteve 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 deverá suportar todos os valores possíveis de bitpool que não excedam a taxa de bits máxima. Este perfil limita a taxa de bits máxima disponível a 320kb/s para mono e 512kb/s para modos de dois canais.

Na nova versão da especificação não há limite de taxa de bits. Estima-se que os fones de ouvido modernos lançados após 2015 que suportam EDR possam suportar taxas de bits de até ≈730 kbps.

Por algum motivo, as pilhas Linux (PulseAudio), Android, Blackberry e macOS Bluetooth que testei têm limites artificiais no valor máximo do parâmetro bitpool, o que afeta diretamente a taxa de bits máxima. Mas este não é o maior problema; quase todos os fones de ouvido também limitam o valor máximo do bitpool a 53.
Como já vi, a maioria dos dispositivos funciona perfeitamente em uma pilha Bluetooth modificada com taxa de bits de 551 kbps, sem interrupções ou estalos. Mas tal taxa de bits nunca será consistente em condições normais, em pilhas Bluetooth normais.

Modificando a pilha Bluetooth

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

Vamos adicionar um botão de alternância à interface! Fiz patches para Android 8.1 e Android 9 que adicionam suporte completo a Dual Channel à pilha, adicionam um modo ao menu de alternância de modo nas ferramentas de desenvolvimento e tratam SBCs habilitados para Dual Channel como se fossem um codec adicional como aptX , AAC ou LDAC (o Android chama isso de HD Audio) adicionando uma marca de seleção às configurações do dispositivo Bluetooth. Isto é o que parece:

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

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 551 kbps, se os fones de ouvido suportarem uma velocidade de conexão de 3 Mbit/s, ou 452 kbps, se os fones de ouvido suportarem apenas 2 Mbit/s.

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

  • LineageOS
  • Ressurreição Remix
  • crDroid

De onde vieram 551 e 452 kbit/s?

A tecnologia de compartilhamento de ar 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 transferência é 5. Existem também modos de transferência que usam 1 ou 3 slots, mas não 2 ou 4. Em 5 slots você pode transferir até 679 bytes na velocidade de conexão de 2 Mbit/s e até 1021 bytes a uma velocidade de 3 Mbit/s, e a 3 - 367 e 552 bytes, respectivamente.

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

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

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

SBC no modo Dual Channel, áudio de 44100 Hz com Bitpool 38 parâmetros, 16 blocos por quadro, 8 faixas de frequência, codifica áudio em quadros de 164 bytes, com taxa de bits de 452 kbps.
O áudio deve ser encapsulado nos protocolos de transferência L2CAP e AVDTP, que ocupam 16 bytes da carga de áudio.

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

Assim, uma transmissão Bluetooth com 5 slots pode 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 enviado, que será transmitido em 3.75 ms, e temos 6 bytes não utilizados restantes no pacote.
Se você aumentar um pouco o bitpool, não será mais possível agrupar 4 quadros de áudio 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 transmitido por quadro e levará mais rapidamente a interrupções no áudio em más condições de rádio.

Da mesma forma, foi selecionada uma taxa de bits de 551 kbit/s 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. Um pacote contém 5 quadros ou 14.6 ms de música.

O algoritmo para calcular todos os parâmetros SBC é bastante complexo, você pode facilmente ficar confuso se contar manualmente, então 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, em alguns arquivos ele pode produzir resultados piores que o SBC com uma taxa de bits padrão de 328 kbps.

O SBC aloca dinamicamente bits de quantização para bandas de frequência de baixo para alto. Se toda a taxa de bits for usada para as frequências baixas e médias, as frequências altas serão “cortadas” (em vez disso, haverá silêncio).
O aptX quantiza bandas de frequência com o mesmo número de bits o tempo todo, e é por isso que tem uma taxa de bits constante: 352 kbps para 44.1 kHz, 384 kbps para 48 kHz e não pode “mudar bits” para as frequências que mais precisam delas. . Ao contrário do SBC, o aptX não “corta” 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. SBC “come detalhes” – descarta as áreas mais tranquilas.
Em média, comparado ao SBC 328k, o aptX introduz menos distorção em música com ampla faixa de frequência, mas em música com faixa de frequência estreita e ampla faixa dinâmica, o SBC 328k às vezes vence.

Vamos considerar um caso especial. Espectrograma de uma gravação de piano:
Modificando a pilha Bluetooth para melhorar o som em fones de ouvido sem codecs AAC, aptX e LDAC

A energia principal reside nas frequências de 0 a 4 kHz e continua até 10 kHz.
O espectrograma de um arquivo compactado em aptX é assim:
Modificando a pilha Bluetooth para melhorar o som em fones de ouvido sem codecs AAC, aptX e LDAC

E é assim que o SBC 328k se parece.
Modificando a pilha Bluetooth para melhorar o som em fones de ouvido sem codecs AAC, aptX e LDAC

Pode-se observar que o SBC 328k desligou periodicamente completamente a faixa acima de 16 kHz, e gastou toda a taxa de bits disponível nas faixas abaixo deste valor. No entanto, o aptX introduziu mais distorção no espectro de frequência audível ao ouvido humano, como pode ser visto no espectrograma original subtraído do espectrograma aptX (quanto mais brilhante, mais distorção):
Modificando a pilha Bluetooth para melhorar o som em fones de ouvido sem codecs AAC, aptX e LDAC

Enquanto o SBC 328k estragou menos o sinal na faixa de 0 a 10 kHz e cortou o resto:
Modificando a pilha Bluetooth para melhorar o som em fones de ouvido sem codecs AAC, aptX e LDAC

A taxa de bits de 485k do SBC foi suficiente para preservar toda a faixa de frequência, sem desabilitar bandas.
Modificando a pilha Bluetooth para melhorar o som em fones de ouvido sem codecs AAC, aptX e LDAC

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

Arquivo de áudio original, SBC e aptX.

Ao mudar para um SBC de alta taxa de bits, você obterá um áudio que geralmente supera o aptX em qualquer fone de ouvido. Em fones de ouvido que suportam conectividade EDR de 3 Mbps, uma taxa de bits de 551 kbps produz um som comparável ao aptX HD.

Você pode fazer ainda mais?

O patch do Android também inclui uma opção para aumentar ainda mais a taxa de bits para dispositivos EDR de 2 Mbps. Você pode aumentar a taxa de bits de 452 kbit/s para 595 kbit/s, ao custo de 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 de taxa de bits extrema até agora só foi adotado no LineageOS 15.1, mas não no 16.0.

Compatibilidade de Dispositivo

O SBC Dual Channel é compatível com quase todos os fones de ouvido, alto-falantes e unidades principais de automóveis. Isso não é de admirar - o padrão exige 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 isolados.
Mais detalhes sobre dispositivos compatíveis podem ser encontrados em 4pda ou xda-developers.

Comparação de diferenças sonoras

Fiz um web service que codifica áudio para SBC (assim como aptX e aptX HD) em tempo real, direto no navegador. Com ele, você pode comparar o som de diferentes 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, e também alterar os parâmetros de codificação diretamente durante a reprodução do áudio.
btcodecs.valdikss.org.ru/sbc-encoder

Entre em contato com desenvolvedores Android

Escrevi para muitos desenvolvedores de pilha Bluetooth do Google pedindo-lhes que considerassem a inclusão de patches no ramo principal do Android - AOSP, mas não recebi uma única resposta. Meus patches em Sistema de patch Gerrit para Android também permaneceu sem comentários de ninguém envolvido.
Eu ficaria feliz se pudesse obter ajuda para entrar em contato com os desenvolvedores do Google e trazer o SBC HD para o Android. O patch no gerrit já está desatualizado (esta é uma das primeiras revisões), e irei atualizá-lo se os desenvolvedores estiverem interessados ​​em minhas mudanças (não é fácil para mim atualizá-lo, não tenho dispositivos compatíveis com Android Q ).

Conclusão

Usuários de smartphones com LineageOS, Resurrection Remix e firmware crDroid podem desfrutar de qualidade de som aprimorada agora mesmo, basta ativar a opção nas configurações do dispositivo Bluetooth. Os usuários do Linux também podem obter maior taxa de bits SBC instalando patch de Pali Rohar, que, entre outras coisas, adiciona suporte para codecs aptX, aptX HD e FastStream.

Fonte: habr.com

Adicionar um comentário