Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Analizator widma na układzie MSGEQ7

ghost666 18 Lis 2019 15:08 1953 2
  • W poniższym artykule skupimy się na zebraniu wszystkich informacji o aplikacji układu MSEQ7 – scalonego analizatora widma dla sygnałów audio.

    Analizator widma na układzie MSGEQ7
    Projekty ‘audio-reaktywne’

    W pierwszej kolejności zarysować musimy potrzebę wykorzystania tego rodzaju układu. Załóżmy, że chcemy skonstruować jakieś urządzenie, które reaguje na dźwięk. Może to być zestaw diod LED, które rozświetlają się w rytm muzyki, albo też bardziej złożony układ lub analizator dźwięku.

    Jeśli chcemy, by nasz projekt reagował na dźwięk, musimy wyposażyć go np. w mikrofon . Doskonale w tym celu nadaje się kompaktowy mikrofon MEMS wraz ze wzmacniaczem sygnału. Tego rodzaju układy dostępne są w postaci niewielkich, kompaktowych modułów, które dołączyć możemy do naszego układu. Istnieje kilka opcji integracji mikrofonu z pozostałą częścią elektroniki i odczytu sygnału audio.

    Opcja 1: Podłączenie sygnału audio do mikrokontrolera (bez FFT)

    Najprostszą z opcji jest podanie sygnału analogowego z wzmacniacza na jedno z wejść analogowych mikrokontrolera. W naszym przypadku będzie to moduł Arduino Nano z niewielkim mikrokontrolerem ATMega, który jakkolwiek ograniczony (8-bitowa szyna danych, 16 MHz zegar procesora etc.) daje całkiem ciekawe możliwości zabawy sygnałem.

    Analizator widma na układzie MSGEQ7
    Uproszczony schemat, w którym sygnał audio podajemy bezpośrednio na mikrokontroler.


    Na schemacie pokazano siedem kanałów LED wychodzących z mikrokontrolera. W rzeczywistym układzie zamiast zwykłych diod LED zastosowane zostaną moduły NeoPixel oparte na WS2812, które można łączyć ze sobą szeregowo, co oznacza, że do ich wysterowania wystarczy jedynie jeden pin mikrokontrolera. Ukazanie siedmiu pinów wyjściowych na powyższym schemacie ma jedynie poprawić czytelność opisu działania i procesu realizowanego w układzie.

    W idealnym przypadku dla tego układu, sygnał wyjściowy z mikrofonu powinien mieć składową stałą równą 2,5 V i napięcie międzyszczytowe równe 5 V. Dokładnie odpowiada to zakresowi napięć wejściowych układu Arduino Nano/Uni/Mega etc. Jeśli jest inaczej, możemy np. dołożyć MAX4466 z regulowanym wzmocnieniem; moduł taki dostać możemy np. z Adafruit.

    Mikrokontroler Arduino wyposażony jest w 10-bitowy przetwornik analogowo-cyfrowy (ADC) - oznacza to, że po wykonaniu analogRead() dostaniemy wartość liczbową (liczbę całkowitą) od 0 do 1023, co odpowiada napięciu od 0 V do 5 V.

    Jako że diody LED przyjmują wartości jasności od 0 do 255, to można by pomyśleć, iż teraz potrzebny jest algorytm, który przeskaluje wartości 0-1023 do wartości 0-255. Niestety nie jest to takie proste, jak mogłoby się początkowo wydawać i samo przeskalowanie nie wystarczy. Załóżmy na początek, że dysponujemy sygnałem wejściowym 5 Vpp w postaci sinusoidy, jak pokazano na rysunku 1 poniżej.

    Analizator widma na układzie MSGEQ7
    Rys.1. Przetwarzanie sygnału sinusoidalnego.


    W tym przypadku, jeśli uśrednimy odpowiednio odczyty, to uzyskamy wartość średnią równą 511. Problemem jest to, że niezależnie od tego, jaka jest amplituda sygnału, to średnia wyniesie dokładnie tyle samo – 511.

    Aby uniknąć powyższego problemu, pierwszą rzeczą, jaką trzeba zrobić, jest programowe wyprostowanie sygnału, co pokazano na rysunku 1b. Operacja ta jest bardzo prosta – jeżeli pobrana próbka ma wartość 512 lub więcej, to zostawiamy ją tak jak jest. Natomiast jeżeli wartość próbki wynosi 512 lub mniej, to odejmujemy ją od 1023.

    Następnie usuwamy z przebiegu wartość stałą, jak pokazano na rysunku 1c. Po prostu odejmujemy 511 od wartości każdej próbki w sygnale.

    Teraz możemy zmapować wartości od 0 do 511 na wartości od 0 do 255, jakie wymagane są przez diody LED. Pokazane jest to na rysunku 1d. Można to zrealizować z pomocą funkcji map() zaimplementowanej w Arduino, podzielić wartości przez dwa lub przesunąć je (bitowo) o jedną pozycję w prawo. Wszystkie te operacje będą miały taki sam efekt.

    Oczywiście, jeżeli w naszym sygnale wartość napięcia DC jest inna, to musimy dostosować wartości użyte w programie do tego napięcia.

    Korzystając z podstawowej konfiguracji opisanej powyżej, jedyną informacją, jaką możemy uzyskać z naszego sygnału audio, jest jego aktualna amplituda za każdym razem, gdy go próbkujemy. Jeśli chodzi o sterowanie diod LED, możemy za pomocą tych informacji, zrealizować kilka schematów sterowania nimi. Możemy na przykład wysterować maksymalnie wszystkie diody LED, a z pomocą audio modulować ich kolor, lub odwrotnie – każda dioda miałaby taki sam kolor, a sygnał wejściowy modulowałby amplitudę świecenia. Oczywiście można połączyć obie te techniki w naszym rozwiązaniu.

    Pamiętając o tym, że w naszym systemie planujemy siedem grup diod LED, lepszą możliwością byłoby podzielenie sygnału audio na siedem osobnych zakresów amplitudy. Za każdym razem, gdy próbkujemy sygnał, decydujemy, które diody LED będą świecić. Jeśli sygnał spadnie do najniższego założonego poziomu amplitudy, możemy po prostu zapalić tylko pierwszy ciąg diod LED. Jeśli sygnał wzrośnie do następnego poziomu amplitudy, będziemy mogli zapalić tylko drugi ciąg diod LED lub możemy zapalać zarówno pierwszy, jak i drugi ciąg LEDów. I tak dalej, i tak dalej… przynajmniej do momentu, gdy sygnał dojdzie do najwyższego poziomu amplitudy, kiedy to możemy zapalić tylko siódmą grupę diod lub zapalić wszystkie. Oczywiście cały czas możemy zmieniać także kolory poszczególnych diod LED, etc. Nic nie ogranicza naszej kreatywności.

    Opcja 2: Podłączenie sygnału audio do mikrokontrolera i wykorzystanie programowego FFT

    Teraz sterowanie zaczyna być już trochę bardziej skomplikowane. Chcemy podzielić sygnał na siedem pasm o różnej częstotliwości środkowej, tak, że będziemy mogli sterować jasnością siedmiu grup diod LED w zależności od natężenia sygnału w każdym z pasm.

    Zakres ludzkiego słuchu rozciąga się, w teorii, od 20 Hz do 20 kHz, jednakże im jesteśmy starsi, tym gorzej słyszymy wysokie częstotliwości. Dlatego też nie ma wielkiego sensu analizować wyższych częstotliwości. Cały zakres częstotliwości podzielić można na pasma centrowane na: 63 Hz, 160 Hz, 400 Hz, 1 kHz, 2,5 kHz, 6250 kHz oraz 16 kHz, jak pokazano na rysunku 2.

    Analizator widma na układzie MSGEQ7
    Rys.2. Podział sygnału audio na siedem pasm.


    W tym przypadku, możemy wykorzystać siedem amplitud (po jednej dla każdego pasma) do sterowania jasnością każdego z pasma diod LED, jednakże jak wyciągnąć ze zdigitalizowanego sygnału wartości poszczególnych amplitud przy różnych częstotliwościach?

    W tym celu wykorzystać musimy algorytm FFT – szybkiej transformaty Fouriera. Pozwala on na przeniesienie funkcji z domeny czasu do domeny częstotliwości. Pozwoli nam to uzyskać dane dotyczące amplitud poszczególnych częstotliwości.

    Analizator widma na układzie MSGEQ7
    Rys.3. Uproszczony schemat, w którym sygnał audio podajemy bezpośrednio na mikrokontroler, który oblicza programowe FFT.


    Programowa realizacja algorytmu FFT jest dosyć zasobochłonna, ale istnieje szereg dosyć dobrze zoptymalizowanych implementacji tego algorytmu na Arduino. Przykładem wykorzystania jednej z implementacji tego algorytmu jest projekt Adafruit https://learn.adafruit.com/piccolo/overview" target="_blank" rel="nofollow ugc" class="postlink ">Piccolo Music Visualizer. Tam znajdziemy więcej informacji na temat odpowiednich bibliotek, w których zaimplementowano ten algorytm.

    Jeśli myślimy realnie o wykorzystaniu FFT w naszym projekcie, zamiast opartego na megaAVR Arduino, lepiej jest wykorzystać np. Teensy 3.2 lub 3.6 – moduły z 32-bitwym procesorem ARM z rdzeniem, odpowiednio, Cortex-M4 i Cortex-M4F, taktowane zegarami 72 MHz lub 180 MHz. Moduły te oferują o wiele większą wydajność, która jest niezbędna do szybkiego obliczania transformaty Fouriera. Jeśli chcemy zastosować w naszym urządzeniu AVRa, to lepiej będzie skłonić się ku rozwiązaniu w pełni sprzętowemu, omówionemu poniżej.

    Opcja 3: Podawanie sygnału audio na mikrokontroler przez analizator widma MSGEQ7

    Zacznijmy od wysokopoziomowego obrazu naszego systemu – analogowy sygnał audio podawany jest najpierw na mały układ scalony z ośmioma nóżkami – tytułowy MSGEQ7. Na rysunku 4 pokazano uproszczony schemat blokowy opisywanego systemu. Układ MSGEQ7 opracowany został przez firmę Mixed Signal Integration i jest analogowym analizatorem widma. Pracuje on przy napięciach zasilania tak 3,3 V jak i 5 V, więc współpracować może z szerokim zakresem mikrokontrolerów.

    Układ dzieli sygnał na siedem pasm i podaje na wyjściu sygnał analogowy, proporcjonalny do amplitudy w każdym z nich. Dokładniejszy opis sposobu odczytywania wyjścia poniżej.

    Analizator widma na układzie MSGEQ7
    Rys.4. Uproszczony schemat w którym sygnał audio podajemy na mikrokontroler przez scalony analizator widma.


    Najlepsze w takim podejściu jest to, że układ analizatora przejmuje na siebie całą ciężką pracę (naszą i mikrokontrolera). Jedyne, co trzeba zrobić to odczytywanie amplitud poszczególnych pasm i odpowiednie sterowanie diodami LED podłączonymi do mikrokontrolera.

    Uwaga: Karta katalogowa omawianego układu scalonego nie jest szczególnie dokładna i pełna szczegółów, ale jedną z istotniejszych informacji jest to, że sygnał analogowy na wejściu układu wynosić powinien 0,3 Vpp (300 mVpp). Oznacza to, że musimy zastosować mniejsze wzmocnienie lub wręcz inny moduł mikrofonu/wejścia analogowego niż w poprzednich opcjach, gdzie zakładaliśmy, że amplituda napięcia wyniesie nawet do 5 Vpp.

    MSGEQ7 doskonale sprawdza się z mikrofonem MEMS INMP401, który dostępny jest w postaci modułu produkowanego przez SparkFun. Napięcie międzyszczytowe sygnału z tego układu wynosi np. 200 mVpp dla „nagrywania normalnej rozmowy z odległości wyciągniętej ręki”, jak wskazuje autor. Karta katalogowa samego mikrofonu mówi o -42 dBV czułości.

    Przedstawiamy MSGEQ7

    W ten sposób, po długim wstępie, docieramy do tytułowego układu scalonego. Pokazany jest on na rysunku 5; znajdziemy tam też rozpiskę pinów. Analizator ten można nabyć w obudowie do montażu przewlekanego (THT) i powierzchniowego (SMD), a dostępny jest m.in. w sklepie SparkFun, gdzie kosztuje niecałe pięć dolarów.

    Analizator widma na układzie MSGEQ7
    Rys.5. Ośmiopinowy układ scalony – analizator widma, wraz z opisem wejść i wyjść.


    Jak widzimy na opisie na rysunku 5 jest tylko jeden pin opisany DATA_OUT, jak więc wydobyć z układu dane dotyczące siedmiu pasm? Spójrzmy najpierw na schemat blokowy MSGEQ7 pokazany na rysunku 6:

    Analizator widma na układzie MSGEQ7
    Rys.6. Schemat blokowy MSGEQ7.


    Układ działa w bardzo prosty sposób. Do sterowana wyjściem potrzebne są dwie linie cyfrowe – Reset oraz Strobe, które powodują przełączanie sygnału na wyjściu układu; sygnał ten jest digitalizowany następnie z pomocą wejścia analogowego mikrokontrolera.

    Sterowanie analizatorem jest proste. Najpierw musimy wysłać impuls napięcia na Reset, który ma zresetować analizator i przygotować go do wysyłania danych, a następnie z pomocą ujemnych impulsów na Strobe przełączamy pasma, które transmitowane są na wyjście sygnału. Napięcie wyjściowe z układu wynosi od 0 V do 5 V (lub do 3,3 V, jeśli takie jest napięcie zasilające naszego układu), co znacznie ułatwia jego digitalizację przez ADC w mikrokontrolerze.

    Analizator widma na układzie MSGEQ7
    Rys.7. Zależności czasowe w układzie MSGEQ7.


    Oczywiście, dane z MSGEQ7 odczytujemy w pętli – cały czas resetujemy układ, przełączamy się pomiędzy pasmami i tak od nowa. Dane zebrane z układu pozwalają nam na sterowanie diodami LED, podłączonymi do naszego Arduino (lub innego dowolnego mikrokontrolera).

    Poniżej znajdziemy przykładową funkcję w Arduino, która odczytuje dane ze scalonego analizatora. Pamiętajmy jedynie o wcześniejszym zdefiniowaniu pinów: PinReset, PinStrobe i PinAudioIn tak, aby zgadzały się z tym, co mamy w naszym układzie.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Warto zauważyć, że w programie nie ma dodanego opóźnienia pomiędzy dwoma digitalWrite() na pinie Resetu. Wynika to z faktu, że minimalny czas impulsu resetującego układ wynosi 100 ns, czyli dużo mniej niż wynosi opóźnienie pomiędzy wykonywaniem poszczególnych komend w Arduino.

    Schemat układu

    Jeśli chcemy wykorzystać MSGEQ7 do przetwarzania pojedynczego kanału audio (mono), to podłączmy sygnał w sposób pokazany na rysunku 8.

    Analizator widma na układzie MSGEQ7
    Rys.8. Schemat podłączenia MSGEQ7 z wejściem monofonicznym.


    Kondensator C2 ma wartość 100 nF – usuwa on z sygnału składową stałą. W karcie katalogowej układu na schemacie pokazano kondensator 10 nF, co jest błędem i wartość ta jest zbyt mała.

    Jeśli chcemy z pomocą analizatora przetwarzać sygnały stereo, to musimy zmodyfikować powyższy układ dodając jeden opornik 22kΩ, jak na rysunku 9.

    Analizator widma na układzie MSGEQ7
    Rys.9. Schemat podłączenia MSGEQ7 z wejściem stereofonicznym.


    Jeśli nie chcemy samodzielnie budować tego rodzaju modułu, możemy kupić go MSGEQ7 w Internecie. Przy cenie 15,95 dolarów, jest to odrobinę kosztowne, ale dzięki temu możemy od razu po otrzymaniu paczki zacząć działać. Należy zwrócić uwagę na to, że moduł domyślnie będzie wyposażony w 5-pinowy złącze i gniazdo stereo. Sprzedawca może dostarczyć moduł bez tych elementów, ale trzeba to zgłosić przy składaniu zamówienia.

    Podsumowanie

    Autor zrealizował szereg projektów przy wykorzystaniu tego układu. Przykładem może być Cunning Chronograph, pokazany poniżej, który reaguje na dźwięki:



    W tym przypadku, zamiast korzystać z mikrofonu, sygnał podawany jest na analizator prosto z wyjścia słuchawkowego iPoda. Można oczywiście zastąpić go modułem mikrofonu MEMS, na przykład INMP401, wspominanym wcześniej.

    Oczywiście, jeśli chcemy uzyskać jeszcze lepszy efekt, to warto skorzystać z sygnału stereofonicznego. Można wykorzystać dwa układy MSGEQ7 do przetwarzania obu kanałów niezależnie (można wtedy wykorzystać dwa wejścia analogowe, ale po jednym pinie na Reset i Strobe obu scalonych analizatorów).

    Możemy lepiej zrozumieć, jak działa opisane tutaj sterowanie po obejrzeniu poniższego filmu obrazującego działanie wyświetlacza sterowanego dźwiękiem.



    Jeśli nie chcemy łączyć wszystkich układów ręcznie zworkami, można zakupić moduł z układem MSGEQ7 na płytce z wyprowadzonymi wszystkim sygnałami. Na Adafruit taki moduł kosztuje ok 27 dolarów, ale można dostać go za poniżej 20 USD np. na eBay.

    Źródło: https://www.eeweb.com/profile/max-maxfield/articles/tips-and-tricks-for-using-the-msgeq7-spectrum-analyzer

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    ghost666
    Tłumacz Redaktor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    ghost666 napisał 9436 postów o ocenie 7364, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.
  • PCBway
  • #2
    TechEkspert
    Redaktor
    Nie znałem tego układu MSGEQ7, cena około 24zł, ale w małej obudowie mamy 7 kanałowy analizator widma audio.
    https://github.com/NicoHood/MSGEQ7
    https://www.sparkfun.com/products/10468
  • PCBway
  • #3
    paluszasty
    Poziom 24