Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Перад чытаннем гэтага артыкула рэкамендуецца азнаёміцца ​​з папярэднім артыкулам: Аўдыё праз Bluetooth: максімальна падрабязна аб профілях, кодэках і прыладах

Некаторыя карыстачы бесправадных слухавак адзначаюць нізкую якасць гуку і недахоп высокіх частот пры выкарыстанні стандартнага Bluetooth-кодэка SBC, які падтрымліваюць усе аўдыёпрылады. Частай рэкамендацыяй для паляпшэння гуку з'яўляецца купля прылад і навушнікаў з падтрымкай кодэкаў aptX і LDAC. Гэтыя кодэкі патрабуюць ліцэнзійных адлічэнняў, таму прылады з іх падтрымкай каштуюць даражэй.

Аказваецца, нізкая якасць SBC абумоўлена штучнымі абмежаваннямі Bluetooth-стэкаў і налад навушнікаў, і гэтае абмежаванне можна абыйсці на любых існуючых прыладах, шляхам праграмных змен смартфона або кампутара.

Кодэк SBC

У кодэка SBC ёсць мноства розных параметраў, якія адпавядаюць на этапе ўсталёўкі злучэння. Сярод іх:

  • Колькасць і тып каналаў: Joint Stereo, Stereo, Dual Channel, Mono;
  • Колькасць частотных палос: 4 ці 8;
  • Колькасць блокаў у пакеце: 4, 8, 12, 16;
  • Алгарытм размеркавання бітаў пры квантаванні: Loudness, SNR;
  • Максімальнае і мінімальнае значэнне пула бітаў, выкарыстоўваных пры квантаванні (bitpool): звычайна, ад 2 да 53.

Якая дэкадуе прылада абавязана падтрымліваць любое спалучэнне гэтых параметраў. Кадавальная прылада можа рэалізоўваць не ўсё.
Існыя Bluetooth-стэкі, як правіла, узгодняць наступны профіль: Joint Stereo, 8 палос, 16 блокаў, Loudness, bitpool 2..53. Гэты профіль кадуе 44.1 кгц аўдыё з бітрэйтам 328 кбіт/з.
Параметр bitpool напроста ўплывае на бітрэйт у рамках аднаго профіля: чым ён вышэй, тым вышэй бітрэйт, а такім чынам і якасць.
Аднак параметр bitpool не прывязаны да пэўнага профіля; уплыў на бітрэйт таксама ў значнай ступені аказвае і іншыя параметры: тып каналаў, колькасць частотных палос, колькасць блокаў. Падняць бітрэйт можна ўскосна, шляхам узгаднення нестандартных профіляў, без змены bitpool.

Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Формула падліку бітрэйту SBC

Напрыклад, рэжым Dual Channel кадуе каналы паасобна, выкарыстоўваючы ўвесь bitpool для кожнага з каналаў. Прымусіўшы прыладу выкарыстоўваць Dual Channel замест Joint Stereo, мы атрымаем амаль падвоены бітрэйт пры тым жа максімальным значэнні bitpool: 617 кбіт/з.
На маю думку, выкарыстанне не прывязанага да профілі значэння bitpool на этапе ўзгаднення – недапрацоўка стандарту A2DP, якая і прывяла да штучнага абмежавання якасці SBC. Разумней было б узгадняць bitrate, а не bitpool.

Такія фіксаваныя значэнні Bitpool і Bitrate бяруць свой пачатак з табліцы з рэкамендаванымі да выкарыстання значэннямі для высакаякаснага аўдыё. Але рэкамендацыя - не нагода абмяжоўвацца гэтымі значэннямі.

Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Спецыфікацыя A2DP v1.2, якая была актыўная з 2007 па 2015 год, прадпісвае ўсім дэкадавальным прыладам карэктна працаваць з бітрэйтамі да 512 кбіт/з:

Выкарыстоўвайце SNK невялікую падтрымку ўсіх магчымых бітпаляў цэнаў, якія не даюць выніку ў максімуме bit rate. Гэтыя profile limits існуючыя максімум bit rate да 320kb/s для mono, and 512kb/s для двухканальных рэжымаў.

У новай версіі спецыфікацыі абмежаванне па бітрэйце адсутнічае. Мяркуецца, што сучасныя навушнікі, выпушчаныя пасля 2015 года і якія падтрымліваюць EDR, могуць падтрымліваць бітрэйты да ≈730 кбіт/с.

Па нейкім чынніку, у правераных мной Bluetooth-стэкаў Linux (PulseAudio), Android, Blackberry і macOS ёсць штучныя абмежаванні максімальнага значэння параметра bitpool, які напроста ўплывае на максімальны бітрэйт. Але гэта - не самая вялікая праблема, амаль усе навушнікі таксама абмяжоўваюць максімальнае значэнне bitpool лікам 53.
Як я ўжо паспеў пераканацца, большасць прылад выдатна працуе на мадыфікаваным Bluetooth-стэку з бітрэйтам у 551 кбіт/з, без перапыненняў і трэска. Але такі бітрэйт ніколі не будзе ўзгоднены ў звычайных умовах, на звычайных Bluetooth-стэках.

Мадыфікуем Bluetooth-стэк

У любым Bluetooth-стэку, які сумяшчальны са стандартам A2DP, ёсць падтрымка рэжыму Dual Channel, але актываваць яе з інтэрфейсу не ўяўляецца магчымым.

Давайце дадамо перамыкач у інтэрфейс! Я зрабіў патчы для Android 8.1 і Android 9, якія дадаюць паўнавартасную падтрымку Dual Channel у стэк, дадаюць рэжым у меню пераключэння рэжыму ў прылады распрацоўніка, і апрацоўваюць SBC з падтрымкай Dual Channel так, быццам гэта дадатковы кодэк, накшталт aptX, AAC або LDAC ( Android называе гэта HD Audio), дадаючы галачку ў наладкі Bluetooth-прылады. Вось як гэта выглядае:

Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Патч для Android 9
Патч для Android 8.1

Пры актывацыі галачкі, Bluetooth-аўдыё пачынае перадавацца з бітрэйтам 551 кбіт/с, калі навушнікі падтрымліваюць злучэнне на хуткасці 3 мбіт / с, або 452 кбіт/с, калі навушнікі падтрымліваюць толькі 2 мбіт/с.

Дадзены патч уключаны ў наступныя альтэрнатыўныя прашыўкі:

  • LineageOS
  • Уваскрасенне Рэмікс
  • crDroid

Адкуль узяліся 551 і 452 кбіт/з?

Тэхналогія падзелу эфіру ў Bluetooth прызначаная для эфектыўнай перадачы вялікіх пакетаў фіксаванага памеру. Перадача дадзеных адбываецца слотамі, самая вялікая колькасць слотаў, якія адпраўляюцца за адну перадачу – 5. Таксама ёсць рэжымы перадачы, якія выкарыстоўваюць 1 ці 3 слот, але не 2 ці 4. У 5 слотах можна перадаць да 679 байт на хуткасці злучэння 2 мбіт/з і да 1021 байт на хуткасці 3 мбіт/з, а ў 3 - 367 і 552 байта адпаведна.

Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Калі мы жадаем перадаць менш дадзеных, чым 679 ці 1021 байт, але больш, чым 367 ці 552 байта, то перадача ўсё роўна зойме 5 слотаў, а дадзеныя будзе перадавацца за такі ж час, што памяншае эфектыўнасць перадачы.

Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

SBC у рэжыме Dual Channel, на 44100 Гц-аўдыё з параметрамі Bitpool 38, 16 блокаў у фрэйме, 8 частотных дыяпазонаў, кадуе аўдыё ў фрэймы памерам 164 байт, з бітрэйтам 452 кбітс.
Аўдыё павінна быць інкапсуляванае ў пратаколы перадачы L2CAP і AVDTP, якія забіраюць 16 байт ад карыснай аўдыёнагрузкі.

Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Такім чынам, у адну Bluetooth-перадачу з 5 слотамі атрымоўваецца змясціць 4 аўдыёфрэйма:

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

Мы змясцілі 11.7/3.75 мс аўдыёдадзеных ў які адпраўляецца пакет, які будзе перададзены за 6 мс, і ў нас засталося XNUMX нявыкарыстаных байт у пасылцы.
Калі ледзь падняць bitpool, 4 аўдыёфрэйма ўжо не атрымаецца спакаваць у адну пасылку. Прыйдзецца адпраўляць па 3 фрэйма за раз, што змяншае эфектыўнасць перадачы, памяншае колькасць перадаванага аўдыё за адну пасылку, і хутчэй прывядзе да заікання аўдыё пры дрэнных радыёўмовах.

Такой жа выявай быў падабраны бітрэйт 551 кбіт/з для EDR 3 мбіт/з: з Bitpool 47, 16 блокамі ў фрэйме, 8 частотнымі дыяпазонамі атрымліваецца памер фрэйма 200 байт, пры бітрэйце 551 кбіт/з. У адну пасылку месціцца 5 фрэймаў ці 14.6/XNUMX мс музыкі.

Алгарытм разліку ўсіх параметраў SBC дастаткова складаны, можна лёгка заблытацца, калі лічыць уручную, таму я зрабіў інтэрактыўны калькулятар у дапамогу тым, хто цікавіцца: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Навошта ўсё гэта патрэбна?

Насуперак ходкаму меркаванню аб якасці гуку кодэка aptX, на некаторых файлах ён можа даваць вынікі горш, чым SBC са стандартным бітрэйтам у 328 кбіт/з.

SBC дынамічна вылучае біты квантавання для частотных палос, дзейнічаючы па прынцыпе ад ніжніх да верхніх . Калі ўвесь бітрэйт выкарыстоўваўся на ніжнія і сярэднія частоты, верхнія частоты абрэжуцца (замест іх будзе цішыня).
aptX квантуе частотныя палосы адной і той жа колькасцю біт увесь час, з-за чаго ў яго сталы бітрэйт: 352 кбіт/з для 44.1 кгц, 384 кбіт/з для 48 кгц, і ён не можа "перанесці біты" на тыя частоты, якія больш за ўсё ў іх маюць патрэбу. У адрозненне ад SBC, aptX не будзе "абрэзаць" частоты, а будзе дадаваць у іх шумы квантавання, памяншаючы дынамічны дыяпазон аўдыё, і часам прыўносіць характэрныя патрэскванні. SBC жа з'ядае дэталі адкідае найболей ціхія ўчасткі.
У сярэднім, у параўнанні з SBC 328k, aptX уносіць менш скажэнняў у музыку з шырокім частотным дыяпазонам, але на музыцы з вузкім дыяпазонам частот і шырокім дынамічным дыяпазонам SBC 328k часам выйграе.

Разгледзім прыватны выпадак. Спектраграма запісу ігры на фартэпіяна:
Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Асноўная энергія ляжыць у частотах ад 0 да 4 кгц, і працягваецца да 10 кгц.
Спектраграма файла, сціснутага ў aptX, выглядае наступным чынам:
Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

А так выглядае SBC 328k.
Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Відаць, што SBC 328k перыядычна цалкам адключаў дыяпазон вышэй за 16 кгц, і расходаваў увесь даступны бітрэйт на дыяпазоны ніжэй гэтага значэння. Аднак, aptX занёс больш скажэнняў у чутны чалавечым вухам спектр частот, што можна бачыць на адыманай арыгінальнай спектраграме з спектраграмы aptX (чым ярчэй, тым больш скажэнняў):
Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

У той час як SBC 328k менш сапсаваў сігнал у дыяпазоне ад 0 да 10 кгц, а астатняе - абрэзаў:
Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Бітрэйт 485k SBC хапіла, каб захаваць увесь дыяпазон частот, без адключэння палос.
Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

SBC 485k на гэтай кампазіцыі значна апярэджвае aptX у дыяпазоне 0-15 кгц, і з меншай, але ўсё ж прыкметнай розніцай – у 15-22 кгц (чым цямней, тым менш скажэнняў):
Мадыфікуем Bluetooth-стэк для паляпшэння гуку на слухаўках без кодэкаў AAC, aptX і LDAC

Архіў арыгінальнага аўдыё, SBC і aptX.

Пераключыўшыся на высокабітрэйтны SBC, вы атрымаеце гук, часцяком праўзыходны aptX, на любых слухаўках. На слухаўках, якія падтрымліваюць падлучэнне EDR 3 мбіт/з, бітрэйт 551 кбіт/з дае гук, параўнальны з aptX HD.

А можна яшчэ болей?

У патчы для Android таксама маецца опцыя для яшчэ большага падвышэння бітрэйту для прылад EDR 2 мбіт/з. Можна падвысіць бітрэйт з 452 кбіт/з да 595 кбіт/з, коштам памяншэння стабільнасці перадачы ў складаных радыёўмовах.
Дастаткова ўсталяваць зменную persist.bluetooth.sbc_hd_higher_bitrate у значэнне 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Патч на экстрэмальны бітрэйт пакуль прыняты толькі ў LineageOS 15.1/16.0, але не ў XNUMX/XNUMX.

Сумяшчальнасць з прыладамі

SBC Dual Channel падтрымліваецца практычна ўсімі навушнікамі, калонкамі і аўтамабільнымі галаўнымі прыладамі. Гэта няхітра - стандарт загадвае яго падтрымку ў любых дэкадавальных прыладах. Ёсць невялікая колькасць прылад, на якіх гэты рэжым выклікае праблемы, але гэта - адзінкавыя асобнікі.
Больш падрабязна з сумяшчальнымі прыладамі можна азнаёміцца ​​на 4pda або XDA-распрацоўнікаў.

Параўнанне адрозненняў гуку

Я зрабіў вэб-сэрвіс, які кадуе аўдыё ў SBC (а таксама aptX і aptX HD) у рэальным часе, прама ў браўзэры. З дапамогай яго вы зможаце параўноўваць гук розных профіляў SBC і іншыя кодэкі, без фактычнай перадачы аўдыё па Bluetooth, на любых правадных слухаўках, калонках, і вашай каханай музыцы, а таксама змяняць параметры кадавання прама падчас прайгравання аўдыё.
btcodecs.valdikss.org.ru/sbc-encoder

Сувязь з распрацоўшчыкамі Android

Я пісаў шматлікім распрацоўнікам Bluetooth-стэка з Google, з просьбай разгледзець уключэнне патчаў у асноўную галінку Android – AOSP, але не атрымаў ніводнага адказу. Мае патчы ў сістэме працы з патчамі Gerrit для Android таксама засталіся без каментароў з боку кагосьці датычнага.
Я быў бы рады, калі б мне дапамаглі ў сувязі з распрацоўшчыкамі з Google і ўкараненні SBC HD у Android. Патчcет у gerrit ужо састарэлы (гэта адна з ранніх рэвізій), і я яго абнаўлю, калі распрацоўнікаў зацікавяць мае змены (мне няпроста яго абнаўляць, у мяне няма сумяшчальных з Android Q прылад).

Заключэнне

Карыстальнікі смартфонаў з прашыўкамі LineageOS, Resurrection Remix і crDroid могуць здавольвацца палепшанай якасцю гуку ўжо цяпер, дастаткова актываваць опцыю ў наладах Bluetooth-прылады. Карыстальнікі Linux таксама могуць атрымаць падвышаны бітрэйт SBC, шляхам усталёўкі патча ад Pali Rohár, які, апроч усяго іншага, дадае падтрымку кодэкаў aptX, aptX HD і FastStream.

Крыніца: habr.com

Дадаць каментар