Procesado de una señal de radiofrecuencia para extraer el mensaje codificado en ella. Decodificación de la señal de un transmisor NICE FLORETM utilizando Octave.
Tipos de transmisores
Una parte muy cercana a la vida cotidiana del espectro electromagnético se encuentra en torno a los 433MHz. En Europa multitud de aplicaciones se apoyan en esta frecuencia: mandos de garaje, llaves de coche, estaciones meteorológicas, sensores inalámbricos…


El funcionamiento de estos dispositivos es muy sencillo y suele ser el siguiente:
- Se produce un evento, ya sea la pulsación de un botón o el avance de un tiempo determinado.
- Un microcontrolador codifica el evento en un mensaje puramente digital, que será una sucesión de un número determinado de bits.
- Mediante un generador de señal y una antena se emite el mensaje. Dependiendo del generador encontramos típicamente dos modulaciones en este tipo de dispositivos: ASK y FSK.
- Cualquier receptor sintonizado a esta frecuencia recibirá la transmisión, pero dicho receptor solo atenderá aquellas que le interesen. Para evitar suplantaciones de identidad o escuchas no deseadas, el transmisor podrá encriptar total o parcialmente la transmisión.
Transmisor NICE FLORE

Este mando de garaje es un transmisor muy simple desde el punto de vista hardware. Consta de:
- MCU: Microcontrolador de Microchip PIC16F526.
- Generador RF: Circuito analógico que genera una señal de 433MHz, se activa mediante una señal digital.
- Antena de bucle: Perímetro entre ~70mm y ~80mm.
Generador RF

El generador de radiofrecuencia es un circuito que oscila a ~433MHz, pudiéndose activar y desactivar mediante una salida digital del MCU.
No es posible averiguar el valor de varios componentes SMD (tampoco aportaría nada). Por otro lado, será importante conocer la topología para saber donde y como capturar señales, de este circuito es posible esperar una modulación ASK, ya que simplemente se trata de activar o no el circuito, sin posibilidad de variar la frecuencia o sincronizar fase.
Finalmente, siempre es interesante conocer circuitos ya comercializados y (en principio) testados.
Antena de bucle NICE FLORE
El transmisor declara el uso de 433,92MHz en su carcasa. En su interior se encuentra una antena de bucle, cuyo perímetro corresponde a 1/8λ y un factor de velocidad entre 0,82 y 0,92.

Capturar datos
Para capturar datos es posible utilizar alguno de los siguientes métodos:
- Receptor de 433MHz ASK, existen multitud listos para conectar a un un pin digital de una tarjeta de desarrollo.
- Receptor SDR genérico, uno de los más populares es el RTL-SDR, y es también una de las formas más baratas de iniciarse en el mundo de la radiofrecuencia.
- Capturar con el osciloscopio la señal emitida en el lado digital, antes del circuito RF.
Esta vez se utilizarán datos obtenidos con el último método, dejando para el futuro cómo utilizar datos generados por el RTL-SDR.
Al accionar el pulsador del NICE FLORE en el circuito generador de radiofrecuencia se observan varios grupos de señales. Cada grupo corresponde a un mensaje que será el que debe decodificarse. De las características del transmisor se espera un mensaje de 52 bits.

Para este ejemplo se ha utilizado el osciloscopio Smartscope de LabNation, el cual permite guardar los datos capturados a un fichero ‘.csv‘ sobre el que se trabajará posteriormente.
En paralelo también se ha capturado esta transmisión con un RTL-SDR Blog V4, y así comparar la decodificación mediante otro método.

El mensaje decodificado mediante el software «Universal Radio Hacker» es:
0x02BBD5E41D124
Script decodificador
Del CSV a memoria
Primero es necesario leer el archivo ‘.csv‘, existen varios métodos para leer un archivo de este tipo en Octave, se utiliza la instrucción «csv2cell(_path, _separator)» por su flexibilidad para extraer determinadas filas y columnas en muy pocos comandos.
data_path = 'DataTest/NICE_Cloned.csv'; csv_data = csv2cell(data_path, ';'); %Get Channel A LabNation Smartscope data sampled_data = csv_data(2:end,6); sample_time = csv_data(2,4); %Clear memory clear csv_data; %Replace coma ',' by dot '.' sampled_data = strrep(sampled_data, ',', '.'); sample_time = strrep(sample_time, ',', '.'); %Convert string to double sampled_data = str2double(sampled_data); sample_time = str2double(sample_time)
Analizando la transmisión
El primer procesado será una normalización de la señal respecto a la tensión, una vez hecho esto se plotea para poder inspeccionarla.
%Normalize data sampled_data = sampled_data / max(sampled_data); %Plot signal t = (0:length(sampled_data) - 1) * sample_time; plot(t, sampled_data) xlabel("Time (s)"); ylabel("Signal (normalized)"); title("NICE FLOR transmit signal");
Del primer mensaje transmitido se extrae la siguiente información.

- Los mensajes comienzan con un pulso de ~1460µS seguido de una pausa de igual duración.
- Un bit igual a ‘0’ será un pulso de ~470µS seguido de una pausa de ~990µS.
- Un bit igual a ‘1’ será un pulso de ~990µS seguido de una pausa de ~470µS.
- El mensaje finaliza con un pulso de ~1460µS.
Decodificando la transmisión
Teniendo toda la información necesaria, se analizan todas las muestras capturadas con una máquina de estados hecha script de Octave como el siguiente.
prev_bit_state = 0; t0 = 0; preamble = 0; msg_started = 0; message = int64(0); message_length = 0; pulse_high = 0; pulse_low = 0; for i = 1:length(sampled_data) %Transition to high if(sampled_data(i) > 0.5 && prev_bit_state == 0) prev_bit_state = 1; pulse_low = (t(i) - t0); t0 = t(i); endif %Transition to low if(sampled_data(i) < 0.5 && prev_bit_state == 1) prev_bit_state = 0; pulse_high = (t(i) - t0); t0 = t(i); endif %Pulse high more than 20ms is preamble if(preamble == 0 && pulse_high > 0.02) preamble = pulse_high pulse_high = 0; pulse_low = 0; endif %End of message if(msg_started == 1 && pulse_high > 0.0012) pulse_high = 0; msg_started = 0; printf("%X\n", message) endif %Message start if(pulse_high > 0.0012) msg_started = 1; message_length = 0; message = 0; pulse_high = 0; pulse_low = 0; endif %Process message if(msg_started == 1) %Bit = 0 if(pulse_high < 0.0006 && pulse_high > 0.0003 && pulse_low < 0.0011 && pulse_low > 0.0007) message_length = message_length + 1; pulse_high = 0; pulse_low = 0; endif %Bit = 1 if(pulse_high < 0.0011 && pulse_high > 0.0007 && pulse_low < 0.0006 && pulse_low > 0.0003) message_length = message_length + 1; message = bitset(message, message_length); pulse_high = 0; pulse_low = 0; endif endif endfor
Conclusiones
Al ejecutar el script se obtiene el mismo mensaje que el obtenido con el software «Universal Radio Hacker«.

Referencias
Silicon Labs – AN639 – Design of printed trace differential loop antenna.