Obliczenie FFT na mikrokontrolerze STM32 – #2 – Program realizujący FFT, prezentacja wyników, wyciek widma oraz jego przyczyny
Na rozgrzewkę:
W kolejnym wpisie dotyczącym szybkiej transformaty Fouriera przedstawię program służący do obliczenia FFT oraz wyniki na podstawie sygnału z generatora funkcyjnego. Następnie zaprezentuję jak częstotliwość próbkowania oraz okna, wpływają na wyciek widma.
Jeśli chcesz nabyć płytki deweloperskie lub mikrokontrolery STM, na których będziesz mógł wykonać projekty związane z przetwarzaniem sygnałów, zapraszam do sklepu msalamon.pl
Sponsorem wpisu jest msalamon.pl
WWW: https://msalamon.pl/
Sklep: https://sklep.msalamon.pl/
Zakres wpisu:
- Program obliczający FFT
- Sygnał z timera 2 informujący o częstotliwości próbkowania
- Wyniki FFT
- Wyciek widma spowodowany złym doborem częstotliwości próbkowania
- Wyciek widma spowodowany użyciem okien innych niż prostokątne, kiedy sygnał jest okresowy
Program obliczający FFT:
Funkcje uruchamiające używane peryferia: timer 2 wyzwalający konwersję oraz DMA przetwornika analogowo-cyfrowego:
Inicjalizacja FFT:
Funkcja obliczająca FFT:
Bufor wejściowy do FFT składa się z 255 próbek, od wartości maksymalnej. Jest to wycięty przebieg wejściowy oknem prostokątnym.
Napięcie referencji na Discovery wynosi 3.0V, więc wprowadzona składowa stała 1.4V na generatorze będzie wynosiła w LSB 1911, która jest odejmowana w linii 19. Bez usunięcia offsetu największym prążkiem będzie 0, czyli składowa stała.
W poniższym kodzie używane jest okno prostokątne, dlatego za komentowane są linie od 22 do 32. Jeśli chcesz użyć innego okna niż prostokątne, należy od komentować wybrane okno, a za komentować część dotyczącą okna prostokątnego.
Funkcja Callback informująca o zebraniu 512 próbek do bufora wejściowego. Zbieram dwa razy większą ilość próbek niż wykorzystywane do FFT, aby mieć pewność, że będzie wystarczająca ilość próbek.
Sygnał z timera 2 informujący o częstotliwości próbkowania:
Częstotliwość próbkowania została ustawiona na 80 kHz poprzez wyzwalanie konwersji przetwornika ADC za pomocą timera 2:

Wyniki FFT:
Przebieg z generatora funkcyjnego o częstotliwości 10kHz, na którym będzie wykonywane FFT:

Bufor wejściowy do FFT jest to wycięty fragment przebiegu, oknem prostokątnym, składający się z 256 próbek, przesunięty o składową stałą w celu wyznaczenia największej energii z częstotliwości przebiegu. Próbki zostały odczytane za pomocą programu STMStudio.

Po wykonaniu FFT na przebiegu o częstotliwości 10kHz, odczytano 32 prążek jako prążek o największej energii:


Wykorzystując okno prostokątne oraz 2^n okresów wyciek widma nie występuje, co można zaobserwować na Rys. 4. Podczas jednego okresu sinusoidy o częstotliwości 10kHz zbieranych jest 8 próbek, czyli w buforze składającym się z 256 próbek będzie 32 okresy.

Wyciek widma spowodowany złym doborem częstotliwości próbkowania:
Następnie przy takich samych ustawieniach częstotliwości próbkowania przetwornika analogowo-cyfrowego, podałem sygnał sinusoidalny o częstotliwości 16kHz, czyli 5 okresów. Warunek o 2^n okresów nie został spełniony.

Niespełniony warunek o 2^n ilości okresów skutkuje tym, że pojawia się wyciek widma, co można zaobserwować na Rys. 7.

Wyciek widma spowodowany użyciem okien innych niż prostokątne, kiedy sygnał jest okresowy:
Okna są użyteczne, kiedy sygnał jest nieokresowy. Kiedy sygnał jest okresowy, najlepszym wyborem będzie okno prostokątne, co udowadniają poniższe wyniki dla różnych okien.
Obliczenia FFT z wykorzystaniem okien zostały wykonane na podstawie przebiegu z Rys. 2 (10kHz), przy tej samej częstotliwości próbkowania 80kHz.
Okno Blackmana-Harrisa:

Obliczone spektrum z przebiegu przemnożonego przez okno Blackmana-Harrisa:

Okno Hanninga:

Obliczone spektrum z przebiegu przemnożonego przez okno Hanninga:

Okno flat top:

Obliczone spektrum z przebiegu przemnożonego przez okno Flat top:

Podsumowanie:
We wpisie zawarłem informację na temat programu służącego do wykonania FFT, przedstawiłem wyniki oraz omówiłem czynniki, które mają wpływ na wyciek widma.
Super – wytłumaczone od podstaw (artykuł #1) . Dziękuję !
Spróbuję tą wiedzę wykorzystać w środowisku Arduino / ESP32 (bo ono jest mi lepiej znane) a może kiedyś znajdę ten artykuł w takiej wersji.
Generalnie wielkie dzięki za tak udostępnioną wiedzę !
Cieszę się bardzo, że podoba Ci się wpis, a tym bardziej że wykorzystasz go w praktyce.