Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Innan du lÀser denna artikel rekommenderas det att du bekantar dig med den föregÄende artikeln: Ljud via Bluetooth: sÄ detaljerat som möjligt om profiler, codecs och enheter

Vissa anvÀndare av trÄdlösa hörlurar rapporterar lÄg ljudkvalitet och brist pÄ diskant nÀr de anvÀnder standard Bluetooth-kodeken SBC, som stöds av alla ljudenheter. En vanlig rekommendation för att förbÀttra ljudet Àr att köpa enheter och hörlurar som stöder kodekarna aptX och LDAC. Dessa kodekar krÀver licensavgifter, vilket gör att enheter med deras stöd Àr dyrare.

Det visar sig att den lÄga kvaliteten av SBC beror pÄ artificiella begrÀnsningar i Bluetooth-stacken och instÀllningarna för hörlurarna, och denna begrÀnsning kan kringgÄs pÄ alla befintliga enheter genom programvaruförÀndringar i smartphone eller dator.

Kodek SBC

Kodeken SBC har mÄnga olika parametrar som kommer överens om vid anslutningen. Bland dem:

  • Antal och typ av kanaler: Joint Stereo, Stereo, Dual Channel, Mono;
  • Antal frekvensband: 4 eller 8;
  • Antal block i paketet: 4, 8, 12, 16;
  • Algoritm för bitfördelning vid kvantisering: Loudness, SNR;
  • Maximalt och minimalt vĂ€rde pĂ„ bitpoolen som anvĂ€nds vid kvantisering: vanligtvis mellan 2 och 53.

Dekoderenheten mÄste stödja vilken kombination som helst av dessa parametrar. Kodarenheten kanske inte kan implementera alla.
Befintliga Bluetooth-stackar förenas vanligtvis med följande profil: Joint Stereo, 8 band, 16 block, Loudness, bitpool 2..53. Denna profil kodar 44,1 kHz ljud med en bithastighet av 328 kbps.
Bitpool-parametern pÄverkar direkt bithastigheten inom en profil: ju högre vÀrde, desto högre bithastighet och dÀrmed ocksÄ kvalitet.
Men bitpool-parametern Àr inte bunden till en specifik profil; pÄverkan pÄ bithastigheten beror ocksÄ i stor grad pÄ andra parametrar: kanaltyp, antal frekvensband, antal block. Bithastigheten kan ökas indirekt genom att godkÀnna icke-standardprofiler utan att Àndra bitpoolen.

Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Formeln för att berÀkna bithastigheten för SBC

Till exempel kodar Dual Channel-lÀget kanaler separat, vilket anvÀnder hela bitpoolen för varje kanal. Genom att fÄ enheten att anvÀnda Dual Channel istÀllet för Joint Stereo kan vi fÄ nÀstan dubbelt sÄ hög bithastighet vid samma maximala bitpoolvÀrde: 617 kbps.
Enligt min Äsikt Àr anvÀndningen av ett icke-profilerat bitpool-vÀrde vid samordning en brist i A2DP-standarden, vilket har lett till en konstgjord begrÀnsning av SBC-kvaliteten. Det hade varit klokare att samordna bitrate istÀllet för bitpool.

Dessa fasta vÀrden för Bitpool och Bitrate har sitt ursprung i en tabell med rekommenderade vÀrden för anvÀndning vid högkvalitativt ljud. Men en rekommendation Àr ingen anledning att begrÀnsa sig till dessa vÀrden.

Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

A2DP v1.2-specifikationen, som var aktiv frÄn 2007 till 2015, föreskriver att alla avkodande enheter korrekt ska fungera med bitrater upp till 512 kbps:

Avkodaren i SNK ska stödja alla möjliga bitpool-vÀrden som inte överskrider den maximala bitraten. Denna profil begrÀnsar den tillgÀngliga maximala bitraten till 320 kbps för mono och 512 kbps för tvÄkanalslÀgen.

I den nya versionen av specifikationen saknas begrĂ€nsningen för bitraten. Det antas att moderna hörlurar som slĂ€pptes efter 2015 och stödjer EDR kan hantera bitrater upp till ≈730 kbps.

Av nÄgon anledning har de Bluetooth-stacks i Linux (PulseAudio), Android, Blackberry och macOS som jag har kontrollerat konstgjorda begrÀnsningar pÄ det maximala vÀrdet av bitpool, vilket direkt pÄverkar den maximala bitraten. Men det Àr inte det största problemet, nÀstan alla hörlurar begrÀnsar ocksÄ det maximala vÀrdet pÄ bitpool till 53.
Som jag redan har konstaterat fungerar de flesta enheter utmÀrkt med en modifierad Bluetooth-stack med en bitrate pÄ 551 kbps, utan avbrott och knÀppande ljud. Men en sÄdan bitrate kommer aldrig att samordnas under normala förhÄllanden, pÄ vanliga Bluetooth-stacks.

Modifiera Bluetooth-stacken

I varje Bluetooth-stack som Àr kompatibel med A2DP-standarden finns stöd för Dual Channel-lÀget, men det Àr inte möjligt att aktivera det frÄn grÀnssnittet.

LÄt oss lÀgga till en omswitch i grÀnssnittet! Jag har gjort patchar för Android 8.1 och Android 9, som lÀgger till fullt stöd för Dual Channel i stacken, lÀgger till lÀget i omkopplingsmenyn i utvecklarverktyg, och hanterar SBC med stöd för Dual Channel som om det vore en extra codec, som aptX, AAC eller LDAC (Android kallar det HD Audio), vilket lÀgger till en kryssruta i Bluetooth-enhetsinstÀllningarna. SÄ hÀr ser det ut:

Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Patch för Android 9
Patch för Android 8.1

NÀr kryssrutan aktiveras börjar Bluetooth-ljudet att överföras med en bitrate pÄ 551 kbps, om hörlurarna stöder en anslutning med en hastighet pÄ 3 Mbps, eller 452 kbit/s, om hörlurarna endast stöder 2 mbit/s.

Denna patch ingÄr i följande alternativa firmware:

  • LineageOS
  • Resurrection Remix
  • crDroid

Var kommer 551 och 452 kbit/s ifrÄn?

Tekniken för och delning av luft i Bluetooth Àr avsedd för effektiv överföring av stora paket av fast storlek. Dataöverföringen sker i slottar, det största antalet slottar som kan sÀndas under en överföring Àr 5. Det finns ocksÄ överföringslÀgen som anvÀnder 1 eller 3 slottar, men inte 2 eller 4. I 5 slottar kan man överföra upp till 679 byte vid en anslutningshastighet pÄ 2 mbit/s och upp till 1021 byte vid en hastighet pÄ 3 mbit/s, och i 3 slottar 367 och 552 byte respektive.

Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Om vi vill överföra mindre data Àn 679 eller 1021 byte, men mer Àn 367 eller 552 byte, kommer överföringen fortfarande att ta 5 slottar, och data kommer att överföras pÄ samma tid, vilket minskar överföringseffektiviteten.

Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

SBC i Dual Channel-lÀget, vid 44100 Hz-ljud med parametrar Bitpool 38, 16 block i ramarna, 8 frekvensband, kodar ljud i ramar av storlek 164 byte, med en bithastighet pÄ 452 kbit/s.
Ljudet mÄste inkapslas i L2CAP och AVDTP-överföringsprotokoll, som tar 16 byte frÄn den nyttiga ljudbelastningen.

Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

SÄledes kan en Bluetooth-överföring med 5 slottar rymma 4 ljudramar:

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

Vi rymde 11,7 ms ljuddata i det sÀnda paketet, vilket kommer att överföras pÄ 3,75 ms, och vi har 6 oanvÀnda byte kvar i paketet.
Om vi höjer bitpoolen nÄgot, gÄr det inte lÀngre att packa 4 ljudramar i ett paket. Vi mÄste skicka 3 ramar i taget, vilket minskar överföringseffektiviteten, minskar mÀngden ljud som överförs i varje paket och snabbare leder till ljudhackningar under dÄliga radioförhÄllanden.

PÄ samma sÀtt valdes bithastigheten 551 kbit/s för EDR 3 mbit/s: med Bitpool 47, 16 block i ramarna, 8 frekvensband fÄr vi en rams storlek av 200 byte, vid en bithastighet pÄ 551 kbit/s. I ett paket fÄr vi plats med 5 ramar eller 14,6 ms musik.

Algoritmen för berÀkning av alla SBC-parametrar Àr ganska komplex, man kan enkelt bli förvirrad om man rÀknar manuellt, sÄ jag gjorde en interaktiv kalkylator för dem som Àr intresserade: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Varför behövs allt detta?

Trots den vanliga uppfattningen om aptX-kodens ljudkvalitet, kan den pÄ vissa filer ge resultat som Àr sÀmre Àn SBC med en standard bitrate pÄ 328 kbit/s.

SBC tilldelar dynamiskt kvantisering av bitar till frekvensband, vilket fungerar enligt principen "frÄn lÄga till höga". Om hela bitraten anvÀnds för lÄga och mellanregisterfrekvenser, kommer de högre frekvenserna att "kapas" (istÀllet för att det blir tystnad).
aptX kvantiserar frekvensband med samma antal bitar konstant, vilket innebĂ€r att den har en konstant bitrate: 352 kbit/s för 44,1 kHz, 384 kbit/s för 48 kHz, och den kan inte "flytta bitar" till de frekvenser som mest behöver dem. Till skillnad frĂ„n SBC kommer aptX inte "att kapa" frekvenser, utan kommer att lĂ€gga till kvantiseringsbrus i dem, vilket minskar ljudets dynamiska omfĂ„ng och ibland medför typiska knastrande ljud. SBC "slukar detaljer" — den kastar bort de tystaste delarna.
I genomsnitt, jÀmfört med SBC 328k, introducerar aptX fÀrre förvrÀngningar i musik med ett brett frekvensomrÄde, men pÄ musik med snÀvt frekvensomrÄde och stort dynamiskt omfÄng vinner SBC 328k ibland.

LÄt oss betrakta ett specifikt fall. Spektrogrammet av en inspelning pÄ piano:
Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Huvudenergin ligger i frekvenserna frÄn 0 till 4 kHz och strÀcker sig upp till 10 kHz.
Spektrogrammet av filen som komprimerats med aptX ser ut som följande:
Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Och sÄ hÀr ser SBC 328k ut.
Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Det Àr tydligt att SBC 328k periodiskt helt stÀngde av omrÄdet över 16 kHz och anvÀnde hela tillgÀngliga bitraten pÄ omrÄden nedanför detta vÀrde. Dock introducerade aptX fler förvrÀngningar i det hörbara ljudspektrumet, vilket kan ses pÄ den subtraherade originalspetragrammet frÄn spektrogrammet av aptX (ju mörkare, desto fler förvrÀngningar):
Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Medan SBC 328k hade mindre pÄverkan pÄ signalen i omrÄdet 0 till 10 kHz, medan resten stÀngdes av:
Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Bitraten 485k SBC rÀckte för att bevara hela frekvensspektrumet utan att stÀnga av banden.
Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

SBC 485k övertrĂ€ffar avsevĂ€rt aptX i kompositionen i intervallet 0-15 kHz, och med en mindre, men Ă€ndĂ„ mĂ€rkbar skillnad — i 15-22 kHz (ju mörkare, desto fĂ€rre förvrĂ€ngningar):
Modifiera Bluetooth-stacken för att förbÀttra ljudet pÄ hörlurar utan kodekarna AAC, aptX och LDAC

Arkiv med originalljud, SBC och aptX.

Genom att byta till högbitrat SBC fÄr du ljud som ofta övertrÀffar aptX, pÄ alla hörlurar. PÄ hörlurar som stöder EDR-anslutning 3 Mbit/s, ger bitrate 551 kbit/s ljud som stÄr pÄ samma nivÄ som aptX HD.

Finns det mer?

I patchen för Android finns ocksÄ ett alternativ för att öka bithastigheten ytterligare för EDR-enheter till 2 Mbit/s. Bithastigheten kan ökas frÄn 452 kbit/s till 595 kbit/s, vilket medför en minskad stabilitet i överföringen under svÄra radioförhÄllanden.
Det rÀcker att stÀlla in variabeln persist.bluetooth.sbc_hd_higher_bitrate till vÀrdet 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Patchen för extrem bithastighet har hittills bara godkÀnts i LineageOS 15.1, men inte i 16.0.

Kompatibilitet med enheter

SBC Dual Channel stöds av nĂ€stan alla hörlurar, högtalare och bilstereonheter. Det Ă€r inte förvĂ„nande — standarden föreskriver att den ska stödjas av alla avkodningsenheter. Det finns ett fĂ„tal enheter dĂ€r detta lĂ€ge orsakar problem, men detta Ă€r undantagsfall.
För mer information om kompatibla enheter kan du titta pÄ 4pda eller xda-developers.

JÀmförelse av ljudskillnader

Jag har skapat en webbtjÀnst som kodar ljud i SBC (samt aptX och aptX HD) i realtid, direkt i webblÀsaren. Med den kan du jÀmföra ljudet mellan olika SBC-profiler och andra codec, utan att faktiskt överföra ljud via Bluetooth, pÄ alla trÄdbundna hörlurar, högtalare och din favoritmusik, samt justera kodningsparametrarna direkt under ljuduppspelningen.
btcodecs.valdikss.org.ru/sbc-encoder

Kontakt med Android-utvecklarna

Jag har skrivit till mĂ„nga utvecklare av Bluetooth-stacken frĂ„n Google med en begĂ€ran att övervĂ€ga att inkludera patchar i huvudgrenen av Android — AOSP, men har inte fĂ„tt nĂ„got svar. Mina patchar i systemet för patchhantering Gerrit för Android har ocksĂ„ förblivit utan kommentarer frĂ„n nĂ„gon involverad.
Jag skulle vara tacksam om jag kunde fÄ hjÀlp med att nÄ utvecklarna pÄ Google och implementeringen av SBC HD i Android. Patchen i Gerrit Àr redan förÄldrad (detta Àr en av de tidiga reviserna), och jag kommer att uppdatera den om utvecklarna Àr intresserade av mina Àndringar (det Àr svÄrt för mig att uppdatera den, jag har inga enheter som Àr kompatibla med Android Q).

Slutsats

AnvÀndare av smartphones med LineageOS, Resurrection Remix och crDroid kan redan nu njuta av förbÀttrad ljudkvalitet, det rÀcker att aktivera alternativet i Bluetooth-enhetens instÀllningar. Linux-anvÀndare kan ocksÄ fÄ högre bithastighet för SBC genom att installera patchen frÄn Pali Rohår, som förutom allt annat lÀgger till stöd för codec:erna aptX, aptX HD och FastStream.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster