Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Zaleca się zapoznać się z wcześniejszym artykułem przed przeczytaniem tego. Audio przez Bluetooth: szczegółowe informacje o profilach, kodekach i urządzeniach

Niektórzy użytkownicy bezprzewodowych słuchawek zauważają niską jakość dźwięku i brak wysokich częstotliwości podczas korzystania z standardowego kodeka Bluetooth SBC, który obsługują wszystkie urządzenia audio. Częstą rekomendacją na poprawę dźwięku jest zakup urządzeń i słuchawek obsługujących kodeki aptX i LDAC. Te kodeki wymagają opłat licencyjnych, dlatego urządzenia z ich obsługą są droższe.

Okazuje się, że niska jakość SBC jest spowodowana sztucznymi ograniczeniami stosów Bluetooth i ustawieniami słuchawek, a to ograniczenie można obejść na wszystkich istniejących urządzeniach, poprzez zmiany w oprogramowaniu smartfona lub komputera.

Kodek SBC

Kodek SBC ma wiele różnych parametrów, które ustalane są na etapie nawiązywania połączenia. Należą do nich:

  • Liczba i typ kanałów: Joint Stereo, Stereo, Dual Channel, Mono;
  • Liczba pasm częstotliwości: 4 lub 8;
  • Liczba bloków w pakiecie: 4, 8, 12, 16;
  • Algorytm przydzielania bitów podczas kwantyzacji: Loudness, SNR;
  • Maksymalne i minimalne wartości puli bitów używanych podczas kwantyzacji (bitpool): zwykle od 2 do 53.

Urządzenie dekodujące musi wspierać dowolne połączenie tych parametrów. Urządzenie kodujące może nie realizować wszystkich.
Istniejące stosy Bluetooth zwykle ustalają następujący profil: Joint Stereo, 8 pasm, 16 bloków, Loudness, bitpool 2..53. Ten profil koduje audio 44.1 kHz z bitrate'em 328 kbit/s.
Parametr bitpool bezpośrednio wpływa na bitrate w ramach jednego profilu: im jest wyższy, tym wyższy bitrate, a co za tym idzie, jakości.
Jednak parametr bitpool nie jest związany z konkretnym profilem; inne parametry mają również znaczący wpływ na bitrate: typ kanałów, liczba pasm częstotliwości, liczba bloków. Można pośrednio zwiększyć bitrate, ustalając niestandardowe profile, bez zmiany bitpool.

Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Formuła do obliczania bitrate'u SBC

Na przykład tryb Dual Channel koduje kanały osobno, wykorzystując cały bitpool dla każdego z kanałów. Зmuszając urządzenie do użycia Dual Channel zamiast Joint Stereo, uzyskujemy prawie podwojony bitrate przy tej samej maksymalnej wartości bitpool: 617 kbit/s.
Uważam, że używanie wartości bitpool niezwiązanej z profilem na etapie negocjacji to wada standardu A2DP, co doprowadziło do sztucznego ograniczenia jakości SBC. Rozsądniej byłoby negocjować bitrate, a nie bitpool.

Takie stałe wartości Bitpool i Bitrate pochodzą z tabeli rekomendowanych wartości do użycia w wysokiej jakości audio. Jednak rekomendacja to nie powód, aby ograniczać się tylko do tych wartości.

Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Specyfikacja A2DP v1.2, która była aktywna od 2007 do 2015 roku, nakazuje wszystkim urządzeniom dekodującym prawidłowo działać z bitrate'ami do 512 kbit/s:

Dekoder SNK powinien obsługiwać wszystkie możliwe wartości bitpool, które nie przekraczają maksymalnego bitrate'u. Ten profil ogranicza dostępny maksymalny bitrate do 320 kbit/s dla mono i 512 kbit/s dla trybów dwukanałowych.

W nowej wersji specyfikacji nie ma ograniczenia bitrate'u. Zakłada się, że nowoczesne słuchawki wydane po 2015 roku i wspierające EDR mogą obsługiwać bitrate do ≈730 kbit/s.

Z jakiegoś powodu w sprawdzonych przeze mnie stosach Bluetooth na Linuxie (PulseAudio), Androidzie, BlackBerry i macOS są sztuczne ograniczenia maksymalnej wartości parametru bitpool, który bezpośrednio wpływa na maksymalny bitrate. Jednak to nie jest największy problem, prawie wszystkie słuchawki również ograniczają maksymalną wartość bitpool do liczby 53.
Jak już się przekonałem, większość urządzeń działa doskonale na zmodyfikowanym stosie Bluetooth z bitrate'em wynoszącym 551 kbit/s, bez przerywań i trzasków. Jednak taki bitrate nigdy nie będzie negocjowany w normalnych warunkach, na standardowych stosach Bluetooth.

Modyfikowalny stos Bluetooth

W każdym stosie Bluetooth, który jest zgodny ze standardem A2DP, istnieje wsparcie dla trybu Dual Channel, jednak aktywacja go z interfejsu nie jest możliwa.

Dodajmy przełącznik do interfejsu! Zrobiłem poprawki dla Androida 8.1 i Androida 9, które dodają pełne wsparcie dla Dual Channel do stosu, dodają tryb do menu przełączania w narzędziach deweloperskich i obsługują SBC z Dual Channel tak, jakby to był dodatkowy kodek, taki jak aptX, AAC czy LDAC (Android nazywa to HD Audio), dodając zaznaczenie w ustawieniach urządzenia Bluetooth. Oto jak to wygląda:

Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Poprawka dla Androida 9
Poprawka dla Androida 8.1

Po zaznaczeniu opcji, dźwięk Bluetooth zaczyna być przesyłany z bitrate'em 551 kbit/s, jeśli słuchawki obsługują połączenie przy prędkości 3 Mbit/s, lub 452 kb/s, jeśli słuchawki obsługują tylko 2 mb/s.

Ta poprawka jest zawarta w następujących alternatywnych wersjach oprogramowania:

  • LineageOS
  • Resurrection Remix
  • crDroid

Skąd wzięły się 551 i 452 kb/s?

Technologia dzielenia rozgłosu w Bluetooth ma na celu efektywne przesyłanie dużych pakietów o stałej wielkości. Przesyłanie danych odbywa się w slotach, największa liczba slotów wysyłanych w trakcie jednej transmisji wynosi 5. Istnieją również tryby przesyłania, które wykorzystują 1 lub 3 sloty, ale nie 2 ani 4. W 5 slotach można przesłać do 679 bajtów przy prędkości połączenia 2 mb/s i do 1021 bajtów przy prędkości 3 mb/s, a w 3 slotach – odpowiednio 367 i 552 bajty.

Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Jeśli chcemy przesłać mniej danych, niż 679 lub 1021 bajtów, ale więcej niż 367 lub 552 bajty, to transmisja i tak zajmie 5 slotów, a dane będą przesyłane w tym samym czasie, co obniża efektywność przesyłania.

Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

SBC w trybie Dual Channel, przy 44100 Hz audio z parametrami Bitpool 38, 16 bloków w ramce, 8 pasmami częstotliwości, koduje audio w ramkach o rozmiarze 164 bajty, z bitrate'em 452 kb/s.
Audio musi być enkapsulowane w protokoły przesyłania L2CAP i AVDTP, które zajmują 16 bajtów z użytecznego obciążenia audio.

Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

W ten sposób, w jednej transmisji Bluetooth z 5 slotami udaje się pomieścić 4 ramki audio:

679 (EDR 2 mb/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (nagłówek SBC) - (164*4) = 6

Pomieściliśmy 11.7 ms danych audio w wysyłanym pakiecie, który zostanie przesłany w ciągu 3.75 ms, i pozostało nam 6 niewykorzystanych bajtów w przesyłce.
Jeśli lekko podniesiemy bitpool, 4 ramki audio już nie zmieszczą się w jednym pakiecie. Będziemy musieli wysyłać po 3 ramki naraz, co obniża efektywność przesyłania, zmniejsza ilość przesyłanego audio w jednym pakiecie i szybciej prowadzi do przerywania dźwięku w złych warunkach radiowych.

W ten sam sposób dobrano bitrate 551 kb/s dla EDR 3 mb/s: przy Bitpool 47, 16 blokach w ramce, 8 pasmach częstotliwości uzyskuje się rozmiar ramki 200 bajtów, przy bitrate 551 kb/s. W jednym pakiecie mieści się 5 ramek lub 14.6 ms muzyki.

Algorytm obliczania wszystkich parametrów SBC jest dość skomplikowany, łatwo się zgubić podczas ręcznego liczenia, dlatego stworzyłem interaktywny kalkulator w pomoc dla zainteresowanych: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Po co to wszystko?

Wbrew powszechnemu przekonaniu o jakości dźwięku kodeka aptX, w przypadku niektórych plików może on dawać wyniki gorsze niż SBC przy standardowej przepływności 328 kbit/s.

SBC dynamicznie przydziela bity kwantowania do pasm częstotliwości, działając na zasadzie »od dolnych do górnych«. Jeśli całkowita przepływność jest wykorzystywana na dolne i średnie częstotliwości, górne częstotliwości zostaną »przycięte« (zamiast nich będzie cisza).
aptX kwantuje pasma częstotliwości stałą liczbą bitów, co skutkuje stałą przepływnością: 352 kbit/s dla 44,1 kHz, 384 kbit/s dla 48 kHz, i nie potrafi »przenieść bitów« na te częstotliwości, które najbardziej ich potrzebują. W przeciwieństwie do SBC, aptX nie będzie »przycinał« częstotliwości, a będzie dodawał do nich szumy kwantowania, zmniejszając dynamiczny zakres audio, a czasami wprowadzając charakterystyczne trzaski. Natomiast SBC »pożera szczegóły« — odrzuca najcichsze fragmenty.
Średnio, w porównaniu do SBC 328k, aptX wprowadza mniej zniekształceń w muzyce o szerokim zakresie częstotliwości, ale w przypadku muzyki o wąskim zakresie częstotliwości i szerokim zakresie dynamicznym SBC 328k czasami wygrywa.

Rozważmy przypadek szczególny. Spektrogram nagrania gry na fortepianie:
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Podstawowa energia leży w częstotliwościach od 0 do 4 kHz, a trwa do 10 kHz.
Spektrogram pliku skompresowanego w aptX wygląda następująco:
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

A tak wygląda SBC 328k.
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Widać, że SBC 328k okresowo całkowicie wyłączał zakres powyżej 16 kHz, wykorzystując całą dostępną przepływność na zakresy poniżej tej wartości. Jednak aptX wprowadził więcej zniekształceń w spektrum częstotliwości słyszalnych dla ludzkiego ucha, co można zobaczyć na odjętym oryginalnym spektrogramie od spektrogramu aptX (im jaśniejsze, tym więcej zniekształceń):
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Podczas gdy SBC 328k mniej zepsuł sygnał w zakresie od 0 do 10 kHz, a resztę — obciął:
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Przepływność 485k SBC wystarczyła, aby zachować cały zakres częstotliwości, bez wyłączania pasm.
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

SBC 485k w tej kompozycji znacząco przewyższa aptX w zakresie 0-15 kHz, a z mniejszą, ale wciąż zauważalną różnicą — w 15-22 kHz (im ciemniej, tym mniej zniekształceń):
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Archiwum oryginalnego audio, SBC i aptX.

Przechodząc na wysokobitowy SBC, uzyskasz dźwięk, który często przewyższa aptX, na dowolnych słuchawkach. Na słuchawkach obsługujących połączenie EDR 3 Mbit/s, przepływność 551 kbit/s daje dźwięk porównywalny z aptX HD.

A można jeszcze więcej?

W poprawce dla systemu Android znajduje się również opcja dalszego zwiększenia bitrate dla urządzeń EDR do 2 Mbps. Można podnieść bitrate z 452 kbps do 595 kbps, kosztem zmniejszenia stabilności transmisji w trudnych warunkach radiowych.
Wystarczy ustawić zmienną persist.bluetooth.sbc_hd_higher_bitrate na wartość 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Patch na ekstremalny bitrate został na razie zaakceptowany tylko w LineageOS 15.1, ale nie w 16.0.

Kompatybilność z urządzeniami

SBC Dual Channel jest wspierany przez praktycznie wszystkie słuchawki, głośniki i systemy audio w samochodach. Nic dziwnego - standard zakłada jego wsparcie w każdym urządzeniu dekodującym. Jest kilka urządzeń, na których tryb ten powoduje problemy, ale to są przypadki jednostkowe.
Szczegółowe informacje o kompatybilnych urządzeniach można znaleźć na 4pda lub xda-developers.

Porównanie różnic w dźwięku

Stworzyłem serwis internetowy, który koduje audio w SBC (a także aptX i aptX HD) w czasie rzeczywistym, bezpośrednio w przeglądarce. Dzięki niemu można porównywać dźwięk różnych profili SBC i inne kodeki, bez faktycznego przesyłania audio przez Bluetooth, na dowolnych słuchawkach przewodowych, głośnikach, oraz swojej ulubionej muzyce, a także zmieniać parametry kodowania w czasie odtwarzania audio.
btcodecs.valdikss.org.ru/sbc-encoder

Kontakt z deweloperami Androida

Napisałem do wielu deweloperów stosu Bluetooth z Google, prosząc o rozważenie włączenia poprawek do głównej gałęzi Androida — AOSP, ale nie dostałem żadnej odpowiedzi. Moje poprawki w systemie zarządzania patchami Gerrit dla Androida również pozostały bez komentarzy ze strony kogokolwiek związanego z tematem.
Byłbym wdzięczny, gdyby ktoś mógł mi pomóc w kontakcie z deweloperami z Google oraz wdrożeniu SBC HD w Androidzie. Patch w gerrit jest już przestarzały (to jedna z wczesnych wersji), i zaktualizuję go, jeśli deweloperzy będą zainteresowani moimi zmianami (nie jest łatwo go zaktualizować, nie mam urządzeń kompatybilnych z Android Q).

Podsumowanie

Użytkownicy smartfonów z firmware'ami LineageOS, Resurrection Remix i crDroid mogą cieszyć się poprawioną jakością dźwięku już teraz, wystarczy aktywować opcję w ustawieniach urządzenia Bluetooth. Użytkownicy Linuxa również mogą uzyskać zwiększony bitrate SBC, instalując patch od Pali Rohára, który, poza tym wszystkim, dodaje wsparcie dla kodeków aptX, aptX HD i FastStream.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster