Od jakiegoś czasu po programowej likwidacji mojego ulubionego radia, słuchanego od wielu lat na falach UKF, teraz określanych jako FM, byłem zmuszony do „przeniesienia się” do Internetu. Zastosowanie do tego celu jakiegokolwiek komputera jest akceptowalne, ale z powodu braku mobilności niepraktyczne. Lepszym wyjściem może być użycie smartfona zwłaszcza, że daje możliwość przekierowania strumienia danych audio do interfejsu Bluetooth i przesłanie ich do urządzenia potrafiącego te dane odebrać i odtworzyć. To bardzo praktyczne rozwiązanie jest stosowane w popularnych przenośnych głośnikach Bluetooth przeznaczonych do odtwarzania muzyki ze smartfonów. Rozważałem zakup lub wykonanie takiego głośnika, ale aż taka mobilność nie była mi potrzebna i skupiłem się na rozwiązaniach, które gwarantowałby uzyskanie najlepszej jakości dźwięku.
Odtwarzanie cyfrowych danych audio zawsze będzie wymagało konwersji cyfrowo analogowej stąd pomysł na zastosowanie sprawdzonego, dobrze brzmiącego przetwornika. Opisywany w „Elektronice Praktycznej” (EP10...12/2020) przetwornik analogowo cyfrowy z układem PCM1794A z założenia był przeznaczony do połączenia przez magistralę I2S z komputerkiem Raspberry Pi. Z powodu braku sygnału Master Clock MCLK uzupełniającego magistralę I2S w Raspberry Pi został zastosowany układ PLL powielający sygnał zegarowy BCLK o częstotliwości 64 Fs. Ta konstrukcja pracuje od długiego czasu i spisuje się bez zarzutu. Dlatego drugi komplet płytek przetwornika postanowiłem zastosować w urządzeniu przeznaczonym do odtwarzania materiału dźwiękowego przesyłanego strumieniowo przez Bluetooth.
Moduł Bluetooth
Praktyczną realizację połączenia również w warunkach amatorskich bardzo ułatwiają gotowe moduły Bluetooth. Zawierają one najtrudniejsze do wykonania obwody wielkiej częstotliwości oraz mikrokontrolery obsługujące stos protokołów standardu Bluetooth. O ile moduły przeznaczone do przesyłania zwykłych danych są stosunkowo proste i tanie, to w przypadku modułów audio już tak nie jest. Moduły Bluetooth audio muszą dodatkowo zawierać zaawansowane procesory DSP z oprogramowaniem pozwalającym na obsługę kodeków. Od tego zależy jakiego kodeka czy kodeków będziemy mogli użyć.
W naszym urządzeniu został użyty moduł PA216 (fotografia 1) wykorzystujący specjalizowany układ Bluetooth CSR8675 firmy Qualcomm. Schemat blokowy układu został pokazany na rysunku 1. Odbiornik radiowy ma czułość –90 dBm, a nadajnik pracuje z mocą +10 dBm. Tor antenowy powinien być dopasowany do impedancji 50 Ω. Według specyfikacji producenta układu, oprogramowanie firmware Qualcomm wpiera wersję Bluetooth 4.2, ale producent modułu PA216 w swojej dokumentacji podaje, że własne oprogramowanie modułu obsługuje nowszą wersję – Bluetooth 5.0, zapewniającą dwukrotnie większą prędkość przesyłania danych.
Jak już wspomniałem, moduły Bluetooth audio muszą być wyposażone w wydajny mikrokontroler z jednostką DSP. Tutaj zastosowano procesor o architekturze RISC taktowany częstotliwością 80 MHz z wbudowaną pamięcią programu FLASH o pojemności 16 Mb z możliwością dołączenia zewnętrznej pamięci FLASH z interfejsem SPI o pojemności do 64 Mb.
Wbudowana pamięć RAM ma pojemność 54 kB. Jednostka DSP o nazwie Kalimba ma dwa bloki pamięci 64 k słów o długości 24 bitów i 12 k słów o długości 32 bitów przeznaczone dla kodu programu. Blok DSP jest taktowany częstotliwością 120 MHz, wykonuje sprzętowe mnożenie 24×24 bity i używa 54 bitowego akumulatora. Jak przystało na specjalizowany układ przeznaczony do cyfrowej obróbki sygnałów audio CSR8675 wyposażono w podwójny interfejs I2S i jeden interfejs S/PDIF. Umieszczony w strukturze układu 24-bitowy przetwornik DAC pracujący z częstotliwościami próbkowania do 192 kHz pozwala na realizację aplikacji z wyjściem analogowym sygnałów audio, bez konieczności stosowania zewnętrznych przetworników DAC. Może to znacznie obniżyć koszty produkcji gotowego urządzenia. Ponadto zintegrowany przetwornik analogowo-cyfrowy 24 bity/96 kHz oraz analogowe wejście mikrofonowe pozwalają na pracę z analogowym źródłem sygnału audio. Zaimplementowano też szereg standardowych układów peryferyjnych: SPI, UART, I2C, sterowniki/drivery diod LED, wejścia interfejsu dotykowego oraz interfejs USB 2.0.
Układ jest przystosowany do zasilania bateryjnego. Wbudowano w jego strukturę układ ładowania baterii Li-Ion o wydajności 200 mA i dwa impulsowe stabilizatory o napięciu wyjściowym 1,8 V i 1,35 V przystosowane do pracy z baterii.
Moduł PA216 jest dostarczany z gotowym firmware realizującym:
- standard Bluetooth 5.0,
- kodeki SBC, AAC, aptX, aptX-II, aptX-HD,
- kodek LDAC obsługujący strumienie danych do 24-bity/96 kHz,
- interfejs USB obsługujący strumienie danych do 16-bit/48 kHz,
- przesyłanie danych audio przez interfejs audio I2S master.
Wbudowany w układ procesor DSP daje możliwość kształtowania pasma akustycznego przez implementację funkcji cyfrowego equalizera. Spotkałem w Internecie niezbyt pochlebne opinie różnych wersji oprogramowania dla układów CSR8675 lub podobnych, z modyfikacjami polegającymi na wyraźnym podbijaniu krańców pasma. W tym przypadku wydaje się, że jeżeli takie modyfikacje są w ogóle wykonywane to są delikatne, ale pewności nie ma. Z punktu widzenia entuzjastów dobrego brzmienia sygnał audio powinien być przesyłany bez żadnej ingerencji w pasmo przenoszenia, a jeżeli taka ingerencja jest stosowana, to musi być możliwość jej wyłączenia. Tu niestety nie mamy takiej możliwości.
Podobnie jak w przypadku Raspberry Pi port I2S w CSR8675 nie jest uzupełniany o sygnał zegara MCLK. Układ przetwornika radzi sobie z tym problemem przez powielanie częstotliwości zegara BCK przez dodatkowy układ PLL. Z problem braku MCLK w specyfikacji I2S zderzyli się również projektanci modułu PA216. Zastosowali inne rozwiązanie w postaci konwertera częstotliwości próbkowania CS8421 z portem wyjściowym I2S Master taktowanym zewnętrznym oscylatorem kwarcowym. Schemat blokowy został pokazany na rysunku 2.
Układ ma następujące właściwości:
- Może pracować z danymi audio o długości próbki 16, 20, 24 i 32 bitów;
- Częstotliwości próbkowania zaczynają się od 8 kHz, a kończą na 192 kHz;
- Zakres dynamiki wynosi 175 dB;
- Zniekształcenia harmoniczne THD+N mają poziom –140 dB;
- Układ jest konfigurowany przez wymuszanie stanów na wejściach konfiguracyjnych. Nie potrzebuje do pracy mikrokontrolera i oprogramowania firmware;
- Dane wejściowe są przesyłane przez 3 liniowy interfejs szeregowy. W naszym przypadku dane są przesyłane w formacie I2S;
- Dane wejściowe i wyjściowe są całkowicie asynchroniczne. Port wyjściowy jest taktowany zewnętrznym oscylatorem kwarcowym.
Jak już wiemy port wyjściowy audio jest skonfigurowany jako I2S Master i wymaga zewnętrznego sygnału zegarowego MCLK (Master Clock). Od jego jakości zależą parametry generowanych sygnałów zegarowych. Osoby, które uważają, że oscylator montowany przez producenta nie spełnia ich oczekiwań mogą sobie go wymienić na taki jaki uważają za stosowny. Nadpróbkowany sygnał przynajmniej w teorii powinien mieć lepszą dynamikę (mniejsze szumy). Wydaje się, że w tym przypadku ma to niewielkie albo żadne znaczenie.
Układ CS8421 spełnia tu rolę generatora MCLK i jest tu wykorzystywana głównie funkcja portu I2S Master.
Moduł można zasilić z napięcia +3,3 V zasilającego część cyfrową przetwornika tak, jak to pokazano na rysunku 3 (dokładne zestawienie połączeń pokazuje tabela 1).
Ja w modelu zastosowałem dodatkowy stabilizator +3,3 V z układem 1117-3.3 zmontowany na kawałku druku uniwersalnego. Napięciem wejściowym jest VDDAC (ok. +8 V) podłączane na złącze zasilania P13 na płytce przetwornika. W przetworniku do podłączenia sygnałów I2S zostało wykorzystane złącze P6.
W przetworniku nie jest potrzebny układ PLL – U7 typu ICS570B i nie musi być wlutowany. Konfiguracja przetwornika za pomocą zworek P3 i P5 jest identyczna jak w przypadku wersji dla Raspberry Pi. Prawidłowo zmontowany przetwornik nie wymaga żadnych dodatkowych czynności uruchomieniowych. Połączenie telefonu z modułem PA216 jest szybkie i pewne. Nie zauważyłem problemów ze zrywaniem transmisji, oczywiście w ramach poprawnego zasięgu Bluetooth 5.0.
Kodeki
Jakość przesyłanego dźwięku w standardzie Bluetooh zależy od możliwości specjalnego oprogramowania nazywanego kodekiem (połączenie słów kodowanie i dekodowanie). Żeby dwa urządzenia połączone przez Bluetooth mogły wykorzystywać zalety konkretnego kodeka musi go wspierać zarówno nadajnik sygnału (na przykład smartfon) jak i odbiornik sygnału (słuchawki, głośniki Bluetooth). Zdarza się, że ktoś kupuje słuchawki bezprzewodowe w założeniu wysokiej jakości wspierające nowy wydajny kodek, ale źródło sygnału na przykład stary smartfon, tego kodeka nie wspiera. System Bluetooth jest tak zorganizowany, że w takim przypadku przesyłanie dźwięku będzie działało, ale jakość sygnału nie będzie zgodna z oczekiwaniami. Trzeba mieć świadomość, że wszystkie obecnie stosowane kodeki są stratne i powodują większą lub mniejszą degradację sygnału audio. Nowe standardy są coraz bardziej doskonałe i oferują odtwarzanie na wysokim poziomie, ale dla bezkompromisowego audiofila może to być bariera nie do pokonania. Serwisy streamingowe, takie jak Tidal, oferują bezstratny transfer danych o jakości płyty CD (16 bitów 44,1 kHz). Przez Bluetooth, na razie takiego strumienia nie prześlemy, chociaż najnowsze rozwiązania są bliskie tego osiągnięcia. Obecnie jest stosowanych kilka kodeków. Historycznie pierwszym jest SBC.
Kodek SBC
Kodek SBC (Subband Coding) to domyślny kodek, który musi być zaimplementowany w każdej realizacji połączenia Bluetooth Audio. To właśnie domyślna implementacja SBC powoduje, że zawsze jest możliwe przesyłanie danych audio nawet wtedy, kiedy inne kodeki nie są ze sobą kompatybilne. Przy projektowaniu SBC położono szczególny nacisk na silną kompresję danych, niskie użycie energii i minimalne opóźnienie. Jakość sygnału audio nie była tu priorytetem i to niestety można usłyszeć szczególnie w porównaniu z nowszymi rozwiązaniami. Jest to dość stary kodek i był dostosowany do technicznych możliwości dostępnych ok. 2000 roku. Przesyłany sygnał audio ma 16 bitów przy próbkowaniu 48 kHz.
Maksymalna przepływność wynosi 328 kbps co odpowiada przepływności 320 kbps sygnału MP3.
Kodek aptX
To chyba najbardziej znany i popularny kodek używany w transmisji danych audio przez Bluetooth. Został opracowany przez Qualcomm. W podstawowej wersji parametry sygnału audio i przepustowość są porównywalne z kodekiem SBC, ale kompresja danych jest lepsza. Według zapewnień miał to być kodek, który miał zapewnić przesłanie dźwięku o jakości CD. Oczywiście przy maksymalnej przepływności 384 kbps nie ma mowy o przesyłaniu surowych plików. Gdyby przesyłać pliki kompresowane bezstratnie w formacie FLAC to pewnie prawie by się udało, ale aptX wprowadza kompresję sygnału, więc i tak go modyfikuje.
Qualcomm pracuje nad swoim kodekami i wydaje nowe bardziej zaawansowane wersje. Jedną z najbardziej interesujących jest aptX HD potrafiący przesyłać pliki o rozdzielczości do 24 bitów z próbkowaniem 48 kHz w trybie LPCM. Przepływność została zwiększona do 576 kbps. To są już wyraźnie lepsze parametry od aptX i SBC. Tak przesyłane dane mogą reprezentować sygnał o naprawdę wysokiej jakości.
Kodek LDAC
Jeszcze więcej osiągnęła firma Sony opracowując kodek LDAC. Nie jest tak popularny jak aptX, ale ma bardzo interesujące parametry: obsługuje pliki 24 bity/96 kHz i zapewnia maksymalną przepływność 990 kbps. W praktyce LDAC procuje w trzech trybach: 330 kbps, 660 kbps i 990 kbps. Najniższa przepływność LDAC jest domyślnie włączana w telefonach z systemem Android. Włączenie wyższych prędkości wymaga ręcznej interwencji użytkownika. Ale nawet 330 kbps zapewnia wyższą jakość LDAC w porównaniu z SBC i aptX.
Skonfigurowanie LDAC z najwyższą przepływnością pozwala mieć nadzieję na przesyłanie materiału audio o naprawdę wysokiej jakości na przykład korzystając z najwyższego planu serwisu TIDAL.
Kodek AAC
AAC (Advanced Audio Coding) jest kodekiem firmy Apple i korzystają z niego smartfony iPhone, ale też iPady i MacBooki. Brak wsparcia dla AAC spowoduje powoduje, że połączenie z iPhone nie będzie możliwe. AAC jest implementowany w systemach Android o wersji 8+. Dane w formacie do 16 bitów/96 kHz są przesyłane z maksymalną przepływnością 320 kbit/s.
To oczywiście nie wszystkie rozwiązania. Procesory montowane we flagowych smartfonach mają coraz większe wydajności pozwalające implementować rozwiązania do tej pory nie dostępne dla mobilnych urządzeń. Prace idą w kilku kierunkach, nie tylko zwiększania jakości przez większe prędkości transferu i coraz lepsze kodowanie stratne. Stosuje się też adaptacyjne dostosowanie przepływności do parametrów sygnału. Pracuje się też nad minimalizacją opóźnień istotną w odtwarzaniu filmów, ale szczególnie w grach komputerowych.
Jedną z najbardziej znanych platform oferujących muzykę jest platforma steramingowa Spotify. Oferuje olbrzymią bibliotekę muzyczną, ale z założenia nie jest przeznaczona do przesyłania plików najwyższej jakości. W płatnej wersji Premium oferuje kompresowany sygnał 16 bitów/44,1 kHz przesyłany z przepływnością ok 320 kbps. Dla tak zwanego zwykłego użytkownika to jest jakość zupełnie wystarczająca. W przypadku radiowych stacji internetowych często jest gorzej. Wykorzystują one transmisję kompresowaną MP3 lub AAC o przepływności 128 kbps lub 256 kbps. Z tego co sobie powiedzieliśmy użycie różnych kodeków może powodować lepszą lub gorszą jakość dźwięku. Dla stacji radiowych i serwisów streamingowych teoretycznie najlepsza będzie LDAC 330 kbps, potem aptX lub AAC i na końcu SBC. Dobrze byłoby mieć możliwość obsługi tych kodeków i wybrać sobie najbardziej odpowiedni. Nie bez znaczenia jest również jakość konwersji cyfrowo analogowej.
Podsumowanie
Zawsze można sobie zadać pytanie, czy w systemach dźwięku wykorzystujących kompresję stratną warto stosować przetworniki wyższej klasy. Według mnie warto. Bezprzewodowa transmisja strumieni audio jest intensywnie rozwijana i są już plany producentów, które przewidują, że nie da się odróżnić sygnału przesyłanego przez Bluetooth PCM od tego z płyty Compact Disc. Nawet teraz bardzo popularny Spotify w wersji Premium oferuje jakość zupełnie dobrą. Jeżeli się pogodzimy z niewielką utratą jakości, to zyskujemy dostęp do prawie nieograniczonego zasobu muzyki polskiej i światowej. Tidal oferuje steraming w planie Hi-Fi w dużo wyższej przepływności i jeżeli mamy telefon z odpowiednimi kodekami to można uzyskać bardzo dobrą jakość, mimo że najprawdopodobniej nadal przez Bluetooth sygnał będzie kompresowany.
Nie zapominajmy, że moduł PA216 ma wejście USB, przez które dane są przesyłane w formie nie skompresowanej. Skąpa dokumentacja modułu tego nie potwierdza, ale układ wspiera tylko dane 16 bitów/48 kHz i technicznie chyba nie ma problemu, żeby to przesłać bez ingerencji programowej. Wejście USB również sprawdziłem i działa poprawnie. Jest aktywne tylko wtedy, kiedy nie ma połączenia z telefonem przez Bluetooth. W przeciwnym przypadku USB jest wyłączane i dane są odbierane przez Bluetooth. To proste i bardzo dobrze działające rozwiązanie.
Pierwsze testy modułu zacząłem od podłączenia zewnętrznej anteny zasilenia go napięciem +3,3 V. Celowo wybrałem wersję z gniazdem anteny zewnętrznej zamiast anteny zintegrowanej na PCB, bo w założeniu urządzenie miało być umieszczone w metalowej obudowie. Działający układ jest wykrywany w liście urządzeń bluetooth jako CSR8675-LDAC (rysunek 4).
Po połączeniu z modułem pojawia się informacja „połączono do obsługi dźwięku”. W tym momencie możemy przesyłać przez Bluetooth strumień danych audio z telefonu. Po uruchomieniu aplikacji streamingowych Spotify, Netfix, Youtube itp. na wyjściach interfejsu I2S pojawiają się sygnały zegarowe i danych. W tym momencie możemy połączyć PA216 z przetwornikiem DAC.
Tomasz Jabłoński, EP