Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Перед прочтением этой статьи рекомендуется ознакомиться с предыдущей статьёй: Âm thanh qua Bluetooth: chi tiết tối đa về cấu hình, codec và thiết bị

Некоторые пользователи беспроводных наушников отмечают низкое качество звука и недостаток высоких частот при использовании стандартного 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.

Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Формула подсчета битрейта SBC

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

Такие фиксированные значения Bitpool и Bitrate берут свое начало из таблицы с рекомендованными к использованию значениями для высококачественного аудио. Но рекомендация — не повод ограничиваться этими значениями.

Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

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

The decoder of the SNK shall support all possible bitpool values that do not result in excess of the maximum bit rate. This profile limits the available maximum bit rate to 320kb/s for mono, and 512kb/s for two-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-устройства. Вот как это выглядит:

Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

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

При активации галочки, Bluetooth-аудио начинает передаваться с битрейтом 551 kbps, если наушники поддерживают соединение на скорости 3 мбит/с, или 452 kbps, если наушники поддерживают только 2 мбит/с.

Данный патч включён в следующие альтернативные прошивки:

  • LineageOS
  • Phục hồi Remix
  • cDroid

Откуда взялись 551 и 452 кбит/с?

Технология разделения эфира в Bluetooth предназначена для эффективной передачи больших пакетов фиксированного размера. Передача данных происходит слотами, самое большое количество слотов, отправляемых за одну передачу — 5. Также есть режимы передачи, использующие 1 или 3 слот, но не 2 или 4. В 5 слотах можно передать до 679 байт на скорости соединения 2 мбит/с и до 1021 байт на скорости 3 мбит/с, а в 3 — 367 и 552 байта соответственно.

Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

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

Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

SBC ở chế độ Dual Channel, ở âm thanh 44100 Hz với thông số Bitpool 38, 16 khối trên mỗi khung hình, 8 dải tần, mã hóa âm thanh thành khung 164 byte, tốc độ bit 452 kbps.
Âm thanh phải được gói gọn trong các giao thức truyền L2CAP và AVDTP, lấy 16 byte từ tải trọng âm thanh.

Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Do đó, một đường truyền Bluetooth có 5 khe cắm có thể chứa 4 khung âm thanh:

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

Chúng tôi đưa 11.7 ms dữ liệu âm thanh vào gói được gửi, gói này sẽ được truyền trong 3.75 ms và chúng tôi còn 6 byte chưa sử dụng trong gói.
Nếu bạn tăng bitpool lên một chút, sẽ không thể gói 4 khung âm thanh vào một gói được nữa. Bạn sẽ phải gửi 3 khung hình cùng lúc, điều này làm giảm hiệu quả truyền tải, giảm lượng âm thanh truyền trên mỗi khung hình và nhanh chóng dẫn đến hiện tượng giật âm thanh trong điều kiện sóng vô tuyến kém.

Theo cách tương tự, tốc độ bit 551 kbit/s đã được chọn cho EDR 3 Mbit/s: với Bitpool 47, 16 khối trên mỗi khung hình, 8 dải tần số, kích thước khung hình là 200 byte, với tốc độ bit là 551 kbit/s. Một gói chứa 5 khung hình hoặc 14.6 ms âm nhạc.

Thuật toán tính toán tất cả các tham số SBC khá phức tạp, bạn có thể dễ bị nhầm lẫn nếu đếm thủ công, vì vậy tôi đã tạo một máy tính tương tác để giúp những người quan tâm: btcodecs.valdikss.org.ru/sbc-bitrate-computer

Tại sao tất cả điều này là cần thiết?

Trái ngược với suy nghĩ phổ biến về chất lượng âm thanh của codec aptX, trên một số tệp, nó có thể tạo ra kết quả kém hơn SBC với tốc độ bit tiêu chuẩn là 328 kbps.

SBC phân bổ động các bit lượng tử hóa cho các dải tần trên cơ sở từ thấp đến cao. Nếu tất cả tốc độ bit được sử dụng cho tần số thấp và trung bình thì tần số cao sẽ bị “cắt” (thay vào đó sẽ có khoảng im lặng).
aptX luôn lượng tử hóa các dải tần có cùng số bit, đó là lý do tại sao nó có tốc độ bit không đổi: 352 kbps cho 44.1 kHz, 384 kbps cho 48 kHz và không thể “dịch chuyển bit” sang những tần số cần chúng nhất . Không giống như SBC, aptX sẽ không “cắt” tần số mà sẽ thêm nhiễu lượng tử hóa vào chúng, làm giảm dải động của âm thanh và đôi khi tạo ra tiếng tanh tách đặc trưng. SBC “ăn chi tiết” - loại bỏ những khu vực yên tĩnh nhất.
Trung bình, so với SBC 328k, aptX ít biến dạng hơn trong âm nhạc có dải tần rộng, nhưng trong âm nhạc có dải tần hẹp và dải động rộng, SBC 328k đôi khi lại thắng.

Hãy xem xét một trường hợp đặc biệt. Quang phổ của bản ghi âm chơi đàn piano:
Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Năng lượng chính nằm ở tần số từ 0 đến 4 kHz và tiếp tục lên đến 10 kHz.
Biểu đồ phổ của tệp được nén trong aptX trông như thế này:
Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Và đây là giao diện của SBC 328k.
Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Có thể thấy, SBC 328k định kỳ tắt hoàn toàn dải tần trên 16 kHz và dành toàn bộ tốc độ bit có sẵn cho các dải dưới giá trị này. Tuy nhiên, aptX đã tạo ra nhiều biến dạng hơn trong phổ tần số mà tai người có thể nghe được, như có thể thấy trong biểu đồ phổ ban đầu bị trừ khỏi biểu đồ phổ aptX (càng sáng, càng biến dạng):
Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Trong khi SBC 328k làm hỏng tín hiệu ít hơn trong phạm vi từ 0 đến 10 kHz và cắt phần còn lại:
Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Tốc độ bit 485k của SBC đủ để duy trì toàn bộ dải tần mà không vô hiệu hóa các băng tần.
Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

SBC 485k vượt trội đáng kể so với aptX trên rãnh này ở dải 0-15 kHz, với mức chênh lệch nhỏ hơn nhưng vẫn đáng chú ý là 15-22 kHz (càng tối thì độ méo càng ít):
Sửa đổi ngăn xếp Bluetooth để cải thiện âm thanh trên tai nghe không có codec AAC, aptX và LDAC

Lưu trữ âm thanh gốc, SBC và aptX.

Bằng cách chuyển sang SBC tốc độ bit cao, bạn sẽ có được âm thanh thường đánh bại aptX trên mọi tai nghe. Trên tai nghe hỗ trợ kết nối EDR 3 Mbps, tốc độ bit 551 kbps tạo ra âm thanh tương đương với aptX HD.

Bạn có thể làm nhiều hơn nữa?

Bản vá Android cũng bao gồm tùy chọn tăng thêm tốc độ bit cho các thiết bị EDR 2 Mbps. Bạn có thể tăng tốc độ bit từ 452 kbit/s lên 595 kbit/s, nhưng phải trả giá bằng việc giảm độ ổn định truyền trong các điều kiện vô tuyến khó khăn.
Chỉ cần đặt biến Persist.bluetooth.sbc_hd_higher_bitrate thành 1 là đủ:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Bản vá tốc độ bit cực cao cho đến nay chỉ được áp dụng trong LineageOS 15.1 chứ không phải trong 16.0.

Khả năng tương thích của thiết bị

SBC Dual Channel được hầu hết các tai nghe, loa và thiết bị đầu xe hơi hỗ trợ. Điều này không có gì lạ - tiêu chuẩn này yêu cầu sự hỗ trợ của nó trong bất kỳ thiết bị giải mã nào. Có một số ít thiết bị mà chế độ này gây ra sự cố, nhưng đây là những trường hợp riêng lẻ.
Bạn có thể tìm thêm thông tin chi tiết về các thiết bị tương thích tại 4pda hoặc xda-phát triển.

So sánh sự khác biệt về âm thanh

Tôi đã tạo một dịch vụ web mã hóa âm thanh thành SBC (cũng như aptX và aptX HD) trong thời gian thực, ngay trong trình duyệt. Với nó, bạn có thể so sánh âm thanh của các cấu hình SBC khác nhau và các codec khác mà không thực sự truyền âm thanh qua Bluetooth, trên bất kỳ tai nghe, loa có dây và bản nhạc yêu thích nào của bạn, đồng thời cũng có thể thay đổi trực tiếp các thông số mã hóa trong khi phát âm thanh.
btcodecs.valdikss.org.ru/sbc-encoding

Liên hệ với nhà phát triển Android

Tôi đã viết thư cho nhiều nhà phát triển ngăn xếp Bluetooth tại Google để yêu cầu họ xem xét đưa các bản vá vào nhánh Android chính - AOSP, nhưng không nhận được một phản hồi nào. Các bản vá của tôi trong Hệ thống vá lỗi Gerrit cho Android cũng không có bình luận từ bất kỳ ai liên quan.
Tôi sẽ rất vui nếu có thể nhận được sự trợ giúp nào đó trong việc liên hệ với các nhà phát triển tại Google và đưa SBC HD lên Android. Bản vá trong gerrit đã lỗi thời (đây là một trong những bản sửa đổi đầu tiên) và tôi sẽ cập nhật nó nếu các nhà phát triển quan tâm đến những thay đổi của tôi (tôi không dễ dàng cập nhật nó, tôi không có thiết bị tương thích với Android Q ).

Kết luận

Người dùng điện thoại thông minh có phần mềm LineageOS, Resurrection Remix và crDroid có thể tận hưởng chất lượng âm thanh được cải thiện ngay bây giờ, chỉ cần kích hoạt tùy chọn trong cài đặt thiết bị Bluetooth. Người dùng Linux cũng có thể tăng tốc độ bit SBC bằng cách cài đặt bản vá từ Pali Rohar, trong số những thứ khác, bổ sung hỗ trợ cho codec aptX, aptX HD và FastStream.

Nguồn: www.habr.com

Thêm một lời nhận xét