Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Før du læser denne artikel, anbefales det, at du læser den forrige artikel: Lyd via Bluetooth: maksimale detaljer om profiler, codecs og enheder

Nogle trådløse hovedtelefonbrugere rapporterer om dårlig lydkvalitet og mangel på høje frekvenser, når de bruger standard SBC Bluetooth-codec, som understøttes af alle lydenheder. En almindelig anbefaling til forbedring af lyden er at købe enheder og hovedtelefoner, der understøtter aptX- og LDAC-codecs. Disse codecs kræver licensgebyrer, så enheder, der understøtter dem, er dyrere.

Det viser sig, at den lave kvalitet af SBC skyldes kunstige begrænsninger af Bluetooth-stabler og hovedtelefonindstillinger, og denne begrænsning kan omgås på alle eksisterende enheder gennem softwareændringer til en smartphone eller computer.

Codec SBC

SBC-codec'et har mange forskellige parametre, der forhandles under opsætningsfasen for forbindelsen. Blandt dem:

  • Antal og type af kanaler: Joint Stereo, Stereo, Dual Channel, Mono;
  • Antal frekvensbånd: 4 eller 8;
  • Antal blokke i pakken: 4, 8, 12, 16;
  • Algoritme til fordeling af bits under kvantisering: Loudness, SNR;
  • Den maksimale og minimale værdi af puljen af ​​bit brugt under kvantisering (bitpool): normalt fra 2 til 53.

Afkodningsenheden skal understøtte enhver kombination af disse parametre. Indkoderen implementerer muligvis ikke alt.
Eksisterende Bluetooth-stabler er typisk enige om følgende profil: Joint Stereo, 8 bånd, 16 blokke, Loudness, bitpool 2..53. Denne profil koder 44.1 kHz lyd med en bitrate på 328 kbps.
Bitpool-parameteren påvirker direkte bithastigheden inden for én profil: Jo højere den er, jo højere bithastighed og dermed kvaliteten.
Bitpool-parameteren er dog ikke bundet til en specifik profil; Bithastigheden er også i høj grad påvirket af andre parametre: type kanaler, antal frekvensbånd, antal blokke. Du kan øge bithastigheden indirekte, ved at aftale ikke-standard profiler, uden at ændre bitpoolen.

Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Formel til beregning af SBC bitrate

For eksempel koder Dual Channel-tilstand kanaler separat ved at bruge hele bitpuljen for hver kanal. Ved at tvinge enheden til at bruge Dual Channel i stedet for Joint Stereo, får vi næsten det dobbelte af bithastigheden med den samme maksimale bitpoolværdi: 617 kbps.
Efter min mening er brugen af ​​en bitpool-værdi, der ikke er bundet til en profil på forhandlingsstadiet, en fejl i A2DP-standarden, hvilket førte til en kunstig begrænsning af SBC-kvaliteten. Det ville give mere mening at forhandle bitrate frem for bitpool.

Disse faste Bitpool- og Bitrate-værdier stammer fra en tabel med anbefalede værdier til brug for lyd af høj kvalitet. Men en anbefaling er ikke en grund til at begrænse sig til disse værdier.

Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

A2DP v1.2-specifikationen, som var aktiv fra 2007 til 2015, kræver, at alle afkodningsenheder fungerer korrekt med bithastigheder på op til 512 kbps:

SNK'ens dekoder skal understøtte alle mulige bitpool-værdier, der ikke resulterer i overskridelse af den maksimale bithastighed. Denne profil begrænser den tilgængelige maksimale bithastighed til 320 kb/s for mono og 512 kb/s for to-kanals tilstande.

I den nye version af specifikationen er der ingen begrænsning på bithastigheden. Det anslås, at moderne hovedtelefoner udgivet efter 2015, der understøtter EDR, kan understøtte bithastigheder op til ≈730 kbps.

Af en eller anden grund har Linux (PulseAudio), Android, Blackberry og macOS Bluetooth-stakkene, jeg testede, kunstige grænser for den maksimale værdi af bitpool-parameteren, som direkte påvirker den maksimale bitrate. Men dette er ikke det største problem; næsten alle hovedtelefoner begrænser også den maksimale bitpool-værdi til 53.
Som jeg allerede har set, fungerer de fleste enheder perfekt på en modificeret Bluetooth-stak med en bitrate på 551 kbps, uden afbrydelser eller krakeleringer. Men sådan en bitrate vil aldrig være konsistent under normale forhold, på almindelige Bluetooth-stakke.

Ændring af Bluetooth-stakken

Enhver Bluetooth-stak, der er kompatibel med A2DP-standarden, understøtter Dual Channel-tilstand, men det er ikke muligt at aktivere den fra grænsefladen.

Lad os tilføje en skifte til grænsefladen! Jeg har lavet patches til Android 8.1 og Android 9, der tilføjer fuld Dual Channel-understøttelse til stakken, tilføjer en tilstand til tilstandsskiftemenuen i dev-værktøjerne og behandler Dual Channel-aktiverede SBC'er, som om de var et ekstra codec som aptX , AAC eller LDAC (Android kalder dette HD Audio) ved at føje et flueben til Bluetooth-enhedsindstillingerne. Sådan ser det ud:

Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Patch til Android 9
Patch til Android 8.1

Når afkrydsningsfeltet er aktiveret, begynder Bluetooth-lyd at blive transmitteret med en bithastighed 551 kbps, hvis hovedtelefonerne understøtter en forbindelseshastighed på 3 Mbit/s, eller 452 kbps, hvis hovedtelefonerne kun understøtter 2 Mbit/s.

Denne patch er inkluderet i følgende alternative firmwares:

  • LineageOS
  • Opstandelsens remix
  • crDroid

Hvor kom 551 og 452 kbit/s fra?

Bluetooth luftdelingsteknologi er designet til effektivt at transmittere store pakker i fast størrelse. Dataoverførsel sker i slots, det største antal slots sendt i en overførsel er 5. Der er også overførselstilstande, der bruger 1 eller 3 slots, men ikke 2 eller 4. I 5 slots kan du overføre op til 679 bytes med en forbindelseshastighed på 2 Mbit/s og op til 1021 bytes ved en hastighed på 3 Mbit/s, og ved henholdsvis 3 - 367 og 552 bytes.

Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Hvis vi ønsker at overføre mindre data end 679 eller 1021 bytes, men mere end 367 eller 552 bytes, vil overførslen stadig tage 5 slots, og dataene vil blive overført på samme tid, hvilket reducerer overførselseffektiviteten.

Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

SBC i Dual Channel-tilstand, ved 44100 Hz lyd med Bitpool 38 parametre, 16 blokke pr. ramme, 8 frekvensområder, koder lyd til 164 byte frames, med en bitrate på 452 kbps.
Lyden skal være indkapslet i L2CAP- og AVDTP-overførselsprotokoller, som tager 16 bytes fra lydens nyttelast.

Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

En Bluetooth-transmission med 5 slots kan således rumme 4 lydrammer:

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

Vi passer 11.7 ms lyddata ind i pakken, der sendes, som vil blive transmitteret på 3.75 ms, og vi har 6 ubrugte bytes tilbage i pakken.
Hvis du hæver bitpoolen lidt, vil det ikke længere være muligt at pakke 4 lydrammer i én pakke. Du bliver nødt til at sende 3 frames ad gangen, hvilket reducerer transmissionseffektiviteten, reducerer mængden af ​​transmitteret lyd pr. frame og vil hurtigere føre til lydstamming under dårlige radioforhold.

På samme måde blev der valgt en bitrate på 551 kbit/s for EDR 3 Mbit/s: med Bitpool 47, 16 blokke pr. frame, 8 frekvensområder, er billedstørrelsen 200 bytes, med en bitrate på 551 kbit/s. En pakke indeholder 5 billeder eller 14.6 ms musik.

Algoritmen til at beregne alle SBC-parametre er ret kompleks, du kan nemt blive forvirret, hvis du tæller manuelt, så jeg lavede en interaktiv lommeregner til at hjælpe interesserede: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Hvorfor er alt dette nødvendigt?

I modsætning til populær tro om lydkvaliteten af ​​aptX-codec'et, kan det på nogle filer give resultater, der er dårligere end SBC med en standardbithastighed på 328 kbps.

SBC'en tildeler dynamisk kvantiseringsbit til frekvensbånd på lav-til-høj-basis. Hvis al bithastigheden blev brugt til de lave og mellemste frekvenser, vil de høje frekvenser blive "afskåret" (der vil være stilhed i stedet).
aptX kvantiserer frekvensbånd med det samme antal bit hele tiden, hvorfor det har en konstant bitrate: 352 kbps for 44.1 kHz, 384 kbps for 48 kHz, og det kan ikke "bit-shift" til de frekvenser, der har mest brug for dem . I modsætning til SBC vil aptX ikke "skære" frekvenser, men tilføje kvantiseringsstøj til dem, reducere det dynamiske område af lyden og nogle gange introducere karakteristisk crackling. SBC "spiser detaljer" - kasserer de mest stille områder.
I gennemsnit, sammenlignet med SBC 328k, introducerer aptX mindre forvrængning i musik med et bredt frekvensområde, men i musik med et smalt frekvensområde og et bredt dynamisk område vinder SBC 328k nogle gange.

Lad os overveje et særligt tilfælde. Spektrogram af en optagelse, der spiller klaver:
Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Hovedenergien ligger i frekvenser fra 0 til 4 kHz, og fortsætter op til 10 kHz.
Spektrogrammet for en fil komprimeret i aptX ser sådan ud:
Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Og sådan ser SBC 328k ud.
Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Det kan ses, at SBC 328k periodisk helt slukkede for området over 16 kHz og brugte al den tilgængelige bitrate på områder under denne værdi. Imidlertid introducerede aptX mere forvrængning i frekvensspektret, der kunne høres for det menneskelige øre, som det kan ses i det subtraherede originale spektrogram fra aptX-spektrogrammet (jo lysere, jo mere forvrængning):
Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Mens SBC 328k spolerede signalet mindre i området fra 0 til 10 kHz og afbrød resten:
Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

SBC'ens 485k bitrate var nok til at bevare hele frekvensområdet uden at deaktivere bånd.
Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

SBC 485k er væsentligt foran aptX på dette spor i området 0-15 kHz, og med en mindre, men stadig mærkbar forskel - i 15-22 kHz (jo mørkere, jo mindre forvrængning):
Vi ændrer Bluetooth-stakken for at forbedre lyden på hovedtelefoner uden AAC, aptX og LDAC codecs

Arkiv af original lyd, SBC og aptX.

Ved at skifte til en SBC med høj bitrate får du lyd, der ofte slår aptX på enhver hovedtelefon. På hovedtelefoner, der understøtter 3 Mbps EDR-forbindelse, producerer en bitrate på 551 kbps lyd, der kan sammenlignes med aptX HD.

Kan du gøre endnu mere?

Android-patchen inkluderer også en mulighed for yderligere at øge bithastigheden for 2 Mbps EDR-enheder. Du kan øge bithastigheden fra 452 kbit/s til 595 kbit/s på bekostning af at reducere transmissionsstabiliteten under vanskelige radioforhold.
Det er nok at indstille persist.bluetooth.sbc_hd_higher_bitrate-variablen til 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Den ekstreme bitrate-patch er indtil videre kun blevet vedtaget i LineageOS 15.1, men ikke i 16.0.

Enhedskompatibilitet

SBC Dual Channel understøttes af næsten alle hovedtelefoner, højttalere og bilhovedenheder. Dette er ikke underligt - standarden kræver sin støtte i alle afkodningsenheder. Der er et lille antal enheder, hvor denne tilstand forårsager problemer, men disse er isolerede tilfælde.
Flere detaljer om kompatible enheder kan findes på 4pda eller XDA-udviklere.

Sammenligning af lydforskelle

Jeg lavede en webtjeneste, der koder lyd til SBC (samt aptX og aptX HD) i realtid, lige i browseren. Med den kan du sammenligne lyden af ​​forskellige SBC-profiler og andre codecs, uden egentlig at overføre lyd via Bluetooth, på nogen kablede hovedtelefoner, højttalere og din yndlingsmusik, og også ændre kodningsparametre direkte, mens du afspiller lyd.
btcodecs.valdikss.org.ru/sbc-encoder

Kontakt Android-udviklere

Jeg skrev til mange Bluetooth-stackudviklere hos Google og bad dem overveje at inkludere patches i Android-hovedgrenen - AOSP, men modtog ikke et eneste svar. Mine plastre ind Gerrit patch system til Android forblev også uden kommentarer fra nogen involveret.
Jeg ville blive glad, hvis jeg kunne få lidt hjælp til at komme i kontakt med udviklerne hos Google og bringe SBC HD til Android. Patchen i gerrit er allerede forældet (dette er en af ​​de tidlige revisioner), og jeg vil opdatere den, hvis udviklerne er interesserede i mine ændringer (det er ikke nemt for mig at opdatere det, jeg har ikke enheder kompatible med Android Q ).

Konklusion

Brugere af smartphones med LineageOS, Resurrection Remix og crDroid-firmware kan nyde forbedret lydkvalitet lige nu, bare aktiver indstillingen i Bluetooth-enhedsindstillingerne. Linux-brugere kan også få øget SBC bitrate ved at installere patch fra Pali Rohar, som blandt andet tilføjer understøttelse af aptX, aptX HD og FastStream codecs.

Kilde: www.habr.com

Tilføj en kommentar