Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Innan du läser den här artikeln rekommenderar vi att du läser föregående artikel: Ljud via Bluetooth: maximal information om profiler, codecs och enheter

Vissa användare av trådlösa hörlurar rapporterar dålig ljudkvalitet och brist på höga frekvenser när de använder standard SBC Bluetooth-codec, 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 aptX och LDAC codecs. Dessa codecs kräver licensavgifter, så enheter som stöder dem är dyrare.

Det visar sig att den låga kvaliteten på SBC beror på artificiella begränsningar av Bluetooth-stackar och hörlursinställningar, och denna begränsning kan kringgås på alla befintliga enheter genom mjukvaruändringar på en smartphone eller dator.

Codec SBC

SBC-codec har många olika parametrar som förhandlas under anslutningsfasen. 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 att distribuera bitar under kvantisering: Loudness, SNR;
  • Det maximala och lägsta värdet för poolen av bitar som används under kvantisering (bitpool): vanligtvis från 2 till 53.

Avkodningsenheten måste stödja vilken kombination som helst av dessa parametrar. Kodaren kanske inte implementerar allt.
Befintliga Bluetooth-stackar kommer vanligtvis överens om följande profil: Joint Stereo, 8 band, 16 block, Loudness, bitpool 2..53. Den här profilen kodar 44.1 kHz ljud med en bithastighet på 328 kbps.
Bitpool-parametern påverkar direkt bithastigheten inom en profil: ju högre den är, desto högre bithastighet och därmed kvaliteten.
Bitpool-parametern är dock inte bunden till en specifik profil; Bithastigheten påverkas också till stor del av andra parametrar: typ av kanaler, antal frekvensband, antal block. Du kan öka bithastigheten indirekt, genom att komma överens om icke-standardiserade profiler, utan att ändra bitpoolen.

Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Formel för beräkning av SBC-bithastighet

Till exempel kodar Dual Channel-läget kanaler separat, och använder hela bitpoolen för varje kanal. Genom att tvinga enheten att använda Dual Channel istället för Joint Stereo får vi nästan dubbla bithastigheten med samma maximala bitpoolvärde: 617 kbps.
Enligt min åsikt är användningen av ett bitpoolvärde som inte är knutet till en profil vid förhandlingsstadiet ett fel i A2DP-standarden, vilket ledde till en artificiell begränsning av SBC-kvaliteten. Det skulle vara mer meningsfullt att förhandla om bithastighet snarare än bitpool.

Dessa fasta Bitpool- och Bitrate-värden kommer från en tabell med rekommenderade värden för användning för högkvalitativt ljud. Men en rekommendation är inte en anledning att begränsa sig till dessa värderingar.

Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

A2DP v1.2-specifikationen, som var aktiv från 2007 till 2015, kräver att alla avkodningsenheter fungerar korrekt med bithastigheter på upp till 512 kbps:

SNK:s avkodare ska stödja alla möjliga bitpoolvärden som inte leder till överskridande av den maximala bithastigheten. Den här profilen begränsar den tillgängliga maximala bithastigheten till 320 kb/s för mono och 512 kb/s för tvåkanalslägen.

I den nya versionen av specifikationen finns det ingen begränsning på bithastigheten. Det uppskattas att moderna hörlurar släppta efter 2015 som stöder EDR kan stödja bithastigheter upp till ≈730 kbps.

Av någon anledning har Linux (PulseAudio), Android, Blackberry och macOS Bluetooth-stackarna jag testade artificiella gränser för maxvärdet för bitpool-parametern, vilket direkt påverkar den maximala bithastigheten. Men detta är inte det största problemet, nästan alla hörlurar begränsar också det maximala bitpoolvärdet till 53.
Som jag redan har sett fungerar de flesta enheter perfekt på en modifierad Bluetooth-stack med en bithastighet på 551 kbps, utan avbrott eller knaster. Men en sådan bithastighet kommer aldrig att vara konsekvent under normala förhållanden, på vanliga Bluetooth-stackar.

Ändra Bluetooth-stacken

Alla Bluetooth-stack som är kompatibla med A2DP-standarden har stöd för Dual Channel-läge, men det är inte möjligt att aktivera det från gränssnittet.

Låt oss lägga till en växel i gränssnittet! Jag har gjort patchar för Android 8.1 och Android 9 som lägger till fullt Dual Channel-stöd till stacken, lägger till ett läge i växlingsmenyn för läge i utvecklingsverktygen och behandlar Dual Channel-aktiverade SBC:er som om de vore en extra codec som aptX , AAC eller LDAC (Android kallar detta HD Audio) genom att lägga till en bock i Bluetooth-enhetsinställningarna. Så här ser det ut:

Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

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

När kryssrutan är aktiverad börjar Bluetooth-ljud sändas med en bithastighet 551 kbps, om hörlurarna stöder en anslutningshastighet på 3 Mbit/s, eller 452 kbps, om hörlurarna bara stöder 2 Mbit/s.

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

  • LineageOS
  • Uppståndelse Remix
  • crDroid

Var kom 551 och 452 kbit/s ifrån?

Bluetooth luftdelningsteknik är utformad för att effektivt överföra stora paket med fast storlek. Dataöverföring sker i slots, det största antalet slots som skickas i en överföring är 5. Det finns även överföringslägen som använder 1 eller 3 slots, men inte 2 eller 4. I 5 slots kan du överföra upp till 679 byte med en anslutningshastighet på 2 Mbit/s och upp till 1021 byte vid en hastighet av 3 Mbit/s och vid 3 - 367 respektive 552 byte.

Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

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 luckor och datan kommer att överföras samtidigt, vilket minskar överföringseffektiviteten.

Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

SBC i Dual Channel-läge, vid 44100 Hz ljud med Bitpool 38 parametrar, 16 block per ram, 8 frekvensområden, kodar ljud till 164 byte ramar, med en bithastighet på 452 kbps.
Ljud måste vara inkapslat i L2CAP- och AVDTP-överföringsprotokoll, som tar 16 byte från ljudets nyttolast.

Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Således kan en Bluetooth-överföring med 5 platser rymma 4 ljudramar:

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

Vi passar in 11.7 ms ljuddata i paketet som skickas, vilket kommer att sändas på 3.75 ms, och vi har 6 oanvända byte kvar i paketet.
Om du höjer bitpoolen lite går det inte längre att packa 4 ljudramar i ett paket. Du måste skicka 3 bildrutor åt gången, vilket minskar överföringseffektiviteten, minskar mängden ljud som sänds per bildruta och kommer snabbare att leda till ljudstamning under dåliga radioförhållanden.

På samma sätt valdes en bithastighet på 551 kbit/s för EDR 3 Mbit/s: med Bitpool 47, 16 block per ram, 8 frekvensområden, är ramstorleken 200 byte, med en bithastighet på 551 kbit/s. Ett paket innehåller 5 bildrutor eller 14.6 ms musik.

Algoritmen för att beräkna alla SBC-parametrar är ganska komplex, du kan lätt bli förvirrad om du räknar manuellt, så jag gjorde en interaktiv kalkylator för att hjälpa de intresserade: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Varför behövs allt detta?

I motsats till vad många tror om ljudkvaliteten hos aptX-codec, kan den på vissa filer ge resultat sämre än SBC med en standardbithastighet på 328 kbps.

SBC:n allokerar kvantiseringsbitar dynamiskt till frekvensband på låg-till-hög-basis. Om all bithastighet användes för de låga och mellanliggande frekvenserna kommer de höga frekvenserna att "klippas av" (det blir tyst istället).
aptX kvantiserar frekvensband med samma antal bitar hela tiden, vilket är anledningen till att den har en konstant bithastighet: 352 kbps för 44.1 kHz, 384 kbps för 48 kHz, och den kan inte "bitskifta" till de frekvenser som behöver dem mest . Till skillnad från SBC kommer aptX inte att "kapa" frekvenser, utan lägga till kvantiseringsbrus till dem, minska det dynamiska omfånget för ljudet och ibland introducera karakteristiskt sprakande. SBC "äter detaljer" - kastar bort de tystaste områdena.
I genomsnitt, jämfört med SBC 328k, introducerar aptX mindre distorsion i musik med ett brett frekvensområde, men i musik med ett smalt frekvensområde och ett brett dynamiskt område vinner SBC 328k ibland.

Låt oss överväga ett specialfall. Spektrogram av en pianospelande inspelning:
Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Huvudenergin ligger i frekvenser från 0 till 4 kHz, och fortsätter upp till 10 kHz.
Spektrogrammet för en fil komprimerad i aptX ser ut så här:
Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Och så här ser SBC 328k ut.
Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Det kan ses att SBC 328k periodvis helt stängde av intervallet över 16 kHz och använde all tillgänglig bithastighet på intervall under detta värde. Emellertid introducerade aptX mer distorsion i frekvensspektrumet hörbart för det mänskliga örat, vilket kan ses i det subtraherade ursprungliga spektrogrammet från aptX-spektrogrammet (ju ljusare, desto mer distorsion):
Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Medan SBC 328k förstörde signalen mindre i intervallet från 0 till 10 kHz och skar av resten:
Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

SBC:ns 485k bithastighet räckte för att bevara hela frekvensområdet, utan att inaktivera band.
Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

SBC 485k är betydligt före aptX på det här spåret i 0-15 kHz-intervallet, med en mindre men fortfarande märkbar skillnad på 15-22 kHz (ju mörkare desto mindre distorsion):
Vi modifierar Bluetooth-stacken för att förbättra ljudet på hörlurar utan AAC, aptX och LDAC codecs

Arkiv med originalljud, SBC och aptX.

Genom att byta till en SBC med hög bithastighet får du ljud som ofta slår aptX på alla hörlurar. På hörlurar som stöder 3 Mbps EDR-anslutning ger en bithastighet på 551 kbps ljud som är jämförbart med aptX HD.

Kan du göra ännu mer?

Android-patchen innehåller också ett alternativ för att ytterligare öka bithastigheten för 2 Mbps EDR-enheter. Du kan öka bithastigheten från 452 kbit/s till 595 kbit/s, till priset av att minska överföringsstabiliteten under svåra radioförhållanden.
Det räcker att ställa in persist.bluetooth.sbc_hd_higher_bitrate-variabeln till 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Den extrema bithastighetspatchen har hittills bara antagits i LineageOS 15.1, men inte i 16.0.

Enhetskompatibilitet

SBC Dual Channel stöds av nästan alla hörlurar, högtalare och bilhuvudenheter. Detta är inget konstigt - standarden kräver sitt stöd i alla avkodningsenheter. Det finns ett litet antal enheter där det här läget orsakar problem, men dessa är isolerade instanser.
Mer information om kompatibla enheter finns på 4pda eller XDA-utvecklare.

Jämförelse av ljudskillnader

Jag gjorde en webbtjänst som kodar ljud till SBC (samt aptX och aptX HD) i realtid, direkt i webbläsaren. Med den kan du jämföra ljudet från olika SBC-profiler och andra codecs, utan att faktiskt överföra ljud via Bluetooth, på alla trådbundna hörlurar, högtalare och din favoritmusik, och även ändra kodningsparametrar direkt medan du spelar upp ljud.
btcodecs.valdikss.org.ru/sbc-encoder

Kontakta Android-utvecklare

Jag skrev till många Bluetooth-stackutvecklare på Google och bad dem att överväga att inkludera patchar i Android-huvudgrenen - AOSP, men fick inte ett enda svar. Mina plåster in Gerrit patchsystem för Android förblev också utan kommentarer från någon inblandad.
Jag skulle bli glad om jag kunde få lite hjälp med att komma i kontakt med utvecklarna på Google och föra SBC HD till Android. Patchen i gerrit är redan föråldrad (detta är en av de tidiga versionerna), och jag kommer att uppdatera den om utvecklarna är intresserade av mina ändringar (det är inte lätt för mig att uppdatera det, jag har inte enheter som är kompatibla med Android Q ).

Slutsats

Användare av smartphones med LineageOS, Resurrection Remix och crDroid firmware kan njuta av förbättrad ljudkvalitet just nu, aktivera bara alternativet i Bluetooth-enhetsinställningarna. Linux-användare kan också få ökad SBC-bithastighet genom att installera patch från Pali Rohar, som bland annat lägger till stöd för aptX, aptX HD och FastStream codecs.

Källa: will.com

Lägg en kommentar