Radio definida por software (SDR)

En este artículo recojo algunas experiencias y apuntes personales sobre radio definida por software. En el blog https://www.rtl-sdr.com se encuentra la mayor información sobre hardware, software y operativa con esta tecnología.

En el año 2011 salió a la venta el Funcube Dongle (FCD). Fue el primer aparato de estas características. Lo diseñó una pequeña empresa británica y tuvo un enorme éxito de ventas. Aproximadamente cada semana ponían a la venta las unidades que habían fabricado, al precio de unos 150€. Anunciaban con antelación la hora precisa a la que se abriría la venta en la tienda web y el lote, de algunas decenas de unidades, se agotaba en un minuto. Posteriormente bajó esa fiebre y no tardaron en verse en webs de segunda mano. Pronto surgieron los comentarios de los usuarios. El receptor adolecía de una muy mala selectividad, mucho peor que la de cualquier equipo habitual, ya fuese transceptor o escáner. La presencia de señales fuertes, como la radiodifusión en FM, puede bloquear el receptor. Un filtro paso banda o de banda eliminada mejora el comportamiento pero en cualquier caso las prestaciones resultaron un tanto decepcionantes. El rango de frecuencias es de 64 a 1.700 MHz (con un hueco entre 1.100 y 1.270 MHz) y la tasa de muestreo de 96 kHz, si bien el ancho de banda utilizable es de 80 kHz. La resolución de la conversión analógico a digital no la encuentro pero creo recordar que eran 12 bits. El consumo no aparece especificado pero he medido 90 mA. Más tarde salió a la venta el Funcube Dongle Pro+ con prestaciones mejoradas.

Consumo del Funcube Dongle

En 2012 unos aficionados descubrieron que unos sencillos receptores de televisión y radio para PC con interfaz USB y basados en el chip RTL2832U podían ser configurados para entregar al ordenador, en lugar de tramas de audio o vídeo, las muestras digitalizadas de RF. El precio era imbatible: unos 10€. Este receptor tiene un rango de 24 a 1.700 MHz, muestreo hasta 2,4 MS/s y sólo 8 bits de resolución. Sin embargo, a menudo el RTL ofrece mejor rendimiento que el FCD. Esa elevada velocidad de muestreo permite, por ejemplo, ver en la pantalla del PC la banda de 2 metros entera, de 144 a 146, con todas las señales que estén presentes. También permite demodular perfectamente señales de gran ancho de banda, como la FM ancha de radiodifusión (unos 200 kHz) o el sistema de posicionamiento aeronáutico ADS-B (sobre 1 MHz).

Banda de 2 metros. GQRX con dongle RTL.

El aparato original que se encuentra en la mayoría de tiendas online tiene algunos defectos y limitaciones. Para empezar la referencia de reloj es imprecisa. Debo introducir una corrección de 65 ppm (partes por millón) en el software para que la frecuencia sintonizada sea la real. Además sufre interferencias causadas por el interfaz usb o por su propia electrónica. Por último, el sintonizador se calienta y no funciona bien por encima de 1.500 MHz. En la web https://www.rtl-sdr.com venden un modelo mejorado que resuelve en gran medida esos tres problemas.

Es posible hacerlo funcionar con un teléfono o tableta Android que disponga de conexión usb OTG. Para ello hay que instalar el driver RTL2832U y la aplicación SDR Touch en su versión gratuita limitada o de pago o bien RF Analyzer; esta última es muy barata en google play y el autor la ofrece gratuitamente como fichero apk aquí. Lo he podido usar así con un smartphone aunque el resultado no ha sido muy satisfactorio, creo que a causa de mi móvil. La mayoría de veces que conecto un dispositivo USB mediante cable OTG no lo detecta bien. No sé si es debido a los drivers del móvil o a la calidad del cable. En alguna ocasión ha llegado a funcionar y he podido escuchar diferentes señales. El dongle RTL consume 0,53 A por lo que se debe conectar al móvil mediante un cable OTG que tenga otro terminal usb para un powerbank.

RTL con OTG

Para PC he utilizado los programas GQRX en linux y SDR# (sdrsharp) en windows, aunque existen muchos más (ver aquí). Para hacer funcionar el dongle rtl con el software SDR# hay que ejecutar el script “install-rtlsdr.bat” que viene con el programa. Si no, no funciona. Ambos programas tienen un interfaz de usuario y unas prestaciones similares. SDR# tiene una larga serie de plugins que amplían su funcionalidad. GQRX de por sí incluye algunas funcionalidades como decodificación de RDS y de AX.25 en afsk 1200 o control remoto de la frecuencia mediante interfaz hamlib para, por ejemplo, corregir el desplazamiento doppler de un satélite.

Puede ser interesante utilizar el audio demodulado por GQRX para decodificarlo con otro programa. Esto se puede hacer en windows con programas tipo cable vitual de audio. En linux es sencillo si utilizamos el sistema de sonido “pulse audio”. Hay que tener instalado el paquete “pavucontrol”. Editamos el fichero /etc/pulse/default.pa y añadimos estas líneas:

load-module module-null-sink sink_name=radio
load-module module-loopback latency_msec=1

 

Dentro de GQRX elegimos enviar la salida de sonido al destino null-sink. Si lanzamos un programa como fldigi, que tome audio como entrada, elegiremos ese mismo null-sink como fuente. El loopback permite escucharlo por los altavoces del pc al mismo tiempo. Podemos ver esto si lanzamos el mezclador de pulse audio “pavucontrol”:

GQRX a null sink

 

FLDIGI desde null sink

 

GQRX está incluido en distribuciones como Debian por lo que no hay que descargarlo aparte. Los repositorios contienen también paquetes para otros programas interesantes. Por ejemplo, el paquete “rtl_test” incluye los siguientes programas, que funcionan en línea de comandos:

* rtl_adsb: a simple ADS-B decoder for RTL2832 based DVB-T receivers
* rtl_eeprom: an EEPROM programming tool for RTL2832 based DVB-T receivers
* rtl_fm: a narrow band FM demodulator for RTL2832 based DVB-T receivers
* rtl_sdr: an I/Q recorder for RTL2832 based DVB-T receivers
* rtl_tcp: an I/Q spectrum server for RTL2832 based DVB-T receivers
* rtl_test: a benchmark tool for RTL2832 based DVB-T receivers

 

El último es una herramienta imprescindible. “rtl_test -p” devuelve el error de frecuencia, en mi caso 65 ppm. Ese valor se introduce en otros programas para corregir la desviación del oscilador y sintonizar exactamente la frecuencia que queramos. El primero, “rtl_adsb”, es un decodificador del sistema ADS-B, si bien devuelve los datos en formato hexadecimal que por sí solo no es útil:

rtl_adsb -p 65
 Found 1 device(s):
 0: Generic, RTL2832U, SN: 77771111153705700

Using device 0: Generic RTL2832U
 Found Rafael Micro R820T tuner
 Tuner gain set to automatic.
 Tuner error set to 65 ppm.
 Tuned to 1090000000 Hz.
 Exact sample rate is: 2000000.052982 Hz
 Sampling at 2000000 S/s.
 *f229dee35c366ee22c34cc52ddf5;

 

Podemos descargar el “dump1090”, así llamado porque los aviones transmiten su señal en 1.090 MHz, que devuelve una información mucho más comprensible:

git clone https://github.com/antirez/dump1090.git
cd dump1090
make

Se ejecuta:

./dump1090 --gain 36 --freq 1089929150 --net --interactive

No admite corrección de frecuencia como error en partes por millón así que introducimos la frecuencia nominal corregida de este modo:
1090000000*(1-65/1000000)=1089929150
En el navegador podemos ver la posición de los aviones sobreimpresa en google maps. Abrimos la url:
http://localhost:8080

Programa dump1090: información en texto y gráfica

A pesar de emplear una antena colineal para 145 y 435 MHz con una bajada de coaxial que introduce gran atenuación a 1 GHz, el programa puede recibir algunos paquetes de aeronaves próximas. Cualquier mejora en la antena, como construirla para la frecuencia de interés o añadir un filtro o un preamplificador, mejorarían notablemente la recepción. Hay numerosos artículos en el blog explicándolo.

Otro programa interesante es acarsdec, para decodificar señales acars. Para instalarlo:

git clone https://github.com/TLeconte/acarsdec.git
cd acarsdec
make

Y ejecutarlo:

 ./acarsdec -g 300 -p 66 -r 0 131.525 131.725 131.825 > captura.txt

Se reciben paquetes de datos en esas tres frecuencias: 131.525 (20% de los paquetes), 131.725 (33%) y 131.825 (46%). 300 es el valor de la ganancia en décimas de dB; en mi caso funcionaba mejor con 30 dB. 66 es el error de frecuencia.

Un sistema similar al acars es el VHF Data link (VDL2). Se puede decodificar con el “dumpvdl2“. Para instalarlo:

git clone https://github.com/szpajder/dumpvdl2.git
cd dumpvdl2
make

Y se ejecuta:

./dumpvdl2 --rtlsdr 0 --gain 30 --correction 68 136875000 136955000 136975000 --output-file vdl2.log&

Frecuencias activas: 136.775 (0,1 % de la actividad), 136.875 (4%) y 136.975 (96%).
Si ejecutamos:

tail -f vdl2.log |grep 136.

Devuelve líneas como:

[2017-08-29 21:28:29] [136.975] [-25.4/-49.4 dBFS] [24.0 dB]

El último parámetro es la relación señal a ruido, en este caso 24 dB. Se pueden probar diferentes valores de ganancia hasta encontrar el que da mejores resultados. En mi caso, alrededor de 30 dB de ganancia. El ajuste no es muy crítico. El ajuste de la frecuencia sí lo es. Errores de 5 ppm ya degradan la recepción, y la tasa de paquetes se reduce drásticamente. Errores de 10 ppm casi imposibilitan recibir nada. Hay que ejecutar antes “rtl_test -p” para obtener el valor exacto de desviación de nuestro receptor.

Además de dispositivos como ordenadores o tabletas, el receptor rtl se puede utilizar en routers con el sistema operativo Openwrt. Yo lo he instalado en un router Huawei HG556a; éste es un modelo que ha sido instalado en muchos hogares para servicio de ADSL.

RTL en router

Obviando todos los pasos para la instalación del sistema operativo en el router, pasamos a la funcionalidad de SDR.

opkg update
opkg install librtlsdr rtl-sdr

Inicialmente vemos que el sistema lo reconoce:

lsusb
Bus 001 Device 010: ID 0bda:2832 Realtek Semiconductor Corp. RTL2832U DVB-T

Si ejecutamos el programa de test obtenemos el error de frecuencia:

root@OpenWrt:~# rtl_test -p
Found 1 device(s):
 0: Generic, RTL2832U, SN: 77771111153705700
Using device 0: Generic RTL2832U
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 
Sampling at 2048000 S/s.
Reporting PPM error measurement every 10 seconds...
Press ^C after a few minutes.
Reading samples in async mode...
lost at least 40 bytes
real sample rate: 2049398 current PPM: 683 cumulative PPM: 683

 

El decodificador de ADS-B está disponible como paquete. Lo instalamos:

opkg install dump1090

Y ejecutamos:

dump1090 --gain 36 --freq 1089929150 --net --interactive

Si ejecutamos “top” vemos que carga bastante la cpu pero puede con ello:

rw,nosuid,nodev,noexec,relatime,frMem: 36320K used, 24900K free, 1044K shrd, 2160K buff, 10232K cached
CPU: 46% usr 13% sys 0% nic 38% idle 0% io 0% irq 1% sirq
Load average: 0.50 0.29 0.17 2/40 2079
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
2075 1138 root R 10580 17% 56% dump1090 --gain 36 --freq 1089929150

Desde un pc abrimos en el navegador la dirección ip del router en el puerto 8080 (por ejemplo http://192.168.1.7:8080) y vemos las aeronaves sobre google maps igual que si dump1090 estuviese funcionando en el mismo pc.

El paquete luci-app-dump1090 permite configurar el servicio dump1090 desde el interfaz web con el que se puede gestionar casi todo en Openwrt. Esto evita lanzar el programa desde la línea de comandos.

En el router podemos lanzar el programa rtl_tcp para enviar las muestras digitalizadas a través de la red a otro dispositivo. En su forma más básica, lo lanzamos con:

rtl_tcp -a 192.168.1.5 -P 65

Así, en otro pc podemos utilizar los programas gqrx o SDR# que utilizan como receptor el del router. En SDR# elegimos como fuente la de tipo RTL-SDR (TCP). En la ventana de Settings debemos poner la dirección ip del router, el puerto (por defecto 1234), tasa de muestreo, AGC y error de frecuencia, estas últimas igual que con un dispositivo físico local. Con GQRX debemos elegir el tipo de fuente RTL-SDR Spectrum Server. En device string pondremos: rtl_tcp=192.168.1.7:1234 (o la ip que corresponda). Por último, incluso desde un móvil Android es posible acceder. El programa RFAnalyzer anteriormente citado permite hacer lo mismo. Desde el menú de la esquina superior derecha vamos a Settings, Source type: RTL-SDR, Source settings (abajo), RTL-SDR settings, activar “use external rtl_tcp server”, y seguidamente dirección IP, puerto y corrección de frecuencia.

RF Analyzer con rtl_tcp

El uso de rtl a través de tcp con estos programas es algo inestable. Es habitual que tanto el cliente como el servidor se cuelguen repentinamente, especialmente si la red tiene pérdidas de paquetes por insuficiente ancho de banda. Es aconsejable conectarse al router por medio de un cable ethernet o bien por una red wifi donde el propio router actúa como punto de acceso.

Hay más información sobre el uso en routers Openwrt en estas páginas:

Installing OpenWRT and RTL-SDR on a Used $20 Router

Configuring OpenWRT and RTL_TCP for WiFi Streaming

OpenWRT on EA3500 with RTL-SDR Stream