NOAA気象衛星の信号を50行のコードでデコードします

こんにちは、Habr。



さまざまなタイプの無線信号をデコードするトピックを続けましょう。前世紀に開発された興味深いフォーマットの1つは、APT(自動画像送信)です。宇宙から地球の画像を送信するために使用されます。APT信号の受信は簡単で、ラジオのアマチュアがアクセスできます。





サテライトNOAA© en.wikipedia.org / wiki / NOAA-15



興味のある方は、カット中の続き。



一般情報



私たちが関心を持っているNOAA気象衛星は、TIROS(Television InfraRed Observation Satellite)シリーズ属しており 、最初の衛星は1960年に発売されました。現在、3つの衛星(NOAA-15、NOAA-18、NOAA-19、最も古いNOAA)が稼働しています。 -1998年以来15作品)。衛星は高度850kmで地球を中心に回転し、約1.5時間で1回転します。さまざまなセンサーが搭載されていますが、気象画像の受信に関心があります。そして、2つのオプションがあります。最も単純で最も広く利用可能なのは、137MHzの周波数ですでに述べたAPTフォーマットのアナログ信号 です。さらに、衛星は高解像度のHRPT形式で画像を送信し ます(高解像度画像伝送)1.7GHzで。HRPTデコーダーも利用できますが、受信にはゲインの良いロータリーアンテナがすでに望まれており、より困難で高価です。



国際条約によると、すべての気象データは公開されており、誰でもNOAA信号を受信できます。私たちが今やろうとしていること。



すでにHabré上のNOAA信号の受信にいくつかの記事がありました(たとえば、のために 12)が、それらはすべて、通常はこの絵が送信される方法の多くの説明なしに、「絵を持って、プログラムを実行し、受信機プラグイン」に煮詰めます。1レベル下がって、信号が内部でどのように機能するかを見てみましょう。



受信



非常に最初で最も明白です。衛星は静止しておらず、空を横切って移動するため、受信時間を「キャッチ」する必要があります。最も簡単なのは、n2yo.comオンラインサービスを使用することです。これにより、任意の衛星の飛行時間を計算できます。NOAA 19の例を次に示し ます。







受信状態が良好です。衛星が地平線より高い位置にある場合、1日に1回程度、衛星自体は約10分かかるため、適切なタイミングでスケジュールされた記録を設定すると役立つ場合があります。



もちろん、無線信号を受信するには受信機が必要です。 35ドルで最も安いRTL-SDRV3で十分ですが、次の設定でより高品質のSDRPlayを使用しました。







ご覧のとおり、デシメーション値を最大に設定しました。これにより、最大の動的範囲を取得できます。ゲインレベルLNAとゲインはアンテナに応じて選択する必要があります。 NOAA衛星15、18、および19は、それぞれ周波数137.620、137.9125、および137.100MHzで信号を送信します。信号自体の帯域幅は約50kHzで、すべてが正しく行われた場合、特定の時間に信号がスペクトルに表示されます。







ドップラー効果による線の傾斜に注意するのは興味深いことです。衛星は私たちを通り過ぎて飛んでいます。飛行時間を考慮すると、これはもう1つの優れた点です。地球の球形性の証明;)



受信について言えば、NOAA衛星の素晴らしいところは、受信が初心者にとって非常に手頃な価格であるということです。信号は、原則として、テレビからの「口ひげ」であっても、どのアンテナでも聞こえますが、良好な画像を得るには、アンテナの品質が非常に重要です。アンテナが悪いと(私のように:)、画像のコントラストは低下しますが、デコーダーの動作を示すにはこれで十分です。専用の137MHzアンテナを購入するか、配管と銅管から作ることができます例をここで見ることができ ます。ただし、この記事のトピックは依然として信号処理であり、大工ではありません。希望する人は、自分でアンテナを構築するトピックを研究できます。



そこで、衛星の飛行時間を見て、プログラムで帯域幅50 kHzのFM記録モードを選択し、信号を記録します。結果は、長さが約10分のWAVファイルになり、周期的なパルスがはっきりと聞こえるはずです。これで、デコードを開始できます。



デコード



ステップ1scipyライブラリを使用してファイルをロードし、画面に表示してみましょう。20〜21秒のフラグメントのみを表示します。そうしないと、レンダリングが長すぎます。



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





明確な信号の周期性が見えるはずです:







ステップ2デコードを高速化するために、サンプリングレートを4分の1に減らし、不要な値を破棄しましょう。



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





ステップ3画像は振幅変調で送信され、AMに変換するには、ヒルベルト変換を適用するだけで十分です。



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

data_am = hilbert(data)
      
      





画面に画像を表示して、信号エンベロープを受信したことを確認できます







ステップ4結論。実際、デコードはすでに終了しています。データ自体はアナログ形式で送信されるため、ピクセルの色は信号レベルによって異なります。画像を2D画像に「展開」できます。フォーマットの説明から、1行が0.5秒で送信されることがわかっています。



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
      
      





putpixel関数は、画像を操作するための最速の方法ではなく、numpy.reshapeとImage.fromarrayを使用してコードを10倍高速化できますが、行ごとの方法の方がわかりやすくなります。信号振幅を輝度範囲0..255に変換するには、値を32で除算します。別のアンテナの場合、値を変更する必要がある場合があります。



見やすくするために、画像を垂直方向に引き伸ばして画面に表示します。



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





すべてが正しく行われた場合、次のような画像が得られるはず







です。美しさのために暖かくランプグリーンが選択されました。putpixel関数のパラメータを変更することで、自由に色域を変更できます。画面には何が表示されますか? APT形式では、2つのチャネルが送信されます。遠方IRはフレームの半分で送信され、近/中IRはもう一方に送信され、モードは衛星が夜間または昼間の画像を送信するかどうかに応じて選択されます。この画像には、同期マーカーとテレメトリーマーカーも含まれています。ご希望の場合は、APT形式の説明をご覧ください。 詳細に。より高度なプログラムでは、これらのマーカーを使用して画像を平坦化しますが、弱い信号では機能しない場合があります。上記のコードは、コントラストは低くなりますが、最も弱くてノイズの多い信号でさえ表示されます。



結論



前述のように、20行のコードでデコードできる通信システムは世界にそれほど多くありません。 NOAA衛星は約20年前のものであり、故障した場合、新しいフォーマットはデジタルでより複雑になる可能性があります(編集-コメントで示唆されているように、新しいMeteor-M2は すでに137 MHzでデジタルでデータを送信しています)。したがって、デコードするのに単純で単純なものを試したい人は、急いでください。



もちろん、必要に応じてNOAAデコード信号は、このように、使用している準備デコーダがある ためで国や都市の輪郭を描く、モノクロチャンネルから疑似カラーを形成するなど、より多くの可能性があります。しかし、最初から自分でそれを行う方がはるかに興味深いです。



いつものように、みんなに頑張ってください。



All Articles