Introducción
La modulación por desplazamiento de frecuencia (FSK, Frequency Shift Keying) es una técnica de modulación digital en la que la información binaria se transmite variando la frecuencia de una portadora entre dos o más valores discretos. En su forma más simple, 2-FSK, un bit 0 se representa con una frecuencia determinada (f0) y un bit 1 con otra (f1). Esta técnica es ampliamente utilizada en comunicaciones inalámbricas de baja velocidad, como controles remotos, sistemas de telemetría, RFID y dispositivos IoT.
Para analizar e interpretar este tipo de señales, una herramienta muy útil es Universal Radio Hacker (URH). URH permite capturar, visualizar y decodificar transmisiones de radio digital de forma interactiva. A través de su interfaz gráfica, es posible observar cómo se alternan las frecuencias que representan los bits y, con un proceso manual de análisis, deducir la estructura de los mensajes transmitidos. La decodificación manual en URH implica:
- Captura de la señal mediante un dispositivo SDR compatible.
- Visualización en el dominio temporal y frecuencial, donde pueden identificarse los saltos entre las dos frecuencias de la modulación FSK.
- Segmentación y conversión de símbolos, transformando los cambios de frecuencia en una secuencia de bits.
- Análisis de patrones, que permite descubrir tramas, preámbulos, sumas de verificación y posibles protocolos empleados.
Este procedimiento brinda no solo la posibilidad de “leer” lo que transmite un dispositivo, sino también de comprender la estructura interna de su comunicación, lo que resulta valioso en tareas de ingeniería inversa, ciberseguridad y experimentación en radiofrecuencia. Como transmisor, vamos a utilizar un dispositivo Flipper Zero, con una señal pre-generada.
Análisis del espectro y captura de la señal
En primer lugar, vamos a buscar en las diferentes frecuencias del espectro radioeléctrico por la señal emitida. Utilizaremos la función Spectrum Analyzer accesible desde el menú File de URH. Realizaremos la configuración con el dispositivo RTL-SDR en la frecuencia 433,920 MHz, con un ancho de banda de 1 MHz. Ajustaremos la ganancia según la potencia de la señal recibida y al ser FSK la señal, desactivaremos la opción Apply DC correction. Capturaremos la señal con el botón Start.
Observamos claramente una señal 2-FSK, con dos frecuencias claramente diferenciadas (433,876 MHz y 433,971 MHz) junto a la portadora (433,920 MHz). Con estos datos calculamos la desviación de f0 y f1 de la señal portadora de alrededor de 48 KHz, coincidiendo con una de las modulaciones incluidas en el Flipper Zero, 2FSK_476. Podemos pasar a grabar la señal y analizarla con la opción Record Signal.
Guardamos la señal mediante Save y al cerrar la ventana se cargará la señal en el programa.
Análisis de la señal
En primer lugar, utilizaremos el selector Y-Scale para cambiar la escala del eje Y de la señal, para observar las señales más visualmente. A continuación realizaremos un filtrado de la señal en el caso de que la señal recibida sea de una baja potencia mediante el botón Filter (moving average).
Ahora tenemos que filtrar el ruido de la señal. Cada uno de los segmentos que aparece en la señal es una de las señales recibidas, es resto de la señal es ruido. seleccionaremos el ruido cambiando el valor de la opción Noise. El área del ruido será marcada en rojo. En este caso la señal se encuentra bastante limpia gracias al filtrado. Obtenemos un valor de Noise de 0,0060.
Observamos que las diferentes señales son similares por lo que vamos a centrarnos en una, la seleccionamos, pulsamos clic derecho en la señal y la recortamos con la opción Crop to selection.
Esta es la señal resultante:
A continuación ya podemos demodular la señal, mediante la selección de la opción Demodulated en Signal view. Se mostrará la señal demodulada por lo que tendremos que utilizar la opción Y-Scale para adaptar la señal a la pantalla. Se han creado dos areas en la pantalla, la morada y la verde. Si la señal se encuentra en la zona morada se determinará el estado binario 0. Si la señal se encuentra en la zona verde se determinará el estado binario 1.
Luego haremos zoom sobre la señal para observarla bit a bit. Observamos una señal en formato de “sierra” aunque se observa claramente que estado es “0” o que estado es “1”. Esto sería una decodificación visual:
Este formato de la señal es debido a la potencia débil recibida. Es posible volver a capturar la señal aumentando la ganancia, a realizar más adelante, ya que con ésta señal se puede realizar la decodificación correctamente. Debemos de hallar la duración que tiene el bit para actualizar el valor de Samples/Symbol. Para ello, seleccionaremos, por ejemplo, el valor 1 en la señal demodulada y observaremos el texto inferior.
El bit tiene una duración de 151 us, o 151 muestras, ya que la señal capturada tiene un ancho de banda de 1 MHz. Por lo que actualizamos el valor. El siguiente valor de tolerancia a errores Error tolerance dependerá de la calidad de la señal capturada. Si la calidad de la señal es buena sin formato de “sierra” podemos utilizar el valor 0. En este caso con el valor 0 observamos que la señal no se está decodificando, por lo que cambiamos al valor 1 ya que se observa de forma visual que la señal se decodifica correctamente observando el código binario inferior.
Como modulación Modulation establecemos el valor FSK y en este caso la opción de Bits/Symbol que indica cuantos bits toma cada símbolo y cambia según la modulación se establece en 1, en el caso de la modulación 2-FSK. Ya podemos observar la señal decodificada.
Al inicio de la señal observamos varios valores a 0. A continuación observamos un patrón 10101010. Esto se suele corresponder a un preámbulo, una serie de bits utilizados para sincronizar el receptor con la señal emitida por el transmisor (tal como la hemos utilizado anteriormente para calcular la duración de la señal de bit). Podemos seleccionar estos bits y eliminarlos ya que no contienen ningún dato.
Podemos convertir la señal decodificada a una cadena ASCII seleccionando ASCII en Show data as.
Obtenemos el mensaje MENSAJE_DE_PRUEBA_ENVIADO_CON_EL_FLIPPER_ZERO. Volviendo a capturar la señal con una ganancia más alta observamos una señal más limpia.
La señal emitida por el Flipper Zero ha sido generada con la herramienta SubGhz Generator con el siguiente comando:
$ python flipper_subghz.py raw --freq 433920000 --preset 2FSK_476 --text MENSAJE_DE_PRUEBA_ENVIADO_CON_EL_FLIPPER_ZERO --te 150 --preamble 10101010 out.sub
Wrote RAW .sub to out.sub
Conclusión
La decodificación manual de señales FSK con Universal Radio Hacker permite comprender en detalle cómo un dispositivo transmite información digital a través de radiofrecuencia. A partir de un ejemplo es posible observar cómo los bits se representan mediante dos frecuencias distintas, transformarlos en una secuencia binaria y descubrir la estructura de las tramas transmitidas.