Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Før du leser denne artikkelen, anbefales det at du leser den forrige artikkelen: Lyd via Bluetooth: maksimal informasjon om profiler, kodeker og enheter

Noen brukere av trådløse hodetelefoner rapporterer dårlig lydkvalitet og mangel på høye frekvenser når de bruker standard SBC Bluetooth-kodeken, som støttes av alle lydenheter. En vanlig anbefaling for å forbedre lyden er å kjøpe enheter og hodetelefoner som støtter aptX- og LDAC-kodeker. Disse kodekene krever lisensavgifter, så enheter som støtter dem er dyrere.

Det viser seg at den lave kvaliteten på SBC skyldes kunstige begrensninger av Bluetooth-stabler og hodetelefoninnstillinger, og denne begrensningen kan omgås på alle eksisterende enheter gjennom programvareendringer til en smarttelefon eller datamaskin.

Codec SBC

SBC-kodeken har mange forskjellige parametere som forhandles under tilkoblingsoppsettfasen. Blant dem:

  • Antall og type kanaler: Joint Stereo, Stereo, Dual Channel, Mono;
  • Antall frekvensbånd: 4 eller 8;
  • Antall blokker i pakken: 4, 8, 12, 16;
  • Algoritme for fordeling av biter under kvantisering: Loudness, SNR;
  • Maksimums- og minimumsverdien til poolen av biter som brukes under kvantisering (bitpool): vanligvis fra 2 til 53.

Dekodingsenheten må støtte enhver kombinasjon av disse parameterne. Enkoderen implementerer kanskje ikke alt.
Eksisterende Bluetooth-stabler er vanligvis enige om følgende profil: Joint Stereo, 8 bånd, 16 blokker, Loudness, bitpool 2..53. Denne profilen koder for 44.1 kHz lyd med en bitrate på 328 kbps.
Bitpool-parameteren påvirker direkte bithastigheten innenfor én profil: jo høyere den er, desto høyere bitrate, og dermed kvaliteten.
Bitpool-parameteren er imidlertid ikke knyttet til en bestemt profil; Bithastigheten er også i stor grad påvirket av andre parametere: type kanaler, antall frekvensbånd, antall blokker. Du kan øke bithastigheten indirekte, ved å avtale ikke-standard profiler, uten å endre bitpoolen.

Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Formel for beregning av SBC-bithastighet

Dual Channel-modus koder for eksempel kanaler separat, og bruker hele bitpoolen for hver kanal. Ved å tvinge enheten til å bruke Dual Channel i stedet for Joint Stereo, får vi nesten dobbel bitrate med samme maksimale bitpool-verdi: 617 kbps.
Etter min mening er bruken av en bitpool-verdi som ikke er knyttet til en profil på forhandlingsstadiet en feil i A2DP-standarden, noe som førte til en kunstig begrensning av SBC-kvalitet. Det ville være mer fornuftig å forhandle om bitrate i stedet for bitpool.

Disse faste Bitpool- og Bitrate-verdiene stammer fra en tabell med anbefalte verdier for bruk for høykvalitetslyd. Men en anbefaling er ikke en grunn til å begrense deg til disse verdiene.

Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

A2DP v1.2-spesifikasjonen, som var aktiv fra 2007 til 2015, krever at alle dekodingsenheter fungerer korrekt med bithastigheter på opptil 512 kbps:

Dekoderen til SNK skal støtte alle mulige bitpool-verdier som ikke resulterer i overskridelse av maksimal bithastighet. Denne profilen begrenser den tilgjengelige maksimale bithastigheten til 320 kb/s for mono, og 512 kb/s for to-kanals moduser.

I den nye versjonen av spesifikasjonen er det ingen begrensning på bithastigheten. Det er anslått at moderne hodetelefoner utgitt etter 2015 som støtter EDR kan støtte bithastigheter på opptil ≈730 kbps.

Av en eller annen grunn har Linux (PulseAudio), Android, Blackberry og macOS Bluetooth-stakkene jeg testet kunstige grenser for maksimalverdien til bitpool-parameteren, som direkte påvirker den maksimale bithastigheten. Men dette er ikke det største problemet; nesten alle hodetelefoner begrenser også den maksimale bitpool-verdien til 53.
Som jeg allerede har sett, fungerer de fleste enheter perfekt på en modifisert Bluetooth-stabel med en bitrate på 551 kbps, uten avbrudd eller knitring. Men en slik bitrate vil aldri være konsistent under normale forhold, på vanlige Bluetooth-stabler.

Endre Bluetooth-stakken

Enhver Bluetooth-stabel som er kompatibel med A2DP-standarden har støtte for Dual Channel-modus, men det er ikke mulig å aktivere den fra grensesnittet.

La oss legge til en bryter i grensesnittet! Jeg har laget patcher for Android 8.1 og Android 9 som legger til full Dual Channel-støtte til stabelen, legger til en modus til modusvekslingsmenyen i utviklerverktøyene og behandler Dual Channel-aktiverte SBC-er som om de var en ekstra kodek som aptX , AAC eller LDAC (Android kaller dette HD Audio) ved å legge til et hakemerke for Bluetooth-enhetsinnstillingene. Slik ser det ut:

Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Patch for Android 9
Patch for Android 8.1

Når avmerkingsboksen er aktivert, begynner Bluetooth-lyd å overføres med en bithastighet 551 kbps, hvis hodetelefonene støtter en tilkoblingshastighet på 3 Mbit/s, eller 452 kbps, hvis hodetelefonene kun støtter 2 Mbit/s.

Denne oppdateringen er inkludert i følgende alternative fastvare:

  • LineageOS
  • Oppstandelsens remix
  • crDroid

Hvor kom 551 og 452 kbit/s fra?

Bluetooth luftdelingsteknologi er designet for å effektivt overføre store pakker med fast størrelse. Dataoverføring skjer i spor, det største antallet spor sendt i en overføring er 5. Det finnes også overføringsmoduser som bruker 1 eller 3 spor, men ikke 2 eller 4. I 5 spor kan du overføre opptil 679 byte med en tilkoblingshastighet på 2 Mbit/s og opptil 1021 byte ved en hastighet på 3 Mbit/s, og ved henholdsvis 3 - 367 og 552 byte.

Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Hvis vi ønsker å overføre mindre data enn 679 eller 1021 byte, men mer enn 367 eller 552 byte, vil overføringen fortsatt ta 5 spor og dataene overføres på samme tid, noe som reduserer overføringseffektiviteten.

Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

SBC i Dual Channel-modus, ved 44100 Hz lyd med Bitpool 38 parametere, 16 blokker per ramme, 8 frekvensområder, koder lyd til 164 byte rammer, med en bitrate på 452 kbps.
Lyd må være innkapslet i L2CAP- og AVDTP-overføringsprotokoller, som tar 16 byte fra lydens nyttelast.

Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Dermed kan én Bluetooth-overføring med 5 spor romme 4 lydrammer:

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

Vi passer 11.7 ms med lyddata i pakken som sendes, som sendes på 3.75 ms, og vi har 6 ubrukte byte igjen i pakken.
Hvis du hever bitpoolen litt, vil det ikke lenger være mulig å pakke 4 lydrammer i en pakke. Du må sende 3 rammer om gangen, noe som reduserer overføringseffektiviteten, reduserer mengden lyd som sendes per ramme, og vil raskere føre til lydstamming under dårlige radioforhold.

På samme måte ble en bitrate på 551 kbit/s valgt for EDR 3 Mbit/s: med Bitpool 47, 16 blokker per ramme, 8 frekvensområder, er rammestørrelsen 200 byte, med en bitrate på 551 kbit/s. Én pakke inneholder 5 bilder eller 14.6 ms musikk.

Algoritmen for å beregne alle SBC-parametere er ganske kompleks, du kan lett bli forvirret hvis du teller manuelt, så jeg laget en interaktiv kalkulator for å hjelpe de som er interessert: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Hvorfor er alt dette nødvendig?

I motsetning til hva man tror om lydkvaliteten til aptX-kodeken, kan den på enkelte filer gi resultater dårligere enn SBC med en standard bitrate på 328 kbps.

SBC allokerer kvantiseringsbiter dynamisk til frekvensbånd på lav-til-høy-basis. Hvis all bithastigheten ble brukt for de lave og mellomste frekvensene, vil de høye frekvensene bli "kuttet av" (det blir stillhet i stedet).
aptX kvantiserer frekvensbånd med samme antall biter hele tiden, og det er grunnen til at den har en konstant bitrate: 352 kbps for 44.1 kHz, 384 kbps for 48 kHz, og den kan ikke "bit-shifte" til de frekvensene som trenger dem mest . I motsetning til SBC, vil ikke aptX "kutte" frekvenser, men vil legge til kvantiseringsstøy til dem, redusere det dynamiske området til lyden, og noen ganger introdusere karakteristisk knitring. SBC "spiser detaljer" - forkaster de roligste områdene.
I gjennomsnitt, sammenlignet med SBC 328k, introduserer aptX mindre forvrengning i musikk med et bredt frekvensområde, men i musikk med et smalt frekvensområde og et bredt dynamisk område vinner noen ganger SBC 328k.

La oss vurdere et spesielt tilfelle. Spektrogram av et pianospillende opptak:
Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Hovedenergien ligger i frekvenser fra 0 til 4 kHz, og fortsetter opp til 10 kHz.
Spektrogrammet til en fil komprimert i aptX ser slik ut:
Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Og slik ser SBC 328k ut.
Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Det kan sees at SBC 328k med jevne mellomrom slo fullstendig av området over 16 kHz, og brukte all tilgjengelig bitrate på områder under denne verdien. Imidlertid introduserte aptX mer forvrengning i frekvensspekteret som var hørbart for det menneskelige øret, som kan sees i det subtraherte originale spektrogrammet fra aptX-spektrogrammet (jo lysere, jo mer forvrengning):
Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Mens SBC 328k ødela signalet mindre i området fra 0 til 10 kHz, og kuttet av resten:
Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

485k bithastigheten til SBC var nok til å bevare hele frekvensområdet, uten å deaktivere bånd.
Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

SBC 485k er betydelig foran aptX på dette sporet i området 0-15 kHz, med en mindre, men fortsatt merkbar forskjell på 15-22 kHz (jo mørkere, jo mindre forvrengning):
Endre Bluetooth-stabelen for å forbedre lyden på hodetelefoner uten AAC-, aptX- og LDAC-kodeker

Arkiv av original lyd, SBC og aptX.

Ved å bytte til en SBC med høy bitrate får du lyd som ofte slår aptX på alle hodetelefoner. På hodetelefoner som støtter 3 Mbps EDR-tilkobling, produserer en bitrate på 551 kbps lyd som kan sammenlignes med aptX HD.

Kan du gjøre enda mer?

Android-oppdateringen inkluderer også et alternativ for å øke bithastigheten ytterligere for 2 Mbps EDR-enheter. Du kan øke bithastigheten fra 452 kbit/s til 595 kbit/s, på bekostning av å redusere overføringsstabiliteten under vanskelige radioforhold.
Det er nok å sette persist.bluetooth.sbc_hd_higher_bitrate-variabelen til 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Den ekstreme bitrate-oppdateringen har så langt bare blitt tatt i bruk i LineageOS 15.1, men ikke i 16.0.

Enhetskompatibilitet

SBC Dual Channel støttes av nesten alle hodetelefoner, høyttalere og bilhodeenheter. Dette er ikke rart - standarden krever støtte i alle dekodingsenheter. Det er et lite antall enheter der denne modusen forårsaker problemer, men dette er isolerte tilfeller.
Mer informasjon om kompatible enheter finner du på W4bsitXNUMX-dns.com eller XDA-utviklere.

Sammenligning av lydforskjeller

Jeg laget en webtjeneste som koder lyd til SBC (samt aptX og aptX HD) i sanntid, rett i nettleseren. Med den kan du sammenligne lyden til forskjellige SBC-profiler og andre kodeker, uten å overføre lyd via Bluetooth, på kablede hodetelefoner, høyttalere og favorittmusikken din, og også endre kodingsparametere direkte mens du spiller av lyd.
btcodecs.valdikss.org.ru/sbc-encoder

Kontakt Android-utviklere

Jeg skrev til mange Bluetooth-stackutviklere hos Google og ba dem vurdere å inkludere oppdateringer i Android-hovedgrenen - AOSP, men fikk ikke et eneste svar. Plastrene mine inn Gerrit patchsystem for Android forble også uten kommentarer fra noen involverte.
Jeg ville bli glad om jeg kunne få litt hjelp til å komme i kontakt med utviklerne hos Google og bringe SBC HD til Android. Patchen i gerrit er allerede utdatert (dette er en av de tidlige revisjonene), og jeg vil oppdatere den hvis utviklerne er interessert i endringene mine (det er ikke lett for meg å oppdatere det, jeg har ikke enheter som er kompatible med Android Q ).

Konklusjon

Brukere av smarttelefoner med LineageOS, Resurrection Remix og crDroid-fastvare kan nyte forbedret lydkvalitet akkurat nå, bare aktiver alternativet i Bluetooth-enhetsinnstillingene. Linux-brukere kan også få økt SBC-bithastighet ved å installere patch fra Pali Rohar, som blant annet legger til støtte for aptX, aptX HD og FastStream-kodeker.

Kilde: www.habr.com

Legg til en kommentar