Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Antaŭ ol legi ĉi tiun artikolon, oni rekomendas legi la antaŭan artikolon: Aŭdio per Bluetooth: maksimumaj detaloj pri profiloj, kodekoj kaj aparatoj

Iuj sendrataj aŭdiloj-uzantoj raportas malbonan sonkvaliton kaj mankon de altfrekvencoj kiam ili uzas la norman SBC Bluetooth-kodekon, kiu estas subtenata de ĉiuj sonaparatoj. Ofta rekomendo por plibonigi sonon estas aĉeti aparatojn kaj aŭdilojn, kiuj subtenas aptX kaj LDAC-kodekojn. Ĉi tiuj kodekoj postulas licencajn kotizojn, do aparatoj kiuj subtenas ilin estas pli multekostaj.

Rezultas, ke la malalta kvalito de SBC ŝuldiĝas al artefaritaj limigoj de Bluetooth-stakoj kaj agordoj de aŭdiloj, kaj ĉi tiu limigo povas esti preterpasita en iuj ekzistantaj aparatoj per programaj ŝanĝoj al inteligenta telefono aŭ komputilo.

Kodeko SBC

La SBC-kodeko havas multajn malsamajn parametrojn, kiuj estas intertraktataj dum la fazo de konekto. Inter ili:

  • Nombro kaj tipo de kanaloj: Komuna Stereo, Stereo, Duobla Kanalo, Mono;
  • Nombro de frekvencaj bandoj: 4 aŭ 8;
  • Nombro da blokoj en la pako: 4, 8, 12, 16;
  • Algoritmo por distribuado de bitoj dum kvantigo: Laŭteco, SNR;
  • La maksimuma kaj minimuma valoro de la aro de bitoj uzataj dum kvantigo (bitpool): kutime de 2 ĝis 53.

La malkoda aparato devas subteni ajnan kombinaĵon de ĉi tiuj parametroj. La kodilo eble ne efektivigas ĉion.
Ekzistantaj Bluetooth-stakoj kutime konsentas pri la sekva profilo: Komuna Stereo, 8 bandoj, 16 blokoj, Loudness, bitpool 2..53. Ĉi tiu profilo ĉifras 44.1 kHz-aŭdion je bitrapideco de 328 kbps.
La parametro bitpool rekte influas la bitrapidecon ene de unu profilo: ju pli alta ĝi estas, des pli alta la bitrapideco, kaj tial la kvalito.
Tamen, la parametro bitpool ne estas ligita al specifa profilo; La bitrateco ankaŭ estas plejparte influita de aliaj parametroj: speco de kanaloj, nombro da frekvencbendoj, nombro da blokoj. Vi povas pliigi la bitratecon nerekte, konsentante pri ne-normaj profiloj, sen ŝanĝi la bitpool.

Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Formulo por kalkuli SBC-bitrapidecon

Ekzemple, Dual Channel-reĝimo ĉifras kanalojn aparte, uzante la tutan bitpoolon por ĉiu kanalo. Devigante la aparaton uzi Duoblan Kanalon anstataŭ Joint Stereo, ni ricevas preskaŭ duoblan la bitratecon kun la sama maksimuma bitpool valoro: 617 kbps.
Laŭ mi, la uzo de bitpool-valoro ne ligita al profilo ĉe la intertraktadstadio estas difekto en la A2DP-normo, kiu kondukis al artefarita limigo de SBC-kvalito. Estus pli senco negoci bitrate prefere ol bitpool.

Ĉi tiuj fiksaj Bitpool kaj Bitrate-valoroj originas de tabelo kun rekomenditaj valoroj por uzo por altkvalita audio. Sed rekomendo ne estas kialo por limigi vin al ĉi tiuj valoroj.

Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

La specifo A2DP v1.2, kiu estis aktiva de 2007 ĝis 2015, postulas, ke ĉiuj malkodaj aparatoj funkciu ĝuste kun bitrapidoj ĝis 512 kbps:

La malĉifrilo de la SNK subtenos ĉiujn eblajn bitpool valorojn kiuj ne rezultas pli ol la maksimuma bitrapideco. Ĉi tiu profilo limigas la disponeblan maksimuman bitrapidecon al 320kb/s por mono, kaj 512kb/s por du-kanalaj reĝimoj.

En la nova versio de la specifo ne estas limo pri la bitrateco. Estas laŭtakse ke modernaj aŭdiloj liberigitaj post 2015 kiuj subtenas EDR povas elporti bitrapidecojn ĝis ≈730 kbps.

Ial, la Linukso (PulseAudio), Android, Blackberry kaj macOS Bluetooth-stakoj, kiujn mi testis, havas artefaritajn limojn pri la maksimuma valoro de la parametro bitpool, kiu rekte influas la maksimuman bitrapidecon. Sed ĉi tio ne estas la plej granda problemo; preskaŭ ĉiuj aŭdiloj ankaŭ limigas la maksimuman bitpool-valoron al 53.
Kiel mi jam vidis, la plej multaj aparatoj funkcias perfekte sur modifita Bludenta stako kun bitrapideco de 551 kbps, sen interrompoj aŭ kraketadoj. Sed tia bitrate neniam estos konsekvenca en normalaj kondiĉoj, sur regulaj Bluetooth-stakoj.

Modifante la Bluetooth-stakon

Ajna Bluetooth-stako kongrua kun la A2DP-normo havas subtenon por Dual Channel-reĝimo, sed ne eblas aktivigi ĝin de la interfaco.

Ni aldonu baskulon al la interfaco! Mi faris flikaĵojn por Android 8.1 kaj Android 9, kiuj aldonas plenan Dual Channel-subtenon al la stako, aldonas reĝimon al la reĝima baskuliga menuo en la dev-iloj, kaj traktas Dual Channel-ebligitajn SBC-ojn kvazaŭ ili estus plia kodeko kiel aptX. , AAC aŭ LDAC (Android nomas ĉi tiun HD Audio) aldonante markomarkon al la agordoj de la Bluetooth-aparato. Jen kiel ĝi aspektas:

Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Flikaĵo por Android 9
Flikaĵo por Android 8.1

Kiam la markobutono estas aktivigita, Bluetooth-aŭdio komencas esti elsendita je bitrapideco 551 kbps, se la aŭdiloj subtenas konektan rapidon de 3 Mbit/s, aŭ 452 kbps, se la aŭdiloj nur subtenas 2 Mbit/s.

Ĉi tiu flikaĵo estas inkluzivita en la sekvaj alternativaj firmwarej:

  • LineageOS
  • Resurrection Remix
  • crDroid

De kie venis 551 kaj 452 kbit/s?

Bluetooth-aera kundivida teknologio estas dizajnita por efike elsendi grandajn fiks-grandajn pakaĵojn. Transdono de datumoj okazas en fendoj, la plej granda nombro da fendoj senditaj en unu translokigo estas 5. Ankaŭ ekzistas transigaj reĝimoj, kiuj uzas 1 aŭ 3 fendojn, sed ne 2 aŭ 4. En 5 fendoj oni povas translokigi ĝis 679 bajtojn je koneksa rapido. de 2 Mbit/s kaj ĝis 1021 bajtoj kun rapideco de 3 Mbit/s, kaj je 3 - 367 kaj 552 bajtoj, respektive.

Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Se ni volas transdoni malpli da datumoj ol 679 aŭ 1021 bajtoj, sed pli ol 367 aŭ 552 bajtoj, la translokigo ankoraŭ prenos 5-fendojn kaj la datumoj estos translokigitaj en la sama tempo, kio reduktas la transdonan efikecon.

Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

SBC en Dual Channel-reĝimo, ĉe 44100 Hz audio kun Bitpool 38 parametroj, 16 blokoj per kadro, 8 frekvencintervaloj, ĉifras aŭdion en 164 bajtajn kadrojn, kun bitrapideco de 452 kbps.
La audio devas esti enkapsuligita en L2CAP kaj AVDTP-transigaj protokoloj, kiuj prenas 16 bajtojn de la aŭda ŝarĝo.

Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Tiel, unu Bludenta dissendo kun 5 fendoj povas akomodi 4 sonkadrojn:

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

Ni enmetas 11.7 ms da sondatumoj en la sendatan pakaĵon, kiu estos transdonita en 3.75 ms, kaj ni restas 6 neuzataj bajtoj en la pako.
Se vi iomete levas la bitpoolon, ne plu eblos paki 4 sonkadrojn en unu pakaĵon. Vi devos sendi 3 kadrojn samtempe, kio reduktas transdonan efikecon, reduktas la kvanton de audio elsendita per kadro, kaj pli rapide kondukos al aŭda balbutado en malbonaj radiokondiĉoj.

Sammaniere, por EDR 551 Mbit/s elektiĝis bitrapideco de 3 kbit/s: kun Bitpool 47, 16 blokoj po kadro, 8 frekvencintervaloj, la framgrandeco estas 200 bajtoj, kun bitrapideco de 551 kbit/s. Unu pako enhavas 5 kadrojn aŭ 14.6 ms da muziko.

La algoritmo por kalkuli ĉiujn SBC-parametrojn estas sufiĉe kompleksa, vi povas facile konfuziĝi se vi kalkulas permane, do mi faris interagan kalkulilon por helpi la interesatojn: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Kial ĉio ĉi necesas?

Kontraŭe al populara kredo pri la sonkvalito de la aptX-kodeko, en iuj dosieroj ĝi povas produkti rezultojn pli malbonajn ol SBC kun norma bitrapideco de 328 kbps.

La SBC dinamike asignas kvantigbitojn al frekvencbendoj sur malalt-al-alta bazo. Se la tuta bitrateco estis uzata por la malaltaj kaj mezaj frekvencoj, la altfrekvencoj estos "fortranĉitaj" (anstataŭe estos silento).
aptX kvantigas frekvencbendojn kun la sama nombro da bitoj la tutan tempon, tial ĝi havas konstantan bitrapidecon: 352 kbps por 44.1 kHz, 384 kbps por 48 kHz, kaj ĝi ne povas "bit-ŝanĝi" al tiuj frekvencoj kiuj plej bezonas ilin. . Male al SBC, aptX ne "tranĉos" frekvencojn, sed aldonos kvantigan bruon al ili, reduktante la dinamikan gamon de la audio, kaj foje enkondukante karakterizan krakadon. SBC "manĝas detalojn" - forĵetas la plej trankvilajn areojn.
Averaĝe, kompare kun la SBC 328k, aptX enkondukas malpli da distordo en muziko kun larĝa frekvenca gamo, sed en muziko kun mallarĝa frekvenca gamo kaj larĝa dinamika gamo, la SBC 328k foje venkas.

Ni konsideru specialan kazon. Spektrogramo de pianluda registrado:
Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

La ĉefa energio kuŝas en frekvencoj de 0 ĝis 4 kHz, kaj daŭras ĝis 10 kHz.
La spektrogramo de dosiero kunpremita en aptX aspektas jene:
Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Kaj jen kiel aspektas SBC 328k.
Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Videblas, ke la SBC 328k periode tute malŝaltis la intervalon super 16 kHz, kaj elspezis la tutan disponeblan bitrapidecon por intervaloj sub ĉi tiu valoro. Tamen, aptX enkondukis pli da misprezento en la frekvenca spektro aŭdebla al la homa orelo, kiel povas esti vidita en la subtrahita origina spektrogramo de la aptX-spektrogramo (ju pli brila, des pli da misprezento):
Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Dum la SBC 328k difektis la signalon malpli en la intervalo de 0 ĝis 10 kHz, kaj fortranĉis la reston:
Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

La 485k bitrapideco de la SBC sufiĉis por konservi la tutan frekvencan gamon, sen malfunkciigado de grupoj.
Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

SBC 485k estas signife antaŭ aptX sur ĉi tiu trako en la intervalo de 0-15 kHz, kaj kun pli malgranda, sed ankoraŭ videbla diferenco - en 15-22 kHz (ju pli malhela, des malpli distordo):
Ni modifas la Bluetooth-stakon por plibonigi sonon ĉe aŭdiloj sen AAC, aptX kaj LDAC-kodekoj

Arkivo de originala audio, SBC kaj aptX.

Ŝanĝante al alt-bitrate SBC, vi ricevos aŭdion, kiu ofte batas aptX sur iu ajn aŭdilo. Ĉe aŭdiloj, kiuj subtenas 3 Mbps EDR-konektecon, bitrapideco de 551 kbps produktas sonon kompareblan al aptX HD.

Ĉu vi povas fari eĉ pli?

La Android-peceto ankaŭ inkluzivas eblon por plialtigi la bitrapidecon por 2 Mbps EDR-aparatoj. Vi povas pliigi la bitrapidecon de 452 kbit/s ĝis 595 kbit/s, koste de reduktado de dissenda stabileco en malfacilaj radiokondiĉoj.
Sufiĉas agordi la variablon persist.bluetooth.sbc_hd_higher_bitrate al 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

La ekstrema bitrate diakilo ĝis nun estis nur adoptita en LineageOS 15.1, sed ne en 16.0.

Aparato Kongrueco

SBC Dual Channel estas subtenata de preskaŭ ĉiuj aŭdiloj, laŭtparoliloj kaj aŭtaj ĉefunuoj. Ĉi tio ne estas mirinde - la normo postulas sian subtenon en iuj malkodaj aparatoj. Estas malgranda nombro da aparatoj sur kiuj ĉi tiu reĝimo kaŭzas problemojn, sed ĉi tiuj estas izolitaj okazoj.
Pliaj detaloj pri kongruaj aparatoj troveblas ĉe W4bsitXNUMX-dns.comxda-developers.

Komparo de sondiferencoj

Mi faris retservon, kiu kodas audio al SBC (same kiel aptX kaj aptX HD) en reala tempo, ĝuste en la retumilo. Per ĝi, vi povas kompari la sonon de malsamaj SBC-profiloj kaj aliaj kodekoj, sen efektive elsendi audion per Bluetooth, sur iuj kablaj aŭdiloj, laŭtparoliloj, kaj via plej ŝatata muziko, kaj ankaŭ ŝanĝi kodajn parametrojn rekte dum ludado de audio.
btcodecs.valdikss.org.ru/sbc-encoder

Kontaktu Android-Programistojn

Mi skribis al multaj Bluetooth-stakaj programistoj ĉe Guglo petante ilin konsideri inkluzivi diakilojn en la ĉefa Android-branĉo - AOSP, sed ne ricevis ununuran respondon. Miaj flikiloj en Gerrit fliksistemo por Android ankaŭ restis sen komento de iu ajn implikita.
Mi ĝojus, se mi povus ricevi helpon por kontakti la programistojn ĉe Google kaj alporti SBC HD al Android. La flikaĵo en gerrit jam estas malaktuala (ĉi tiu estas unu el la fruaj revizioj), kaj mi ĝisdatigos ĝin se la programistoj interesiĝas pri miaj ŝanĝoj (ne estas facile por mi ĝisdatigi ĝin, mi ne havas aparatojn kongruajn kun Android Q). ).

konkludo

Uzantoj de saĝtelefonoj kun LineageOS, Resurrection Remix kaj crDroid-firmvaro povas ĝui plibonigitan sonkvaliton nun, nur aktivigu la opcion en la agordoj de Bluetooth-aparato. Linukso-uzantoj ankaŭ povas akiri pliigitan SBC-bitrapidecon per instalado flikaĵo de Pali Rohar, kiu, interalie, aldonas subtenon por aptX, aptX HD kaj FastStream-kodekoj.

fonto: www.habr.com

Aldoni komenton