21.9.2013 Vývoj číslicových obvodů a výpočetní techniky v posledních desetiletích dal vzniknout zcela nové koncepci radiového přijímače SDR (Software Defined Radio). Idea SDR je vykousnout požadovanou část rádiového spektra, zdigitalizovat, softwarově ji vyfiltrovat a zdemodulovat / zdekódovat. To přináší velkou flexibilitu - možnost pomocí jednoho hardwaru zpracovávat signály s různou modulací a kódováním, ať už existující nebo které bude teprve vymyšleno. Hardware SDR se typicky skládá ze vstupního VF obvodu, programovatelného PLL oscilátoru, směšovače a případně ještě dolní propusti a A/D převodníku. Pro úzkopásmové signály lze s výhodou použít jako A/D převodník běžnou zvukovou kartu v PC, která zvládne typicky vzorkování 44,1 - 192 kHz. Z navzorkovaného signálu se pak digitálně vyfiltruje vybraný kanál (FIR / IIR filtry) a dekóduje podle potřeby. Příklad takového jednoduchého SDR přijímače najdete zde.
Poprvé jsem se s SDR seznámil v roce 2004, když jsme byli se školou na exkurzi v ASICentru, kde se mimo jiné zabývali vývojem přijímače pro DRM (Digital Radio Mondiale). To je digitální vysílání v pásmu DV, SV, KV využívající kodeku MPEG-4 AAC, díky němuž se vejdou do šířky pásma 10 - 20 kHz (šířka AM kanálu je 9 kHz, mezní frekvence 4,5 kHz) s podstatně lepší kvalitou zvuku než AM.
Asi před rokem jsem se dozvěděl, že jako SDR přijímač lze znásilnit i některé DVB-T tunery založené na čipu Realtek RTL2832U, který byl vyhackován a vznikl tak projekt RTL-SDR, více zde. Jelikož lze dnes sehnat tyto USB DVB-T tunery za pár korun, koupil jsem si taky jeden na hraní, konkrétně typ Terratec TStick z DealExtreme za 16,90 $ (poštovné zdarma). Uvnitř najdeme zmiňovaný obvod Realtek RTL2832U taktovaný dle 28,8MHz krystalu, který obsahuje dva 8-bitové A/D převodníky max. 3,2 MS/s vzorkující I, Q baseband signál z tuneru, DVB-T COFDM demodulátor, podporu MPEG-2, USB 2.0 rozhraní, dekodér pro IR dálkové ovládání a další (datasheet není k dispozici). Vstupní signál z anténního konektoru zpracovává obvod tuneru Elonics E4000 schopný ladit v pásmech 52 - 1088 MHz a 1252 - 2174 MHz. Pro příjem vysílání na krátkých vlnách je možné si ubastlit jednoduchý UpConverter. Dále zde ještě najdeme 3,3V LDO a sériovou EEPROM 24C02B pro uložení USB VID a PID, příp. další konfigurace Realteku.
Zde je blokové schéma tuneru: vstupní VF signál je zesílen LNA s nastavitelným ziskem max. 30 dB (možno řídit i automaticky - AGC), projde programovatelným VF filtrem a ve směšovačích (max. zisk 12 dB) se smíchá se signálem z programovatelného PLL oscilátoru (resp. s 2 signály, kde druhý je fázově posunutý o 90°). Vzniklý komplexní signál (I - reálná část, Q - imaginární část) se dále zbaví SS složky a prožene programovatelnou dolní propustí na výstupní zesilovače (max. zisk 57 dB) se symetrickými výstupy max. 1 Vpp (z nich se též odvozuje signál pro řízení AGC). Obvod se konfiguruje pomocí sady programovatelných registrů po I2C sběrnici. Pro příjem slabších či vzdálených vysílačů je vhodné předřadit na vstup pásmový VF filtr, který potlačí mnohem silnější signály blízkých vysílačů či zdrojů rušení.
Popis instalace software najdete na této české stránce věnované SDR, ze které jsem vycházel. Software se skládá ze 3 částí:Začal jsem tedy instalací ovladače. Zde jsem se dostal do problémů, když jsem zkoušel instalovat poslední verzi 1.5.1 balíčku ExtIO_USRP+FCD+RTL2832U+BorIP, která na mě vyplivla chybu "vstupní bod procedury _except_handler4_common se nepodařilo najít v knihovně msvcrt.dll" a ani po ruční instalaci exportovaných ovladačů se mi to nepodařilo rozchodit - tuner měl ve správci zařízení stále vykřičníky. Zkusil jsem tedy nainstalovat starší verzi 1.2 beta a ta fungovala. V programu Zadig jsem postupně vybral a nainstaloval obě detekovaná Bulk-In zařízení s USB VID: 0CCD, PID: 00D7 a v instalátoru odsouhlasil nakopírování libusb0.dll knihovny. Zjistil jsem, že pokud nainstaluju znovu verzi 1.5.1 a v programu Zadig přeinstaluju ovladače, tak to projde bez chyby. Doporučuji tedy instalovat v tomto pořadí, napřed 1.2 beta a pak poslední verzi. Balíček už v sobě obsahuje i plug-in knihovnu ExtIO_USRP.dll, ale existuje ještě alternativní verze ExtIO_RTL.dll, která mi přijde lepší. Knihovnu jsem rozbalil do stejného adresáře.
- alternativní ovladač pro RTL2832U (není tedy třeba instalovat ovladač od výrobce)
- ExtIO plugin, který virtualizuje různé typy SDR přijímačů a poskytuje programům jednotné API
- ovládací a dekódovací programy
UPDATE: při pokusu rozběhnout HDSDR 2.80 pod Windows 10 x64 jsem narazil na problém, že výše zmíněné staré knihovny nefungovaly, resp. způsobily pád HDSDR při loadnutí DLLka. Našel jsem však novější funkční knihovnu ExtIO_RTL2832.dll (funguje i pod Windows XP), v programu Zadig jsem pro zařízení vybral instalaci driveru libusb-win32.
Pak už jen zbývá vybrat si vhodný ovládací a dekódovací program. Zde je přehled programů pro Windows a Linux. Vyzkoušel jsem několik windowsích programů a jako nejlepší se mi zdá HDSDR, který má hodně funkcí a je často aktualizovaný. HDSDR jsem nainstaloval do stejného adresáře jako balíček a plug-iny. Po spuštění se program zeptá, kterou knihovnu plug-inu má načíst, vybral jsem ExtIO_RTL.dll. V případě použití ExtIO_USRP.dll je nutné ještě v okně USRP do políčka Device hint: zadat parametr "RTL tuner=e4k". HDSDR se mě na knihovnu ptá při každém spuštění i když nechám v adresáři jen jednu, nikde jsem nenašel nastavení preferovaného plug-inu. Po spuštění je třeba jít do nastavení [F7] | Select Input a vybrat "Realtek". Otevře se okno RTL Settings, kde lze nastavit rychlost vzorkování, velikost bufferu a zisk LNA nebo zapnutí AGC. Také je zde možno kompenzovat chybu oscilátoru. Nejlépe tak, že si najdete nějaký úzkopásmový vysílač se známou frekvencí a v zobrazení spektra naklikáte korekci tak, aby peak odpovídal dané frekvenci.
Dále je třeba v nastavení zvukové karty [F5] vybrat vstupní a výstupní zařízení s největší podporovanou vzorkovací frekvencí (u mě na SB Audigy 2 je to RX Input: "kX Wave SB0240 10k2 [d000] HQ"). Pokud chcete poslouchat běžné FM rádio, bude potřeba ještě v nastavení šířky pásma [F6] vybrat výstupní vzorkovací frekvenci alespoň 96 kHz. Nakonec se spustí zpracovaní signálu tlačítkem Start [F2] a měl by se ozvat nějaký šum a rozběhnout zobrazení spektrogramu. A můžeme se vydat brázdit frekvenčním spektrem. Ladění frekvence tuneru se dělá kolečkem myši nad jednotlivými ciframi číselníku LO. Tím se nám zobrazí výsek spektra okolo této frekvence jehož šířka pásma je daná nastavenou vzorkovací frekvencí A/D převodníku Realteku. Na spektrogramu vidíme peaky jednotlivých vysílačů na které lze najet myší a se stisknutým levým tlačítkem posouvat kurzor nebo frekvenci nastavit přesně kolečkem na druhém číselníku Tune. Softwarový filtr pak z navzorkovaného výseku vyfiltruje jen vybraný kanál, jehož šířku pásma si určíme šoupátkem FM-BW. Režim demodulátoru se vybírá několika tlačítky nad číselníkem frekvence, program v současnosti podporuje: AM, ECSS, FM, SSB, CW a DRM. Vybrané frekvence si můžete uložit do seznamu pod tlačítkem FreqMgr. Přijímaný signál je též možno nahrávat a to jak z A/D převodníku, tak softwarově dekódovaný. Nahrávání si lze i časově naplánovat v kalendáři. Do jeho nastavení se dostanete kliknutím pravým myšítkem na tlačítko záznamu.
Zde je pro zajímavost krátká ukázka záznamu vysílání neaktivního ATIS Vodochody [51 kB MP3] (Automatic Terminal Information Service) na frekvenci 123,025 MHz AM.
12.12.2013 jsem zkusil zprovoznit tuner pod Linuxem. V novém debianím kernelu 3.12.6 je už driver k dispozici (moduly rtl2832.ko, dvb-usb-rtl28xxu.ko, v menuconfigu musí být vybraná položka "Realtek RTL28xxU DVB USB support"). S tímto jádrem jsem po drobné úpravě rozběhnul i svůj starší tuner Asus U3100 Mini plus. Na notebooku jsem použil kernel 3.13.0-rc1 z linuxtv.org.
Po připojení tuneru by se měl objevit podobný výpis:
usb 1-2: new high-speed USB device number 13 using ehci-pci usb 1-2: dvb_usb_v2: found a 'TerraTec Cinergy T Stick+' in warm state usb 1-2: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer DVB: registering new adapter (TerraTec Cinergy T Stick+) usb 1-2: DVB: registering adapter 0 frontend 0 (Realtek RTL2832 (DVB-T))... i2c i2c-4: e4000: Elonics E4000 successfully identified Registered IR keymap rc-empty input: TerraTec Cinergy T Stick+ as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/rc/rc1/input27 rc1: TerraTec Cinergy T Stick+ as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/rc/rc1 input: MCE IR Keyboard/Mouse (dvb_usb_rtl28xxu) as /devices/virtual/input/input28 rc rc1: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0 usb 1-2: dvb_usb_v2: schedule remote query interval to 400 msecs usb 1-2: dvb_usb_v2: 'TerraTec Cinergy T Stick+' successfully initialized and connected
Nyní je možné naladit a přehrávat DVB-T stanice, jak už jsem popisoval dříve zde. Pro první test SDR jsem nainstaloval základní toolkit rtl-sdr - v mém případě debianí balíčky rtl-sdr 0.5.0.4.4914-2 a librtlsdr0 0.5.0.4.4914-2, které jsou pouze v repozitáři testing a unstable. Při instalaci hlásil DPKG problém se starší verzí libc6 2.13 v mojí distribuci Wheezy (stable), protože program rtl_tcp (TCP server pro streamování samplovaných I/Q dat) vyžaduje verzi libc6 2.15 a vyšší, ale ten zrovna nepotřebuju, takže jsem hlášení ignoroval. Později jsem si bez problémů přeložil rtl-sdr ze zdrojáků na GitHubu. Balíček dále obsahuje programy:
Tyto programy si obsluhují tuner přímým přístupem a vyžadují, aby nebyl aktivní kernel modul dvb_usb_rtl28xxu, tak jsem ho dynamicky unloadnul. Zde je ukázka krátkého testu, který skončil úspěšným příjmem blízkého FM vysílače:
- rtl_adsb - ADS-B dekodér (monitoring leteckého provozu)
- rtl_eeprom - umožňuje číst a měnit konfigurační EEPROM v tuneru
- rtl_fm - jednoduchý AM/FM/SSB demodulátor
- rtl_sdr - rekordér samplovaných I/Q dat
- rtl_power - rekordér FFT dat
- rtl_test - otestuje frekvenční rozsah ladění obvodu tuneru Elonics E4000
root@MR:~# rtl_test -t Found 1 device(s): 0: Terratec T Stick PLUS Using device 0: Terratec T Stick PLUS Kernel driver is active, or device is claimed by second instance of librtlsdr. In the first case, please either detach or blacklist the kernel module (dvb_usb_rtl28xxu), or enable automatic detaching at compile time. usb_claim_interface error -6 Failed to open rtlsdr device #0. root@MR:~# lsmod |grep rtl rtl2832 6331 1 dvb_usb_rtl28xxu 10096 0 rtl2830 5321 1 dvb_usb_rtl28xxu dvb_usb_v2 9782 1 dvb_usb_rtl28xxu dvb_core 58991 3 rtl2830,rtl2832,dvb_usb_v2 root@MR:~# rmmod dvb_usb_rtl28xxu usbcore: deregistering interface driver dvb_usb_rtl28xxu usb 1-2: dvb_usb_v2: 'TerraTec Cinergy T Stick+' successfully deinitialized and disconnected root@MR:~# rtl_eeprom Found 1 device(s): 0: Terratec T Stick PLUS Using device 0: Terratec T Stick PLUS Found Elonics E4000 tuner Current configuration: __________________________________________ Vendor ID: 0x0ccd Product ID: 0x00d7 Manufacturer: Realtek Product: RTL2838UHIDIR Serial number: 00000001 Serial number enabled: yes IR endpoint enabled: yes Remote wakeup enabled: no __________________________________________ root@MR:~# rtl_test -t Found 1 device(s): 0: Terratec T Stick PLUS Using device 0: Terratec T Stick PLUS Found Elonics E4000 tuner Supported gain values (14): -1.0 1.5 4.0 6.5 9.0 11.5 14.0 16.5 19.0 21.5 24.0 29.0 34.0 42.0 Benchmarking E4000 PLL... [E4K] PLL not locked for 51000000 Hz! [E4K] PLL not locked for 2216000000 Hz! [E4K] PLL not locked for 1109000000 Hz! [E4K] PLL not locked for 1244000000 Hz! E4K range: 52 to 2215 MHz E4K L-band gap: 1109 to 1244 MHz root@MR:~# rtl_fm -f 97200000 -s 192k | aplay -r 192k -f S16_LE -t raw -c 1 Found 1 device(s): 0: Realtek, RTL2838UHIDIR, SN: 00000001 Using device 0: Terratec T Stick PLUS Found Elonics E4000 tuner Oversampling input by: 6x. Oversampling output by: 1x. Buffer size: 7.11ms Tuned to 97488000 Hz. Sampling at 1152000 Hz. Output at 192000 Hz. Tuner gain set to automatic. Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 192000 Hz, Mono
Dále jsem hledal nějaký pokročilejší program podobný windowsímu HDSDR, ale nenašel jsem nic, co by šlo snadno nainstalovat. Základem většiny linuxových programů je GNU Radio, jehož balíček gnuradio 3.5.3.2-1 má spoustu závislostí (včetně molocha QT) a vyžadovalo to po mě stáhnout dalších skoro 400 MB, což se mi zrovna moc nechtělo si zasírat systém. Jeho instalaci popisuje tutoriál zde. Hledal jsem i další alternativy, ale toto :( mě odradilo...
25.12.2013 Nakonec jsem se rozhodl aktualizovat svoji distribuci Debian Wheezy na Jessie (testing), protože problémů kvůli starší verzi libc6 přibývalo (kde je novější verze libc6 2.17). Nejprve jsem upravil seznam repozitářů v /etc/apt/sources.list a pak spustil apt-get update a apt-get dist-upgrade, dopadlo to dobře. Nyní jsem mohl vyzkoušet program GQRX 2.1.251, který je k dispozici i jako binárka s potřebnými knihovnami. Bohužel novější verze je už kompilovaná jen pro 64-bitový systém. Při prvním spuštění na mě program vybafl chybovou hlášku: "../pulseaudio/pa_sink.cc: pa_simple_new() failed: Connection refused" a zůstal viset. Jak jsem záhy zjistil, neměl jsem v systému nainstalovaný zvukový server PulseAudio. To jsem napravil instalací balíčků pulseaudio 4.0-6 a pavucontrol 1.0-1, akorát že mi přestal fungovat zvuk v celém systému. Prošel jsem troubleshooting a upravil nastavení v mixéru pavucontrol - zabralo nastavit "Vnitřní zvukový systém" na vypnuto:
Po té už se GQRX bez problémů spustil. Při prvním spuštění je třeba vybrat tuner, zvukovku, nastavit vzorkovací frekvence a můžeme vesele ladit. Sem tam se blbě vykreslují některá tlačítka. K dispozici jsou demodulátory AM, FM a SSB. Program zvládá i nastavení zisku a AGC vstupního LNA. Oproti windowsímu HDSDR je to takový chudý příbuzný, ale lepší než drátem do oka...
RTL-SDR lze také provozovat na minipočítači Raspberry Pi a na připojeném TFT displeji zobrazovat spektrum. Pokud chcete skenovat širší rozsah spektra, než co zvládne převodník naráz, můžete vyzkoušet pythoní program RTLSDR Scanner pro Windows/Linux/MAC OS.
19.10.2016 jsem zkusil zprovoznit tuner na smartphonu Samsung Galaxy S3 s OS Android 6.0.1 připojený pomocí USB OTG kablíku. Nainstaloval jsem program SDR Touch a RTL2832U driver a vše hned fungovalo bez dalšího nastavování. SDR Touch využívá OpenSource rtl_tcp server, s nímž komunikuje přes TCP/IP. Podporuje demodulaci FM, AM, SSB, CW a dekódování RDS. Základní free verze má řadu omezení, např. zobrazování spektra funguje pouze 1 minutu, pak se musí tuner vypnout a zapnout nebo ladit naslepo. Dá se však stáhnout medicínka v podobě modifikovaného balíčku SDR Touch Key 1.03 :) Funkčnost jsem ověřil i na novějším Anroidu 9.0 Pie (LineageOS 16.0) na smartphonu Sony Xperia Z1 Compact D5503.
program SDR Touch 2.65 v akci
28.8.2017 Kamarád mě v Holicích namotivoval, že bych si mohl snadno trochu vylepšit svůj USB RTL-SDR tuner výměnou běžného krystalu za TCXO (Temperature Compensated Crystal Oscillator), které tam jeden pán prodával za 50 Kč. Je též možné si ho objednat na Digi-Key, ale z toho poštovného z USA se vám protočí panenky. TCXO má asi o řád lepší frekvenční stabilitu, což by mělo zlepšit příjem úzkopásmových vysílačů. Některé novější RTL-SDR tunery prý mají pod THT krystalem už připravený footprint na SMD pouzdro, ale to nebyl můj případ. Koupený SMD TCXO velikosti 3,2 x 2,5 mm nese označení WTL3C22961ML 28,800 MHz, avšak na webu čínského výrobce WTL International Limited jsem k němu žádnou dokumentaci nenašel, pouze k podobnému typu WTL3TN2600001. V jeho datasheetu je zmínka o existenci varianty TCXO a VC-TCXO (lze doladit napětím o pár ppm). Podle zapojení pinů by měl mít TCXO dva GND piny, což nemá, takže buď jde o VC-TCXO nebo koupený TCXO má jeden pin nezapojený.
Než jsem odpájel původní krystal, osahal jsem si osciloskopem jeho piny a zjistil, který z nich je připojený na vstup čipu (nižší amplituda signálu, na fotce je to ten vlevo). Po odpájení jsem na jeho místo kápnul trochu tavňáku a přilepil tam TCXO ploškama nahoru. Přímo mezi VCC a GND plošky jsem připájel keramický blokovací SMD kondenzátor 10 nF 0603 a propojil TCXO s deskou tenkými drátky. Neznámý pin jsem spojil s GND. Na osciloskopu jsem změřil průběhy výstupního napětí TCXO bez zátěže a dále po připojení DC vazbou a AC vazbou přes kondík 10 nF. Nakonec jsem nechal přímé připojení DC vazbou. Je vidět, že obvody RTL-SDR výstup TCXO docela zatěžují, amplituda poklesla z 1,3 Vpp na 0,8 Vpp, ale pro funkci to stačí. Původní krystal dával na vstupu asi 1,2 Vpp. Další odvážnější úpravy RTL-SDR tuneru naleznete zde a zde. Novější verzi RTL-SDR s obvodem tuneru R820T lze též předělat na laditelný VF generátor.
Vout unloaded Vout DC-coupling Vout AC-coupling
17.2.2020 Můj známý Franta Ryšánek napsal jednoduchý prográmek RTL-SDR Skyline, který slouží jako přehledový spektrák s automatickým přelaďováním pásem tuneru. Umožňuje nastavit skenovaný rozsah frekvencí, velikost FFT okna a počet průměrovaných oken. Program využívá knihovnu librtlsdr a běží na Windows XP - 10.
18.9.2020 Další zajímavou OpenSource aplikací je rtl_433, která umožňuje přijímat a dekódovat digitální signál různých dálkových ovladačů a meteostanic vysílajících převážně v pásmu 433 a 868 MHz s modulací FSK/ASK/OOK. Program je k dispozici pro Linux i Windows 7 - 10. Jedna starší verze, která ještě funguje pod Windows XP je zde.