W ramach zabawy z układami FPGA zrobiłem mały analizator widma sygnału audio, publikuje kod gdyby ktoś szukał inspiracji na prawdziwy analizator z kolorowymi słupkami ledów itp. Pierwotnie w planach miałem zastosowanie pasków kolorowych diod led WSxxxx ale jako że bardziej mnie interesuje pisanie w VHDL niż kolorowe światełka skończyło się na prostym wyświetlaczu TFT. Nie będzie żadnych schematów bo wszystko siedzi na płytce ewaluacyjnej Terasic DE2-115 z układem Cyclone V od Altera/Intel. Jedyna modyfikacja to podłączony wyświetlacz na sterowniku ILI9341. Co to robi? A więc tak:
- Akwizycja próbek audio z wbudowanego układu I2S firmy Wolfson z częstością próbkowania 48 kHz (tak na prawdę 50 kHz) i rozdzielczością 24 bitów. Do obliczeń tylko najstarszych 16 bitów jest używanych. Na raz łapię 1024 próbki.
- Zapisane w pamięci próbki są mnożone przez funkcję okienkową Hanninga aby dostać ładne widmo po transformacie DFT. Dane typu integer są zamieniane na zmiennoprzecinkową reprezentację IEEE-754 (typu single 32 bity) następnie mnożone przez odpowiednią wartość i zamieniane znów na integer.
- Po przeskalowaniu liczona jest transformata DFT. Tutaj poszedłem na łatwizję i zastosowałem kod w Verilogu z projektu Spire.
- Otrzymanego w ten sposób widma liczony jest log10 dla każdej próbki. Aby ładniej na wyświetlaczu ładniej to wyglądało.
- Z otrzymanego widma generowana jest bitmapa, która zostaje zapisane we framebuferze wyświetlacza. Kod obsługi wyświetlacza pobiera dane z dwuportowej pamięci tam i wysyła po SPI z czestościa 50 MHz.
- Na jeden bin widma przypada 25kHz/511 = 48.9 Hz. Wyświetlacz pokazuje pierwsze 320 punktów z transformaty więc widzimy widmo od DC do 48.9*320 = 15 kHz.
- Można wysłać dane z widmem do komputera po naciśnieciu guzika.
- Przełącznik SW(1) przełącza pomiędzy widmem liniowym a logarytmicznym.
Jako źródło sygnałów na poniższych filmikach użyłem apki na smartfona. Dla wyższych częstości widmo jest bardzo brzydkie, nie wiem czy to jest spowodowane zniekszatłaceniami w telefonie czy w torze analogowym układu I2S.
Tutaj są filmiki:
https://youtu.be/TJIZBhBNofI
https://youtu.be/xRw6NkzDQ_o
A tutaj cały projekt Quartus'a:
https://github.com/filipamator/vu_meter
Dodałem załącznik jpg ale nie pokazuje się więc trzeba kliknąć w filmik na youtube.
- Akwizycja próbek audio z wbudowanego układu I2S firmy Wolfson z częstością próbkowania 48 kHz (tak na prawdę 50 kHz) i rozdzielczością 24 bitów. Do obliczeń tylko najstarszych 16 bitów jest używanych. Na raz łapię 1024 próbki.
- Zapisane w pamięci próbki są mnożone przez funkcję okienkową Hanninga aby dostać ładne widmo po transformacie DFT. Dane typu integer są zamieniane na zmiennoprzecinkową reprezentację IEEE-754 (typu single 32 bity) następnie mnożone przez odpowiednią wartość i zamieniane znów na integer.
- Po przeskalowaniu liczona jest transformata DFT. Tutaj poszedłem na łatwizję i zastosowałem kod w Verilogu z projektu Spire.
- Otrzymanego w ten sposób widma liczony jest log10 dla każdej próbki. Aby ładniej na wyświetlaczu ładniej to wyglądało.
- Z otrzymanego widma generowana jest bitmapa, która zostaje zapisane we framebuferze wyświetlacza. Kod obsługi wyświetlacza pobiera dane z dwuportowej pamięci tam i wysyła po SPI z czestościa 50 MHz.
- Na jeden bin widma przypada 25kHz/511 = 48.9 Hz. Wyświetlacz pokazuje pierwsze 320 punktów z transformaty więc widzimy widmo od DC do 48.9*320 = 15 kHz.
- Można wysłać dane z widmem do komputera po naciśnieciu guzika.
- Przełącznik SW(1) przełącza pomiędzy widmem liniowym a logarytmicznym.
Jako źródło sygnałów na poniższych filmikach użyłem apki na smartfona. Dla wyższych częstości widmo jest bardzo brzydkie, nie wiem czy to jest spowodowane zniekszatłaceniami w telefonie czy w torze analogowym układu I2S.
Tutaj są filmiki:
https://youtu.be/TJIZBhBNofI
https://youtu.be/xRw6NkzDQ_o
A tutaj cały projekt Quartus'a:
https://github.com/filipamator/vu_meter
Dodałem załącznik jpg ale nie pokazuje się więc trzeba kliknąć w filmik na youtube.
Fajne? Ranking DIY