Graficzny analizator widma dźwięku

Tak, wiem, nazwa straszna, ale nie ma potrzeby się jakoś szczególnie nad nią rozczulać, bo mamy do czynienia z takim ustrojstwem znacznie częściej niż nam się wydaje, ale od początku.

Nie wiem, czy każdy z czytelników wie, czym jest synestezja – otóż jest to zjawisko, które dzięki nietypowej budowie mózgu pozwala na postrzeganie doznań zmysłowych za pomocą bodźców na pierwszy, drugi i kolejne nie mających związku z tematem. Synesteci potrafią powiedzieć, że dla nich Sonata Księżycowa Mozarta jest np. mokra, a Bolero smakuje budyniem, podczas gdy kolor brązowy pachnie fiołkami, a zapach morza brzmi jak brzęczenie pszczoły. Przykłady są oczywiście z miejsca, gdzie plecy tracą swą szlachetną nazwę, ponieważ nie miałem nigdy okazji ani doświadczyć synestezji ani poznać synestety, więc zwyczajnie zgaduję.

A co ma piernik do wiatraka? Otóż taki graficzny analizator widma dźwięku pozwala nam zobaczyć jak rozkładają się poszczególne częstotliwości w próbce sygnału ciągłego. Innymi słowy – możemy zobaczyć jakie częstotliwości i z jaką “mocą” tworzą słyszany przez nas dźwięk. Podobne ustrojstwo było swego czasu obowiązkowym wyposażeniem każdej jako tako szanującej się wieży Hi-Fi z lat 90-tych (co było potem – nie wiem, bo przestało mnie to interesować). Tak czy siak nasze oczy mogą widzieć muzykę, a ja chciałem takie ustrojstwo dla siebie. Bo tak.

Normalnie podobne wynalazki robi się za pomocą odpowiednich filtrów górno i dolnoprzepustowych, które odcinają niepożądane częstotliwości i wtedy łatwo już można pokazać siłę takie sygnału. Niestety (a może stety?) nie jestem elektronikiem i nie mam zielonego pojęcia o analogowej obróbce sygnałów za pomocą jakichś pasywnych elementów. Nie umiem ani zbudować odpowiednich filtrów, ani nawet pokazać na kilku lampkach siły sygnału (no dobra, to ostatnie chyba bym potrafił, bo prawie mi się udało w trakcie przymiarek do tego projektu). Co natomiast umiem to programować i podłączać kabelki.

Uzbrojony w takie umiejętności postanowiłem zbudować własny analizator spektrum wykorzystujący mikrokontroler RP2040 (zwany również Raspbery Pi Pico). Zdecydowałem się na taki mikrokontroler gdyż: jest tani (poniżej 20 PLN), ma akurat dwa wejścia analogowe (w sam raz dla sygnału stereo), ma mnóstwo wyjść cyfrowych (jednak za mało dla mych niecnych celów, ale o tym później), a co najważniejsze akurat taki miałem (a gdybym nie miał, to są łatwo dostępne). 

PICO w pełnej krasie

Jak widać na załączonym obrazku taki PICO nie ma ekranu, ani nawet jakiegoś szczególnego portu do podłączenia jakiegoś wyświetlacza (co nie do końca jest prawdą, bo są inne sposoby niż jakieś tam porty dla lamerów), postanowiłem więc zbudować własny i to do tego LEDowy. Zapewne co bardziej oświeceni myślą sobie teraz – o borze (tucholski) co za młot, ale spokojnie. Jeśli się weźmie pod uwagę, że wystarczy mi zawrotna rozdzielczość 5×6 pikseli, a kolor tych pikseli jest w zasadzie nieistotny (byle świeciło) sprawa dramatycznie się upraszcza. Mamy 30 ledów, z których każdy zapalamy sygnałem cyfrowym – jak trudno może to być? No okazuje się, że z tych wszystkich pól jakie widać powyżej musimy z miejsca kilka odrzucić – odpadają nam wszystkie “kwadratowe”, bo to “neutral”, “ziemia”, czy jak kto woli “minus” – ergo prądu z tego nie ma. Te trzy z podpisem “DEBUG” też odpadają bo są nieprogramowalne, kolejny pin odpada bo służy jako zasilanie 5V (reszta logiki jest na 3,3V i to też uzyskuje się z kolejnego pinu) 2 odpadają jako odbiorniki sygnału analogowego. Krótko mówiąc brakuje kilku pinów. Problem nie do przeskoczenia? Może trzeba dwóch PICO? Otóż nie. Potrzeba takiego cuda:

Multiplekser za 5 PLNów

To cudo, to multiplekser. Jest to rodzaj elektronicznej zwrotnicy, gdzie za pomocą 4 pinów możemy skierować sygnał podany na pole SIG do dowolnego z 16 kanałów. Dlaczego tak, zamiast drugiego PICO? Żeby zaoszczędzić 10 PLNów na lody (i czegoś się nauczyć). Dlaczego 10 a nie 15 PLNów? Bo użyłem dwóch multiplekserów aby całość działała mniej więcej tak samo. Inna sprawa, że gdybym użył dwóch PICO zapewne efekt byłby nieco ładniejszy. Ale o tym oczywiście później. Teraz czas na nie dłubaniny.

Otóż mój ekran trzeba jeszcze było stworzyć. Najłatwiej byłoby takie cudo umieścić na płytce drukowanej, a że Sknerus McKwacz u mnie uczył się oszczędności, to zobowiązuje mnie do tego by nie płacić tych 5$ za płytkę drukowaną własnego projektu. Szybciej, a przede wszystkim taniej było wydrukować ją na drukarce 3D (poza tym, co za różnica jak się drukuje te płytki co nie?).

Efektem wytężonej pracy moich rąk, lutownicy, oraz wiertarki było takie oto dzieło:

i jego mniej twarzowa część:

Gwoli wyjaśnienie – ten wielki, czerowny krodolek po pierwsze wcale nie jest taki duży, a po drugie doprowadza on napięcie 5V do wszystkich LEDów na raz. Prąd “odpływa” widocznymi na zdjęciu kabelkami do multiplekserów, które z kolei są połączone z ziemią. 

Na fotce powyżej z kolei widać jak to całe cudo jest ze sobą połączone.

Tak zmontowany ekran nie tylko specjalnie ładnie nie wygląda, ale działa też wcale nie lepiej. Zastosowanie multiplekserów i chęć przyoszczędzenia na opornikach (bo w tym układzie potrzebuję tylko dwóch po kilka groszy zamiast trzydziestu) spowodowało, że w danej chwili mogą się świecić tylko dwie diody na raz. W skrajnych wypadkach dioda może być zasilana przez zaledwie 0,01s, czyli nieszczególnie da radę zabłysnąć, a obraz drga i jest niestabilny. Na domiar złego, spaliła się jedna dioda i ogólnie smuteczek.

Część praktyczno-fizyczna za nami. Całość wygląda żałośnie i działa tak sobie. Na szczęście skasowałem filmik z próbami wyświetlenia na tym ekranie prostych animacji, więc nie będziecie musieli kaleczyć swych oczu. Nawet jednak, gdyby efektem mojej pracy był plazmowy telewizor za kilka tysięcy, to ciągle nie jest analizator spektrum. Aby się nim stał potrzebujemy kilka linijek kodu (jupi!). Zanim jednak napiszemy jakiś kod potrzebujemy zaznajomić się z teorią. Otóż teorie mówi, że kilka lat temu, no może trochę dawniej, żył sobie jegomość nazwiskiem Fourier. I ten Fourier był na tyle klawy, że wymyślił jak ze złożonego sygnału wyciągnąć jak dużo w nich poszczególnych składowych. Ktoś inny z kolei wymyślił jak przerobić jego formułę na język zrozumiały dla komputerów, a jeszcze kto inny zauważył, że w sumie można sobie tu i tam parę rzeczy uprościć dzięki czemu analiza takiego sygnału powinna być znacznie szybsza. Koniec końców świat dostał algorytm zwany szybką transformacją Fouriera (FFT), którego za diabła nie potrafiłem zrozumieć (głównie dlatego, że z ciekawszymi dziedzinami matematyki nie mam doczynienia od prawie 20 lat i nie skumałem o co biega już w samym matematycznym zapisie). Trochę mnie to podłamało i już projekt miał zostać poddany demontażowi, ale szperając w czeluściach internetu znalazłem, że istnieją biblioteki na taki jak mój mikrokontroler które potrafią obliczyć FFT (i robią to naprawdę szybko). Trochę dalszej dłubaniny, wyrzucenie “starego” firmware’u wrzucenie nowego (inaczej się nie da zaimplementować innych niż standardowe bibliotek) i miałem FFT. Miałem więc wreszcie czym potraktować odczytany przezemnie sygnał.

Niestety światełko w tunelu może nie tylko być wyjściem, ale równie dobrze nadjeżdżającym pociągiem. Tak było i tym razem. Uzyskane wyniki były dalekie od zadowalających, odświeżanie lampek było dramatycznie nieciekawe i koniec końców projekt kolejny raz wisiał na włosku. Ostatnia deska ratunku to wielowątkowość. Procesor we wspominanym przeze mnie wielokrotnie mikrokontrolerze jest dwurdzeniowy. Ze względu na brak systemu operacyjnego brak jest automatycznego zarządzania przełączaniem pomiędzy wątkami, ale dwa bez problemu da się odpalić. Po rozdzieleniu sterowania lampkami od obliczania FFT nareszcie sukces. Mamy coś, co przy dużej dozie dobrej woli można uznać za analizator spektrum! Prosze więc usiść i spokojnie podziwiać filmik.

(disclaimer – z powodu użytej technologii nagrany telefonem filmik prezentuje się znacznie gorzej niż wygląda to w rzeczywistości)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.