logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Eksperymentalny odbiornik SDR (Software-Defined Radio) na R820T i STM32F407

maciej_333 05 Sie 2025 01:15 5010 61

TL;DR

  • Zbudowano eksperymentalny odbiornik SDR na tunerze DVB-T Opticam HD N2 z głowicą R820T i mikrokontrolerem STM32F407, z wyjściem audio przez CS43L22.
  • Tor wykorzystuje próbkowanie pasmowe p.cz., analogowy wzmacniacz z trzema filtrami ceramicznymi SFE 4,5 MHz oraz cyfrowe demodulatory FM, AM i CW oparte na IIR.
  • Ustawiono częstotliwość próbkowania fs=857,1 kHz i uzyskano pasmo około 400 kHz przy tłumieniu −60 dB oraz wzmocnienie toru około 17 dB.
  • Odbiornik odebrał stacje UKF 88–108 MHz, a po prostym up-converterze także KF, lecz jakość nie dorównuje RTL-SDR i wąskopasmowe FM działa słabo.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
📢 Słuchaj (Głos AI):
  • Płytka STM32 połączona z tunerem R820T i układem SDR na płytce stykowej
    W związku z urlopem postanowiłem opisać wykonaną w ostatnim czasie konstrukcję. W zawodzie nauczyciela akademickiego jest to 36 dni roboczych plus w moim przypadku 26 dni zaległych z zeszłego roku. Jest to więc trochę czasu - za dużo.

    Wszystko zaczęło się od znalezienia tunera DVB-T Opticam HD N2. Jest to mało wartościowe urządzenie, ponieważ nie obsługuje DVB-T2. Poniżej znajdują się fotografie tunera i pilota:
    Odbiornik DVB-T Opticum HD N2 na drewnianej powierzchni Tylna ścianka tunera DVB-T Opticum HD N2 z widocznymi złączami Wnętrze tunera DVB-T z widoczną płytką drukowaną i komponentami elektronicznymi Spód dekodera DVB-T Opticum HD N2 z widocznymi etykietami i otworami wentylacyjnymiPilot do tunera DVB-T Opticum HD N2 leżący na drewnianym blacie
    Po jego rozkręceniu okazało się, że głowica tj. blok w.cz. (RF) jest osobnym modułem. Jest to bardzo rzadkie. Jeszcze rzadszy jest fakt, że do układu występującego w głowicy jest dokumentacja (przynajmniej jakaś). W tym przypadku mamy do czynienia z układem R820T, który to wydaje się być zgodny (przynajmniej na poziomie rejestrów) z tak popularnym R820T2 w RTL-SDR. Poniżej zamieszczam zdjęcia wymontowanej głowicy:
    Moduł głowicy RF z osłoną metalową i dwoma złączami koncentrycznymi na drewnianym tle Moduł głowicy R820T z dolnym ekranowaniem miedzianą folią i złączami RF Moduł głowicy R820T po wymontowaniu z tunera DVB-T, widoczna elektronika i ekran metalowy
    Na podstawie przykładowego schematu głowicy z datasheet i opisu wyprowadzeń R820T można ustalić opis wyprowadzeń tego modułu:
    Schemat złącz i pinów głowicy RF z oznaczeniem funkcji sygnałowych
    Głowica wydaje się odpowiadać temu, co jest w datasheet:
    Schemat aplikacyjny R820T z filtrem IF i interfejsem EVK
    Wymieniłem tylko kwarc z 16 MHz (oryginalny) na 28,8 MHz. Niestety nie udało mi się tego poprawnie uruchomić z oryginalnym kwarcem.

    Mając tak atrakcyjny moduł zdecydowałem się zrobić własny odbiornik SDR (Software-Defined Radio) z wykorzystaniem STM32. Generalnie w SDR chodzi o realizację części odbiornika w sposób programowy z wykorzystaniem procesora DSP lub układu FPGA. Podstawą jest tu jednak tzw. próbkowanie kwadraturowe. Wstępnie można zajrzeć do popularnej i bardzo wartościowej książki Richarda Lyonsa:
    Okładka książki „Wprowadzenie do cyfrowego przetwarzania sygnałów”
    Pierwszy raz miałem styczność z tym podręcznikiem wiele lat temu w trakcie studiów. Można tam znaleźć ideę odnośnie tego zagadnienia:
    Schemat blokowy konwersji kwadraturowej sygnału analogowego do postaci zespolonej
    Widzimy tu mnożenie (analogowe) sygnału wejściowego przez sinus i kosinus o częstotliwości równej częstotliwości środkowej sygnału wejściowego. Potem są dwa (analogowe) filtry dolnoprzepustowe o częstotliwości granicznej równej połowie pasma sygnału wejściowego (idealizując). Potem można próbkować sygnały z wyjść tych filtrów, by uzyskać próbki sygnałów i(t) (składowa synfazowa) i q(t) (składowa kwadraturowa) tj. odpowiednio dyskretne i(n) i q(n). W ten złożony sposób uzyskuje się zespoloną postać sygnału:
    Wektor zespolony sygnału pokazany na płaszczyźnie i(t)-q(t)
    Da się z tego już obliczyć moduł i fazę na podstawie twierdzenia Pitagorasa i funkcji tangensa w trójkącie prostokątnym. To już umożliwia bardo wiele np. budowę demodulatorów dla modulacji analogowych i cyfrowych, ale "matematycznie" tj. w kodzie programu. Stąd właśnie mowa o SDR. Jest to jednak nie jedyne rozwiązanie. Można zastosować też mieszanie cyfrowe:
    Schemat cyfrowego próbkowania sygnału z przekształceniem kwadraturowym
    Tutaj sygnał wejściowy jest próbkowany (w sposób dolnopasmowy lub pasmowy) i dalej wszystko jest programowe tj. mamy mnożenie przez sin i cos oraz filtry cyfrowe dolnoprzepustowe. Potrzeba jednak do tego znacznie więcej mocy obliczeniowej. Generalnie też można stosować sztuczki przy odpowiednio dobranej częstotliwości próbkowania (jak na rysunku). Da się wtedy zastosować tzw. ciągi mieszające. Zdecydowałem się właśnie na próbkowanie sygnału pasmowego, który to stanowi sygnał pośredniej częstotliwości p.cz. (IF) na wyjściu głowicy z R820T. Zatem odbiornik jest zrealizowany wg. powyższego rysunku. W datasheet R820T2 podano m.in. schemat blokowy odbiornika:
    Schemat blokowy z R820T i demodulatorem cyfrowym podłączonym do komputera
    Jak widać dalszemu próbkowaniu podlega sygnał p.cz. (tutaj oznaczony przez LIF). Potem jest już DSP, czyli cyfrowe przetwarzanie sygnałów. Kolejno powstał więc schemat blokowy całego układu oparty o podany w datasheet pomysł i wzmiankowane wyżej mieszanie cyfrowe:
    Schemat blokowy SDR z tunerem R820T i mikrokontrolerem STM32F407
    W tym przypadku sygnał p.cz. z głowicy podawany jest do wzmacniacza p.cz. i potem jest już próbkowany sygnał pasmowy. Wzmacniacz ten jest potrzebny, ponieważ maksymalna wartość sygnału różnicowego dla R820T2 to 1,00 Vpp (wg. datasheet - faktycznie jest trochę mniej). Jest to za mało, by w pełni wykorzystać dynamikę przetwornika A/C w STM32F407 (wymagane 0...3,000 V). Ponadto mimo odpowiedniej konfiguracji rejestrów w R820T pasmo jest znacznie za szerokie, by dało się to próbkować przez STM32. Stąd potrzeba nie tylko wzmocnienia, ale też zawężenia pasma. Zaprojektowałem więc bardzo prosty wzmacniacz p.cz.:
    Schemat wzmacniacza p.cz. z filtrami ceramicznymi i sterowaniem AGC
    Występuje tu wstępnie transformator szerokopasmowy, by pobrać sygnał różnicowy z głowicy i przekształcić go w niesymetryczny. Potem zastosowałem wzmacniacz WE, by uzyskać wstępne wzmocnienie i dopasowanie impedancji. Impedancja wyjściowa tego stopnia to mniej więcej tyle, co R3. Jest to więc dopasowane do filtrów ceramicznych. Zastosowałem tu filtry od fonii różnicowej z telewizora SFE 4,5 MHz. Po filtrach jest drugi stopień WE o rezystancji wejściowej w przybliżeniu 1 kΩ, by odpowiednio obciążyć filtry. Z uwagi na minimalne napięcie zasilania, raptem +5 V z płytki STM32F4DISCOVERY i duże sygnały zdecydowałem się na obciążenie indukcyjne L1 (zwarcie dla prądu stałego). Ostatecznie stopień WK zapewnia dopasowanie impedancji do przetwornika A/C. Dwa stopnie WE kompensują tłumienie filtrów i zapewniają dodatkowe wzmocnienie. Dzielnik R15-R16 ustala składową stałą dla przetwornika A/C. Wykonany odbiornik wygląda tak:
    Prototyp odbiornika SDR z STM32 zmontowany na płytce stykowej obok słuchawek i stacji lutowniczejPłytka STM32F4DISCOVERY z dołączonym modułem RF i układem odbiornika SDR Płytka STM32 połączona z prototypową płytką SDR i modułem w ekranie miedzianym

    Zastosowanie trzech filtrów ceramicznych w torze p.cz. wynika z konieczności uzyskania odpowiedniej selektywności. Charakterystyka pojedynczego filtru jest w datasheet Muraty:
    Charakterystyka tłumienia filtru ceramicznego SFE 4,5 MHz
    Można to przekształcić na dane tabelaryczne (program Engauge Digitizer) i pobawić się tym w Excelu:
    Charakterystyki trzech filtrów ceramicznych w funkcji częstotliwości
    Oczywiście czym więcej filtrów połączonych kaskadowo (charakterystyki k1, k2, k3), tym większe nachylenie zboczy charakterystyki, węższe pasmo (z tego samego powodu) i większe tłumienie dla częstotliwości środkowej. Daje się uzyskać B jakieś 400 kHz przy tłumieniu -60 dB. Coś takiego sobie założyłem względem skąpych (jak na ten projekt) możliwości STM32 i obliczeń, jakie zrobiłem dla tego przetwornika A/C. Cały wzmacniacz ma następującą charakterystykę (wyniki pomiarów) dla Ui=250 mVpp:
    Charakterystyka częstotliwościowa wzmacniacza p.cz.; maksimum przy 4,5 MHz
    Uzyskuje się wzmocnienie ok. 17 dB, co przy ok. 85 dB z R820T2 wydaje się mieć sens. Jednak R820T z pewnością tego nie osiąga.

    Kiedy już miałem blok analogowy należało dobrać częstotliwość próbkowania dla próbkowania pasmowego. Tutaj można próbkować sygnał pasmowy z częstotliwością mniejszą, niż to wynika z twierdzenia o próbkowaniu. Unika się wciąż aliasingu, ale inna będzie częstotliwość środkowa po próbkowaniu (dochodzą też oczywiście powielenia widmowe). Obliczenia są przedstawione poniżej:
    Tabela minimalnych częstotliwości próbkowania dla sygnału pasmowego z wartościami fc i B
    Wybrałem m=10. Z uwagi na rozdzielczość nastawy częstotliwości próbkowania (timer w STM32 do wyzwalania A/C pracującego z DMA, buforem kołowym i dwoma callback) fs=857,1 kHz. Musiałem ustawić bardzo krótkie próbkowanie w STM32, by to było możliwe. Nie jest to więc dokładnie, jak być powinno. Ponadto trzeba brać pod uwagę, że tor analogowy przetwornika A/C musi przenieść całe pasmo sygnału pasmowego tj. ponad 4,5 MHz. Z uwagi na próbkowanie pasmowe uzyskuje się nową częstotliwość środkową dla sygnału dyskretnego. Tutaj będzie to 260 kHz.

    Odnośnie samego R820T wykorzystałem kod Erica Brombaugh dostępny na Githubie. Wstępnie przeportowałem ten kod do STM32F407 i HAL dla STM32 oraz STM32IDE. Następnie zmodyfikowałem oryginalny kod i trochę go ulepszyłem wg. własnych upodobań i potrzeb. Tutaj pojawiły się pierwsze problemy. Okazuje się, że R820T nie może pracować na tej samej szynie I2C, co DAC audio CS43L22 z płytki STM32F4DISCOVERY. Jest konflikt adresów I2C, ponieważ CS43L22 daje też ACK dla adresu na który nie powinien reagować. Jest to skrajnie dziwna, ale prawdziwa sytuacja. Opisałem to na forum STM32: Link.

    Wstępnie jest skalowanie próbek z A/C. Pozbywam się więc składowej stałej i mam mniejsze wartości, co zmniejsza ryzyko jakichś przepełnień przy obliczeniach zmiennoprzecinkowych. Najpierw przetwarzane są 4 pierwsze próbki w zdarzeniu HAL_ADC_ConvHalfCpltCallback, potem 4 kolejne w HAL_ADC_ConvCpltCallback. W tym przypadku nie da się zastosować ciągów mieszających przy mieszaniu cyfrowym z uwagi na zastosowaną częstotliwość próbkowania. Trzeba więc zrobić odpowiedni NCO w taki sposób, by zachować ciągłość fazy przy zerowaniu licznika tablicy "lookup table". To nie jest takie oczywiste, jak się wydaje. Uzyskałem jednak pomoc na StackExchange: Link.

    Filtry cyfrowe są o nieskończonej odpowiedzi impulsowej (IIR). Jest to bardzo kontrowersyjne. Normalnie stosuje się w takich przypadkach FIR wysokiego rzędu, ale nie mam takich możliwości obliczeniowych. Stąd szybkie w obliczeniu IIR o mniejszym rzędzie, ale niezłej selektywności w porównaniu do FIR o tym samym rzędzie. Wada to nieliniowa charakterystyka fazowa i przez to niestałe opóźnienie grupowe. Mimo tego jakoś to działa. Zastosowałem filtry Czebyszewa 5-tego rzędu (trochę za mało). Jest więc jeszcze gorzej z fazą. Jakoś to działa, bo wykorzystywana jest tylko część charakterystyki, dalej jest już duże tłumienie. Filtry początkowo projektowałem wg. własnego skryptu w Matlabie. Wykorzystałem metodę transformacji biliniowej i oczywiście odpowiedni prototyp analogowy filtru. Ten był już projektowany (właściwie jego transmitancja), jak dla filtrów analogowych. Potem jednak z tego zrezygnowałem, bo metoda optymalizacyjna jaką ma FDATOOL w Matlabie (obecnie filter designer) jest dużo lepsza. Niestety dla uproszczeń programu w STM32 zrobiłem filtry jednosekcyjne, jako "direct form II". Jest to więc robione w taki sposób:
    Schemat struktury filtru IIR w formie bezpośredniej II z opóźnieniami Z^-1
    Do STM32IDE trzeba tylko odpowiednio przekopiować współczynniki filtru. Mam do tego zrobiony prosty skrypt w Matlabie. Po filtrach można (i na tak słabym mikrokontrolerze trzeba) zrobić decymację tj. obniżenie częstotliwości próbkowania. Nic się na tym nie traci, zaś wszystko jest dobrane tak, by nie było aliasingu. Generalnie przyjęte 105 kHz częstotliwości granicznej to nie jest B/2 (B=400 kHz), ale nie dałem rady na tym mikrokontrolerze zrobić nic więcej - fs=214,3 kHz to i tak bardzo dużo do obliczeń w czasie rzeczywistym z STM32F407. Dobrze, że jest tu całkiem sensowne FPU z przydatnymi instrukcjami dla DSP.

    Dalej dla dyskretnych sygnałów i(n) i q(n) można już robić demodulatory. Postanowiłem zrobić FM (szerokopasmowe), AM, CW (bardzo proste z komparatorem) i testowe wystawianie na przetworniki C/A bezpośrednio i(n) i q(n). Dla FM przydatna jest ta praca (znakomity materiał):
    Okładka raportu technicznego pt. Numerical FM Demodulation Enhancements
    Jest to zrobione w ten sposób dla sygnału ciągłego:
    Wzór matematyczny opisujący pochodną fazy chwilowej sygnału zespolonego
    Zaś po dyskretyzacji:
    Równanie pochodnej fazy sygnału zespolonego z i(nTs) i q(nTs)
    Obliczam jednak inaczej pochodne dla i(n) i q(n) z uwagi na szumy. Wykazuje się, że potem jeszcze trzeba zastosować arcus sinus:
    Wzór matematyczny przedstawiający obliczenie pochodnej fazy z sygnałów i(n) i q(n)
    Bez tego działa to nieliniowo, ale jeżeli interesuje nas np. odbiór FSK (lub jakiejś jego wersji), to można to sobie odpuścić. Tutaj musiałem zrobić to z kolejną tablicą "lookup table". Niestety nie miałem możliwości zrobienia normowania względem modułu. Ostatecznie jest filtr dolnoprzepustowy, by usunąć powstałe szumy - też niestety IIR. Przyjąłem częstotliwość graniczną 10 kHz. Słychać nieco zniekształcenia, ale sam dyskryminator jest bardzo liniowy. Nie pracuje dla pełnej dewiacji 75 kHz, ale wystarczy to do odbioru monofonicznego. Ostatecznie próbki m.cz. trafiają już bez decymacji i po skalowaniu do C/A i ostatecznie na CS43L22. Dla AM stosuję jednak znacznie węższe filtry dolnoprzepustowe dla i(n) i q(n).

    Z pomocą generatora w.cz. i generatora funkcji oraz oscyloskopu zbadałem ten dyskryminator.
    Generator funkcyjny Grundig TG 5 z aktywnymi wskaźnikami i podłączonym przewodem BNC Radziecki generator sygnałów wysokiej częstotliwości G4-116 na stole pomiarowym Stary oscyloskop UNITRA pokazujący sygnał sinusoidalny na ekranie
    Zastosowałem modulację sygnałem zewnętrznym 239 Hz. Generator G4-116 ma tą świetną cechę, że zachowuje nastawioną dewiację dla FM i głębokość modulacji dla AM przy podaniu sygnału zewnętrznego. Sam się dostraja do wartości maksymalnej tego sygnału. Generator w.cz. był dołączony do wejścia głowicy i ustawiony na 100 MHz. Podałem 540 µV (wartość skuteczna). Odbiornik dostroiłem do 100 MHz. Kolejno na X oscyloskopu dołączony był sygnał modulujący (do niego proporcjonalna jest chwilowa wartość częstotliwości), zaś do wejścia Y sygnał z C/A w STM32. Bardzo dobrze to wyszło. By uzyskać pełną charakterystykę (również część nieliniowa) ustawiłem dewiację 90 kHz. Liniowo pracuje dla 45 kHz. Wyszło coś takiego:
    Przebieg zniekształconej sinusoidy na ekranie oscyloskopu w trybie XY
    Nie jest idealnie, ale musiałem przyjąć 1000 kompromisów robiąc ten odbiornik z uwagi na słaby STM32. Można się już pobawić z mniejszą dewiacją (45 kHz) i obserwacją przebiegu (tj. zależnego od czasu). Poprawne dostrojenie generatora do 100 MHz:
    Zniekształcony przebieg sinusoidalny widoczny na ekranie oscyloskopu analogowego Licznik częstotliwości RFT pokazujący wartość 100,0077 MHz
    Odstrojenie "w górę":
    Zrzut ekranu z oscyloskopu przedstawiający zniekształcony sygnał sinusoidalny Wyświetlacz urządzenia pomiarowego pokazujący częstotliwość 100.0222 MHz
    Odstrojenie "w dół":
    Przebieg sygnału widoczny na ekranie analogowego oscyloskopu Częstotliwościomierz pokazujący 99,9899 MHz z podłączonym przewodem koncentrycznym
    Przy dewiacji 90 kHz przebieg na wyjściu C/A będzie mocno zniekształcony zgodnie z charakterystyką statyczną, jaka była wcześniej:
    Zbliżenie na ekran oscyloskopu z nieregularnym przebiegiem sinusoidalnym

    Co udało się odebrać? Oczywiście stacje z zakresu 88-108 MHz. Nie jest to Hi-Fi, ale jest nieźle, jak na tak prymitywny odbiornik i program. Poniżej nagrania dla stacji UKF na 93,3 MHz:



    Tutaj na 94,8 MHz:



    Odbiór w Grudziądzu na pokojowej antenie telewizyjnej ze wzmacniaczem szerokopasmowym. Można też sobie posłuchać terkotu FSK na 433,92 MHz, ale słychać też czasem GFSK:



    W Grudziądzu udało mi się też usyłszeć coś z analogowych łączności amatorskich w paśmie 2 m i 70 cm z jakichś przemienników. Jednak ten dyskryminator słabo się nadaje do wąskopasmowej modulacji. Generalnie słychać sporo transmisji cyfrowych - również w pasmach amatorskich.

    Odnośnie AM wystarczy obliczyć moduł. Ten po filtrze (znowu IIR) i odpowiednim skalowaniu można już wykorzystać jako sygnał m.cz. Dalej analogicznie jak w FM. Nie mam ARW (AGC), ale jest automatyczne skalowanie względem wartości modułu, więc jest jakaś namiastka cyfrowa. Wychodzi coś takiego:
    Dwa przebiegi sygnałów na ekranie oscyloskopu Unitra ZRK OS-710
    Górny sygnał to m.cz. na wyjściu C/A w STM32, dolny zaś to sygnał p.cz. na wejściu przetwornika. Głębokość 90%. Na wejściu głowicy 288 µV (wartość skuteczna). Częstotliwość nośna 100 MHz. Tu pojawia się problem, bo R820T pracuje od ok. 45 MHz. Faktycznie PLL chwyta od ok. 26 MHz, ale wzmocnienie jest małe. Można ewentualnie posłuchać pasma lotniczego. Jednak nic nie udało mi się odebrać oprócz jakichś transmisji cyfrowych. Zrobiłem więc skrajnie uproszczony blok dodatkowej przemiany (tzw. up converter) na mieszaczu szerokopasmowym podwójnie zrównoważonym.
    Schemat prostego mieszacza z generatorem 50 MHz i modułem SAM-3H-3
    Zrezygnowałem tu z przedwzmacniacza i jakichkolwiek filtrów na wejściu. Zastosowałem generatora przebiegu prostokątnego jako heterodynę. Wszystko jest więc przesunięte o 50 MHz. Odpuściłem nawet zasilanie przez złącze RF. Zmontowany moduł wygląda tak:
    Płytka prototypowa z mieszaczem radiowym i generatorem prostokątnym 50 MHzLutowana płytka prototypowa z elementami toru p.cz. dla odbiornika SDR
    Po dołączeniu do odbiornika:
    Zmontowany prototyp odbiornika SDR z płytką STM32F4 i układem RF R820T
    Coś tam można odebrać na KF. Kilka stacji:
    7,30 MHz




    11,64 MHz




    11,97 MHz




    13,70 MHz




    17,65 MHz




    Z łączności amatorskich słychać było przez chwilę CW i różne transmisje cyfrowe, radary pozahoryzontalne itd. Odbiór był na ok. trzech metrach przewodu rozwieszonego po pokoju.

    Edukacyjnie można też wrócić do początku tego opisu. Mowa była o sygnałach i(t) i q(t). Można je wystawić na wyjścia C/A w STM32. Poniżej przebiegi:
    Zrzut ekranu oscyloskopu Unitra z dwoma przesuniętymi sinusoidami
    Górny przebieg to i(t), dolny z kolei q(t). Jak widać jest szum, ale to efekt niedostatecznego tłumienia filtrów dolnoprzepustowych. Pomiary były robione znowu dla 100 MHz i 288 µV (wartość skuteczna) na wejściu głowicy. Warto zobaczyć to w trybie XY. Jest to bardzo ciekawe. Teoretycznie byłby stacjonarny punkt, jak na początkowym rysunku. Jednak z uwagi na szumy fazowe tak nie będzie. Więc punkt ten będzie się poruszał w kierunku zależnym od znaku odstrojenia częstotliwości i z prędkością zależną od wartości odstrojenia. Nagrałem więc z tego film:



    Podczas nagrywania filmu starałem się dostrajać generator. Widać więc chwilowe niemal zatrzymanie.

    Odbiornik sterowany jest przez konsolę UART i terminal RealTerm. Dostępnych jest trochę poleceń do nastawy częstotliwości, demodulatora itd.:
    Spoiler:
    help - this message
    read <addr> - read reg (R820T2)
    write <addr> <data> - write reg, data (R820T2)
    dump - dump all regs (R820T2)
    freq <frequency> - Set freq in MHz
    lna_gain <gain> - Set gain of LNA [0 - 15]
    mixer_gain <gain> - Set gain Mixer [0 - 15]
    vga_gain <gain> - Set gain VGA [1 - 49.3 dB]
    lna_agc_ena <state> - Enable LNA AGC [0 / 1]
    mixer_agc_ena <state> - Enable Mixer AGC [0 / 1]
    bandwidth <bw> - Set IF bandwidth [1 - 15]
    init - default SDR state
    volume <vol> - audio volume for CS43L22 [0 - 100]
    mute - muting of CS43L22
    unmute - unmuting of CS43L22
    demod_type <type> <CW upper lvl> <CW hyst> - Set demodulator type [AM/FM/IQ/CW]
    tune <start_freq> <step> - Manual tune from start_freq [MHz] with step [MHz]
    scan <start_freq> <step> <mod_thres> <Mute> - Scan from start_freq [MHz] with step [MHz], mod_thres [dB] and Mute [0/1]


    Po uruchomieniu w konsoli jest coś takiego:
    Zrzut ekranu konsoli UART z komunikatem inicjalizacji odbiornika SDR
    Można np. ustawić demodulację FM i potem częstotliwość:
    Zrzut ekranu terminala RealTerm z ustawioną modulacją FM i częstotliwością 99,6 MHz
    Ułatwieniem jest komenda "tune", czyli ręczne dostrajanie:
    Zrzut ekranu terminala UART z wynikami strojenia odbiornika SDR
    Tutaj strojenie jest od 100 MHz z krokiem 0,1 MHz. Podawany jest też powiedzmy, że uśredniony moduł na wejściu przetwornika. Nie uwzględniałem tu wzmocnień całego toru.

    Jest też wyszukiwanie względem modułu tj. komenda "scan":
    Zrzut ekranu z terminala UART pokazujący wyniki skanowania częstotliwości od 100 MHz
    Tutaj jest od 100 MHz z krokiem 0,1 MHz, progiem -22 dB i bez wyciszenia CS43L22.

    W mojej wersji wzmocnienie dla toru p.cz. w R820T2 nastawiam przez wyprowadzenie IF AGC.
    Schemat blokowy tunera R820T z zaznaczonym wzmacniaczem AGC w torze p.cz.
    Stąd mam do tego PWM z STM32 i filtr dolnoprzepustowy. Można w ten sposób uzyskać lepszą rozdzielczość nastawy wzmocnienia. Byłoby to też wygodniejsze do zrobienia ARW (jak dałoby się to zdążyć zrobić mając tak niewiele taktów zegara STM32). Jest więc do tego komenda:
    Zrzut ekranowy terminala konsoli z ustawieniem wzmocnienia VGA na 31,7 dB
    Kilka innych komend:
    Zrzut ekranu z terminala pokazujący polecenia sterujące głośnością i wyciszeniem

    Generalnie założony cel został osiągnięty. Powstał prosty i edukacyjny SDR. Z pewnością nie jest to konkurencja dla RTL-SDR.

    Projekt zamieściłem też w repozytorium na Githubie: R820T2-and-STM32F407-SDR-receiver.

    Mam nadzieję, że nie przesadziłem z obszernością opisu. Może więc komuś udało się dotrzeć do tego miejsca. W razie pojawienia się zainteresowania chętnie odpowiem na wszelkie pytania.

    Fajne? Ranking DIY
    O autorze
    maciej_333
    Poziom 38  
    Offline 
    Specjalizuje się w: programowanie
    maciej_333 napisał 4247 postów o ocenie 1606, pomógł 488 razy. Mieszka w mieście Grudziądz. Jest z nami od 2003 roku.
  • #2 21626274
    TechEkspert
    Redaktor
    Posty: 7285
    Pomógł: 17
    Ocena: 5665
    Robi wrażenie, dzięki za umieszczenie projektu, licznik plusów pewnie szybko przekroczy setkę :)
    Wycisnąłeś maksimum możliwości z mikrokontrolera jednocześnie dostosowując część radiową. Część radiowa zawsze była dla mnie trudna.
    Podoba mi się efekt końcowy, ze sterowania po UART można przejść na WEBSDR ;)

    Aż strach pomyśleć co wycisnąłbyś z M7 :) np. NUCLEO-H743ZI2 Cortex-M7, chociaż M4 były też takie ze wsparciem dla DSP NUCLEO-G474RE jednak nie wiem na ile pomogłoby to w tym konkretnym zastosowaniu.

    Materiały wideo w takim artykule dobrze wzbogacają treść.
  • #3 21626281
    gulson
    Administrator Systemowy
    Posty: 29473
    Pomógł: 150
    Ocena: 6099
    Wspaniały projekt, nie wiem, jak się odwdzięczyć za tak kompletną prezentację.
    Chciałbym też przetłumaczyć na język angielski, aby zobaczył cały świat, co taki wspaniały nauczyciel stworzył.
    Nauczyciel, nie żaden teoretyk, tylko prawdziwy praktyk, aż z przyjemnością bym wysłuchał wykładu.
  • #4 21626424
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    Dziękuję za uznanie.

    TechEkspert napisał:
    Aż strach pomyśleć co wycisnąłbyś z M7 np. NUCLEO-H743ZI2 Cortex-M7

    Widziałem tą płytkę i czytałem o STM32H755. Ma niezłe wsparcie dla DSP i możliwość sprzętowej realizacji filtrów IIR oraz FIR. Brak jednak C/A audio na tej płytce. Dałoby się jednak łatwo coś dorobić przez i tak występujący C/A w każdym STM32. Zdecydowałem się też na STM32F407 dlatego, że miałem doświadczenie z DSP głównie w Matlabie. Dlatego też wydawało mi się, że nie będzie aż tak ciężko tego upchnąć.

    Z kolei STM32F407 też wspiera nie najgorzej DSP (jak na M4). Mamy tu trochę ciekawych instrukcji. Jest to opisane w nocie aplikacyjnej STM32:
    Zrzut ekranu z dokumentu AN4044 dotyczącego FPU w mikrokontrolerach STM32
    Fragment dokumentacji STM32 z tabelą instrukcji zmiennoprzecinkowych FPU.
    Zaznaczyłem to, co się tu szczególnie przydało. Musiałem jednak brać to pod uwagę, by kompilator miał szansę to wykorzystać. Czasem np. zastosowanie pętli jest wbrew pozorom szybsze, niż jej brak.
    Pamiętajmy jednak, że nawet najlepsze STM32 mają daleko z DSP do faktycznych procesorów DSP. Nie ma co tego porównywać np. do TMS320C6678 (nawet przy tym samym zegarze). Pracowałem z nim kiedyś, jak robiłem doktorat. Sinus oblicza w ciągu ok. 60 taktów zegara. Nie chodzi tu tylko o blok sprzętowy, ale też o samą implementację funkcji trygonometrycznych.

    TechEkspert napisał:
    Wycisnąłeś maksimum możliwości z mikrokontrolera jednocześnie dostosowując część radiową. Część radiowa zawsze była dla mnie trudna.

    Tak, starałem się to jakoś równoważyć. W sumie mogłem w torze p.cz. dać np. jakiś wzmacniacz regulowany np. VC810. Mam ich kilka, ale było mi tego szkoda. Zresztą musiałbym kombinować z zasilaniem. Zależało mi na jak najprostszym bloku sprzętowym. Stąd są tylko trzy tranzystory.

    TechEkspert napisał:
    Podoba mi się efekt końcowy, ze sterowania po UART można przejść na WEBSDR

    Trochę słabo jak na WEBSDR. Nie dałoby się np. zrobić SDFT, czyli analizy zmian widma w czasie (po polsku tu chyba sepktrogram). Zresztą tylko jedna osoba miałaby do tego dostęp na raz.

    gulson napisał:
    Chciałbym też przetłumaczyć na język angielski

    Będzie mi miło jakbyś to zrobił. Nie mam siły tego opisywać po angielsku. Napisałem trochę na Github i w komentarzach w kodzie, by chociaż kluczowe kwestie były opisane.
  • #5 21626450
    bulek01
    Poziom 17  
    Posty: 338
    Pomógł: 12
    Ocena: 297
    Fajny projekt bardzo mi się podoba tym bardziej, że marzy mi się aby zrobić coś takiego samemu z zewnętrznym ADC.
    Dzięki za informację o materiałach na temat demodulacji cyfrowej, przyda się. Podoba mi się też, że zaprojektowałeś wzmacniacz p.cz na tranzystorach i to jeszcze z filtracją na filtrach ceramicznych. Gotowe SDRy oraz transceivery radiowe scalone w mojej obserwacji mają tragicznie słabe te filtry.
    Myślę, że fajnie byłoby zrobić taki układ w oparciu o analogowy mieszacz IQ i potem dwa przetworniki.
    Też zastanawiam się czy byłyby z tego korzyści i jakie.
  • #6 21626502
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    bulek01 napisał:
    Fajny projekt bardzo mi się podoba tym bardziej, że marzy mi się aby zrobić coś takiego samemu z zewnętrznym ADC.

    Niewiele się zyska. Mam tu 12 bitów, ale jak byłoby 8, to nie byłoby wielkiej różnicy. Rzadko kiedy sygnał ma taki SNR by choćby zbliżyć się do SNR 12 bitowego A/C. Ponadto wewnętrzny A/C to wyjątkowa elastyczność, jeśli chodzi o callback, DMA itd.

    bulek01 napisał:
    Podoba mi się też, że zaprojektowałeś wzmacniacz p.cz na tranzystorach i to jeszcze z filtracją na filtrach ceramicznych.

    Można go było znacznie rozwinąć np. dać na wejściu kaskodę WE-WB i jeszcze filtry LC oprócz ceramicznych. Jednak nie chciało mi się tego robić. Wolałem przyjąć trochę szersze pasmo i większą częstotliwość próbkowania.

    bulek01 napisał:
    Gotowe SDRy oraz transceivery radiowe scalone w mojej obserwacji mają tragicznie słabe te filtry.

    To nie ma znaczenia, bo jest to nadrabiane programowo. Zresztą te SDR to tak naprawdę odbiorniki DVB-T. Stąd są dopasowane do odbioru właśnie DVB-T i ich pasmo jest rzędu 8 MHz.

    bulek01 napisał:
    Myślę, że fajnie byłoby zrobić taki układ w oparciu o analogowy mieszacz IQ i potem dwa przetworniki.
    Też zastanawiam się czy byłyby z tego korzyści i jakie.

    Myślałem o tym, ale już wstępne obliczenia i projekt w głowie mnie zniechęca do czegoś takiego. To jest trudniejsze, niż się wydaje. Zresztą po spróbkowaniu i(t) i q(t) w takich odbiornikach robi się jeszcze korektę z uwagi na nieidealne tory dla i(t) i q(t).
  • #7 21626570
    aadeer
    Poziom 17  
    Posty: 274
    Pomógł: 11
    Ocena: 172
    No i to jest projekt DIY godny zaprezentowania!

    Moją uwagę zwrócił też oscyloskop. mariaż starej i nowej technologii... ;)
  • #8 21626680
    szeryf3
    Poziom 30  
    Posty: 2046
    Pomógł: 12
    Ocena: 674
    Fajny projekt. Szacunek za pracę.
    Po sprzęcie z jakiego kolega korzysta widzę, że jesteśmy z tego samego okresu wiekowego.
  • #9 21626804
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    szeryf3 napisał:
    Po sprzęcie z jakiego kolega korzysta widzę, że jesteśmy z tego samego okresu wiekowego.

    Sprzęt ten jest jednak młodszy ode mnie. Urodziłem się w 1987 roku. Generalnie przynajmniej generator funkcji i oscyloskop mógłbym już kupić nowe. Obecnie nie jest to taki wielki wydatek. Taki sprzęt mam, bo jeszcze 15 lat temu były nieco inne realia np. w zakresie cen oscyloskopów.
  • #10 21627315
    aadeer
    Poziom 17  
    Posty: 274
    Pomógł: 11
    Ocena: 172
    Widząc oscyloskop pomyślałem na początku - oooo, oscyloskop z przed 30 lat - pewnie lata 70 ;) A 30 lat temu to były późne lata 90...

    Te nagrania audio są w wewnętrznego DAC? Zerknąłem w kod i widzę, że używasz wewnętrznego DAC zamiast tego kodeka CS...?

    
    case DEMOD_FM: //it's described in NUMERICAL FM DEMODULATION ENHANCEMENTS by Andrew J. Noga   https://apps.dtic.mil/sti/pdfs/ADA311269.pdf
             phase = K*(I_Z1*(Q - Q_Z2) - (I - I_Z2)*Q_Z1) / (I_Z1*I_Z1 + Q_Z1*Q_Z1);
             .....
                            ....
             DAC->DHR12R1 = A_DAC_scale_FM*phase + B_DAC_scale_FM; //scaling
          break;
    


    A ten fragment nie wprowadza stałego przesunięcia fazowego między I i Q?
    Q ze względu na te obliczenia i porównanie będzie zawsze trochę opóźniony, pytanie na ile to jest znaczące i czy kompilator próbuje to optymalizować.
    
    DAC_value = A_DAC_scale_IQ*I + B_DAC_scale_IQ;
             if (DAC_value > 4095) DAC_value = 4095;
             if (DAC_value < 0) DAC_value = 0;
             DAC->DHR12R1 = DAC_value;
    
             DAC_value = A_DAC_scale_IQ*Q + B_DAC_scale_IQ;
             if (DAC_value > 4095) DAC_value = 4095;
             if (DAC_value < 0) DAC_value = 0;
             DAC->DHR12R2 = DAC_value;
    
  • #11 21627447
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    @aader -> Dziękuję za merytoryczne pytania.

    aadeer napisał:
    Te nagrania audio są w wewnętrznego DAC? Zerknąłem w kod i widzę, że używasz wewnętrznego DAC zamiast tego kodeka CS...?

    Tak, stosuję wewnętrzny DAC dla sygnału m.cz. przy AM i FM. Chodzi o to, że CS43L22, czyli DAC audio może działać też w trybie "analogowym". Dostaje on wtedy sygnał z zewnątrz poprzez DAC STM32. Wciąż jednak działa mute, volume i inne funkcje CS43L22 (działa to więc jako wzmacniacz mocy do wysterowania słuchawek). Ustawia się to przez I2C. Poprzez I2S generuję tylko zegar, ale nie wysyłam danych do CS43L22.

    Można zadać pytanie skąd taki pomysł? Otóż, niestety mam pewną częstotliwość próbkowania sygnału p.cz. Nie mam zbytnio na to wpływu. Po decymacji jest 4 razy mniej, ale to wciąż 214,3 kHz. Stąd, żeby to podać na I2S musiałbym znowu zmieniać szybkość próbkowania, by się dopasować np. do 48 kHz. Jednak tutaj musiałbym robić interpolację i decymację, bo 214,3/48 to nie jest liczba całkowita. Nie mam mocy obliczeniowej, by to zrobić. Stąd wybrałem rozwiązanie bardzo prymitywne, ale dosyć skuteczne. Generalnie te 12 bitów w DAC od STM32 wystarczy na taki dźwięk, jaki jest w nagraniach. Jak widać musiałem nawet zrezygnować z HAL przy odwołaniu się do DAC. Niezbyt to rozsądne, bo nie należy mieszać HAL i podejścia na rejestrach, ale tutaj nie będzie problemu.

    aadeer napisał:
    A ten fragment nie wprowadza stałego przesunięcia fazowego między I i Q?
    Q ze względu na te obliczenia i porównanie będzie zawsze trochę opóźniony, pytanie na ile to jest znaczące i czy kompilator próbuje to optymalizować.

    Tak, daje to przesunięcie. Jednak zegar dla STM32F407 to 168 MHz (maksymalna dopuszczalna wartość). To opóźnienie wyniesie pewnie kilka taktów zegara. Wystawianie i(n) i q(n) na zewnątrz jest tylko eksperymentalne, by zobaczyć jak to wygląda na żywo - nie tylko w Matlabie. Można też bawić się w odbiornik o bezpośredniej przemianie częstotliwości i słychać tego na słuchawkach.
  • #12 21627554
    aadeer
    Poziom 17  
    Posty: 274
    Pomógł: 11
    Ocena: 172
    maciej_333 napisał:
    @aader -> Dziękuję za merytoryczne pytania.

    Dzięki za podzielenie się projektem, nie pomyślałbym, żeby na zwykłym STM F4 coś takiego robić...
  • #13 21628284
    pikarel
    Poziom 39  
    Posty: 5036
    Pomógł: 410
    Ocena: 1848
    Łamiesz stereotyp; po co, skoro już wszystko jest.
    Opis jest tak rzeczowy, fachowy i zrozumiały, że "klękajcie narody", inni publikujący swoje opracowania mogą brać przykład z Ciebie.
    Gigantyczny plus ode mnie za projekt i wykonanie.
  • #14 21629265
    andrzejmfranek
    Poziom 4  
    Posty: 7
    Ocena: 3
    Znakomity projekt! Być może użycie STM32G431 uprościłoby projekt i poprawiło jego parametry. Procesor ma prawie identyczne taktowanie, dwa 12-bitowe przetworniki a/c 4 Mhz mogące pracować w trybie interleaved (pozwala zrealizować sprzętowe przesunięcie sygnału o 90 st), programowany wzacniacz wejściowy o wzmocnieniu 1-64, sprzętowe akceleratory obliczania funkcji trygonometrycznych (CORDIC) i sprzętowe wsparcie cyfrowego filtrowania (FMAC). Na ALI-EXPRESS mżna kupić moduł za ok. 15 zł plus koszty wysyłki.
  • #15 21629540
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    Wejściowy PGA nic nie nie da, bo nie przeniesie 4,5 MHz. Tutaj cały tor analogowy przetwornika musi przenieść całe pasmo sygnału pośredniej częstotliwości. Z tego, co widzę w datasheet STM32G431 jest tylko wzmacniacz operacyjny, który pewnie może działać jako prosty PGA. Ma on jednak minimalne pole wzmocnienia 7 MHz. Jak wzmocnienie będzie np. 8 V/V to przy założeniu prostej funkcji jednobiegunowej transmitancji (stałość pola wzmocnienia) mamy pasmo raptem 875 kHz. Jest to znacznie za mało. W przypadku próbkowania kwadraturowego, nie stosuje się przesunięć, tylko mieszanie cyfrowe na pobranych próbkach. Stąd wejście jest jedno.

    Z kolei CORDIC mógłby dużo pomóc i można by się obyć bez tablicowania funkcji trygonometrycznych. Tablicowanie działa przynajmniej w tym projekcie dobrze, ale jest kłopotliwe, mało elastyczne i prowadzi do uzyskania trudnych do przewidzenia błędów. Bardzo dużo pomógłby FMAC. Jednak jak już portować to na inny mikrokontroler, to lepiej dać od razu coś znacznie większego jak np. STM32H755.
  • #16 21631093
    andrzejmfranek
    Poziom 4  
    Posty: 7
    Ocena: 3
    >>21629540

    Przegląd prcesorów do sdr

    1. Inne procesory niż STM nie są godne uwagi. Za malała prędkość
    przetwarzania a/c i większe błędy
    2. STM32MP157C
    Dwurdzeniowy Cortex A7 800 MHz + Cortex M4 210 MHz. 2 przetworniki a/c
    16b/3,6 Msamples lub 14-12-10-8b/ z odpowiednio wyższą częstotliwością
    próbkowania. W M4 instrukcje DSP. Dostępny np w Kamami (moduł
    uruchomieniowy) za ok. 370 zł.Na Ali-Express za drogo...
    3. STM32MP25x
    Dwurdzeniowy Cortex A35 1.5 GHz + Cortex-M33
    3 przetworniki a/c 12b/5 Msamples. Jeszcze mocniejszy.
    4. STM32H750
    Jednordzeniowy Cortex-M7 480MHz. 3 przetworniki a/c
    16b/3,6 Msamples lub 14-12-10-8b/ z odpowiednio wyższą częstotliwością
    próbkowania, instrukcje DSP. Posiada USB high-speed, co pozwoli na
    połączenie z osobnym komputerem - opcja lepsza i tańsza niż 2.
    Dostępny np w Kamami (moduł uruchomieniowy) za ok. 150 zł.
    Na Ali-Express za ok. 50 zł,.

    Przy okazji - po dobrym filtrze p.cz. sygnał można próbkować z
    częstotliwością będącą podwielokrotnością częstotliwości synału. Dla
    przetworników STM32 jest to wykonalne, gdyż najkrótszy (programowalny)
    czas próbkowania jest znacznie krótszy niż całkowity czas przetwarzania
    sygnału.

    PS. Dziękuję za zwrócenie mi uwagi na problem pola wzmocnienia wzacniacza
    operacyjnego.
  • #17 21631115
    ArturAVS
    Moderator
    Posty: 26376
    Pomógł: 2301
    Ocena: 7818
    @andrzejmfranek Do odpowiednio zaprojektowanego SDRa wystarczy i AtMega. (patrz uSDX).
  • #18 21631204
    żarówka rtęciowa
    Poziom 38  
    Posty: 3914
    Pomógł: 364
    Ocena: 393
    Witam

    Ciekawe czy dałoby radę wykorzystać podobny moduł głowicy od telewizora LCD? Ostatnio sporo takiego sprzętu ulega kasacji z powodu zmian standardu nadawania lub zwyczajnej awarii. Czy jest możliwy odbiór radia w standardzie DAB+?
  • #19 21631212
    ArturAVS
    Moderator
    Posty: 26376
    Pomógł: 2301
    Ocena: 7818
    żarówka rtęciowa napisał:
    moduł głowicy od telewizora LCD

    Rodzaj TV nie ma znaczenia, byle był DVBT z odpowiednim układem tunera.

    R820 jest od lat "rozpracowany", patrz RTL-SDR. Sam tuner R820 będzie potrzebował szybkich przetworników A/C, ale da się przenieść widmo do mniejszych wartości.
  • #20 21631347
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    andrzejmfranek napisał:
    4. STM32H750
    Jednordzeniowy Cortex-M7 480MHz. 3 przetworniki a/c
    16b/3,6 Msamples lub 14-12-10-8b/ z odpowiednio wyższą częstotliwością
    próbkowania, instrukcje DSP.

    Ten mi bardzo odpowiada. Zobaczymy co będę dalej robił.

    andrzejmfranek napisał:
    Przy okazji - po dobrym filtrze p.cz. sygnał można próbkować z
    częstotliwością będącą podwielokrotnością częstotliwości synału.

    Jest to próbkowanie sygnałów pasmowych. Tak mam to właśnie zrobione.

    żarówka rtęciowa napisał:
    ciekawe czy dałoby radę wykorzystać podobny moduł głowicy od telewizora LCD?

    Wstępnie uruchomiłem to z MXL5007T. Można stosować inne układy. Ważne jest by była odpowiednia częstotliwość pośrednia. Musi być dosyć niska np. 4,5 MHz. Problem jest jednak taki, że do tych układów przeważnie nie ma dokumentacji.

    żarówka rtęciowa napisał:
    Czy jest możliwy odbiór radia w standardzie DAB+?

    Teoretycznie tak, bo można to zrobić na SDR, ale praktycznie nie mam tyle mocy obliczeniowej, by to zrobić.

    ArturAVS napisał:
    Sam tuner R820 będzie potrzebował szybkich przetworników A/C, ale da się przenieść widmo do mniejszych wartości.

    Raczej trzeba zawężać pasmo. Tak jest to zrobione - próbkowanie sygnału pasmowego. Można stosować mniejszą częstotliwość, niż to wynika z twierdzenia o próbkowaniu.
  • #21 21631354
    TechEkspert
    Redaktor
    Posty: 7285
    Pomógł: 17
    Ocena: 5665
    @maciej_333 jeżeli poza formą tekstową interesuje cię także nagranie audycji, to jeżeli chciałbyś przedstawić wybrany temat w podkaście elektroda.pl zapraszam na PW.
  • #22 21631461
    andrzejmfranek
    Poziom 4  
    Posty: 7
    Ocena: 3
    >>21631115
    Oczywiście, że można. Tylko w uSDX sygnały I i Q dla DSP otrzymywane są analogowo z demodulatora Tayloe, DSP natomiast ma pasmo zbyt wąskie dla odbioru SSB. W tym rozwiązaniu sygnały I i Q otrzymywane są cyfrowo. Uzyskane pasmo starcza do odbioru szerokopasmowego FM. Różnica w paśmie odbieanym ok. 2 rzędy wielkości.
  • #23 21634059
    andrzejmfranek
    Poziom 4  
    Posty: 7
    Ocena: 3
    >>21631461

    Kolejny wynik poszukiwania sprzętu:
    Ze strony
    https://hackaday.io/project/186329-32mhz-spec...an-fpga/log/213303-the-adc-board-analog-input

    Maszyna o parametrach znacznie przekraczających wymagania R820 - ALI-EXPRESS

    1. Płytka EBAZ 4205 -Xilinx ZYNQ 7010, 90 zł + 20 zł
    procesor: 2 rdzenie ARMv7-A zegar 667 MHz
    DSP: 80 bloków 18x25 MACCs (multiply and accumulate)

    Słabe przetworniki A/C: 12b/1 MSample
    brak programatora na płytce

    2. Programator Xilinx 65 zł + wysyłka 20 zł

    3. Płytka AD9226 - A/D 12b/65 MSamples, 60 zł + wysyłka 20 zł

    4. Wzmacniacz 0.1 - 500 MHz 32 dB, 10 zł + wysyłka 5 zł

    Razem ok. 300 zł
  • #24 21635473
    satanistik
    Poziom 27  
    Posty: 1938
    Pomógł: 61
    Ocena: 762
    Projekt bardzo skomplikowany, widać ogrom wiedzy teoretycznej. Może jakis poradnik jak robić takie filtry cyfrowe w praktyce, zrozumiały dla kogoś kto nie siedzi w tym na codzień ale czasem mógł by to wykorzystać.
    Bo te wzory i diagramy z książki są mało przydatne dla programisty amatora nie obcujacego na codzień z taką wiedzą.
  • #25 21635515
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    Projekt faktycznie nie jest taki prosty. Z DSP nie pracuje się tak trudno w Matlabie. Dużo trudniej jest w systemach wbudowanych, jak tutaj.

    satanistik napisał:
    Może jakis poradnik jak robić takie filtry cyfrowe w praktyce, zrozumiały dla kogoś kto nie siedzi w tym na codzień ale czasem mógł by to wykorzystać.

    Zdaję sobie sprawę, że artykuł zawiera całą masę terminów z zakresu DSP i elektroniki. Niestety jakbym miał to wszystko dokładnie opisać, to powstałaby praca magisterska.
    Mógłbym coś opowiedzieć, ale to byłby długi artykuł. Nie wiem, czy byłoby duże zainteresowanie. W formie łatwego do zrozumienia poradnika filtry FIR i IIR są opisane w książce Lyonsa, jaką wskazałem już na początku. Jest to najlepsza pozycja o DSP dla amatora. Z zakresu DSP można też polecić "Podstawy teorii sygnałów" Szabatina. Z polskich książek jest też "Cyfrowe przetwarzanie sygnałów od teorii do zastosowań" Zielińskiego. Jednak najlepiej najpierw poczytać Lyonsa.
  • #26 21635517
    andrzejmfranek
    Poziom 4  
    Posty: 7
    Ocena: 3
    W sieci jest trochę dobrych tutoriali. Moim zdaniem warto zacząć od https://zipcpu.com/tutorial/, oraz https://nandland.com/introduction-to-verilog-for-beginners-with-code-examples/ i https://asic-worlad.com/verilog/veritut.html, do których odsyła strona zipcpu. Na niej jest też link do symulatora (Verlator) https://www.veripool.org/wiki/verilator.
    Sam uczyłem się korzystając z modułu Terasic DE0-NANO a potem DE10-NANO (INTEL/Altera Cyclone 4 i 5), które też posiadają dość dobre tutoriale, lecz napisane pod konkretne moduły. Problemem z nimi jest cena. Na Kamami DE0-NANO to koszt ponad 600 zł (edu), DE10-NANO ponad 1600 zł, na ALI-EXPRESS jeszcze więcej. Płytkę EBAZ 4205 (zestaw edukacyjny) zamówiłem za 140 zł plus programator za 65 zł (moduły TERASIC programatory mają wbudowane). Sama płytka EBAZ ma parametry pomiędzy DE0 (wielkość FPGA) i DE10 (podobny procesor). Cena jest tak niska prawdopodobnie z powodu zbyt małej mocy do kopania kryptowalut. Za kilka dni mam to dostać.
  • #27 21635527
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    W Google za darmo można pobrać ze strony Analog Devices też coś takiego:
    Okładka książki „Software-Defined Radio for Engineers” z geometrycznymi wzorami
    Niezły materiał. Przykłady są pod Matlaba i konkretne zestawy rozwojowe, ale mimo to teorię opisują w sposób ogólny. Zatem da się na podstawie tego wszystko zrobić.
  • #28 21635548
    andrzejmfranek
    Poziom 4  
    Posty: 7
    Ocena: 3
    >>21635515
    Dla mnie wystarczająco dobrą pozycją dotyczącą DSP jest "The Scientist & Engineer's Guide to Digital Signal Processing", jao że jest pisana z punktu widzenia programisty. PS. W poprzednim poście pisałem nt tutoriali do FPGA, głównie Verilog.
  • #29 21636498
    satanistik
    Poziom 27  
    Posty: 1938
    Pomógł: 61
    Ocena: 762
    W polskiej literaturze zwykle "Jak u Hitchcocka - najpierw trzęsienie ziemi, a potem napięcie będzie narastać" - na pierwszej stronie wzór na 1/2 kartki, a później tylko więcej greckich literek. Odeszliby już od tego, bo ani tego już w szkole nie uczą, ani z klawiatury nie wpisze ;-). A tak poza tym to rozkład tych sygnałów na składowe przypomina działanie wykrywaczy metali - kiedyś właśnie myślałem nad tym, żeby pozbyć się demodulatorów i podać sygnał z cewki na uP. Tylko nie miałem pojęcia, jak to oprogramować.
  • #30 21636553
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1606
    satanistik napisał:
    W polskiej literaturze zwykle "Jak u Hitchcocka - najpierw trzęsienie ziemi, a potem napięcie będzie narastać" - na pierwszej stronie wzór na 1/2 kartki,

    Do jakiej dokładnie pozycji literaturowej się odnosisz? Widzisz niektórzy z czymś takim stale pracują. W doktoracie zużyłem chyba większość greckiego alfabetu.

    "Najlepsze" jest jak autor książki pisze słynne "łatwo zauważyć, że...".

    satanistik napisał:
    A tak poza tym to rozkład tych sygnałów na składowe przypomina działanie wykrywaczy metali - kiedyś właśnie myślałem nad tym, żeby pozbyć się demodulatorów i podać sygnał z cewki na uP. Tylko nie miałem pojęcia, jak to oprogramować.

    Nie ma problemu. Wystarczy zrobić dokładnie tak samo, jak w opisanym tu rozwiązaniu. Wiele lat temu prowadziłem takie eksperymenty. Wykorzystywałem jednak detektory synchroniczne, ale to i tak prowadzi do i(t) i q(t). Był to wykrywacz IB z sondą DD. Jednak nie widzę sensu odchodzić od głównego wątku.
📢 Słuchaj (Głos AI):

Podsumowanie tematu

✨ Dyskusja dotyczy eksperymentalnego odbiornika SDR zbudowanego na tunerze DVB-T z głowicą R820T oraz mikrokontrolerze STM32F407. Opisano wykorzystanie próbkowania sygnału pośredniej częstotliwości, cyfrową demodulację AM/FM/SSB, obróbkę I/Q, filtrację cyfrową FIR/IIR oraz generację audio przez wewnętrzny DAC STM32 i układ CS43L22 pracujący w trybie analogowym. Omawiano ograniczenia mocy obliczeniowej, dobór częstotliwości próbkowania, zastosowanie instrukcji DSP w Cortex-M4 oraz potencjalne korzyści z nowszych układów STM32 z CORDIC, FMAC i szybszym ADC. Duża część rozmowy dotyczyła toru p.cz. z filtrami ceramicznymi 4,5 MHz, dopasowania impedancji, tłumienia w paśmie przepustowym, zafalowań charakterystyki i wpływu topologii montażu na sprzężenia pojemnościowe. W toku testów porównywano filtry Murata i chińskie, wykonywano pomiary NanoVNA, analizę plików S2P/S1P oraz korekty układu wzmacniacza na tranzystorach. Ostatecznie wykazano, że problem z zafalowaniem wynikał z ułożenia filtrów na PCB, a po zmianie topologii i montażu w jednej linii charakterystyka toru stała się zgodna z oczekiwaniami.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA