Nous décodons le signal du satellite météo NOAA en 50 lignes de code

Bonjour, Habr.



Continuons le sujet du décodage de différents types de signaux radio. L'un des formats intéressants développés au siècle dernier est APT (Automatic Picture Transmission). Il est utilisé pour transmettre des images de la Terre depuis l'espace, et ce qui est beaucoup plus intéressant et pertinent pour nous, la réception des signaux APT est simple et accessible aux radioamateurs.





Satellite NOAA © en.wikipedia.org/wiki/NOAA-15



Pour ceux qui sont intéressés, la suite sous la coupe.



informations générales



Les satellites météorologiques NOAA qui nous intéressent appartiennent à la série TIROS (Television InfraRed Observation Satellite), dont le premier a été lancé en 1960.Il y a actuellement 3 satellites en service (NOAA-15, NOAA-18 et NOAA-19, dont le plus ancien, NOAA -15 œuvres depuis 1998). Les satellites tournent autour de la Terre à une altitude de 850 km et font une révolution en environ 1,5 heure. Il y a différents capteurs à bord, mais nous serons intéressés par la réception d'images météorologiques. Et il y a deux options. Le plus simple et le plus largement disponible est un signal analogique du format APT déjà mentionné à une fréquence de 137 MHz. De plus, les satellites transmettent également des images au format HRPT haute résolution (Transmission d'image haute résolution) à 1,7 GHz. Des décodeurs HRPT sont disponibles, mais une antenne rotative avec un bon gain est déjà souhaitable pour la réception, ce qui est plus difficile et coûteux.



Selon les conventions internationales, toutes les données météorologiques sont ouvertes et tout le monde peut recevoir des signaux NOAA. Ce que nous allons faire maintenant.



Il y a déjà eu plusieurs articles sur la réception des signaux NOAA sur Habré (par exemple, 1 , 2 ), mais ils se résument généralement tous à "branché le récepteur, exécuter le programme, obtenir une image", sans beaucoup d'explications sur la façon dont cette image est transmise. Essayons de descendre d'un niveau et de voir comment le signal fonctionne à l'intérieur.



accueil



Le tout premier et le plus évident. Le satellite n'est pas géostationnaire, il se déplace dans le ciel, donc l'heure de réception doit être «captée». Le plus simple est d'utiliser le service en ligne n2yo.com, qui vous permet de calculer le temps de vol de n'importe quel satellite. Voici un exemple pour NOAA 19 :







Bonne réception, lorsque le satellite est haut au-dessus de l'horizon, environ une fois par jour, le satellite lui-même au-dessus du ciel prend environ 10 minutes, il peut donc être utile de configurer un enregistrement programmé au bon moment.



Bien sûr, vous avez besoin d'un récepteur pour recevoir le signal radio. Le RTL-SDR V3 le moins cher à 35 $ fera l'affaire, j'ai utilisé un SDRPlay de meilleure qualité avec les paramètres suivants:







Comme vous pouvez le voir, j'ai réglé la valeur de décimation au maximum, ce qui me permet d'obtenir la plage dynamique maximale. Les niveaux de gain LNA et Gain doivent être sélectionnés en fonction de l'antenne. Les satellites NOAA 15, 18 et 19 émettent des signaux sur les fréquences 137,620, 137,9125 et 137,100 MHz, respectivement. Le signal lui-même a une bande passante d'environ 50 kHz, et si tout a été fait correctement, à un moment donné le signal doit apparaître sur le spectre:







il est intéressant de noter la pente des raies due à l'effet Doppler - le satellite vole devant nous, et compte tenu du temps de vol, c'est un autre bien preuve de la sphéricité de la Terre;)



En parlant de réception, le grand avantage des satellites NOAA est que la réception est très abordable pour les débutants. Le signal sera, en principe, entendu sur n'importe quelle antenne, même sur la "moustache" du téléviseur, mais pour une bonne image, la qualité de l'antenne est très critique. Avec une mauvaise antenne (comme la mienne :) l'image sera moins contrastée, mais cela suffit pour démontrer le fonctionnement du décodeur. Une antenne dédiée de 137 MHz peut être achetée ou fabriquée à partir de tuyaux de plomberie et de cuivre, un exemple peut être consulté ici . Cependant, le sujet de l'article reste le traitement du signal, et non la menuiserie, ceux qui le souhaitent peuvent étudier le sujet de la construction d'antennes par eux-mêmes.



Ainsi, nous regardons l'heure de vol du satellite, sélectionnons le mode d'enregistrement FM dans le programme avec une bande passante de 50 KHz et enregistrons le signal. Le résultat doit être un fichier WAV d'une durée d'environ 10 minutes et les impulsions répétées périodiquement doivent être clairement audibles. Vous pouvez maintenant commencer le décodage.



Décodage



Étape 1 . Chargez le fichier à l'aide de la bibliothèque scipy et affichez-le à l'écran. Je n'affiche qu'un fragment de 20 à 21 secondes, sinon le rendu sera trop long.



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()
      
      





Une périodicité claire du signal doit être visible:







Étape 2 . Pour accélérer le décodage, réduisons la fréquence d'échantillonnage de 4 fois, en supprimant les valeurs inutiles:



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





Étape 3 . L'image est transmise en modulation d'amplitude, pour la convertir en AM il suffit d'appliquer la transformée de Hilbert:



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

data_am = hilbert(data)
      
      





Vous pouvez afficher l'image sur l'écran et vous assurer que nous avons bien reçu l'enveloppe du signal:







Étape 4 . Conclusion. En fait, le décodage est déjà terminé. Les données elles-mêmes sont transmises au format analogique, de sorte que la couleur du pixel dépend du niveau du signal. On peut "déplier" l'image en une image 2D, à partir de la description du format on sait qu'une ligne est transmise 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 fonction putpixel n'est pas le moyen le plus rapide de travailler avec des images, et le code peut être accéléré 10 fois en utilisant numpy.reshape et Image.fromarray, mais la méthode ligne par ligne est plus descriptive. Pour convertir l'amplitude du signal dans la plage de luminosité 0..255, les valeurs sont divisées par 32, pour une autre antenne, la valeur peut devoir être modifiée.



Pour faciliter la visualisation, nous étirons l'image verticalement et l'afficherons à l'écran:



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





Si tout a été fait correctement, nous devrions obtenir une image comme celle-ci: le







vert chaud et lampe a été choisi juste pour la beauté, ceux qui le souhaitent peuvent changer la gamme de couleurs à leur discrétion en modifiant les paramètres de la fonction putpixel. Que voyons-nous à l'écran? Au format APT, deux canaux sont transmis. L'IR lointain est transmis sur une moitié de la trame, l'IR proche / moyen est transmis à l'autre, le mode est sélectionné selon que le satellite transmet une image de nuit ou de jour. L'image contient également des marqueurs de synchronisation et de télémétrie, ceux qui le souhaitent peuvent voir la description du format APTen détails. Les programmes plus avancés utilisent ces marqueurs pour aplatir l'image, mais peuvent ne pas fonctionner sur des signaux faibles. Le code ci-dessus ne se désynchronise jamais depuis il n'est tout simplement pas là, même le signal le plus faible et le plus bruyant sera visible, mais avec moins de contraste.



Conclusion



Comme mentionné précédemment, il n'y a pas autant de systèmes de communication efficaces dans le monde, dont le signal peut être décodé à l'aide de 20 lignes de code. Les satellites de la NOAA ont environ 20 ans, et lorsqu'ils échoueront, le nouveau format sera très probablement numérique et plus complexe (éditer - comme suggéré dans les commentaires, le nouveau Meteor-M2 transmet déjà des données en numérique à 137 MHz). Donc, ceux qui veulent essayer quelque chose de simple et simple à décoder peuvent être invités à se dépêcher.



Bien sûr, en option, la NOAA décode les signaux uniquement de cette manière, il existe des décodeurs prêts à l'emploi, qui ont utilisé pourplus de possibilités, comme dessiner des contours de pays et de villes, former des pseudo couleurs à partir de canaux monochromes, etc. Mais le faire soi-même à partir de zéro est beaucoup plus intéressant.



Comme d'habitude, bonne chance à tous.



All Articles