We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Het wordt aanbevolen om deze artikel te lezen na het doornemen van het vorige artikel: Audio via Bluetooth: een uitgebreide bespreking van profielen, codecs en apparaten

Sommige gebruikers van draadloze koptelefoons merken dat de geluidskwaliteit laag is en de hoge frequenties ontbreken bij het gebruik van de standaard Bluetooth-codec SBC, die door alle audio-apparaten wordt ondersteund. Een veel voorkomende aanbeveling voor verbetering van de geluidskwaliteit is de aanschaf van apparaten en koptelefoons die codecs zoals aptX en LDAC ondersteunen. Deze codecs vereisen licentiekosten, waardoor apparaten die ze ondersteunen duurder zijn.

Het blijkt dat de lage kwaliteit van SBC het gevolg is van kunstmatige beperkingen in de Bluetooth-stacks en de instellingen van de koptelefoons, en deze beperking kan op alle bestaande apparaten worden omzeild door softwarematige aanpassingen aan de smartphone of computer.

Codec SBC

De SBC-codec heeft verschillende parameters die worden afgesproken tijdens de totstandkoming van de verbinding. Onder deze parameters zijn:

  • Aantal en type kanalen: Joint Stereo, Stereo, Dual Channel, Mono;
  • Aantal frequentiebanden: 4 of 8;
  • Aantal blokken in het pakket: 4, 8, 12, 16;
  • Algoritme voor bitverdeling bij kwantisatie: Loudness, SNR;
  • Maximale en minimale waarde van de bitpool die wordt gebruikt bij kwantisatie: doorgaans van 2 tot 53.

Het decoderende apparaat moet elke combinatie van deze parameters ondersteunen. Het coderende apparaat hoeft niet alles te implementeren.
Bestaande Bluetooth-stacks stemmen doorgaans het volgende profiel af: Joint Stereo, 8 banden, 16 blokken, Loudness, bitpool 2..53. Dit profiel codeert 44.1 kHz audio met een bitrate van 328 kbps.
De bitpool-parameter beïnvloedt direct de bitrate binnen een profiel: hoe hoger deze is, hoe hoger de bitrate en daarmee de kwaliteit.
Echter, de bitpool-parameter is niet gebonden aan een specifiek profiel; andere parameters hebben ook in belangrijke mate invloed op de bitrate: type kanalen, aantal frequentiebanden, aantal blokken. De bitrate kan indirect verhoogd worden door niet-standaard profielen af te stemmen, zonder de bitpool te wijzigen.

We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Formule voor het berekenen van SBC-bitrate

Bijvoorbeeld, de Dual Channel-modus codeert kanalen afzonderlijk, waarbij de gehele bitpool voor elk van de kanalen wordt gebruikt. Door het apparaat te dwingen Dual Channel in plaats van Joint Stereo te gebruiken, krijgen we bijna een verdubbelde bitrate bij dezelfde maximale waarde van de bitpool: 617 kb/s.
Naar mijn mening is het gebruik van een niet-gebonden bitpoolwaarde tijdens de onderhandelingen een tekortkoming van de A2DP-standaard, die heeft geleid tot een kunstmatige beperking van de kwaliteit van SBC. Het zou verstandiger zijn om de bitrate in plaats van de bitpool af te stemmen.

Deze vaste waarden voor Bitpool en Bitrate zijn afkomstig uit een tabel met aanbevolen waarden voor gebruik bij hoogwaardige audio. Maar een aanbeveling is geen reden om je tot deze waarden te beperken.

We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

De A2DP-specificatie v1.2, die actief was van 2007 tot 2015, schrijft voor dat alle decoderende apparaten correct moeten omgaan met bitrates tot 512 kb/s:

De decoder van de SNK moet alle mogelijke bitpoolwaarden ondersteunen die niet resulteren in overschrijding van de maximale bitrate. Dit profiel beperkt de beschikbare maximale bitrate tot 320kb/s voor mono en 512kb/s voor twee-kanaalsmodi.

In de nieuwe versie van de specificatie ontbreekt een limiet voor de bitrate. Het wordt aangenomen dat moderne koptelefoons, uitgebracht na 2015 en die EDR ondersteunen, bitrates tot ongeveer 730 kb/s kunnen ondersteunen.

Om de een of andere reden hebben de Bluetooth-stacks van Linux (PulseAudio), Android, Blackberry en macOS die ik heb gecontroleerd kunstmatige beperkingen voor de maximale waarde van de bitpool, die direct van invloed is op de maximale bitrate. Maar dat is niet het grootste probleem, bijna alle koptelefoons beperken ook de maximale bitpoolwaarde tot 53.
Zoals ik al heb kunnen vaststellen, werken de meeste apparaten uitstekend op een gemodificeerde Bluetooth-stack met een bitrate van 551 kb/s, zonder onderbrekingen of ruis. Maar zo'n bitrate zal nooit worden onderhandeld onder normale omstandigheden, op reguliere Bluetooth-stacks.

Pas de Bluetooth-stack aan

In elke Bluetooth-stack die compatibel is met de A2DP-standaard, is er ondersteuning voor de Dual Channel-modus, maar het lijkt niet mogelijk om deze via de interface te activeren.

Laten we een schakelaar aan de interface toevoegen! Ik heb patches gemaakt voor Android 8.1 en Android 9, die volledige ondersteuning voor Dual Channel aan de stack toevoegen, een modus aan het schakelen van modus menu in de ontwikkelaarstools toevoegen, en SBC met Dual Channel behandelen alsof het een extra codec is, zoals aptX, AAC of LDAC (Android noemt dit HD Audio), door een vinkje in de Bluetooth-apparaatinstellingen toe te voegen. Dit is hoe het eruit ziet:

We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Patch voor Android 9
Patch voor Android 8.1

Bij het inschakelen van het vinkje begint Bluetooth-audio met een bitrate van 551 kbit/s, als de hoofdtelefoon een verbinding op 3 mbit/s ondersteunt, of 452 kbit/s, als de hoofdtelefoon alleen 2 mbit/s ondersteunt.

Deze patch is opgenomen in de volgende alternatieve firmware:

  • LineageOS
  • Resurrection Remix
  • crDroid

Waar komen 551 en 452 kbit/s vandaan?

De technologie voor het splitsen van het ether in Bluetooth is bedoeld voor een efficiënte overdracht van grote pakketten met een vaste grootte. Gegevens worden in slots verzonden, het grootste aantal slots dat in één verzending kan worden verzonden is 5. Er zijn ook overdrachtsmodi die 1 of 3 slots gebruiken, maar niet 2 of 4. In 5 slots kunnen tot 679 bytes worden verzonden bij een verbindingssnelheid van 2 mbit/s en tot 1021 bytes bij een snelheid van 3 mbit/s, en in 3 – 367 en 552 bytes respectievelijk.

We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Als we minder gegevens willen verzenden dan 679 of 1021 bytes, maar meer dan 367 of 552 bytes, dan heeft de overdracht nog steeds 5 slots nodig, en de gegevens worden in dezelfde tijd verzonden, wat de efficiëntie van de overdracht vermindert.

We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

SBC in Dual Channel-modus, bij 44100 Hz-audio met parameters Bitpool 38, 16 blokken in het frame, 8 frequentiebanden, codeert audio in frames van 164 bytes, met een bitrate van 452 kbit/s.
Audio moet worden ingekapseld in L2CAP- en AVDTP-overdrachtsprotocollen, die 16 bytes van de nuttige audio-inhoud afnemen.

We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Op deze manier kunnen we in één Bluetooth-overdracht met 5 slots 4 audioframes plaatsen:

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

We hebben 11,7 ms aan audiogegevens in het verzonden pakket weten te proppen, dat in 3,75 ms zal worden verzonden, en we hebben nog 6 ongebruikte bytes in de zending over.
Als je de bitpool iets verhoogt, kunnen 4 audioframes al niet meer in één pakket worden verpakt. We zullen 3 frames per keer moeten verzenden, wat de efficiëntie van de overdracht vermindert, de hoeveelheid verzonden audio per pakket vermindert, en sneller zal leiden tot haperingen in de audio bij slechte radioomstandigheden.

Op dezelfde manier is een bitrate van 551 kbit/s voor EDR 3 Mbit/s gekozen: met Bitpool 47, 16 blokken in het frame, en 8 frequentiebanden, is de framegrootte 200 bytes bij een bitrate van 551 kbit/s. In één pakket passen 5 frames of 14,6 ms muziek.

Het algoritme voor het berekenen van alle parameters van SBC is vrij complex, je kunt gemakkelijk in de war raken als je handmatig rekent, daarom heb ik een interactieve calculator gemaakt voor geïnteresseerden: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Waarom is dit allemaal nodig?

Tegen de gangbare opvatting over de geluidskwaliteit van de aptX-codec, kan deze in sommige bestanden slechtere resultaten opleveren dan SBC met een standaard bitrate van 328 kbit/s.

SBC wijst dynamisch quantiseringsbits toe aan frequentiebanden, werkend volgens het principe van 'van laag naar hoog'. Als de hele bitrate op lage en middelhoge frequenties wordt gebruikt, worden de hoge frequenties 'afgekapt' (in plaats daarvan is er stilte).
aptX quantiseert frequentiebanden met steeds hetzelfde aantal bits, waardoor het een constante bitrate heeft: 352 kbit/s voor 44.1 kHz, 384 kbit/s voor 48 kHz, en het kan geen 'bits verplaatsen' naar de frequenties die het meest behoefte hebben aan die bits. In tegenstelling tot SBC zal aptX geen frequenties 'afkappen', maar zal het ruis van quantisatie toevoegen, waardoor het dynamisch bereik van audio vermindert en soms karakteristieke knettergeluiden introduceert. SBC 'consumeert details' - het gooit de zachtste delen weg.
Gemiddeld, vergeleken met SBC 328k, introduceert aptX minder vervorming in muziek met een breed frequentiebereik, maar bij muziek met een smal frequentiebereik en een breed dynamisch bereik wint SBC 328k soms.

Laten we een specifiek geval bekijken. De spectrogram van een opname van een piano:
We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

De belangrijkste energie ligt in frequenties van 0 tot 4 kHz en gaat door tot 10 kHz.
Het spectrogram van een bestand, gecomprimeerd in aptX, ziet er als volgt uit:
We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

En zo ziet SBC 328k eruit.
We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Het is duidelijk dat SBC 328k periodiek het bereik boven 16 kHz volledig uitschakelde en alle beschikbare bitrate bij de lagere bereiken gebruikte. Echter, aptX introduceerde meer vervormingen in het frequentiespectrum dat hoorbaar is voor het menselijke oor, wat te zien is op de afgetrokken originele spectrogram van de aptX-spectrogram (hoe helderder, hoe meer vervormingen):
We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Terwijl SBC 328k het signaal in het bereik van 0 tot 10 kHz minder verstoorde, en de rest werd afgesneden:
We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Bitrate 485k SBC was sufficient to preserve the entire frequency range without disconnecting bands.
We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

SBC 485k on this track significantly outperforms aptX in the range of 0-15 kHz, and with a smaller, yet noticeable difference — in the 15-22 kHz range (the darker it is, the less distortion there is):
We modificeren de Bluetooth-stack om de geluidskwaliteit van koptelefoons zonder de codecs AAC, aptX en LDAC te verbeteren

Archive of original audio, SBC and aptX.

By switching to high-bitrate SBC, you will get sound that often exceeds aptX on any headphones. On headphones supporting EDR 3 Mbps, a bitrate of 551 kbps delivers sound comparable to aptX HD.

Can it be even more?

The patch for Android also includes an option for further increasing the bitrate for EDR 2 Mbps devices. You can increase the bitrate from 452 kbps to 595 kbps, at the cost of reduced transmission stability in challenging radio conditions.
Just set the variable persist.bluetooth.sbc_hd_higher_bitrate to 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

The patch for extreme bitrate has only been adopted in LineageOS 15.1, but not in 16.0.

Compatibility with devices

SBC Dual Channel is supported by virtually all headphones, speakers, and car head units. This is not surprising — the standard mandates support in any decoding device. There are a few devices that have issues with this mode, but they are isolated cases.
For more details on compatible devices, you can refer to 4pda of xda-developers.

Comparison of sound differences

I created a web service that encodes audio in SBC (as well as aptX and aptX HD) in real time, directly in the browser. With it, you can compare the sound of various SBC profiles and other codecs, without actual audio transmission via Bluetooth, on any wired headphones, speakers, and your favorite music, while also changing encoding parameters during audio playback.
btcodecs.valdikss.org.ru/sbc-encoder

Contact with Android developers

I wrote to many Bluetooth stack developers at Google, asking to consider including patches in the main branch of Android — AOSP, but received no response. My patches in the patch management system Gerrit for Android also went without comments from anyone involved.
Ik zou het op prijs stellen als ik geholpen zou kunnen worden met de ontwikkelaars van Google en de implementatie van SBC HD in Android. De patch in gerrit is al verouderd (dit is een van de vroege revisies) en ik zal deze bijwerken als de ontwikkelaars geïnteresseerd zijn in mijn wijzigingen (het is voor mij moeilijk om deze te updaten, omdat ik geen apparaten heb die compatibel zijn met Android Q).

Conclusie

Smartphonegebruikers met LineageOS, Resurrection Remix en crDroid ROM's kunnen nu al genieten van verbeterde geluidskwaliteit; het enige wat ze hoeven te doen is de optie in de Bluetooth-instellingen te activeren. Linux-gebruikers kunnen ook een verhoogde bit-rate voor SBC krijgen door de patch van Pali Rohár, die naast andere dingen ondersteuning toevoegt voor de codecs aptX, aptX HD en FastStream.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster