Wir dekodieren das Signal des NOAA-Wettersatelliten in 50 Codezeilen

Hallo Habr.



Fahren wir mit dem Thema der Dekodierung verschiedener Arten von Funksignalen fort. Eines der interessanten Formate, die im letzten Jahrhundert entwickelt wurden, ist APT (Automatic Picture Transmission). Es wird verwendet, um Bilder der Erde aus dem Weltraum zu übertragen. Was für uns viel interessanter und relevanter ist, ist der Empfang von APT-Signalen einfach und für Funkamateure zugänglich.





Satellit NOAA © de.wikipedia.org/wiki/NOAA-15



Für Interessierte ist die Fortsetzung unter dem Schnitt.



allgemeine Informationen



Die für uns interessanten meteorologischen NOAA-Satelliten gehören zur TIROS- Serie (Television InfraRed Observation Satellite), von der der erste bereits 1960 gestartet wurde. Derzeit sind 3 Satelliten in Betrieb (NOAA-15, NOAA-18 und NOAA-19, von denen der älteste NOAA ist -15 arbeitet seit 1998). Die Satelliten drehen sich in einer Höhe von 850 km um die Erde und machen eine Umdrehung in etwa 1,5 Stunden. Es sind verschiedene Sensoren an Bord, aber wir werden daran interessiert sein, meteorologische Bilder zu erhalten. Und es gibt zwei Möglichkeiten. Das einfachste und am weitesten verbreitete ist ein analoges Signal des bereits erwähnten APT- Formats mit einer Frequenz von 137 MHz. Darüber hinaus übertragen Satelliten auch Bilder im hochauflösenden HRPT-Format(Hochauflösende Bildübertragung) bei 1,7 GHz. HRPT-Decoder sind verfügbar, aber eine drehbare Antenne mit guter Verstärkung ist bereits für den Empfang wünschenswert, was schwieriger und teurer ist.



Gemäß internationalen Konventionen sind alle meteorologischen Daten offen und jeder kann NOAA-Signale empfangen. Was wir jetzt machen werden.



Es gab bereits mehrere Artikel über den Empfang von NOAA-Signalen auf Habré (zum Beispiel 1 , 2 ), aber alle laufen normalerweise darauf hinaus, "den Empfänger anzuschließen, das Programm auszuführen, ein Bild zu bekommen", ohne viel zu erklären, wie dieses Bild übertragen wird. Lassen Sie uns versuchen, eine Ebene tiefer zu gehen und zu sehen, wie das Signal im Inneren funktioniert.



Rezeption



Das allererste und offensichtlichste. Der Satellit ist nicht geostationär, er bewegt sich über den Himmel, daher muss die Empfangszeit „erfasst“ werden. Am einfachsten ist es, den Onlinedienst n2yo.com zu verwenden, mit dem Sie die Flugzeit für jeden Satelliten berechnen können. Hier ein Beispiel für NOAA 19 :







Guter Empfang: Wenn sich der Satellit ungefähr einmal am Tag hoch über dem Horizont befindet, dauert der Satellit selbst über dem Himmel ungefähr 10 Minuten. Daher kann es nützlich sein, eine geplante Aufzeichnung zum richtigen Zeitpunkt einzurichten.



Natürlich benötigen Sie einen Empfänger, um das Funksignal zu empfangen. Das billigste RTL-SDR V3 für 35 US-Dollar reicht aus. Ich habe ein SDRPlay mit besserer Qualität mit den folgenden Einstellungen verwendet:







Wie Sie sehen können, habe ich den Dezimierungswert auf Maximum gesetzt, wodurch ich den maximalen Dynamikbereich erhalten kann. Die Verstärkungsstufen LNA und Gain sollten abhängig von der Antenne ausgewählt werden. Die NOAA-Satelliten 15, 18 und 19 senden Signale auf den Frequenzen 137,620, 137,9125 bzw. 137,100 MHz. Das Signal selbst hat eine Bandbreite von etwa 50 kHz, und wenn alles richtig gemacht wurde, sollte das Signal zu einem bestimmten Zeitpunkt im Spektrum erscheinen:







Es ist interessant, die Steigung der Linien aufgrund des Doppler-Effekts zu bemerken - der Satellit fliegt an uns vorbei und unter Berücksichtigung der Flugzeit ist dies ein weiteres Gut Beweis der Sphärizität der Erde;)



Apropos Empfang: Das Tolle an NOAA-Satelliten ist, dass der Empfang für Anfänger sehr erschwinglich ist. Das Signal ist im Prinzip auf jeder Antenne zu hören, auch auf dem "Schnurrbart" des Fernsehgeräts. Für ein gutes Bild ist die Qualität der Antenne jedoch sehr kritisch. Bei einer schlechten Antenne (wie meiner :) ist das Bild weniger kontrastreich, aber dies reicht aus, um die Funktionsweise des Decoders zu demonstrieren. Eine dedizierte 137-MHz-Antenne kann gekauft oder aus Rohrleitungen und Kupferrohren hergestellt werden. Ein Beispiel finden Sie hier . Das Thema des Artikels ist jedoch immer noch die Signalverarbeitung, nicht die Tischlerei. Wer möchte, kann das Thema Antennenbau selbst studieren.



Wir betrachten also die Flugzeit des Satelliten, wählen den FM-Aufnahmemodus im Programm mit einer Bandbreite von 50 kHz und zeichnen das Signal auf. Das Ergebnis sollte eine WAV-Datei mit einer Länge von etwa 10 Minuten sein, und die sich regelmäßig wiederholenden Impulse sollten deutlich hörbar sein. Jetzt können Sie mit dem Dekodieren beginnen.



Dekodierung



Schritt 1 . Laden wir die Datei mithilfe der Scipy-Bibliothek und zeigen sie auf dem Bildschirm an. Ich zeige nur ein Fragment von 20 bis 21 Sekunden an, sonst ist das Rendern zu lang.



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





Eine deutliche Signalperiodizität sollte sichtbar sein:







Schritt 2 . Um die Dekodierung zu beschleunigen, reduzieren wir die Abtastrate um das Vierfache und verwerfen unnötige Werte:



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





Schritt 3 . Das Bild wird in Amplitudenmodulation übertragen. Um es in AM umzuwandeln, reicht es aus, die Hilbert-Transformation anzuwenden:



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

data_am = hilbert(data)
      
      





Sie können das Bild auf dem Bildschirm anzeigen und sicherstellen, dass wir die Signalhüllkurve erhalten haben:







Schritt 4 . Fazit. Tatsächlich ist die Dekodierung bereits abgeschlossen. Die Daten selbst werden im analogen Format übertragen, sodass die Farbe des Pixels vom Signalpegel abhängt. Wir können das Bild in ein 2D-Bild "entfalten". Aus der Formatbeschreibung ist bekannt, dass eine Linie in 0,5 s übertragen wird:



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
      
      





Die Putpixel-Funktion ist nicht der schnellste Weg, um mit Bildern zu arbeiten, und der Code kann mit numpy.reshape und Image.fromarray zehnmal beschleunigt werden, aber die zeilenweise Methode ist aussagekräftiger. Um die Signalamplitude in den Helligkeitsbereich 0..255 umzuwandeln, werden die Werte durch 32 geteilt. Bei einer anderen Antenne muss der Wert möglicherweise geändert werden.



Zur Vereinfachung der Anzeige strecken wir das Bild vertikal und zeigen es auf dem Bildschirm an:



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





Wenn alles richtig gemacht wurde, sollten wir ein Bild wie dieses erhalten:







Warm und Lampengrün wurde nur aus Gründen der Schönheit ausgewählt. Wer dies wünscht, kann den Farbumfang nach eigenem Ermessen ändern, indem er die Parameter der Putpixel-Funktion ändert. Was sehen wir auf dem Bildschirm? Im APT-Format werden zwei Kanäle übertragen. Fernes IR wird auf einer Hälfte des Rahmens übertragen, nahes / mittleres IR wird auf die andere übertragen, der Modus wird abhängig davon ausgewählt, ob der Satellit ein Nacht- oder Tagesbild sendet. Das Bild enthält auch Synchronisations- und Telemetriemarker. Wer möchte, kann die Beschreibung des APT-Formats sehenausführlicher. Fortgeschrittenere Programme verwenden diese Markierungen, um das Bild zu glätten, funktionieren jedoch möglicherweise nicht bei schwachen Signalen. Der obige Code wird seitdem nie mehr synchronisiert es ist einfach nicht da, selbst das schwächste und lauteste Signal wird sichtbar sein, wenn auch mit weniger Kontrast.



Fazit



Wie bereits erwähnt, gibt es weltweit nicht so viele effektive Kommunikationssysteme, deren Signal mit 20 Codezeilen decodiert werden kann. Die NOAA-Satelliten sind ungefähr 20 Jahre alt, und wenn sie ausfallen, wird das neue Format höchstwahrscheinlich digital und komplexer sein (Bearbeiten - wie in den Kommentaren vorgeschlagen, überträgt der neue Meteor-M2 bereits Daten in digitaler Form mit 137 MHz). Wer also etwas Einfaches und Unkompliziertes ausprobieren möchte, kann sich beeilen.



Natürlich, optional NOAA-Decodiersignale nur auf diese Weise, gibt es Ready-Decoder, die für verwendet habenmehr Möglichkeiten, wie das Zeichnen der Umrisse von Ländern und Städten, das Bilden von Pseudofarben aus monochromen Kanälen usw. Aber es ist viel interessanter, es selbst von Grund auf neu zu machen.



Wie immer viel Glück an alle.



All Articles