Модифікуємо 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. Цей профіль обмеження доступні максимальний bit rate до 320kb/s для mono, а 512kb/s для двох-channel modes.

У новій версії специфікації обмеження щодо бітрейту відсутнє. Передбачається, що сучасні навушники, випущені після 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 невикористаних байт у посилці.
Якщо трохи підняти bitpool, 4 аудіофрейми вже не вдасться запакувати в одну посилку. Прийде відправляти по 3 кадри за раз, що знижує ефективність передачі, зменшує кількість аудіо, що передається, за одну посилку, і швидше призведе до заїкань аудіо за поганих радіоумов.

Так само був підібраний бітрейт 551 кбіт/с для EDR 3 мбіт/с: з Bitpool 47, 16 блоками у кадрі, 8 частотними діапазонами виходить розмір кадру 200 байт, при бітрейті 551 кбіт/с. В одну посилку вміщується 5 кадрів або 14.6 мс музики.

Алгоритм розрахунку всіх параметрів 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.

Сумісність із пристроями

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

Додати коментар або відгук