衛星通信の基礎 — GEOからLEOコンステレーションまで

台風で地上の通信インフラが壊滅した被災地に、衛星電話だけが外部との唯一の通信手段として残っている — こうした場面は災害報道で繰り返し目にします。また、太平洋の真ん中を航行する船舶や、極地を飛ぶ航空機は、地上の基地局の電波が全く届かない場所にいます。このような「地上のインフラでは到達できない場所」に通信サービスを提供できるのが衛星通信の最大の強みです。

衛星通信は、災害時の緊急通信や船舶・航空機の移動体通信にとどまらず、衛星放送(BS/CS)、衛星インターネット(Starlink、OneWebなど)、GPS測位、気象観測データの伝送、さらには深宇宙探査機との通信まで、現代社会の基盤インフラとして不可欠な役割を果たしています。

本記事の内容

  • 衛星通信システムのアーキテクチャ(アップリンク/ダウンリンク/トランスポンダ)
  • 軌道による分類(GEO/MEO/LEO)と各軌道の特徴比較
  • 周波数帯(L/S/C/Ku/Ka)の使い分けと割り当て
  • 多元接続方式(FDMA/TDMA/CDMA)の原理と比較
  • LEOコンステレーション(Starlink等)の設計概念
  • Pythonによる軌道パラメータと通信特性の関係の可視化

前提知識

この記事を読む前に、以下の概念に馴染みがあると理解がスムーズです。

  • 電磁波の基本(周波数・波長・電力の関係)
  • デシベル(dB/dBm/dBW)の定義と使い方
  • ケプラーの法則の概要(軌道力学の基礎)

衛星通信システムのアーキテクチャ

全体構成

衛星通信システムは、大きく分けて3つの要素から構成されます。それぞれの役割を日常の郵便に例えると分かりやすいでしょう。

  1. 宇宙セグメント(Space Segment): 衛星本体。郵便に例えると「中継の郵便局」に相当します。地上から送られてきた信号を受信し、増幅して別の周波数で地上に送り返します
  2. 地上セグメント(Ground Segment): 地上局、ゲートウェイ局、管制局。「本局の郵便局」に相当し、衛星との通信を地上のネットワーク(インターネット等)に接続します
  3. ユーザーセグメント(User Segment): 端末(VSAT、衛星電話、受信機等)。「郵便を送受する家庭」に相当します

アップリンクとダウンリンク

衛星通信では、地上局から衛星への通信をアップリンク(uplink)、衛星から地上局への通信をダウンリンク(downlink)と呼びます。アップリンクとダウンリンクでは通常、異なる周波数が使われます。これは、衛星が受信した信号を増幅して再送信する際に、同じ周波数を使うとアンテナ間のフィードバック(自己干渉)が生じるためです。

一般に、アップリンクの周波数はダウンリンクより高く設定されます。高い周波数はビーム幅が狭くなる(つまり地上局のアンテナがより指向性を持てる)ため、送信電力を効率的に衛星に集中させることができるからです。

トランスポンダ

衛星に搭載されている中継器をトランスポンダ(transponder)と呼びます。基本的な機能は「受信→周波数変換→増幅→送信」です。トランスポンダには大きく2種類あります。

ベントパイプ(bent-pipe)トランスポンダ: 受信した信号をそのまま周波数変換して増幅し、送り返す「曲がったパイプ」型。信号の内容には一切手を加えないため、任意の変調方式やプロトコルに対応できる柔軟性があります。従来の衛星のほとんどがこの方式です。

再生中継(regenerative)トランスポンダ: 受信した信号をいったんデジタル復調し、誤り訂正やルーティングを行った上で再変調して送信する方式です。雑音の累積を防げるため、特にマルチホップ(複数の衛星を経由する通信)で性能が向上します。ただし、衛星の搭載機器が複雑になるというトレードオフがあります。

1基の衛星には通常、数十個のトランスポンダが搭載されます。各トランスポンダは典型的に36 MHzや72 MHzの帯域幅を持ち、1つのトランスポンダで複数のテレビチャンネルや数千の電話回線を中継できます。

衛星通信のアーキテクチャを理解したところで、次に最も重要な設計パラメータである「衛星をどの軌道に配置するか」について見ていきましょう。

衛星の軌道と特徴

なぜ軌道が重要か

衛星をどの高度の軌道に配置するかは、通信システムの特性を根本的に決定します。高い軌道は広い範囲をカバーできますが、伝搬距離が長くなるため損失が大きく、遅延も大きくなります。低い軌道は遅延が小さいですが、カバー範囲が狭いため多数の衛星が必要です。この基本的なトレードオフが、衛星通信の軌道設計を支配しています。

静止軌道(GEO: Geostationary Earth Orbit)

高度約35,786 kmの赤道上空を周回する円軌道で、周期がちょうど地球の自転と同じ(約23時間56分)になります。地上から見ると衛星は空の一点に「静止」しているように見えるため、地上局のアンテナを常に一定方向に向けておけばよいという大きな利点があります。

GEO衛星の主な特徴:

  • カバレッジ: 1基で地球表面の約1/3(赤道帯でおよそ経度120度の範囲)をカバー可能。3基で極地域を除くほぼ全球をカバーできる
  • 伝搬遅延: 往復約250 ms(片道約125 ms)。電波が36,000 kmを2回(上り+下り)往復するため
  • 自由空間損失: 距離が非常に長いため約200 dB(Ku帯)の損失
  • 可視仰角: 緯度が高いほど仰角が低くなる。緯度70度以上では実用的な仰角が確保できない

代表的なGEO衛星システム: BSAT(BS放送)、JCSAT(CS放送)、Inmarsat(海事通信)、GOES(気象観測)

GEOの最大の弱点は伝搬遅延です。音声通話では約0.5秒の往復遅延が会話のテンポを乱し、インタラクティブなWebブラウジングでも体感できるレベルの遅延が生じます。

中軌道(MEO: Medium Earth Orbit)

高度約2,000〜35,786 km(GEOより低くLEOより高い)の軌道です。GEOほどの遅延はなく、LEOほど多数の衛星を必要としない、バランスの取れた軌道です。

MEO衛星の主な特徴:

  • 軌道高度: 典型的には約20,000 km(GPS等のナビゲーション衛星)
  • 周期: 約12時間(GPS衛星の場合)
  • 伝搬遅延: 往復約130 ms(高度20,000 kmの場合)
  • カバレッジ: 1基でGEOより狭いが、LEOよりは広い

代表的なMEOシステム: GPS/GNSS(高度約20,200 km、24基以上)、O3b/SES(高度約8,000 km、高スループット通信)

低軌道(LEO: Low Earth Orbit)

高度約200〜2,000 kmの軌道です。近年のStarlinkやOneWebに代表されるLEOコンステレーションが、衛星通信の構図を大きく変えつつあります。

LEO衛星の主な特徴:

  • 軌道高度: 典型的には500〜1,200 km
  • 周期: 約90〜120分
  • 伝搬遅延: 往復約4〜16 ms(高度500〜1,200 km)。光ファイバーの遅延と同等かそれ以下
  • 自由空間損失: GEOに比べて30〜40 dB小さい
  • 可視時間: 1基あたり約5〜20分(衛星が高速で移動するため)
  • ドップラーシフト: 衛星の高速移動(約7.5 km/s)により、最大で数十kHzのドップラーシフトが発生

LEOの最大の課題は、衛星が常に移動しているため、連続的な通信を保証するには多数の衛星を配置して「切れ目なく」カバーする必要があることです。また、衛星の相対速度が大きいため、ドップラーシフトの補償やハンドオーバー(通信中に衛星を切り替える処理)の設計が複雑になります。

3つの軌道の比較

パラメータ GEO MEO LEO
高度 35,786 km 2,000〜35,786 km 200〜2,000 km
往復遅延 約250 ms 約40〜130 ms 約4〜16 ms
全球カバーに必要な衛星数 3基 10〜20基 数百〜数千基
1基のカバレッジ 地球の約1/3 地球の約1/5〜1/10 地球の約1/50〜1/200
設計寿命 15〜20年 10〜15年 5〜7年
軌道速度 約3.1 km/s 約3.9〜7.5 km/s 約7.5〜7.8 km/s
ドップラーシフト ほぼゼロ 中程度 大きい
アンテナ追尾 不要(固定) 必要 必要(高速追尾)
打上げコスト 高い 中程度 低い(小型衛星が多い)

各軌道にはそれぞれの用途に最適な特性があり、「どの軌道が最良か」という問いには答えがありません。放送のように固定方向への大面積カバレッジが重要なサービスにはGEO、低遅延・高スループットが求められるインターネットアクセスにはLEO、精密測位にはMEOが適しています。

衛星の軌道を決めたら、次に重要なのはどの周波数帯で通信するかです。周波数帯の選択は、アンテナのサイズ、降雨減衰、帯域幅など多くのパラメータに影響します。

衛星通信の周波数帯

周波数帯の分類と特徴

衛星通信で使われる主要な周波数帯を、低い周波数から順に見ていきましょう。それぞれの帯域名はアルファベットの文字で表されますが、これは第二次世界大戦中のレーダー開発で使われた秘匿名称に由来しています。

L帯(1〜2 GHz): – アップリンク: 1.6〜1.66 GHz、ダウンリンク: 1.5〜1.56 GHz – 用途: 衛星電話(Inmarsat、Iridium)、GPS(1.575 GHz)、衛星ラジオ – 特徴: 降雨減衰がほとんどない。小型アンテナ(オムニや小パッチ)で受信可能。帯域幅は狭い

S帯(2〜4 GHz): – 用途: 気象衛星、一部の通信衛星、宇宙探査 – 特徴: L帯と同様に降雨減衰が小さい。帯域幅はL帯よりやや広い

C帯(4〜8 GHz): – アップリンク: 5.925〜6.425 GHz、ダウンリンク: 3.7〜4.2 GHz – 用途: 固定衛星通信(VSAT)、テレビ中継、トランク通信 – 特徴: 降雨減衰がほとんどない。大型アンテナ(直径3〜5 m)が必要。帯域幅500 MHz

Ku帯(12〜18 GHz): – アップリンク: 14.0〜14.5 GHz、ダウンリンク: 11.7〜12.2 GHz(日本はBSバンド) – 用途: 衛星放送(BS/CS)、VSAT通信、衛星ニュース取材(SNG) – 特徴: C帯より小さいアンテナ(直径45〜90 cm)で受信可能。降雨減衰が顕在化する。帯域幅は広い

Ka帯(26.5〜40 GHz): – アップリンク: 27.5〜30.0 GHz、ダウンリンク: 17.7〜20.2 GHz – 用途: 高スループット衛星(HTS)、LEOコンステレーション – 特徴: 非常に広い帯域幅(数GHz)。狭いビームで高いスループットを実現。降雨減衰が大きい。大気吸収も考慮が必要

V帯(40〜75 GHz): – 用途: 次世代衛星通信(衛星間リンクなど) – 特徴: 極めて広い帯域幅。降雨減衰と酸素吸収(60 GHz帯)の影響が大きい

周波数選択のトレードオフ

周波数帯の選択には以下のトレードオフが存在します。

低い周波数(L帯、S帯、C帯)の利点: – 降雨減衰が小さく、高い稼働率が得られる – 回折効果により見通し外への回り込みが良い – 受信端末の許容損失マージンが大きい

高い周波数(Ku帯、Ka帯)の利点: – 利用可能な帯域幅が広く、大容量通信が可能 – アンテナの指向性が高く(同じアンテナサイズで)、小型アンテナでも十分な利得が得られる – スポットビームにより周波数再利用が可能で、システム全体のスループットが向上

この「帯域幅 vs 降雨耐性」のトレードオフが、用途に応じた周波数帯の使い分けの根拠です。衛星放送のように高い稼働率と小型アンテナの両立が求められるサービスにはKu帯が選ばれ、大容量データ通信にはKa帯が選ばれます。

衛星の周波数帯が決まったら、次に考えるべきは「同じトランスポンダの帯域を複数のユーザーでどのように共有するか」です。これが多元接続方式の問題です。

多元接続方式

なぜ多元接続が必要か

1基の通信衛星には限られた帯域幅と電力しかありません。しかし、多数の地上局やユーザー端末が同時に通信する必要があります。レストランのテーブルを複数の客が共有するように、衛星の通信資源を多数のユーザーで効率的に分け合う方法が多元接続(Multiple Access)です。

主要な3つの方式について、それぞれの原理と特徴を見ていきましょう。

FDMA(周波数分割多元接続)

FDMA(Frequency Division Multiple Access)は、トランスポンダの帯域幅を複数の周波数チャネルに分割し、各ユーザーに異なる周波数を割り当てる方式です。

イメージとしては、FMラジオの各局が異なる周波数で放送しているのと同じです。ユーザーAは $f_1$ で、ユーザーBは $f_2$ で通信し、同時に干渉なく通信できます。

利点: 技術的にシンプル。タイミング同期が不要 欠点: 隣接チャネル間にガードバンド(未使用の周波数帯)が必要で、帯域効率が低下する。また、トランスポンダの非線形特性により相互変調(intermodulation)歪みが発生するため、バックオフ(送信電力の低減)が必要

TDMA(時分割多元接続)

TDMA(Time Division Multiple Access)は、時間軸を一定周期のフレームに分割し、各ユーザーに異なるタイムスロットを割り当てる方式です。

電話のグループ通話で「順番に話す」のと似ています。ある瞬間にはユーザーAだけが送信し、次の瞬間にはユーザーBが送信します。各ユーザーは自分のスロットでバースト的に高速送信し、他のスロットでは送信を停止します。

利点: トランスポンダを1ユーザーずつ使うため相互変調歪みが小さい。帯域効率が高い 欠点: 全ユーザーの送信タイミングを衛星のフレームに正確に同期させる必要がある。特にGEO衛星では伝搬遅延(約125 ms)の補正が必要。バースト送信のためピーク電力が大きい

CDMA(符号分割多元接続)

CDMA(Code Division Multiple Access)は、全ユーザーが同じ周波数帯域を同時に使用するが、各ユーザーに固有の拡散符号(spreading code)を割り当てることで区別する方式です。

騒がしいパーティーで、特定の言語を話す人の声だけを聞き取るのに似ています。全員が同じ部屋(周波数帯域)で同時に話していますが、「符号」という「言語」が異なるため、受信側は自分宛ての信号だけを復調できます。

利点: 周波数計画が不要。ソフトハンドオーバーが可能。耐干渉性が高い。ユーザー数が少ない時は帯域全体を使えるため柔軟性が高い 欠点: 近遠問題(near-far problem)により電力制御が必須。ユーザー数が増えると干渉が増大し、容量が緩やかに劣化する

方式の比較と選択

項目 FDMA TDMA CDMA
共有の次元 周波数 時間 符号
帯域効率 低〜中 中〜高 中〜高
同期要件 不要 厳密な時間同期 符号同期
電力制御 不要 不要 必須
柔軟性 低い(固定割当て) 中(動的割当て可能) 高い
代表的システム 初期のIntelsat DVB-RCS GPS, IS-95

現代の衛星通信システムでは、これらの方式を組み合わせたハイブリッド方式が主流です。たとえば、DVB-S2X(衛星放送の標準規格)ではダウンリンクにTDM(時分割多重)を使い、リターンリンクにMF-TDMA(多周波TDMA)を使います。

多元接続方式による帯域の共有方法を理解したところで、次に近年急速に発展しているLEOコンステレーションの設計概念について見ていきましょう。

LEOコンステレーション

コンステレーションとは

人工衛星のコンステレーション(constellation)とは、特定のミッションを達成するために設計された衛星群のことです。ちょうど夜空の「星座(constellation)」のように、複数の衛星が計画された軌道パターンに配置されます。

GEO衛星は1基で地球の1/3をカバーできるため、少数の衛星で広範囲のサービスが可能です。一方、LEO衛星は1基のカバレッジが狭く、かつ高速で移動するため、連続的なサービスを提供するには数百〜数千基の衛星を複数の軌道面に配置する必要があります。

ウォーカー・コンステレーション

LEOコンステレーションの軌道設計で最も一般的に使われるのがウォーカー・デルタ・パターン(Walker Delta Pattern)です。3つのパラメータ $T/P/F$ で特徴づけられます。

  • $T$: 衛星の総数
  • $P$: 軌道面の数
  • $F$: 隣接軌道面間の位相差パラメータ($0 \leq F < P$)

各軌道面には $T/P$ 基の衛星が均等に配置され、全ての軌道面は同じ傾斜角と高度を持ちます。たとえば、GPS衛星群はウォーカー 24/6/1パターンに基づいており、6つの軌道面に各4基の衛星が配置されています。

主要なLEOコンステレーション

近年、いくつかの大規模LEOコンステレーションが構築・計画されています。

Starlink(SpaceX): – 軌道高度: 550 km(第1世代) – 衛星数: 約6,000基以上(2026年時点で運用中)、最終的に42,000基を計画 – 軌道傾斜角: 53度、70度、97.6度の複数シェル – 周波数帯: Ku帯(ユーザーリンク)、Ka帯(ゲートウェイリンク) – スループット: 1衛星あたり約20 Gbps – ユーザー端末遅延: 約20〜40 ms

OneWeb: – 軌道高度: 1,200 km – 衛星数: 約650基 – 軌道傾斜角: 87.9度(準極軌道) – 特徴: 企業向け・政府向けサービスに注力。極地域のカバレッジが優秀

Amazon Kuiper: – 軌道高度: 590〜630 km – 衛星数: 3,236基を計画 – 特徴: Amazonのクラウドインフラとの統合を目指す

LEOコンステレーションの技術的課題

LEOコンステレーションには、GEO衛星にはない固有の技術的課題があります。

ハンドオーバー: LEO衛星は約90分で地球を1周するため、ユーザーから見て1基の衛星の可視時間は数分〜十数分です。通信中に衛星が地平線に沈むと、次の衛星に接続を切り替える必要があります。このハンドオーバーをシームレスに行うことが、ユーザー体験の鍵を握ります。

ドップラーシフト: LEO衛星の地上に対する相対速度は最大で約7.5 km/sに達します。Ku帯(12 GHz)でのドップラーシフトは最大約 $\pm 300$ kHz にもなり、受信機は常にドップラー補償を行う必要があります。

衛星間リンク(ISL: Inter-Satellite Link): 地上のゲートウェイ局がない海洋上空でもデータを中継するために、隣接する衛星同士がレーザーやミリ波でデータをやり取りする衛星間リンクが重要です。Starlinkの最新世代の衛星にはレーザー衛星間リンクが搭載されています。

スペースデブリ: 数千基の衛星を運用することは、宇宙空間の混雑とデブリリスクの増大を意味します。運用終了後の衛星の確実なデオービット(大気圏再突入)が義務づけられています。

LEOコンステレーションの概念を理解したところで、次にPythonを使って各軌道の通信パラメータを定量的に計算し、軌道選択のトレードオフを数値で確認しましょう。

Pythonで学ぶ衛星通信の基礎

軌道高度と通信パラメータの関係

軌道高度が伝搬遅延、自由空間損失、ドップラーシフト、可視時間にどのように影響するかを計算してみましょう。

import numpy as np
import matplotlib.pyplot as plt

# 物理定数
Re = 6371        # 地球半径 [km]
c = 3e5          # 光速 [km/s]
G = 6.674e-11    # 万有引力定数 [m^3/(kg*s^2)]
Me = 5.972e24    # 地球質量 [kg]
mu = G * Me      # 地球の標準重力パラメータ [m^3/s^2]

def orbital_velocity(h_km):
    """軌道速度 [km/s]"""
    r = (Re + h_km) * 1000  # m
    v = np.sqrt(mu / r) / 1000  # km/s
    return v

def orbital_period(h_km):
    """軌道周期 [分]"""
    r = (Re + h_km) * 1000  # m
    T = 2 * np.pi * np.sqrt(r**3 / mu) / 60  # 分
    return T

def one_way_delay(h_km, elev_deg=90):
    """片道伝搬遅延 [ms](最短は天頂方向)"""
    elev = np.radians(elev_deg)
    # 衛星までのスラント距離
    r_sat = Re + h_km
    slant = -Re * np.sin(elev) + np.sqrt((Re * np.sin(elev))**2 +
             2 * Re * h_km + h_km**2)
    delay = slant / c * 1000  # ms
    return delay

def fspl_sat(h_km, f_ghz, elev_deg=90):
    """自由空間損失 [dB]"""
    elev = np.radians(elev_deg)
    r_sat = Re + h_km
    slant = -Re * np.sin(elev) + np.sqrt((Re * np.sin(elev))**2 +
             2 * Re * h_km + h_km**2)
    fspl = 20 * np.log10(slant * 1000) + 20 * np.log10(f_ghz * 1e9) + \
           20 * np.log10(4 * np.pi / (3e8))
    return fspl

def max_doppler(h_km, f_ghz):
    """最大ドップラーシフト [kHz](低仰角通過時)"""
    v = orbital_velocity(h_km) * 1000  # m/s
    # 最大ドップラーは衛星が真横を通過するとき(放射方向速度が最大)
    f_doppler = v * f_ghz * 1e9 / (3e8) / 1000  # kHz
    return f_doppler

def visibility_time(h_km, min_elev_deg=10):
    """1回の可視時間 [分](最低仰角以上の時間)"""
    elev = np.radians(min_elev_deg)
    # 可視半角
    r_sat = Re + h_km
    half_angle = np.arccos(Re * np.cos(elev) / r_sat) - elev
    # 可視弧の長さ
    T = orbital_period(h_km)
    vis = T * (2 * half_angle) / (2 * np.pi)
    return vis

# 高度範囲
h = np.linspace(200, 40000, 1000)

fig, axes = plt.subplots(2, 3, figsize=(16, 10))

# 1. 往復遅延
delay_90 = 2 * one_way_delay(h, 90)  # 天頂
delay_10 = 2 * one_way_delay(h, 10)  # 仰角10度
axes[0, 0].semilogy(h, delay_90, 'b-', linewidth=2, label='Elevation = 90°')
axes[0, 0].semilogy(h, delay_10, 'r--', linewidth=2, label='Elevation = 10°')
axes[0, 0].axhline(y=250, color='gray', linestyle=':', alpha=0.5)
axes[0, 0].text(5000, 280, 'GEO RTT ≈ 250 ms', fontsize=9, color='gray')
axes[0, 0].set_xlabel('Altitude [km]', fontsize=11)
axes[0, 0].set_ylabel('Round-Trip Delay [ms]', fontsize=11)
axes[0, 0].set_title('Propagation Delay', fontsize=12)
axes[0, 0].legend(fontsize=9)
axes[0, 0].grid(True, alpha=0.3)

# 2. 自由空間損失(Ku帯 12 GHz)
fspl_90 = fspl_sat(h, 12, 90)
fspl_10 = fspl_sat(h, 12, 10)
axes[0, 1].plot(h, fspl_90, 'b-', linewidth=2, label='Elevation = 90°')
axes[0, 1].plot(h, fspl_10, 'r--', linewidth=2, label='Elevation = 10°')
axes[0, 1].set_xlabel('Altitude [km]', fontsize=11)
axes[0, 1].set_ylabel('FSPL [dB]', fontsize=11)
axes[0, 1].set_title('Free Space Path Loss (12 GHz)', fontsize=12)
axes[0, 1].legend(fontsize=9)
axes[0, 1].grid(True, alpha=0.3)

# 3. ドップラーシフト
doppler_ku = max_doppler(h, 12)
doppler_ka = max_doppler(h, 30)
axes[0, 2].semilogy(h, doppler_ku, 'b-', linewidth=2, label='Ku (12 GHz)')
axes[0, 2].semilogy(h, doppler_ka, 'r-', linewidth=2, label='Ka (30 GHz)')
axes[0, 2].set_xlabel('Altitude [km]', fontsize=11)
axes[0, 2].set_ylabel('Max Doppler Shift [kHz]', fontsize=11)
axes[0, 2].set_title('Maximum Doppler Shift', fontsize=12)
axes[0, 2].legend(fontsize=9)
axes[0, 2].grid(True, alpha=0.3)

# 4. 可視時間
vis_10 = visibility_time(h, 10)
vis_20 = visibility_time(h, 20)
axes[1, 0].plot(h, vis_10, 'b-', linewidth=2, label='Min elev = 10°')
axes[1, 0].plot(h, vis_20, 'r--', linewidth=2, label='Min elev = 20°')
axes[1, 0].set_xlabel('Altitude [km]', fontsize=11)
axes[1, 0].set_ylabel('Visibility Time [min]', fontsize=11)
axes[1, 0].set_title('Single Pass Visibility Time', fontsize=12)
axes[1, 0].legend(fontsize=9)
axes[1, 0].grid(True, alpha=0.3)
axes[1, 0].set_xlim([200, 5000])

# 5. 軌道速度と周期
ax5a = axes[1, 1]
ax5b = ax5a.twinx()
ax5a.plot(h, orbital_velocity(h), 'b-', linewidth=2)
ax5b.plot(h, orbital_period(h) / 60, 'r-', linewidth=2)
ax5a.set_xlabel('Altitude [km]', fontsize=11)
ax5a.set_ylabel('Orbital Velocity [km/s]', fontsize=11, color='b')
ax5b.set_ylabel('Orbital Period [hours]', fontsize=11, color='r')
ax5a.set_title('Orbital Velocity & Period', fontsize=12)
ax5a.grid(True, alpha=0.3)

# 6. 代表的な衛星の位置をプロット
sat_systems = {
    'Starlink': 550,
    'OneWeb': 1200,
    'O3b': 8062,
    'GPS': 20200,
    'GEO': 35786,
}

categories = ['Delay\n[ms]', 'FSPL\n[dB]', 'Doppler\n[kHz]',
               'Visibility\n[min]', 'Velocity\n[km/s]']
values = {}
for name, alt in sat_systems.items():
    values[name] = [
        2 * one_way_delay(alt, 30),
        fspl_sat(alt, 12, 30),
        max_doppler(alt, 12),
        visibility_time(alt, 10) if alt < 36000 else np.inf,
        orbital_velocity(alt)
    ]

# テーブル形式で比較
cell_text = []
for name, alt in sat_systems.items():
    v = values[name]
    vis_str = f'{v[3]:.1f}' if v[3] < 1000 else 'N/A'
    cell_text.append([name, f'{alt}', f'{v[0]:.1f}', f'{v[1]:.1f}',
                       f'{v[2]:.1f}', vis_str, f'{v[4]:.2f}'])

axes[1, 2].axis('off')
table = axes[1, 2].table(
    cellText=cell_text,
    colLabels=['System', 'Alt [km]', 'RTD [ms]', 'FSPL [dB]',
                'Doppler\n[kHz]', 'Vis [min]', 'Vel [km/s]'],
    loc='center',
    cellLoc='center'
)
table.auto_set_font_size(False)
table.set_fontsize(9)
table.scale(1.2, 1.8)
axes[1, 2].set_title('Satellite System Comparison (elev=30°)', fontsize=12)

plt.tight_layout()
plt.savefig('satellite_orbit_parameters.png', dpi=150, bbox_inches='tight')
plt.show()

この6つのグラフと比較表から、軌道選択のトレードオフが明確に数値化されます。

  1. 伝搬遅延のスケーリング(左上): LEO(550 km)での往復遅延は天頂方向で約4 ms、仰角10度でも約8 ms程度であり、光ファイバーの伝搬遅延と比較しても遜色ありません。一方、GEO(35,786 km)では約250 msに達し、リアルタイムアプリケーションには大きな制約となります。この約60倍の遅延差がLEOコンステレーションの最大の動機です。

  2. 自由空間損失の差は約30 dB(右上): LEO(550 km)とGEO(35,786 km)のFSPLの差は12 GHzで約36 dBです。これは電力比で約4000倍に相当し、LEO衛星では送信電力を大幅に削減できるか、同じ電力でより高いデータレートを実現できることを意味します。

  3. ドップラーシフトはLEOが最大(右上中央): Starlink(550 km)のKu帯でのドップラーシフトは約300 kHzに達します。GEOではほぼゼロです。LEO通信端末はこの高速なドップラー変動に追従する必要があります。

衛星のカバレッジエリアの可視化

次に、異なる高度の衛星がどの程度の地表面をカバーできるかを可視化します。

import numpy as np
import matplotlib.pyplot as plt

Re = 6371  # km

def coverage_radius(h_km, min_elev_deg):
    """衛星のカバレッジ半径 [km](地表面上の距離)"""
    elev = np.radians(min_elev_deg)
    r_sat = Re + h_km

    # 中心角
    central_angle = np.arccos(Re * np.cos(elev) / r_sat) - elev

    # 地表面上の距離
    ground_dist = Re * central_angle
    return ground_dist

def coverage_area(h_km, min_elev_deg):
    """カバレッジ面積 [km^2]"""
    central_angle = coverage_radius(h_km, min_elev_deg) / Re
    area = 2 * np.pi * Re**2 * (1 - np.cos(central_angle))
    return area

def min_satellites_for_coverage(h_km, min_elev_deg):
    """全球カバーに必要な最小衛星数(概算)"""
    earth_surface = 4 * np.pi * Re**2
    single_area = coverage_area(h_km, min_elev_deg)
    # 球面を重なりなくカバーするのは不可能なので、重複係数1.5を掛ける
    n_min = earth_surface / single_area * 1.5
    return n_min

# 高度範囲
h = np.linspace(200, 40000, 500)

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

# カバレッジ半径
for elev in [5, 10, 20, 30]:
    r = coverage_radius(h, elev)
    axes[0].plot(h, r, linewidth=2, label=f'Min elev = {elev}°')

axes[0].set_xlabel('Altitude [km]', fontsize=12)
axes[0].set_ylabel('Coverage Radius [km]', fontsize=12)
axes[0].set_title('Ground Coverage Radius', fontsize=13)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)

# カバレッジ面積(地球表面積の割合で)
earth_area = 4 * np.pi * Re**2  # km^2

for elev in [5, 10, 20]:
    area_frac = coverage_area(h, elev) / earth_area * 100
    axes[1].semilogy(h, area_frac, linewidth=2, label=f'Min elev = {elev}°')

axes[1].set_xlabel('Altitude [km]', fontsize=12)
axes[1].set_ylabel('Coverage Area [% of Earth]', fontsize=12)
axes[1].set_title('Coverage Area Fraction', fontsize=13)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)

# 必要衛星数
h_leo = np.linspace(300, 2000, 200)
for elev in [10, 20, 30]:
    n_sat = min_satellites_for_coverage(h_leo, elev)
    axes[2].plot(h_leo, n_sat, linewidth=2, label=f'Min elev = {elev}°')

axes[2].set_xlabel('Altitude [km]', fontsize=12)
axes[2].set_ylabel('Minimum Satellites for Global Coverage', fontsize=12)
axes[2].set_title('Required Satellites (LEO range)', fontsize=13)
axes[2].legend(fontsize=10)
axes[2].grid(True, alpha=0.3)
axes[2].set_ylim([0, 3000])

# Starlinkの位置をマーク
axes[2].axvline(x=550, color='gray', linestyle=':', alpha=0.5)
axes[2].annotate('Starlink\n(550 km)', xy=(550, 1200),
                  fontsize=10, ha='center')

plt.tight_layout()
plt.savefig('satellite_coverage.png', dpi=150, bbox_inches='tight')
plt.show()

# 具体的な数値
for name, alt in [('Starlink', 550), ('OneWeb', 1200), ('GEO', 35786)]:
    r = coverage_radius(alt, 10)
    area = coverage_area(alt, 10)
    frac = area / earth_area * 100
    print(f"{name} ({alt} km): カバレッジ半径 {r:.0f} km, "
          f"面積 {area:.0f} km², 地球の {frac:.2f}%")

カバレッジ解析の結果から、LEOコンステレーションの設計ロジックが数値的に理解できます。

  1. GEOの圧倒的なカバレッジ(左・中央図): GEO衛星1基は最低仰角10度の条件で地球表面の約34%をカバーし、カバレッジ半径は約6,000 kmに達します。3基あれば極地域を除くほぼ全球をカバーできるのはこの計算から明らかです。

  2. LEOでは多数の衛星が不可避(右図): 高度550 km(Starlink)で最低仰角10度の場合、全球カバーには概算で約800基以上が必要です。仰角要件を20度に上げると1,500基以上に増えます。これにハンドオーバーの冗長性を考慮すると、Starlinkの計画基数(数千基)が合理的であることが分かります。

  3. 高度を上げれば衛星数は減るが遅延が増える: OneWebの高度1,200 kmでは必要衛星数は550 kmの半分程度に減りますが、遅延は約2倍になります。このトレードオフの中で各事業者が異なる高度を選択しています。

衛星通信の周波数帯特性

最後に、各周波数帯における自由空間損失と降雨減衰の影響を統合的に示します。

import numpy as np
import matplotlib.pyplot as plt

# 各衛星システムの代表的パラメータ
systems = {
    'L-band\n(Iridium/GPS)': {'f': 1.5, 'alt': 780, 'color': '#4CAF50'},
    'S-band': {'f': 2.5, 'alt': 1200, 'color': '#8BC34A'},
    'C-band\n(VSAT)': {'f': 6, 'alt': 35786, 'color': '#2196F3'},
    'Ku-band\n(BSat)': {'f': 12, 'alt': 35786, 'color': '#FF9800'},
    'Ka-band\n(Starlink)': {'f': 20, 'alt': 550, 'color': '#F44336'},
    'Ka-band\n(GEO HTS)': {'f': 20, 'alt': 35786, 'color': '#9C27B0'},
}

Re = 6371

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 仰角による自由空間損失の変化(各システム)
elevations = np.linspace(5, 90, 100)

for name, params in systems.items():
    f = params['f']
    h = params['alt']
    fspl_list = []
    for elev in elevations:
        elev_rad = np.radians(elev)
        slant = -Re * np.sin(elev_rad) + np.sqrt(
            (Re * np.sin(elev_rad))**2 + 2 * Re * h + h**2)
        fspl_val = 20 * np.log10(slant * 1000) + 20 * np.log10(f * 1e9) + \
                   20 * np.log10(4 * np.pi / 3e8)
        fspl_list.append(fspl_val)

    axes[0].plot(elevations, fspl_list, linewidth=2,
                  color=params['color'], label=name)

axes[0].set_xlabel('Elevation Angle [deg]', fontsize=12)
axes[0].set_ylabel('Free Space Path Loss [dB]', fontsize=12)
axes[0].set_title('FSPL vs Elevation for Various Systems', fontsize=13)
axes[0].legend(fontsize=8, ncol=2)
axes[0].grid(True, alpha=0.3)
axes[0].invert_yaxis()

# 周波数帯ごとの降雨マージン必要量(概算)
# ITU-R P.618に基づく概算(GEO、仰角30度、東京、0.01%)
freq_bands = ['L\n(1.5 GHz)', 'S\n(2.5 GHz)', 'C\n(6 GHz)',
               'Ku\n(12 GHz)', 'Ka-up\n(30 GHz)', 'Ka-dn\n(20 GHz)',
               'V\n(50 GHz)']
rain_atten = [0.01, 0.05, 0.3, 3.5, 18, 8, 35]  # dB概算
atm_atten = [0.05, 0.05, 0.08, 0.15, 0.4, 0.3, 2.0]  # dB概算

x = np.arange(len(freq_bands))
width = 0.35

bars1 = axes[1].bar(x - width/2, rain_atten, width, label='Rain (0.01%)',
                      color='#2196F3', alpha=0.8)
bars2 = axes[1].bar(x + width/2, atm_atten, width, label='Atmospheric',
                      color='#FF9800', alpha=0.8)

axes[1].set_xlabel('Frequency Band', fontsize=12)
axes[1].set_ylabel('Attenuation [dB]', fontsize=12)
axes[1].set_title('Rain & Atmospheric Attenuation\n'
                    '(GEO, elev=30°, Tokyo, 0.01% exceedance)', fontsize=13)
axes[1].set_xticks(x)
axes[1].set_xticklabels(freq_bands, fontsize=10)
axes[1].legend(fontsize=11)
axes[1].grid(True, alpha=0.3, axis='y')
axes[1].set_yscale('log')
axes[1].set_ylim([0.005, 50])

plt.tight_layout()
plt.savefig('satellite_frequency_comparison.png', dpi=150, bbox_inches='tight')
plt.show()

この周波数帯比較から、衛星通信の周波数設計の要点が明確になります。

  1. LEO Ka帯はGEO Ku帯と同等のFSPL(左図): Starlink(Ka帯、550 km)のFSPLは約170 dBで、BSat(Ku帯、GEO)の約206 dBより約36 dB小さくなっています。LEOの距離の近さがKa帯の高周波数によるFSPL増加を十分に補償していることが分かります。

  2. Ka帯以上では降雨減衰が支配的(右図): C帯では0.01%超過時の降雨減衰が約0.3 dBでほぼ無視できますが、Ka帯のアップリンク(30 GHz)では約18 dBに達します。これはアップリンク電力の60倍以上が雨で吸収されることを意味し、大きな設計マージンが必要です。V帯ではさらに厳しく、大気吸収も加わります。

まとめ

本記事では、衛星通信システムの基礎を体系的に解説しました。

  • システムアーキテクチャ: アップリンク・ダウンリンクの周波数分離とトランスポンダ(ベントパイプ/再生中継)による中継
  • 軌道の分類: GEO(35,786 km)は広域カバレッジだが遅延250 ms、LEO(500〜1,200 km)は低遅延だが多数の衛星が必要。MEOはその中間
  • 周波数帯: L/S帯は降雨に強いが帯域狭い。C帯は安定的だが大型アンテナ必要。Ku帯は放送に最適。Ka帯は大容量だが降雨減衰が大きい
  • 多元接続: FDMA(周波数分割)、TDMA(時分割)、CDMA(符号分割)の3方式があり、現代はハイブリッド方式が主流
  • LEOコンステレーション: Starlinkに代表される数千基規模の衛星群が低遅延・大容量インターネットを実現。ハンドオーバーとドップラー補償が技術的課題

衛星通信の実用的な回線設計を行うには、送信電力から受信品質までを定量的にバランスさせる「リンクバジェット」の考え方が不可欠です。

次のステップとして、以下の記事も参考にしてください。