We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Voordat u dit artikel leest, raden wij u aan het vorige artikel te lezen: Audio via Bluetooth: maximale details over profielen, codecs en apparaten

Sommige gebruikers van draadloze hoofdtelefoons melden een slechte geluidskwaliteit en een gebrek aan hoge frequenties bij gebruik van de standaard SBC Bluetooth-codec, die door alle audioapparaten wordt ondersteund. Een veel voorkomende aanbeveling voor het verbeteren van het geluid is het kopen van apparaten en hoofdtelefoons die aptX- en LDAC-codecs ondersteunen. Voor deze codecs zijn licentiekosten vereist, waardoor apparaten die deze codecs ondersteunen duurder zijn.

Het blijkt dat de lage kwaliteit van SBC te wijten is aan kunstmatige beperkingen van Bluetooth-stacks en hoofdtelefooninstellingen, en deze beperking kan op elk bestaand apparaat worden omzeild door softwarewijzigingen op een smartphone of computer.

Codec-SBC

De SBC-codec heeft veel verschillende parameters waarover wordt onderhandeld tijdens de fase van het tot stand brengen van de verbinding. Onder hen:

  • 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 het distribueren van bits tijdens kwantisering: Loudness, SNR;
  • De maximale en minimale waarde van de bitpool die wordt gebruikt tijdens de kwantisering (bitpool): meestal van 2 tot 53.

Het decodeerapparaat moet elke combinatie van deze parameters ondersteunen. De encoder implementeert mogelijk niet alles.
Bestaande Bluetooth-stacks komen doorgaans overeen met het volgende profiel: Joint Stereo, 8 bands, 16 blokken, Loudness, bitpool 2..53. Dit profiel codeert 44.1 kHz audio met een bitsnelheid van 328 kbps.
De parameter bitpool heeft rechtstreeks invloed op de bitrate binnen één profiel: hoe hoger deze is, hoe hoger de bitrate en dus de kwaliteit.
De bitpoolparameter is echter niet gebonden aan een specifiek profiel; De bitrate wordt ook grotendeels beïnvloed door andere parameters: type kanalen, aantal frequentiebanden, aantal blokken. U kunt de bitrate indirect verhogen door niet-standaardprofielen af ​​te spreken, zonder de bitpool te wijzigen.

We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Formule voor het berekenen van de SBC-bitsnelheid

De Dual Channel-modus codeert bijvoorbeeld kanalen afzonderlijk, waarbij voor elk kanaal de volledige bitpool wordt gebruikt. Door het apparaat te dwingen Dual Channel te gebruiken in plaats van Joint Stereo, krijgen we bijna de dubbele bitrate met dezelfde maximale bitpoolwaarde: 617 kbps.
Naar mijn mening is het gebruik van een bitpoolwaarde die niet aan een profiel is gekoppeld in de onderhandelingsfase een fout in de A2DP-standaard, die heeft geleid tot een kunstmatige beperking van de SBC-kwaliteit. Het zou logischer zijn om over bitrate te onderhandelen in plaats van over bitpool.

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

We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

De A2DP v1.2-specificatie, die actief was van 2007 tot 2015, vereist dat alle decodeerapparaten correct werken met bitrates tot 512 kbps:

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

In de nieuwe versie van de specificatie is er geen limiet op de bitrate. Geschat wordt dat moderne hoofdtelefoons die na 2015 zijn uitgebracht en die EDR ondersteunen, bitsnelheden tot ≈730 kbps kunnen ondersteunen.

Om de een of andere reden hebben de Linux (PulseAudio), Android, Blackberry en macOS Bluetooth-stacks die ik heb getest kunstmatige limieten voor de maximale waarde van de bitpool-parameter, die rechtstreeks van invloed is op de maximale bitsnelheid. Maar dit is niet het grootste probleem; vrijwel alle hoofdtelefoons beperken ook de maximale bitpoolwaarde tot 53.
Zoals ik al heb gezien werken de meeste apparaten perfect op een aangepaste Bluetooth-stack met een bitrate van 551 kbps, zonder onderbrekingen of gekraak. Maar een dergelijke bitrate zal onder normale omstandigheden nooit consistent zijn, op reguliere Bluetooth-stacks.

De Bluetooth-stack wijzigen

Elke Bluetooth-stack die compatibel is met de A2DP-standaard ondersteunt de Dual Channel-modus, maar het is niet mogelijk 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 Dual Channel-ondersteuning aan de stapel toevoegen, een modus toevoegen aan het moduswisselmenu in de dev-tools en Dual Channel-compatibele SBC's behandelen alsof ze een extra codec zijn, zoals aptX , AAC of LDAC (Android noemt dit HD Audio) door een vinkje toe te voegen aan de Bluetooth-apparaatinstellingen. Dit is hoe het eruit ziet:

We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Patch voor Android 9
Patch voor Android 8.1

Wanneer het selectievakje is geactiveerd, wordt Bluetooth-audio met een bitsnelheid verzonden 551 kbps, als de hoofdtelefoon een verbindingssnelheid van 3 Mbit/s ondersteunt, of 452 kbps, als de hoofdtelefoon slechts 2 Mbit/s ondersteunt.

Deze patch is opgenomen in de volgende alternatieve firmwares:

  • LineageOS
  • Resurrection Remix
  • crDroid

Waar komen 551 en 452 kbit/s vandaan?

Bluetooth-air-sharing-technologie is ontworpen om grote pakketten met een vast formaat efficiënt te verzenden. Gegevensoverdracht vindt plaats in slots, het grootste aantal slots dat bij één overdracht wordt verzonden is 5. Er zijn ook overdrachtsmodi die 1 of 3 slots gebruiken, maar niet 2 of 4. In 5 slots kunt u tot 679 bytes overbrengen met een verbindingssnelheid van 2 Mbit/s en maximaal 1021 bytes bij een snelheid van 3 Mbit/s, en respectievelijk 3 - 367 en 552 bytes.

We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Als we minder gegevens willen overbrengen dan 679 of 1021 bytes, maar meer dan 367 of 552 bytes, zal de overdracht nog steeds 5 slots in beslag nemen en zullen de gegevens in dezelfde tijd worden overgedragen, wat de overdrachtsefficiëntie vermindert.

We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

SBC in Dual Channel-modus, bij 44100 Hz audio met Bitpool 38 parameters, 16 blokken per frame, 8 frequentiebereiken, codeert audio in 164 byte frames, met een bitsnelheid van 452 kbps.
Audio moet worden ingekapseld in L2CAP- en AVDTP-overdrachtsprotocollen, die 16 bytes uit de audiopayload nemen.

We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Eén Bluetooth-transmissie met 5 slots kan dus 4 audioframes bevatten:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (заголовок SBC) - (164*4) = 6

We passen 11.7 ms aan audiogegevens in het pakket dat wordt verzonden, dat in 3.75 ms wordt verzonden, en we hebben nog 6 ongebruikte bytes in het pakket.
Als u de bitpool een beetje verhoogt, is het niet langer mogelijk om 4 audioframes in één pakket te verpakken. U zult 3 frames tegelijk moeten verzenden, wat de transmissie-efficiëntie vermindert, de hoeveelheid verzonden audio per frame vermindert en sneller tot stotteren van het geluid leidt bij slechte radioomstandigheden.

Op dezelfde manier werd voor EDR 551 Mbit/s een bitrate van 3 kbit/s geselecteerd: met Bitpool 47, 16 blokken per frame, 8 frequentiebereiken, bedraagt ​​de framegrootte 200 bytes, met een bitrate van 551 kbit/s. Eén pakket bevat 5 frames of 14.6 ms muziek.

Het algoritme voor het berekenen van alle SBC-parameters is behoorlijk complex. Je kunt gemakkelijk in de war raken als je handmatig telt, dus heb ik een interactieve rekenmachine gemaakt om geïnteresseerden te helpen: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Waarom is dit allemaal nodig?

In tegenstelling tot wat vaak wordt gedacht over de geluidskwaliteit van de aptX-codec, kan deze bij sommige bestanden slechtere resultaten opleveren dan SBC met een standaard bitsnelheid van 328 kbps.

De SBC wijst kwantiseringsbits dynamisch toe aan frequentiebanden op basis van laag naar hoog. Als alle bitrates zijn gebruikt voor de lage en middenfrequenties, worden de hoge frequenties “afgesneden” (in plaats daarvan zal er stilte zijn).
aptX kwantiseert frequentiebanden met hetzelfde aantal bits de hele tijd, en daarom heeft het een constante bitrate: 352 kbps voor 44.1 kHz, 384 kbps voor 48 kHz, en kan het niet "bit-shiften" naar de frequenties die deze het meest nodig hebben . In tegenstelling tot SBC zal aptX de frequenties niet "afsnijden", maar er kwantiseringsruis aan toevoegen, waardoor het dynamische bereik van de audio wordt verkleind en soms kenmerkend gekraak wordt geïntroduceerd. SBC "eet details" - verwijdert de stilste gebieden.
Gemiddeld introduceert aptX vergeleken met de SBC 328k minder vervorming bij muziek met een breed frequentiebereik, maar bij muziek met een smal frequentiebereik en een groot dynamisch bereik wint de SBC 328k soms.

Laten we een speciaal geval bekijken. Spectrogram van een pianospelopname:
We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

De belangrijkste energie ligt in frequenties van 0 tot 4 kHz, en loopt door tot 10 kHz.
Het spectrogram van een bestand gecomprimeerd in aptX ziet er als volgt uit:
We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

En zo ziet SBC 328k eruit.
We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Het is duidelijk dat de SBC 328k periodiek het bereik boven 16 kHz volledig uitschakelde en alle beschikbare bitrates besteedde aan bereiken onder deze waarde. aptX introduceerde echter meer vervorming in het frequentiespectrum dat hoorbaar is voor het menselijk oor, zoals te zien is in het afgetrokken originele spectrogram van het aptX-spectrogram (hoe helderder, hoe meer vervorming):
We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Terwijl de SBC 328k het signaal minder bedierf in het bereik van 0 tot 10 kHz, en de rest afsneed:
We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

De bitrate van 485k van de SBC was voldoende om het volledige frequentiebereik te behouden, zonder banden uit te schakelen.
We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

De SBC 485k ligt op dit spoor aanzienlijk voor op aptX in het bereik van 0-15 kHz, met een kleiner maar nog steeds merkbaar verschil van 15-22 kHz (hoe donkerder, hoe minder vervorming):
We passen de Bluetooth-stack aan om het geluid op hoofdtelefoons zonder AAC-, aptX- en LDAC-codecs te verbeteren

Archief van originele audio, SBC en aptX.

Door over te schakelen naar een SBC met hoge bitsnelheid, krijg je op elke hoofdtelefoon audio die vaak beter is dan aptX. Op hoofdtelefoons die 3 Mbps EDR-connectiviteit ondersteunen, produceert een bitsnelheid van 551 kbps geluid dat vergelijkbaar is met aptX HD.

Kun je nog meer doen?

De Android-patch bevat ook een optie om de bitrate voor 2 Mbps EDR-apparaten verder te verhogen. U kunt de bitsnelheid verhogen van 452 kbit/s naar 595 kbit/s, wat ten koste gaat van de transmissiestabiliteit onder moeilijke radioomstandigheden.
Het volstaat om de variabele persistent.bluetooth.sbc_hd_higher_bitrate op 1 in te stellen:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

De extreme bitrate-patch is tot nu toe alleen overgenomen in LineageOS 15.1, maar niet in 16.0.

Compatibiliteit van apparaten

SBC Dual Channel wordt ondersteund door vrijwel alle hoofdtelefoons, luidsprekers en autoradio's. Dit is geen wonder: de standaard vereist ondersteuning in alle decodeerapparaten. Er is een klein aantal apparaten waarop deze modus problemen veroorzaakt, maar dit zijn geïsoleerde gevallen.
Meer details over compatibele apparaten vindt u op W4bsitXNUMX-dns.com of xda-developers.

Vergelijking van geluidsverschillen

Ik heb een webservice gemaakt die audio in realtime codeert naar SBC (evenals aptX en aptX HD), rechtstreeks in de browser. Hiermee kun je het geluid van verschillende SBC-profielen en andere codecs vergelijken, zonder daadwerkelijk audio via Bluetooth te verzenden, op een bedrade hoofdtelefoon, luidsprekers en je favoriete muziek, en ook de coderingsparameters rechtstreeks wijzigen terwijl je audio afspeelt.
btcodecs.valdikss.org.ru/sbc-encoder

Neem contact op met Android-ontwikkelaars

Ik schreef naar veel Bluetooth-stack-ontwikkelaars bij Google met het verzoek om patches op te nemen in de hoofdtak van Android - AOSP, maar ik kreeg geen enkel antwoord. Mijn patches binnen Gerrit patchsysteem voor Android bleef ook zonder commentaar van alle betrokkenen.
Ik zou het fijn vinden als ik hulp zou kunnen krijgen om in contact te komen met de ontwikkelaars van Google en SBC HD naar Android te brengen. De patch in Gerrit is al verouderd (dit is een van de eerste herzieningen) en ik zal deze bijwerken als de ontwikkelaars geïnteresseerd zijn in mijn wijzigingen (het is niet gemakkelijk voor mij om deze bij te werken, ik heb geen apparaten die compatibel zijn met Android Q ).

Conclusie

Gebruikers van smartphones met LineageOS, Resurrection Remix en crDroid-firmware kunnen nu genieten van een verbeterde geluidskwaliteit. Activeer gewoon de optie in de Bluetooth-apparaatinstellingen. Linux-gebruikers kunnen ook een hogere SBC-bitsnelheid krijgen door te installeren patch van Pali Rohar, die onder meer ondersteuning toevoegt voor aptX-, aptX HD- en FastStream-codecs.

Bron: www.habr.com

Voeg een reactie