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

Przed przeczytaniem tego artykułu zaleca się przeczytanie poprzedniego artykułu: Dźwięk przez Bluetooth: maksimum szczegółów na temat profili, kodeków i urządzeń

Niektórzy użytkownicy słuchawek bezprzewodowych zgłaszają słabą jakość dźwięku i brak wysokich częstotliwości podczas korzystania ze standardowego kodeka SBC Bluetooth, który jest obsługiwany przez wszystkie urządzenia audio. Powszechnym zaleceniem dotyczącym poprawy dźwięku jest zakup urządzeń i słuchawek obsługujących kodeki aptX i LDAC. Kodeki te wymagają opłat licencyjnych, więc urządzenia je obsługujące są droższe.

Okazuje się, że niska jakość SBC wynika ze sztucznych ograniczeń stosów Bluetooth i ustawień słuchawek, a ograniczenie to można ominąć na dowolnym istniejącym urządzeniu poprzez zmianę oprogramowania w smartfonie lub komputerze.

Kodek SBC

Kodek SBC ma wiele różnych parametrów, które są negocjowane w fazie konfiguracji połączenia. Pomiędzy nimi:

  • Liczba i rodzaj kanałów: Joint Stereo, Stereo, Dual Channel, Mono;
  • Liczba pasm częstotliwości: 4 lub 8;
  • Ilość klocków w opakowaniu: 4, 8, 12, 16;
  • Algorytm dystrybucji bitów podczas kwantyzacji: Loudness, SNR;
  • Maksymalna i minimalna wartość puli bitów wykorzystywanych podczas kwantyzacji (bitpool): zwykle od 2 do 53.

Urządzenie dekodujące musi obsługiwać dowolną kombinację tych parametrów. Koder może nie zaimplementować wszystkiego.
Istniejące stosy Bluetooth zazwyczaj obsługują następujący profil: Joint Stereo, 8 pasm, 16 bloków, Loudness, bitpool 2..53. Ten profil koduje dźwięk 44.1 kHz przy przepływności 328 kb/s.
Parametr bitpool wpływa bezpośrednio na bitrate w ramach jednego profilu: im wyższy, tym wyższy bitrate, a co za tym idzie, jakość.
Jednakże parametr bitpool nie jest powiązany z konkretnym profilem; Na bitrate duży wpływ mają także inne parametry: rodzaj kanałów, liczba pasm częstotliwości, liczba bloków. Możesz zwiększyć bitrate pośrednio, uzgadniając niestandardowe profile, bez zmiany bitpoolu.

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

Wzór do obliczania bitrate SBC

Na przykład tryb Dual Channel koduje kanały oddzielnie, wykorzystując całą pulę bitów dla każdego kanału. Zmuszając urządzenie do korzystania z Dual Channel zamiast Joint Stereo, uzyskujemy prawie dwukrotnie większy bitrate przy tej samej maksymalnej wartości bitpoolu: 617 kbps.
Moim zdaniem użycie na etapie negocjacji wartości bitpool niezwiązanej z profilem jest wadą standardu A2DP, która doprowadziła do sztucznego ograniczenia jakości SBC. Bardziej sensowne byłoby negocjowanie bitrate zamiast bitpool.

Te stałe wartości Bitpool i Bitrate pochodzą z tabeli z zalecanymi wartościami do stosowania w celu zapewnienia wysokiej jakości dźwięku. Ale rekomendacja nie jest powodem do ograniczania się 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 obowiązywała od 2007 do 2015 roku, wymaga, aby wszystkie urządzenia dekodujące działały poprawnie przy przepływnościach do 512 kbps:

Dekoder SNK będzie obsługiwał wszystkie możliwe wartości puli bitów, które nie powodują przekroczenia maksymalnej przepływności. Ten profil ogranicza dostępną maksymalną przepływność do 320 kb/s w trybie mono i 512 kb/s w trybach dwukanałowych.

W nowej wersji specyfikacji nie ma ograniczenia bitrate. Szacuje się, że nowoczesne słuchawki wydane po 2015 roku, które obsługują EDR, mogą obsługiwać przepływność do ≈730 kbps.

Z jakiegoś powodu testowane przeze mnie stosy Bluetooth dla systemów Linux (PulseAudio), Android, Blackberry i macOS mają sztuczne ograniczenia maksymalnej wartości parametru bitpool, co bezpośrednio wpływa na maksymalną przepływność. Ale nie to jest największym problemem, prawie wszystkie słuchawki ograniczają także maksymalną wartość bitpoolu do 53.
Jak już widziałem, większość urządzeń działa idealnie na zmodyfikowanym stosie Bluetooth z przepływnością 551 kbps, bez przerw i trzasków. Ale taka przepływność nigdy nie będzie stała w normalnych warunkach, na zwykłych stosach Bluetooth.

Modyfikowanie stosu Bluetooth

Każdy stos Bluetooth zgodny ze standardem A2DP obsługuje tryb Dual Channel, ale nie ma możliwości jego aktywacji z poziomu interfejsu.

Dodajmy przełącznik do interfejsu! Zrobiłem poprawki dla Androida 8.1 i Androida 9, które dodają pełną obsługę Dual Channel do stosu, dodają tryb do menu przełączania trybu w narzędziach programistycznych i traktują SBC z obsługą Dual Channel tak, jakby były dodatkowym kodekiem, takim jak aptX , AAC lub LDAC (Android nazywa to HD Audio), dodając znacznik wyboru 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

Łatka dla Androida 9
Łatka dla Androida 8.1

Gdy to pole wyboru jest zaznaczone, dźwięk Bluetooth zaczyna być przesyłany z szybkością transmisji 551 kot/s, jeśli słuchawki obsługują prędkość połączenia 3 Mbit/s, lub 452 kot/s, jeśli słuchawki obsługują tylko 2 Mbit/s.

Ta poprawka jest zawarta w następujących alternatywnych oprogramowaniach sprzętowych:

  • LineageOS
  • Resurrection Remix
  • cDroid

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

Technologia Bluetooth Air Sharing została zaprojektowana w celu wydajnego przesyłania dużych pakietów o stałym rozmiarze. Transmisja danych odbywa się w slotach, największa liczba slotów wysyłanych w jednym transferze to 5. Istnieją również tryby transferu wykorzystujące 1 lub 3 sloty, ale nie 2 lub 4. W 5 slotach można przesłać do 679 bajtów przy prędkości połączenia 2 Mbit/s i do 1021 bajtów przy prędkości 3 Mbit/s oraz przy 3 – odpowiednio 367 i 552 bajtów.

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 bajtów, transfer nadal zajmie 5 slotów, a dane zostaną przesłane w tym samym czasie, co zmniejsza wydajność transferu.

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

SBC w trybie Dual Channel, przy częstotliwości audio 44100 Hz z parametrami Bitpool 38, 16 bloków na ramkę, 8 zakresów częstotliwości, koduje dźwięk w ramkach o długości 164 bajtów, z szybkością transmisji 452 kbps.
Dźwięk musi być enkapsulowany w protokołach przesyłania L2CAP i AVDTP, które zajmują 16 bajtów z ładunku audio.

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

Zatem jedna transmisja Bluetooth z 5 slotami może obsłużyć 4 ramki audio:

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

W wysyłanym pakiecie mieścimy 11.7 ms danych audio, które zostaną przesłane za 3.75 ms, a w pakiecie pozostaje 6 niewykorzystanych bajtów.
Jeśli nieco zwiększysz bitpool, spakowanie 4 klatek audio w jeden pakiet nie będzie już możliwe. Będziesz musiał wysłać 3 klatki na raz, co zmniejsza wydajność transmisji, zmniejsza ilość dźwięku przesyłanego na ramkę i szybciej prowadzi do zacinania się dźwięku w złych warunkach radiowych.

W ten sam sposób wybrano przepływność 551 kbit/s dla EDR 3 Mbit/s: przy Bitpool 47, 16 bloków na ramkę, 8 zakresów częstotliwości, rozmiar ramki wynosi 200 bajtów, przy przepływności 551 kbit/s. Jedno opakowanie zawiera 5 klatek lub 14.6 ms muzyki.

Algorytm obliczania wszystkich parametrów SBC jest dość skomplikowany, można się łatwo pomylić, licząc ręcznie, dlatego zrobiłem interaktywny kalkulator, aby pomóc zainteresowanym: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Dlaczego to wszystko jest potrzebne?

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 kbps.

SBC dynamicznie przydziela bity kwantyzacji do pasm częstotliwości na zasadzie od niskiej do wysokiej. Jeśli dla niskich i średnich częstotliwości wykorzystano całą przepływność, wysokie częstotliwości zostaną „odcięte” (zamiast tego będzie cisza).
aptX kwantyzuje pasma częstotliwości o tej samej liczbie bitów przez cały czas, dlatego ma stałą przepływność: 352 kbps dla 44.1 kHz, 384 kbps dla 48 kHz i nie może „przesuwać bitów” do tych częstotliwości, które ich najbardziej potrzebują . W przeciwieństwie do SBC, aptX nie będzie „obcinał” częstotliwości, ale dodawał do nich szum kwantyzacji, zmniejszając zakres dynamiki dźwięku, a czasami wprowadzając charakterystyczne trzaski. SBC „zjada szczegóły” – odrzuca najcichsze obszary.
Średnio w porównaniu do SBC 328k, aptX wprowadza mniej zniekształceń w muzyce o szerokim zakresie częstotliwości, ale w muzyce o wąskim zakresie częstotliwości i szerokim zakresie dynamiki SBC 328k czasami wygrywa.

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

Główna energia leży w częstotliwościach od 0 do 4 kHz i 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

Można zauważyć, że SBC 328k okresowo całkowicie wyłączał zakres powyżej 16 kHz i wydawał całą dostępną przepływność na zakresy poniżej tej wartości. Jednak aptX wprowadził większe zniekształcenia do widma częstotliwości słyszalnego dla ludzkiego ucha, co widać na odjętym oryginalnym spektrogramie od spektrogramu aptX (im jaśniejszy, tym większe zniekształcenie):
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

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

Bitrate 485k SBC był wystarczający, 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 znacznie wyprzedza aptX na tym utworze w zakresie 0-15 kHz, z mniejszą, ale wciąż zauważalną różnicą 15-22 kHz (im ciemniejszy, tym mniejsze zniekształcenia):
Modyfikujemy stos Bluetooth, aby poprawić dźwięk w słuchawkach bez kodeków AAC, aptX i LDAC

Archiwum oryginalnych plików audio, SBC i aptX.

Przełączając się na SBC o dużej przepływności, uzyskasz dźwięk, który często przewyższa aptX na dowolnych słuchawkach. W słuchawkach obsługujących łączność EDR 3 Mb/s szybkość transmisji wynosząca 551 kb/s zapewnia dźwięk porównywalny z aptX HD.

Czy możesz zrobić jeszcze więcej?

Łatka dla systemu Android zawiera także opcję dalszego zwiększenia szybkości transmisji dla urządzeń EDR o przepustowości 2 Mb/s. Można zwiększyć przepływność z 452 kbit/s do 595 kbit/s, kosztem zmniejszenia stabilności transmisji w trudnych warunkach radiowych.
Wystarczy ustawić zmienną generate.bluetooth.sbc_hd_higher_bitrate na 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Łatka o ekstremalnej przepływności została dotychczas zastosowana tylko w LineageOS 15.1, ale nie w wersji 16.0.

Kompatybilność urządzeń

SBC Dual Channel jest obsługiwany przez prawie wszystkie słuchawki, głośniki i radioodtwarzacze samochodowe. Nie ma w tym nic dziwnego – standard wymaga jego obsługi w dowolnych urządzeniach dekodujących. Istnieje niewielka liczba urządzeń, na których ten tryb powoduje problemy, ale są to pojedyncze przypadki.
Więcej szczegółów na temat kompatybilnych urządzeń można znaleźć na stronie w4bsitXNUMX-dns.com lub XDA-developers.

Porównanie różnic dźwiękowych

Stworzyłem usługę internetową, która koduje dźwięk do formatu SBC (a także aptX i aptX HD) w czasie rzeczywistym, bezpośrednio w przeglądarce. Dzięki niemu możesz porównywać dźwięk różnych profili SBC i innych kodeków, bez konieczności przesyłania dźwięku przez Bluetooth, na dowolnych przewodowych słuchawkach, głośnikach i ulubionej muzyce, a także zmieniać parametry kodowania bezpośrednio podczas odtwarzania dźwięku.
btcodecs.valdikss.org.ru/sbc-encoder

Skontaktuj się z programistami Androida

Napisałem do wielu programistów stosu Bluetooth w Google, prosząc ich o rozważenie włączenia poprawek do głównej gałęzi Androida – AOSP, ale nie otrzymałem ani jednej odpowiedzi. Moje poprawki System poprawek Gerrit dla Androida również pozostało bez komentarza ze strony osób zaangażowanych.
Byłbym szczęśliwy, gdybym mógł uzyskać pomoc w skontaktowaniu się z programistami w Google i udostępnieniu SBC HD na Androida. Łatka w gerrit jest już nieaktualna (jest to jedna z wczesnych wersji) i zaktualizuję ją, jeśli twórcy zainteresują się moimi zmianami (nie jest mi łatwo ją zaktualizować, nie mam urządzeń kompatybilnych z Androidem Q ).

wniosek

Użytkownicy smartfonów z systemem LineageOS, Resurrection Remix i oprogramowaniem crDroid mogą już teraz cieszyć się lepszą jakością dźwięku, wystarczy włączyć odpowiednią opcję w ustawieniach urządzenia Bluetooth. Użytkownicy Linuksa mogą również uzyskać zwiększoną przepływność SBC, instalując łatka z Pali Rohar, który między innymi dodaje obsługę kodeków aptX, aptX HD i FastStream.

Źródło: www.habr.com

Dodaj komentarz