Decodificamos la señal del satélite meteorológico NOAA en 50 líneas de código

Hola, Habr.



Continuemos con el tema de la decodificación de diferentes tipos de señales de radio. Uno de los formatos interesantes desarrollados en el último siglo es APT (Automatic Picture Transmission). Se utiliza para transmitir imágenes de la Tierra desde el espacio, y lo que es mucho más interesante y relevante para nosotros, recibir señales APT es sencillo y accesible para los radioaficionados.





Satélite NOAA © en.wikipedia.org/wiki/NOAA-15



Para aquellos que estén interesados, la continuación debajo del corte.



Información general



Los satélites meteorológicos NOAA que nos interesan pertenecen a la serie TIROS (Television InfraRed Observation Satellite), el primero de los cuales fue lanzado en 1960, actualmente hay 3 satélites en operación (NOAA-15, NOAA-18 y NOAA-19, el más antiguo de los cuales, NOAA -15 obras desde 1998). Los satélites giran alrededor de la Tierra a una altitud de 850 km y hacen una revolución en aproximadamente 1,5 horas. Hay varios sensores a bordo, pero nos interesará recibir imágenes meteorológicas. Y hay dos opciones. La más simple y más disponible es una señal analógica del formato APT ya mencionado a una frecuencia de 137 MHz. Además, los satélites también transmiten imágenes en formato HRPT de alta resolución (Transmisión de imágenes de alta resolución) a 1,7 GHz. Hay decodificadores HRPT disponibles, pero una antena giratoria con buena ganancia ya es deseable para la recepción, que es más difícil y cara.



Según las convenciones internacionales, todos los datos meteorológicos están abiertos y cualquier persona puede recibir señales NOAA. Qué vamos a hacer ahora.



Ya ha habido varios artículos sobre la recepción de señales NOAA en Habré (por ejemplo, 1 , 2 ), pero por lo general todos se reducen a "enchufar el receptor, ejecutar el programa, obtener una imagen", sin mucha explicación de cómo se transmite esta imagen. Intentemos bajar un nivel y ver cómo funciona la señal en el interior.



Recepción



El primero y más obvio. El satélite no es geoestacionario, se mueve por el cielo, por lo que se debe “capturar” la hora de recepción. Lo más sencillo es utilizar el servicio online n2yo.com, que permite calcular el tiempo de vuelo de cualquier satélite. Aquí hay un ejemplo para NOAA 19 :







Buena recepción, cuando el satélite está muy por encima del horizonte, aproximadamente una vez al día, el satélite en sí sobre el cielo tarda unos 10 minutos, por lo que puede ser útil configurar una grabación programada en el momento adecuado.



Por supuesto, necesita un receptor para recibir la señal de radio. El RTL-SDR V3 más barato a $ 35 servirá, utilicé un SDRPlay de mejor calidad con la siguiente configuración:







Como puede ver, he establecido el valor de diezmado al máximo, lo que me permite obtener el rango dinámico máximo. Los niveles de ganancia LNA y Gain deben seleccionarse según la antena. Los satélites NOAA 15, 18 y 19 transmiten señales en frecuencias de 137,620, 137,9125 y 137,100 MHz, respectivamente. La señal en sí tiene un ancho de banda de unos 50 kHz, y si todo se hizo correctamente, en un momento dado la señal debería aparecer en el espectro:







Es interesante notar la pendiente de las líneas debido al efecto Doppler - el satélite pasa volando por delante de nosotros, y teniendo en cuenta el tiempo de vuelo, este es otro bien prueba de la esfericidad de la Tierra;)



Hablando de recepción, lo mejor de los satélites NOAA es que la recepción es muy asequible para los principiantes. La señal, en principio, se escuchará en cualquier antena, incluso en el "bigote" del televisor, pero para obtener una buena imagen, la calidad de la antena es muy crítica. Con una antena defectuosa (como la mía :) la imagen tendrá menos contraste, pero esto es suficiente para demostrar el funcionamiento del decodificador. Se puede comprar una antena dedicada de 137 MHz o fabricarla con plomería y tuberías de cobre; se puede ver un ejemplo aquí . Sin embargo, el tema del artículo sigue siendo el procesamiento de señales, y no la carpintería, quienes lo deseen pueden estudiar el tema de la construcción de antenas por su cuenta.



Entonces, miramos el tiempo de vuelo del satélite, seleccionamos el modo de grabación FM con un ancho de banda de 50 kHz en el programa y registramos la señal. El resultado debe ser un archivo WAV de aproximadamente 10 minutos de duración, y los pulsos periódicos deben ser claramente audibles. Ahora puede comenzar a decodificar.



Descodificación



Paso 1 . Carguemos el archivo usando la biblioteca scipy y lo mostraremos en la pantalla. Solo muestro un fragmento de 20 a 21 segundos, de lo contrario, el renderizado será demasiado largo.



import scipy.io.wavfile as wav
import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt


fs, data = wav.read('HDSDR_20201227_070306Z_137100kHz_AF.wav')
data_crop = data[20*fs:21*fs]

plt.figure(figsize=(12,4))

plt.plot(data_crop)
plt.xlabel("Samples")
plt.ylabel("Amplitude")
plt.title("Signal")
plt.show()
      
      





Debe ser visible una periodicidad de señal clara:







Paso 2 . Para acelerar la decodificación, reduzcamos la frecuencia de muestreo en 4 veces, descartando valores innecesarios:



resample = 4
data = data[::resample]
fs = fs//resample
      
      





Paso 3 . La imagen se transmite en modulación de amplitud, para la conversión a AM, basta con aplicar la transformada de Hilbert:



def hilbert(data):
    analytical_signal = signal.hilbert(data)
    amplitude_envelope = np.abs(analytical_signal)
    return amplitude_envelope

data_am = hilbert(data)
      
      





Puede mostrar la imagen en la pantalla y asegurarse de que hayamos recibido la envolvente de la señal:







Paso 4 . Conclusión. De hecho, la decodificación ya está terminada. Los datos en sí se transmiten en formato analógico, por lo que el color del píxel depende del nivel de la señal. Podemos "desplegar" la imagen en una imagen 2D, por la descripción del formato se sabe que una línea se transmite en 0.5 s:



from PIL import Image

frame_width = int(0.5*fs)
w, h = frame_width, data_am.shape[0]//frame_width
image = Image.new('RGB', (w, h))

px, py = 0, 0
for p in range(data_am.shape[0]):
    lum = int(data_am[p]//32 - 32)
    if lum < 0: lum = 0
    if lum > 255: lum = 255
    image.putpixel((px, py), (0, lum, 0))
    px += 1
    if px >= w:
        if (py % 50) == 0:
            print(f"Line saved {py} of {h}")
        px = 0
        py += 1
        if py >= h:
            break
      
      





La función putpixel no es la forma más rápida de trabajar con imágenes, y el código se puede acelerar 10 veces usando numpy.reshape e Image.fromarray, pero el método línea por línea es más descriptivo. Para convertir la amplitud de la señal al rango de brillo 0..255, los valores se dividen por 32; para otra antena, es posible que deba cambiarse el valor.



Para facilitar la visualización, estiramos la imagen verticalmente y la mostramos en la pantalla:



image = image.resize((w, 4*h))
plt.imshow(image)
plt.show()
      
      





Si todo se hizo correctamente, deberíamos obtener una imagen similar a esta:







Se eligió el verde cálido y la lámpara solo por belleza, quienes lo deseen pueden cambiar la gama de colores a su discreción cambiando los parámetros de la función putpixel. ¿Qué vemos en la pantalla? En formato APT, se transmiten dos canales. El IR lejano se transmite en la mitad del cuadro, el IR cercano / medio se transmite a la otra, el modo se selecciona dependiendo de si el satélite transmite una imagen nocturna o diurna. La imagen también contiene marcadores de sincronización y telemetría, quienes lo deseen pueden ver la descripción del formato APTen detalles. Los programas más avanzados utilizan estos marcadores para aplanar la imagen, pero es posible que no funcionen con señales débiles. El código anterior nunca se desincroniza desde simplemente no está allí, incluso la señal más débil y ruidosa será visible, aunque con menos contraste.



Conclusión



Como se mencionó anteriormente, no hay tantos sistemas de comunicación efectivos en el mundo, cuya señal se puede decodificar usando 20 líneas de código. Los satélites NOAA tienen alrededor de 20 años y, cuando fallan, el nuevo formato probablemente será digital y más complejo (editar, como se sugiere en los comentarios, el nuevo Meteor-M2 ya está transmitiendo datos en digital a 137 MHz). Por lo tanto, se puede recomendar a aquellos que quieran probar algo simple y sencillo de decodificar que se den prisa.



Por supuesto, opcionalmente NOAA decodifica señales solo de esta manera, hay decodificadores listos, que se han utilizado paramás posibilidades, como dibujar contornos de países y ciudades, formar pseudo colores a partir de canales monocromáticos, etc. Pero hacerlo tú mismo desde cero es mucho más interesante.



Como de costumbre, buena suerte a todos.



All Articles