To forum używa plików cookies
To forum wykorzystuje pliki cookies do przechowywania informacji o Twoim logowaniu, jeśli jesteś zarejestrowany, oraz informacji o Twojej ostatniej wizycie, jeśli nie jesteś zalogowany. Pliki cookies to niewielkie pliki tekstowe zapisywane na Twoim komputerze; cookies ustawiane przez to forum mogą być używane wyłącznie na tej stronie i nie stanowią zagrożenia dla bezpieczeństwa. Cookies na tym forum śledzą również, które tematy zostały przez Ciebie przeczytane oraz kiedy miało to miejsce. Prosimy o potwierdzenie, czy akceptujesz, czy odrzucasz zapisywanie tych plików cookies.

Niezależnie od wyboru w Twojej przeglądarce zostanie zapisany plik cookie, aby zapobiec ponownemu zadawaniu tego pytania. W każdej chwili będziesz mógł zmienić ustawienia cookies, korzystając z linku w stopce strony.

Ocena wątku:
  • 1 głosów - średnia: 5
  • 1
  • 2
  • 3
  • 4
  • 5
WALET – czyli jak buduję sobie transceiver SDR
#57
Moduł fft warto opisać oddzielnie.
Ale zanim to zrobię to spróbuję bardzo skrótowo opisać o co chodzi z fft.

[Obrazek: http://lx-net.pl/walet/image/fft00.jpg]
Okazuje się, że każdy sygnał (w szczególności okresowy) można przedstawić jako nieskończony szereg elementarnych funkcji sinus i cosinus o odpowiednio dobranych wartościach częstotliwości i amplitudy

[Obrazek: http://lx-net.pl/walet/image/fft01.jpg]
Dla przykładu,sygnał prostokątny składa się z nieskończonego szeregu funkcji sinus o rosnącej częstotliwości i malejącej amplitudzie. Rysunek pokazuje kształt sygnału prostokątnego oraz jego przybliżenie składające się z czterech funkcji sinus (dla prostokąta wszystkie składowe cosinus mają wartość 0).

Sposób doboru częstotliwości składowych sinus i cosinus (amplitudy i częstotliwości) można znaleźć za pomocą tzw. transformaty Fouriera a w cyfrowym przetwarzaniu sygnałów największe znaczenie ma FFT (Fast Fourier Transform) czyli szybki algorytm wyliczenia tych współczynników. Podstawowym warunkiem dla FFT jest użycie ilości danych będących jakąś potęgą liczby 2 np. 64 (2^6), 256 (2^8), 1024 (2^10) itd.
W wyniku działania transformaty fft otrzymuje się w uproszczeniu dyskretne wartości opisujące jakie częstotliwości znajdują się w sygnale i jaką mają amplitudę, np. 75Hz/14, 150Hz/6, 225Hz/8, 300Hz/12,.....,750Hz/184, ...... Cechą charakterystyczną wyniku jest stały krok odstępu poszczególnych składowych (np. tu 75Hz) wynikający z wartości tzw długości próbki będącej parametrem fft.

Jak fft ma się do odbiornika typu Walet czyli z bezpośrednia przemianą? 
Sygnał częstotliwości pośredniej z mieszacza Tayloe leży w paśmie akustycznym i nieco wyżej. Oczywiście, dla nas użyteczne są częstotliwości akustyczne ale jeśli kilka kHz obok częstotliwości odbioru znajdują się stacje, których nie słyszymy to jednak wchodzą one w skład sygnału docierającego do części cyfrowej urządzenia. Zwykle te niechciane częstotliwości są filtrowane na różne sposoby ale jeśli przed filtrowaniem zostaną poddane działaniu FFT to można ocenić otoczenie odbieranego sygnału. Ograniczeniami są tu częstotliwość próbkowania oraz długość próbki FFT. Z częstotliwości próbkowania wynika możliwość pozyskania informacji o sygnałach co najwyżej równych połowie częstotliwości próbkowania a z długości próbki wynika krok analizy częstotliwości.

W kodzie Waleta moduł fft jest zdefiniowany następująco:

Kod:
#include "AudioTools/FFT/AudioRealFFT.h" //wczytanie biblioteki AudioRealFFT
AudioRealFFT fft; //uruchomienie instancji AudioRealFFT o nazwie fft
.................
void fftResultCallback(AudioFFTBase &fftObj) { //definicja funcji zwracajacej dane z modułu fft
auto result = fft.result(); //utworzenie macierzy wyników o nazwie result
Serial.print("Freq = "); //wydruk na konsolę najsilniejszego składnika w widmie sygnału
Serial.print(result.frequency);
Serial.print(", Magnitude = ");
Serial.println(result.magnitude);
}
.................

void setup(void) {
.................
//Setup FFT output
  auto tcfg = fft.defaultConfig();
  tcfg.copyFrom(info);
  tcfg.length = 512;                // Okno o długości 512 próbek
  tcfg.callback = fftResultCallback;
  fft.begin(tcfg);
  .................
  }

Funkcja fft podczas konfiguracji otrzymuje informację na temat częstotliwości próbkowania (24kHz) a więc wynik ograniczony jest do połowy tej wartości czyli 12kHz. Ustawione okno dla fft (długość próbki) to 512. Wyniki pojawiają się w tablicy result zawierającej 512 par danych indeksowanych od 0 do 511 ale z natury transformaty Fouriera wynika, że okno o długości N dostarcza N/2 unikalnych odpowiedzi a więc do dyspozycji jest w tym przypadku 256 par częstotliwość/amplituda. Oznacza to, że krok analizy wynosi 12kHz/256 = 46,875Hz. Próbka o numerze 0 to zwykle wartość tzw. składowej stałej w sygnale i z reguły jest pomijana.

Teraz, mając dostęp do danych o naturze składowych będących częścią odbieranego sygnału można pokusić się o jakąś ich wizualizację. Zwykle jest to tzw "wodospad" obrazujący graficznie otoczenie odbieranego sygnału w czasie (kilka, kilkanaście sek.). 
Na razie kod Waleta w ostatniej wersji pokazuje w polu obrazowania wielkość odbieranego sygnału jako linie o odpowiednim kolorze. Rozważam wykonanie obrazowania zarówno w formie klasycznego wodospadu ale także jako słupków powiązanych z konkretnymi częstotliwościami o wysokościach dynamicznie zmieniających się w czasie.

cdn. lj

Github
Cytuj


Wiadomości w tym wątku
RE: WALET – czyli jak buduję sobie transceiver SDR - przez SP6FRE - 03-10-2026, 12:21

Skocz do:


Użytkownicy przeglądający ten wątek: 3 gości