73! Zbyszek
|
WALET – czyli jak buduję sobie transceiver SDR
|
|
Zbyszku, gratuluję tempa montażu urządzenia.
Proszę pamiętaj o właściwym wlutowaniu pinów łącznika na drugiej płytce i kolejnych oraz o prawidłowym sposobie montażu kondensatora C31 co zapobiega ewentualnemu wzbudzaniu się wzmacniacza. [Obrazek: https://lx-net.pl/walet/image/noisy.jpg] Polecam zapoznanie się z opisami płytek w aplikacji Kickad dla wersji 1.1 Dodatkowo, w folderach h0 i h1 znajdują się aktualne schematy i opisy montażowe tej wersji a dodatkowo zamieściłem tam rysunki wersji uproszczonej zawierającej minimalną ilość elementów zapewniających działanie układu. Z działająca płytką h0 można przeprowadzić testy formowania sygnału jakie opisałem w postach #43 i #44. płytka h0 płytka ha Przy tej okazji informuję, że konstrukcja Waleta znalazła uznanie na konkursie PUK i otrzymała nagrodę. A ponieważ konstrukcja ta nie jest jakimś wiekopomnym odkryciem to zakładam, że komisja uznała za bardziej wartościowy sposób w jaki prezentuję i wyjaśniam moją pracę niż jej wartość techniczną. Ostatni tydzień trwałem jeszcze w szoku po nagrodzie w konkursie PUK ale mówiąc poważnie podjąłem próbę pomiaru odbieranego sygnału w domenie cyfrowej zamiast układów analogowych. Niestety, wielokrotne próby zastosowania biblioteki VolumeMeter z Arduino Audio Tools nie przyniosły rezultatu więc w końcu zdecydowałem się na kontakt z autorem (Phil Saltzman). Tu również początkowo nie udało się nam rozwiązać problemu ale na końcu okazało się, że winna była moja niekompetencja jako programisty ale przede wszystkim używałem starszej wersji ArduinoAudio Tools i o tym napiszę z detalami jutro. lj. GitHub
23-09-2026, 12:14
Pomiar siły odbieranego sygnału za pomocą narzędzi Arduino Audio Tools możliwy jest przez włączenie do łańcucha przetwarzania danych modułu z klasy VolumeMeter.
Do tej pory algorytm działał w cyklu: i2s -> filters -i2s gdzie lewe i2s to wejście sygnału po zamianie z analogowego na cyfrowy a prawe i2s to wyjście sygnału analogowego po zamianie z cyfrowego. W module filters znajduje się łańcuch hilbert -> lpf/bpf tak więc w rzeczywistości pełny łańcuch wyglądał następująco: i2s -> hilbert -> lpf/bpf -> i2s. Niestety, w przypadku procesora ESP32A1S z wbudowanym kodekiem audio (konwerter A/C i C/A + inne funkcje) rozróżnienie między i2s na wejściu i i2s na wyjściu nie jest oczywiste i realizowane jest przez dokładniejsze precyzowanie tych portów w sekcji setup{ } programu. Poza tym, klasa VolumeMeter nie posiada, jak większość innych narzędzi Audio Tools tzw. defaultConfig czyli zestawu ustawień domyślnych niezbędnych do uruchomienia instancji z klasy VolumeMeter dlatego pewien czas zajęło mi wyszukanie sposobu w jaki zainicjować moduł VolumeMeter. Sposobem na to okazało się zbudowanie uniwersalnego pliku konfiguracyjnego: Kod: uint16_t sample_rate = 24000;Plik info zawiera niezbędne informacje potrzebne dla instancji klasy VolumeMeter do jej uruchomienia. Pomiar sygnału może być włączony w dowolnym miejscu strumienia przetwarzania ale zwykle robi się to na wejściu lub na wyjściu. Ale z punktu widzenia pomiaru siły sygnału konkretnego sygnału celowe jest mierzenie jego siły na wyjściu za filtrami ograniczającymi pasmo przetwarzania. Gdyby włączyć pomiar na wejściu to pomiarowi podlegałyby wszystkie sygnały docierające do konwertera a/c a konwersja z prędkością sample_rate "zobaczy" wszystkie sygnały o częstotliwości sample_rate/2 (zgodnie z teorią próbkowania) czyli w tym przypadku do 12kHz. Filtry działające przed pomiarem ograniczają pasmo do 3.6/2.4kHz dla SSB oraz do niewielkiego pasma wokół 800Hz przy odbiorze CW a więc w zasadzie mamy pomiar jednego sygnału. Tak więc włączenie pomiaru w strumień przetwarzania danych poszerza ten łańcuch do postaci: i2s -> filters -> volumeMeter -> i2s . Poniżej prezentuję obecną sekwencję przepływu danych w kodzie programu po włączeniu cyfrowego pomiaru siły sygnału. Kod: ......Jak wspominałem, początkowo pokazany kod powodował, że kompilacja odbywała się bez błędów ale po wgraniu jej do procesora następował cykliczny jego restart co ok. 1 sek. Nie mogąc sam sobie z tym poradzić zapytałem autora pakietu Arduino Audio Tools i prawie tydzień zajęło nam wykrycie, że winna było niezgodność pakietu podstawowego Audio Tools z pakietem Driver Tools, który obsługuje kodeki w ESP32A1S. O ile mój pakiet Driver Tools był aktualny to Audio Tools miało wersję dość odległą od obecnej co generowało problemy. Wydaje się, że początkowa instalacja mojego pakietu Audio Tools nie odbyła się ze strony na GitHub ale z jakiegoś miejsca gdzie ten pakiet polecano i tamten link prowadził właśnie do starszej wersji. Po ustaleniu przyczyny okazało się, że mój początkowy kod włączenia pomiaru sygnału był poprawny ale kosztowało to stratę kilku dni i wykazaniem się słabą znajomością narzędzi Audio Tools wobec autora tego oprogramowania. Trochę to bolało ale żadna wiedza nie przychodzi łatwo ;-) Pomiar sygnału w torze cyfrowym umożliwia całkowitą rezygnację z pomiaru na drodze analogowej. [Obrazek: https://lx-net.pl/walet/image/arw01.jpg] [Obrazek: https://lx-net.pl/walet/image/arw02.jpg] Te elementy można usunąć całkowicie bez szkody dla działania całości na płytce h0 [Obrazek: https://lx-net.pl/walet/image/arw03.jpg] Dodatkowo, można też usunąć Q5 z otoczeniem z płytki ha Obecny kod programu zawiera pomiar sygnału w torze cyfrowym co daje jednoznaczne wartości bez konieczności regulowania trymerami ustawień w torach analogowych. Pisałem o tym wcześniej ale warto to przypomnieć w tym miejscu, że dynamika toru a/c to 16 bitów (65535 poziomów) ale w praktyce można liczyć na połowę tej wartości bo pełna dynamika dotyczy sygnałów zarówno na plus jak i na minus co oznacza ograniczenie do 15 bitów (32767 poziomów). Z moich pomiarów i kalibracji miernika volumeMeter wynika, że tło szumowe przetwornika (bez sygnału na wejściu) to ok. 50 a największy poziom jaki można odebrać w tej skali (32767) to ok. S9 + 23dB. Wydaje się to być wystarczające dla większości sytuacji z ewentualną reakcją dla sygnałów S9 +30, +40 i +60dB. Taka reakcja może być wykonana za pomocą pokazanego powyżej układu U9 (PCF8574) oraz D7/RV2, D8/RV3 i ewentualnie D9/RV4. Może uda się zredukować tłumik sygnału na czterech diodach PIN do jednej lub dwóch ale na razie, jeśli jest on zamontowany to należy pozostawić jedynie D7/RV2 z RV2 ustawionym na poziom ok. 3-4k. Na Github zamieściłem w części dotyczącej wersji 1.1 zarówno kod źródłowy jak i pliki bin dotyczące tej wersji. lj. Github
27-09-2026, 21:35
Prace posuwają się do przodu. Prośba do Leszka o zdjęcia poszczególnych płytek i opisy cewek i transformatorów.
73! Zbyszek
Przepraszam za opóźnienie w odpowiedzi.
Od kilku dni siedzę nad wprowadzeniem do kodu operacji fft, która będzie służyć do wizualizacji otoczenia odbieranego pomiaru w formie wodospadu. Na razie mam umiarkowane sukcesy. Wprawdzie udało mi się uruchomić fft ale mam problem z jednoczesnym działaniem toru filtrowania i znowu szukam podpowiedzi u autora Arduino Audio Tools. Brakuje mi jednego kroku do pełnej integracji fft z działającym już kodem. Zbyszku, cieszę się z postępów prac i mam nadzieję, że informacje jakie podam będą dla Ciebie pomocne. Przede wszystkim do montażu obwodów na płytkach potrzebny będzie wobulator - najlepiej jakaś wersja VNA. Przyda się też miernik pojemności i indukcyjności choć ja obyłem się bez tych mierników. Natomiast bardzo przyda się kalkulator online do obliczeń dla rdzeni Amidon, z których korzystałem przy budowie obwodów. Ja korzystam z reguły z tego kalkulatora [Obrazek: https://lx-net.pl/walet/image/hb01.jpg] [Obrazek: https://lx-net.pl/walet/image/hc01.jpg] Pokazane płytki będą się nieco różnić od tych jakie posiadasz bo moje są w najstarszej wersji i noszą ślady modyfikacji. Płytki jakie posiadasz nie mają błędów moich prototypów. Posiłkuj się też schematami i opisami z Github dla wersji 1.1. Strojenie obwodów rezonansowych, szczególnie w wersji z ograniczeniami smd oraz rdzeni toroidalnych nigdy nie będzie powtarzalne w 100 procentach niemniej spróbuję podać Ci kilka pomocnych informacji. Na początek płytka filtrów pasmowych (hb). 1. Analizator sieci (vna) należy zapinać na pinach 5 i 8 każdego z przekaźników 2. Najpierw wlutuj kondensatory obwodu szeregowego (np. dla pasma 3.5 to C1 i C3) a następnie cewkę tego obwodu (dla 3.5 to L2). 3. Należy dobrać ilość zwojów L2 lub ścisnąć/rozciągnąć uzwojenie tej cewki aby maksimum znalazło się w środku tego pasma. Dla 3.5 powinno to być oczywiście 3.65. Tłumienie powinno wynosić 10-20dB w maksimum. 4. Kolejno należy wlutować kondensatory i cewki obwodów równoległych i podobnie jak dla cewki szeregowej, należy regulując cewkami równoległymi aby uzyskać w miarę symetryczne pasmo przenoszenia ze środkiem w środku pasma. Ponieważ filtry działają zarówno podczas nadawania jak i odbioru to istotne jest aby tłumienie zestrojonego obwodu było jak najmniejsze. Należy dążyć do tłumienia poniżej 2dB, tłumienie 3db podczas nadawania to zmniejszenie mocy wyjściowej o połowę!. Do wykonania obwodów użyłem w większości rdzeni Amidon T37 (9.5x5x3.5mm), indukcyjności opisałem na rysunku hb 3.5 -> L2 - T37-1 (niebieski u=20) - 45 zwojów DNE 0.2, L1/3 - T37-2 (czerwony u=10) - 7 zwojów DNE 0.2 7.0 -> L5 - T37-1 (niebieski u=20) - 26 zwojów DNE 0.2, L4/6 - T37-2 (czerwony u=10) - 6 zwojów DNE 0.2 10 -> L10 - T37-1 (niebieski u=20) - 24 zwoje DNE 0.2, L8/12 - T37-2 (czerwony u=10) - 4 zwoje DNE 0.2 14 -> L9 - T37-2 (czerwony u=10) - 32 zwoje DNE 0.2, L8/12 - T37-17 (żółto-zielony u=4) - 4 zwoje DNE 0.2 18 -> L16 - T37-2 (czerwony u=10) - 26 zwojów DNE 0.2, L14/18 - T37-17 (żółto-zielony u=4) - 4 zwoje DNE 0.2 21 -> L15 - T37-2 (czerwony u=10) - 24 zwoje DNE 0.2, L13/17 - powietrzna fi 5mm - 3 zwoje DNE 0.4 25 -> L22 - T37-2 (czerwony u=10) - 21 zwojów DNE 0.2, L20/24 - powietrzna fi 5mm - 3 zwoje DNE 0.4 28 -> L21 - T37-2 (czerwony u=10) - 18 zwojów DNE 0.2, L19/23 - powietrzna fi 5mm - 3 zwoje DNE 0.4 Trzy ostatnie pasma mają cewki powietrzne o tej samej ilości zwojów ale dla wyższych częstotliwości są one bardziej rozciągnięte. Najlepiej byłoby użyć tu rdzeni Amidon T37-0 (brązowy u=0) ale są one chyba trudno dostępne od ręki. Transformatory T1 i T2 nawinięte są na rdzeniach dwuotworowych 15x8x7mm i mają: T1 -> 2/2x4zwoje, T2 -> 2x2/4 zwoje drutem DNE 0.4 Transformatory można zamontować na dowolnej stronie płytki a nawet wygodniej to zrobić z drugiej strony. Moc jaką dostarcza ten stopień zależy od polaryzacji wstępnej tranzystorów Q12/16. Wstępnie należy ustawić punkt pracy za pomocą RV3 na ok. 50mA (2x25mA) ale zwiększenie tego prądu istotnie wpływa na sygnał wyjściowy ale należy uważać bo dla większych prądów niż 2x50mA tranzystory będą się mocno grzać i należy wtedy zastosować jakiś radiator. Przed włączeniem zasilania należy suwak RV3 ustawić od strony masy. Tranzystory również można wlutować z drugiej strony płytki co może ułatwić chłodzenie. Opornik R34 (51 ohm) jest opcjonalny w razie wzbudzania się użytego stopnia mocy ale użycie go zmniejsza sygnał wyjściowy z płytki hb mniej więcej o połowę więc na poczatek proponuje go nie montować. Płytka filtrów stopnia mocy (hc). Tu wszystkie indukcyjności wykonane są na rdzeniach T50 (13x7.5x5) a kondensatory powinny mieć napięcie co najmniej 50V i rozmiar 1206. Podobnie, podczas strojenia analizator sieci (vna) należy zapinać na pinach 5 i 8 każdego z przekaźników. wartości indukcyjności podałem na schematach płytki hc. obwód 4MHz -> 23 zwoje DNE 0.4mm obwód 8MHz -> 13 zwójów DNE 0.4mm obwód 16MHz -> 9 zwojów DNE 0.4mm obwód 32MHz -> 6 zwojów DNE 0.4mm Transformator TR2 ma 4 uzwojenia na rdzeniu dwuotworowym (14x13x7mm). Uzwojenia pomiarowe mają po 17 zwojów DNE 0.2mm i są nawinięte w symetrii lustrzanej na przeciwległych otworach rdzenia a pozostałe 2 uzwojenia to odcinki przewodów środkowych kabla koncentrycznego, łącznie z izolacją środkową, przechodzące przez każdy z otworów. Takie transformatory pomiarowe są dość dobrze opisywane przy okazji konstrukcji skrzynek antenowych. Pisałem o tym też ja w tym watku w poście #10 Po zmontowaniu płytek hb i hc i połączeniu elektrycznym za pomocą łączników można sprawdzić czy działa przełączanie obwodów na płytkach w miarę jak zmieniane jest pasmo pracy i częstotliwość. Ale mając działający generator Si5351 można testować tor nadawczy na cw. Najpierw należy sprawdzić czy na wyjściu RF płytki ha pojawia się sygnał podczas nadawania. Jeśli tak, to powinien on sterować wzmacniacz na płytce hb a sygnał na gnieździe TX tej płytki powinien być już czystą sinusoidą. Sygnał ten powinien służyć do sterowania jakiegoś wzmacniacza PA ale jeśli połączyć go na krótko z gniazdem PA na płytce hc to powinien, po przejściu przez filtry dolnoprzepustowe pojawić się na wyjściu ANT. Jeśli odpowiednio spolaryzować wzmacniacz na tranzystorach Q12/16 i zapewnić im jakieś chłodzenie to można doprowadzić do mocy ok. 1 W na gnieździe antenowym co da się już pomierzyć za pomocą mostka SWR a nawet zrobić jakąś łączność. cdn lj. Github
Mam postęp w zakresie modułu fft, który posłuży do budowy "wodospadu" lub innej formy obrazowania zawartości otoczenia odbieranego sygnału.
Piszę o otoczeniu bo zakres analizy jest ograniczony twierdzeniem Nyquista-Shannon-a o próbkowaniu co w skrócie oznacza, że uda się "zauważyć" jedynie te składniki w sygnale, których częstotliwość jest dwukrotnie mniejsza niż częstotliwość próbkowania. W przypadku kodu Waleta, który działa z częstotliwością próbkowania 24kHz, fft dostarczy informacji o sygnałach co najwyżej 12kHz. Nie wchodząc w szczegóły należy wstępnie zapewnić aby do członu cyfrowego przetwarzania nie docierały sygnały o częstotliwościach większych niż 12kHz co powinny zapewnić wzmacniacze w torze analogowym między mieszaczem Tayloe a procesorem lub należy użyć w części cyfrowej na wejściu odpowiedni, cyfrowy filtr dolnoprzepustowy. W przypadku Waleta zastosowany jest pierwszy z tych sposobów za pomocą R8/C8 i R9/C10 (płytka ha). Dotychczasowe przetwarzanie sygnały działa według schematu: Kod: i2s -> FilteredStream -> VolumeMeter -> i2sgdzie: i2s z lewej to w uproszczeniu wejście a/d FilteredStream to ciąg filtrów cyfrowych (Hilbert + lpf/bpf) VolumeMeter to moduł pomiaru siły sygnału i2s z prawej to w uproszczeniu wyjście d/a a odpowiednie polecenia w kodzie programu są następujące: Kod: uint16_t sample_rate = 24000;Wprowadzenie fft wymaga rozdzielenia sygnału do czego w Arduino Audio Tools można wykorzystać klasę MultiOutput a odpowiedni schemat przetwarzania danych będzie wyglądał następująco: Kod: fftTak więc sygnał analogowy "wczytany" do procesora przez konwerter a/d (moduł i2s) zostaje podzielony na dwie kopie z których jedna służy wyłącznie do zasilania modułu fft a druga to opisany wcześniej przebieg związany z filtrowaniem (Hilbert + lpf/bpf), pomiarem siły sygnału (volumeMeter) oraz konwersji d/a do postaci analogowej (i2s). Odpowiednie polecenia wraz z ich logicznym następstwem pokazuje poniżej: Kod: AudioRealFFT fft; //utworzenie instancji fftOkazało się, że krytyczna jest kolejność poleceń szczególnie dla inFiltered. Aby filtrowanie działało od startu tego modułu należy go najpierw uruchomić poleceniem inFiltered.begin(info); a kolejno trzeba zdefiniować sposób filtrowania poleceniami inFiltered.setFilter(...); cdn lj. Github
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 AudioRealFFTFunkcja 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
6 godzin(y) temu
FFT - chyba never ending story ;-)
Ostatnio pisałem o uruchomieniu działania analizy fft i spróbowałem wykonać wizualizację otrzymanych wyników. Zacząłem od wykresu "słupkowego" bo wydał mi się najłatwiejszy do wykonania a w czasie programowania tej funkcjonalności pojawiły się kolejne problemy do rozwiązania o czym dalej. [Obrazek: https://lx-net.pl/walet/image/fft_01.jpg] Pole gdzie do tej pory pojawiały się kolorowe linie związane z siłą odbieranego sygnału zastąpiłem wykresem częstotliwościowo - amplitudowym gdzie oś częstotliwości to 10kHz a oś amplitudy to siła odbieranego sygnału od S1 do S9+20 (i wyżej). Ze względu na rozpiętość amplitudy wykres należy traktować jedynie informacyjnie. "Słupki lub prążki" sygnału mają kolor w zależności od jego siły od szarego przez zielony do żółtego i kończąc na czerwonym dla najsilniejszych. Ze względu na częstotliwość próbkowania można się spodziewać informacji co najwyżej z połowy tej częstotliwości a zatem do 12kHz ale ze względów praktycznych skala ma zakres do 10kHz bo dość łatwo było utworzyć obraz właśnie w tym zakresie przydzielając każdemu "prążkowi" dwa pixel-e szerokości. [Obrazek: https://lx-net.pl/walet/image/fft_00.jpg] Na potrzeby obrazowania fft powstała grafika o odpowiednim rozmiarze stanowiąca stałe "tło" analizy fft. Prążki rysowane są w sposób nie naruszający tej grafiki tak, że najpierw czyszczona jest przestrzeń wewnątrz wykresu czarnym prostokątem a kolejno wrysowywane są kolejne prążki z wyników analizy fft od pierwszego do prążka nr 107. Sama transformata liczy 128 prążków w paśmie do 12kHz a więc jeden prążek to ok. 12000/128 = 93.75Hz. 107 prążków to właśnie ok. 10kHz. Grafika odświeżana jest ok. 3 razy na sekundę ale wydaje się, że można tą częstotliwość istotnie zwiększyć. Przygotowałem kilka filmów z działania tej funkcjonalności i każdy z nich dodatkowo skomentuję uzupełniając nagrana treść dodatkowymi wyjaśnieniami. Do prób wykorzystałem pokazany wcześniej, podwójny generator funkcyjny FY6900 posiadający dwa niezależne generatory. FFT - podstawowa funkcjonalność Pierwszy z filmów pokazuje istotę działania FFT. Zaczynam z sygnałem ok. 2kHz poniżej częstotliwości pracy (filtr Hilberta wycina częstotliwości wyższe od częstotliwości pracy) i zwiększam amplitudę tego sygnału do poziomu S9 i wyżej a następnie przestrajam odbiornik pokazując jak prążek sygnału wędruje po wykresie. Kierunek "wędrówki" prążka można oczywiście odwrócić - jest to czynność do wyboru w trakcie programowania. Chciałbym zwrócić tu uwagę na dwa fakty. Po pierwsze im silniejszy sygnał tym więcej pobocznych prążków pojawia się na wykresie co wynika z działania fft na skończonej ilości danych, ze skończoną częstotliwością próbkowania itd. I choć wydaje się, że prążki poboczne są dość duże to trzeba zwrócić uwagę, że na przyjętej skali skok od S2 do S3 jest niemal tak samo widoczny jak z S7 do S9+20 więc dysponując ekranem o dużej rozdzielczości w pionie udałoby się istotnie "wyszczuplić" wizualizację odbieranego sygnału. Zdarza się również, że dla pewnych ustawień częstotliwości dla prążka znika otoczenie artefaktów i jest on samotny na skali co wynika z ograniczeń analizy (krok fft, częstotliwość próbkowania) - w tych przypadkach analiza fft idealnie "trafia" z obliczeniami w wielokrotność odbieranego sygnału. Powiększając dokładność analizy fft na pewno uda się zmniejszyć/wyeliminować opisane zjawiska ale zachodzi pytanie czy procesor "uciągnie" dokładniejszą analizę z jednej strony oraz czy jest to potrzebne dla zastosowanej dokładności grafiki. FFT - dwa sygnały W tej próbie używam dwóch sygnałów oddalonych od siebie o 2kHz. Oba sygnały leżą poniżej częstotliwości odbioru a więc nie są tłumione przez filtr transformaty Hilberta i słychać je dobrze w głośniku. Wspominałem wcześniej, że ze względu na częstotliwość próbkowania dobre wyniki ograniczone są do częstotliwości równej połowie tej częstotliwości i to należałoby zapewnić zanim sygnał z mieszacza dostanie się do części cyfrowej (DSP). Wspominałem też, że w Walecie odpowiedzialne za to są wzmacniacze wstępne z kondensatorami ograniczającymi pasmo pracy tych wzmacniaczy. Przy zastosowanych wartościach RC: R8/C8 i R9/C10 (10k/4.7n) częstotliwości graniczne to ok. 3.3kHz i widać to podczas oddalania się częstotliwości generatorów od częstotliwości odbioru. Spadek jest jednak wolny choć na tyle duży, że dla częstotliwości powyżej 12kHz jest już istotny. Dlatego po oddaleniu się od częstotliwości sygnałów powyżej 12kHz widać jedynie słaby ślad z prawej strony wykresu związany z tzw. aliasowaniem. Ale Walet to nie sprzęt wyczynowy ale raczej boisko treningowe i po prostu trzeba mieć świadomość ograniczeń zastosowanych narzędzi. Najlepszym wyjściem w tej sytuacji mogłyby na przykład być silne filtry analogowe dolnoprzepustowe z pasmem do ok. 10kHz za mieszaczem Tayloe. FFT - dwa sygnały po obu stronach częstotliwości pracy Ten film pokazuje kolejne ograniczenie związane z procedurą fft. Początkowo skupiałem się jedynie na uruchomieniu fft korzystając z narzędzi Arduino Audio Tools nie wchodząc w szczegóły wyników ale kiedy zacząłem analizować rezultaty tych procedur okazało się, że wszystkie dostępne procedury fft są typu rzeczywistego co oznacza, że procedura transformaty rozpoznaje jedynie częstotliwość składnika sygnału oraz jego amplitudę ale nie jest w stanie stwierdzić czy sygnał leży powyżej częstotliwości odbioru czy poniżej. W głośniku oczywiście daje się to rozróżnić bo filtr Hilberta wycina jedną ze stron i słychać to wyraźnie podczas prób z jednym sygnałem. Narzędzia fft z puli Arduino Audio Tools celują w analizę typowych sygnałów audio a więc skupione są na tworzeniu grafów dla muzyki i mowy i dopiera wnikliwa analiza opisów tych narzędzi pozwala na jednoznaczną interpretację wyników. Sygnał do analizy fft pobierany jest z jednego z kanałów (w naszym przypadku albo I albo Q) a każdy z kanałów zawiera sygnały zarówno poniżej jak i powyżej częstotliwości odbioru. Filtr Hiberta usuwa dolną lub górną składową odbieranego widma dlatego w głośniku jest efekt odbioru jednowstęgowego. Rozwiązaniem w tej sytuacji jest tzw. kompleksowa (complex) analiza fft korzystająca z danych z obu kanałów I oraz Q. Jak się można domyślać to jakby dwie transformaty fft wykonywane jednocześnie, co należy rozpatrywać w kontekście mocy procesora, ale dające w wyniku dwukrotnie więcej danych dla częstotliwości poniżej i powyżej częstotliwości odbioru. Stan obecny, obrazujący wymieszane częstotliwości zapewnia ich rozróżnienie właśnie poprzez badanie kierunku przesuwania się prążków podczas strojenia. FFT - co "widzi" fft po dołączeniu mojej anteny Ten film to ciekawostka pokazująca stan zanieczyszczenia mojego środowiska radiowego. Na wejście antenowe urządzenia dołączyłem antenę. W paśmie pracy mam zakłócenia, o sile przekraczającej S9, wypełniające cały analizowany zakres odbioru. Pisałem w tytule o fft jako o "never ending story" bo czeka mnie próba wykonania pełnej (complex) analizy fft dającej rzeczywiste, w funkcji częstotliwości, wyniki analizy odbieranych sygnałów. Zrobiłem już wstępne rozeznanie i mam narzędzie, czyli gotową do użycia funkcję complex fft z tym, że na razie nie mam pojęcia jak podpiąć ją pod istniejące struktury Audio Tools. Niemniej, w najbliższych dniach opublikuję pełny opis osiągniętego już stanu. Funkcjonalność fft wymaga co najmniej pokazanej wyżej dodatkowej grafiki więc pewnie to co opublikuję będzie mieć wyższy numer wersji. Nowsza wersja, zawierająca fft, nie wymaga modyfikacji sprzętowych co może być w tej sytuacji pewnym pocieszeniem. cdn. lj Github |
|
« Starszy wątek | Nowszy wątek »
|
Użytkownicy przeglądający ten wątek: 1 gości

