頭上を通り過ぎる Starlink 衛星にアンテナを向けて受信機を眺めていると、画面上の信号スペクトルが時間とともに右へ左へとゆっくり「流れて」いくのが見えます。衛星は秒速約 $7.6\,\text{km}$ で空を駆け抜けるため、わずか 10 秒のあいだに Ka バンドのキャリア周波数が 500 kHz も動くこともあります。地上の Wi-Fi や 5G では絶対にお目にかかれないこの大きな周波数オフセットの正体が、本記事で扱う LEO 衛星のドップラーシフトです。
ドップラーシフトを正しく扱えないと、LEO 衛星通信ではほとんど何もできません。受信機の局部発振器は周波数を追尾できずに復調に失敗しますし、変調が QPSK や OFDM のように位相情報を使う場合は、ドップラー変化率(Hz/s)が PLL のループ帯域を超えただけでビット誤り率が一気に劣化します。逆にドップラーシフトを「測れる」ようになると、衛星測位(GNSS のドップラー航法)、衛星 IoT 端末の自己位置推定、地球観測衛星のレーダー画像(SAR)など、多くの応用が一気に視野に入ってきます。
本記事の内容
- 古典ドップラー式の復習と、LEO で相対論補正が不要な理由
- 視線速度(range rate)の幾何学的導出 — 仰角・地心角・軌道速度との関係
- ISS(高度約 $400\,\text{km}$)/ Starlink(高度約 $550\,\text{km}$)でのドップラー量の具体計算
- S バンド・Ka バンド・V バンドでの周波数オフセット比較
- パスごとの S 字ドップラー曲線とドップラー変化率の最大値
- PLL ループ帯域への要求とハンドオーバ周期との関係
- Python による「衛星軌道 → ドップラー曲線」の可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと幾何や物理の前提が押さえやすくなります。
- ドップラー効果の理論と応用 — 音波と光それぞれのドップラー効果の基礎
- 衛星通信の基礎 — GEOからLEOコンステレーションまで — 軌道別の通信特性とリンク設計
- 衛星リンクバジェットの計算 — 自由空間損失と受信電力の評価
- 低軌道(LEO)の特徴と軌道力学 — LEO の高度・周期・速度の関係
ドップラーシフトとは(直感で押さえる)
救急車のサイレンからの類推
ドップラーシフトの直感は、救急車のサイレンの音程変化と完全に同じです。救急車が近づいてくる間は音波の山が押し縮められ、観測者には実際よりも高い周波数として届きます。通り過ぎた瞬間に音程が一段落ちて聞こえるのは、波の山が引き伸ばされて低い周波数になるからです。
LEO 衛星と地上局の関係も、これと全く同じ構図です。違うのは「波の媒質が空気でなく真空中の電磁波である」ことと、「ソースが秒速 $7.6\,\text{km}$ という日常離れした速さで空を横切る」ことだけです。電磁波には音波と違って「媒質」がないので、相対速度だけが本質的に効きます。直感としては、衛星が地上局に近づいている間は周波数が高い側へ、遠ざかっている間は低い側へ偏移する、というだけのシンプルな話です。
LEO ならではの「速さ」と「角度」
ここで重要なのは、LEO 衛星の動きが「地上から見ると驚くほど速い」という点です。GEO 衛星は地上から見ればほぼ静止していて、ドップラーシフトは衛星の南北方向の摂動による微少なものに限られます。一方、高度 $500\,\text{km}$ の LEO 衛星は秒速 $7.6\,\text{km}$ で動き、地平線から地平線まで数分で通過します。
このとき重要になるのが視線方向の速度成分、すなわち視線速度(range rate)です。衛星が地上局の真上(仰角 $90^\circ$)を通る瞬間、衛星の速度ベクトルは視線(地上局と衛星を結ぶ直線)に対してほぼ垂直になり、視線速度はゼロになります。つまり、頭の真上を通った瞬間にドップラーシフトはちょうどゼロを横切ります。これは「衛星が一番近い瞬間に音が一番高い」と思いがちな直感とは逆の現象であり、本記事の核心です。
これらの直感が押さえられたところで、次のセクションで数式に落としていきます。
数学的定式化(視線速度ベクトルとドップラー式)
古典ドップラー式の復習
電磁波のドップラーシフトを LEO 衛星の文脈で扱うには、まず古典的(非相対論的)な式から始めます。送信周波数 $f_T$、相対視線速度を $v_r$(観測者から遠ざかる方向を正)とすると、観測周波数 $f_R$ は
$$ \begin{equation} f_R = f_T \left(1 – \frac{v_r}{c}\right) \end{equation} $$
で与えられます。ここで $c$ は光速、$v_r$ は range rate とも呼ばれ、衛星と地上局を結ぶ直線(視線)方向への相対速度を表します。ドップラーシフト量 $\Delta f = f_R – f_T$ は
$$ \begin{equation} \Delta f = -f_T \frac{v_r}{c} \end{equation} $$
となり、衛星が近づいている($v_r < 0$)ときに $\Delta f > 0$、すなわち周波数が上にずれます。
LEO で相対論補正は要るか?
「衛星が秒速 $7.6\,\text{km}$ で動くなら、相対論的ドップラー効果まで考えるべきでは?」という疑問は当然湧きます。相対論的ドップラー式は、送信源と観測者の相対速度を $v$、視線とのなす角を $\theta$(観測者基準)とすると
$$ \begin{equation} f_R = f_T \frac{\sqrt{1 – \beta^2}}{1 – \beta\cos\theta}, \quad \beta = \frac{v}{c} \end{equation} $$
と書けます。LEO の場合、$\beta = v/c \simeq 7.6\times 10^3 / 3.0\times 10^8 \simeq 2.5\times 10^{-5}$ なので、ローレンツ因子 $\sqrt{1-\beta^2}$ は約 $1 – 3\times 10^{-10}$ となり、$10\,\text{GHz}$ の搬送波で見ても相対論補正は $3\,\text{Hz}$ オーダーにすぎません。古典ドップラーが与える数十 kHz 〜数百 kHz の偏移と比べると無視できる大きさです。
ただし、GNSS のように $\text{ns}$ オーダーの時刻決定が必要な系では、相対論的(特に重力ポテンシャル差による)周波数シフトが本質的に効きます。本記事の対象である LEO 通信リンクでは古典近似で十分です。
視線速度ベクトルの定義
次に、視線速度 $v_r$ を幾何的にきちんと定義しておきましょう。地球中心慣性系(ECI)における衛星位置を $\bm{r}_{sat}(t)$、地上局位置を $\bm{r}_{gs}(t)$ とすると、地上局から衛星への相対位置ベクトルは
$$ \begin{equation} \bm{\rho}(t) = \bm{r}_{sat}(t) – \bm{r}_{gs}(t) \end{equation} $$
です。スラント距離(slant range)は $\rho(t) = |\bm{\rho}(t)|$。視線速度は単にこのスラント距離の時間微分
$$ \begin{equation} v_r(t) = \dot{\rho}(t) = \frac{d}{dt}|\bm{\rho}(t)| \end{equation} $$
として定義されます。ベクトル形式で書けば、視線方向の単位ベクトル $\hat{\bm{\rho}} = \bm{\rho}/\rho$ に対して
$$ \begin{equation} v_r = \dot{\bm{\rho}}\cdot\hat{\bm{\rho}} = (\dot{\bm{r}}_{sat} – \dot{\bm{r}}_{gs})\cdot\hat{\bm{\rho}} \end{equation} $$
となります。これは「相対速度ベクトルの視線方向成分」という最も素直な表現で、後の幾何的議論はすべてこの式に帰着します。
衛星速度を視線方向に射影する
地上局が地球とともに自転している速度は、低緯度でも秒速 $0.46\,\text{km}$ 程度であり、LEO 衛星の軌道速度 $v_{sat}\approx 7.6\,\text{km/s}$ の 6% 程度です。粗い見積もりではいったん $\dot{\bm{r}}_{gs}=\bm{0}$ と置いて簡略化しましょう(後で具体計算では含めます)。すると
$$ v_r \simeq \bm{v}_{sat}\cdot\hat{\bm{\rho}} $$
となり、衛星速度ベクトルを視線方向に「射影」した量が視線速度であることがわかります。この射影が、軌道幾何と結びついて見やすい形に変形できることが、LEO ドップラー解析の出発点です。
ここまでで視線速度の定義を確認しました。次は具体的に LEO 軌道の幾何に当てはめて、ドップラーシフトの大きさと時間変化を導出していきます。
LEO 幾何でのドップラーシフトの導出
地心角 $\gamma$・仰角 $\epsilon$・スラント距離 $\rho$ の関係
LEO の解析でよく使われる幾何が、地心角・仰角・スラント距離の三角形です。地球半径を $R_E$、衛星の軌道半径を $r=R_E+h$($h$ は高度)、地心角(衛星と地上局の地心からの角度差)を $\gamma$、地上局から衛星を見上げる仰角を $\epsilon$ とすると、余弦定理より
$$ \begin{equation} \rho^2 = R_E^2 + r^2 – 2 R_E r \cos\gamma \end{equation} $$
が成り立ちます。同じ三角形に対する正弦定理から、仰角と地心角は
$$ \begin{equation} \cos\epsilon = \frac{r}{\rho}\sin\gamma, \qquad \sin\epsilon = \frac{r\cos\gamma – R_E}{\rho} \end{equation} $$
という関係で結ばれます。第二式は、観測者の天頂方向と視線方向の角度関係から幾何的に出てきます。
視線速度を $\gamma$ と $\dot\gamma$ で書き直す
ここで、衛星が地心を中心とする円軌道上を運動し、地球の自転と地上局の運動は無視すると仮定しましょう(後で Python で全部入りで扱います)。すると地心角 $\gamma$ の時間変化率は、衛星の軌道角速度 $\omega_{orb}=v_{sat}/r$ をそのまま使って $\dot\gamma\simeq\omega_{orb}$ となります。
スラント距離の式の両辺を $t$ で微分すると、
$$ 2\rho\dot\rho = 2 R_E r \sin\gamma\cdot\dot\gamma $$
ここで右辺は「$-2 R_E r\cos\gamma$ を時間で微分する」と $+2 R_E r\sin\gamma\cdot\dot\gamma$ になることから出てきます。両辺を $2\rho$ で割って $\dot\rho=v_r$ を取り出すと
$$ \begin{equation} v_r = \frac{R_E r \sin\gamma}{\rho}\cdot\dot\gamma = \frac{R_E r \sin\gamma}{\rho}\cdot\frac{v_{sat}}{r} = \frac{R_E\sin\gamma}{\rho}\,v_{sat} \end{equation} $$
という綺麗な式が得られます。これは「衛星速度のうち、視線方向に射影される成分は $R_E\sin\gamma / \rho$ で決まる」という幾何的事実を表しています。
仰角 $\epsilon$ で書いた形
実用上は地心角 $\gamma$ ではなく、地上局からの仰角 $\epsilon$ で議論したい場面が多いです。先ほどの正弦定理 $\cos\epsilon=r\sin\gamma/\rho$ を使うと、$R_E\sin\gamma/\rho$ の形に整理する必要があります。両辺に $R_E/r$ を掛けて
$$ \frac{R_E}{r}\cos\epsilon = \frac{R_E\sin\gamma}{\rho} $$
が得られるので、これを先ほどの $v_r$ の式に代入すると
$$ \begin{equation} v_r = \frac{R_E}{r}\,v_{sat}\,\cos\epsilon \end{equation} $$
という非常に見通しの良い式に到達します。LEO の解析で最もよく出てくるのがこの形です。$\cos\epsilon$ の因子があるため、仰角が $90^\circ$(衛星が頭の真上)に近づくと視線速度はゼロになり、地平線($\epsilon=0$)で最大値 $v_{r,\max}=(R_E/r)v_{sat}$ を取ります。
ただし、この式は「衛星と地上局・地心が同一平面上にあり、衛星が地上局の天頂を通過する理想パス」での値です。実際の通過では衛星が地上局の真上を外れて通るため、最大仰角 $\epsilon_{\max}<90^\circ$ となり、ドップラーシフトはゼロを横切らないこともあります。
ドップラーシフト量の最終形
得られた $v_r$ を古典ドップラー式に代入すると、
$$ \begin{equation} \Delta f(\epsilon) = -f_T\cdot\frac{R_E v_{sat}}{c\, r}\cos\epsilon \end{equation} $$
となります。最大シフト量は地平線($\epsilon=0$)通過時で
$$ \begin{equation} |\Delta f|_{\max} = f_T\cdot\frac{R_E v_{sat}}{c\, r} \end{equation} $$
になります。ここで $v_{sat}=\sqrt{\mu/r}$(円軌道の速度、$\mu=GM_E$)を入れれば、高度 $h$ だけで最大ドップラーが決まります。具体値は次セクションで Python と一緒に確認しましょう。
ここまでで LEO のドップラーシフトを幾何的に閉じた形にできました。次は、地球の自転や軌道の傾きを含めた現実的な計算を Python で行います。
Pythonでの実装(ISS軌道で具体計算)
1. 最大ドップラーシフトの高度依存性
まずは「軌道高度ごとに最大ドップラーシフトがどう変わるか」を、上で導いた閉形式の式
$$ |\Delta f|_{\max} = f_T\cdot\frac{R_E v_{sat}}{c\, r} $$
を使ってプロットしてみます。
import numpy as np
import matplotlib.pyplot as plt
# 物理定数
c = 2.99792458e8 # 光速 [m/s]
mu = 3.986004418e14 # 地心重力定数 [m^3/s^2]
R_E = 6378.137e3 # 地球半径 [m]
# 軌道高度を変えて最大ドップラーを計算
h = np.linspace(200e3, 2000e3, 200) # 200 km 〜 2000 km
r = R_E + h
v_sat = np.sqrt(mu / r) # 円軌道速度 [m/s]
# 周波数帯ごとの最大ドップラーシフト
bands = {
"L (1.5 GHz)": 1.5e9,
"S (2.2 GHz)": 2.2e9,
"X (8.4 GHz)": 8.4e9,
"Ku (12 GHz)": 12e9,
"Ka (20 GHz)": 20e9,
"V (40 GHz)": 40e9,
}
plt.figure(figsize=(8, 5))
for label, f_T in bands.items():
df_max = f_T * R_E * v_sat / (c * r) # [Hz]
plt.plot(h / 1e3, df_max / 1e3, label=label)
plt.xlabel("Altitude [km]")
plt.ylabel("|Δf|_max [kHz]")
plt.title("Maximum Doppler shift vs. LEO altitude (overhead pass, ε=0)")
plt.grid(True, alpha=0.3)
plt.legend()
plt.tight_layout()
plt.show()
このグラフから、いくつか重要な特徴が読み取れます。まず、高度が上がるほど最大ドップラーシフトは緩やかに減少します。これは $R_E v_{sat}/(c\, r)\propto 1/r\cdot\sqrt{\mu/r}=\sqrt{\mu}/(c\, r^{3/2})$ なので、$r^{-3/2}$ で効くためです。次に、周波数帯が高くなるほど偏移量は線形に増えることが見て取れます。L バンドでは最大数 kHz 程度に収まる一方、Ka バンドでは数百 kHz、V バンドではほぼ MHz オーダーに達します。これが、高帯域 LEO 通信でドップラー追尾が桁違いに難しい技術課題となる根本的な理由です。
2. ISS の現実的なパスで計算する
次に、ISS(高度約 $400\,\text{km}$)の現実的なパスを想定して、時間とともにドップラーシフトがどう変化するかを見ます。ここでは地球を球と近似し、円軌道の衛星が観測者の天頂を通過する理想パスをまずシミュレートします。
import numpy as np
import matplotlib.pyplot as plt
# 物理定数
c = 2.99792458e8
mu = 3.986004418e14
R_E = 6378.137e3
# ISS の典型高度
h_iss = 400e3
r_iss = R_E + h_iss
v_iss = np.sqrt(mu / r_iss)
T_orb = 2 * np.pi * np.sqrt(r_iss**3 / mu) # 軌道周期
omega_orb = 2 * np.pi / T_orb # 軌道角速度 [rad/s]
print(f"ISS 軌道速度: {v_iss/1e3:.3f} km/s")
print(f"ISS 軌道周期: {T_orb/60:.2f} min")
print(f"ISS 軌道角速度: {np.degrees(omega_orb):.4f} deg/s")
# 観測者の天頂を通過するパスを仮定
# t=0 を最大仰角(ε=90°)の瞬間とする
t = np.linspace(-600, 600, 4001) # ±10 分間 [s]
gamma = omega_orb * t # 地心角 [rad](通過時 0)
# スラント距離・仰角・視線速度
rho = np.sqrt(R_E**2 + r_iss**2 - 2 * R_E * r_iss * np.cos(gamma))
sin_eps = (r_iss * np.cos(gamma) - R_E) / rho
eps = np.arcsin(np.clip(sin_eps, -1.0, 1.0))
v_r = R_E * r_iss * np.sin(gamma) * omega_orb / rho # [m/s]
# 仰角 0°(地平線)以下はパス外として除外
visible = eps > 0
t_v = t[visible]
v_r_v = v_r[visible]
eps_v = eps[visible]
rho_v = rho[visible]
# Sバンド 2.2 GHz と Kaバンド 20 GHz のドップラー
f_S = 2.2e9
f_Ka = 20e9
df_S = -f_S * v_r_v / c
df_Ka = -f_Ka * v_r_v / c
fig, ax = plt.subplots(2, 1, figsize=(9, 7), sharex=True)
ax[0].plot(t_v, np.degrees(eps_v), color="tab:blue")
ax[0].set_ylabel("Elevation ε [deg]")
ax[0].set_title("ISS overhead pass: elevation and Doppler shift")
ax[0].grid(True, alpha=0.3)
ax[1].plot(t_v, df_S / 1e3, label="S-band 2.2 GHz", color="tab:orange")
ax[1].plot(t_v, df_Ka / 1e3, label="Ka-band 20 GHz", color="tab:green")
ax[1].axhline(0, color="black", lw=0.5)
ax[1].set_xlabel("Time from zenith [s]")
ax[1].set_ylabel("Doppler shift Δf [kHz]")
ax[1].legend()
ax[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 最大ドップラーと天頂通過時のドップラー変化率
df_S_max = np.max(np.abs(df_S))
df_Ka_max = np.max(np.abs(df_Ka))
print(f"|Δf|_max (S-band) = {df_S_max/1e3:.2f} kHz")
print(f"|Δf|_max (Ka-band) = {df_Ka_max/1e3:.2f} kHz")
このプロットから、LEO ドップラーシフトの最も特徴的な振る舞いが読み取れます。仰角は中央で $90^\circ$ に達し、両端で $0^\circ$(地平線)まで下がる山型になっており、可視時間は約 11 分程度しかありません。一方、ドップラーシフトは中央でちょうどゼロを横切る S 字カーブを描き、両端の地平線付近で最大の正・負シフトを取ります。S バンドでは最大約 $\pm 56\,\text{kHz}$、Ka バンドでは約 $\pm 510\,\text{kHz}$ と桁違いの値になります。直感的には「一番近い瞬間(天頂)はドップラーゼロ、一番遠い瞬間(地平線)にシフト最大」という反直感的な事実が、$\cos\epsilon$ の幾何で説明されているわけです。
3. ドップラー変化率(Hz/s)の評価
次に、PLL ループ帯域への要求を決める ドップラー変化率 $\dot{\Delta f}=d(\Delta f)/dt$ を計算します。理論的には $\Delta f=-f_T(R_E/r)v_{sat}\cos\epsilon$ なので、$\dot{\Delta f}=f_T(R_E/r)v_{sat}\sin\epsilon\cdot\dot\epsilon$ となり、天頂通過の瞬間($\epsilon=90^\circ$、$\sin\epsilon=1$)で最大になります。
import numpy as np
import matplotlib.pyplot as plt
# 上のシミュレーションの続きを使う前提
df_S_series = -f_S * v_r / c # 全時間のドップラー
df_Ka_series = -f_Ka * v_r / c
dt = t[1] - t[0]
# 数値微分でドップラー変化率
ddf_S = np.gradient(df_S_series, dt)
ddf_Ka = np.gradient(df_Ka_series, dt)
visible = eps > 0
plt.figure(figsize=(9, 5))
plt.plot(t[visible], ddf_S[visible], label="S-band 2.2 GHz", color="tab:orange")
plt.plot(t[visible], ddf_Ka[visible], label="Ka-band 20 GHz", color="tab:green")
plt.axhline(0, color="black", lw=0.5)
plt.xlabel("Time from zenith [s]")
plt.ylabel("Doppler rate dΔf/dt [Hz/s]")
plt.title("Doppler rate during ISS overhead pass")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
print(f"max|dΔf/dt| (S-band) = {np.max(np.abs(ddf_S[visible])):.1f} Hz/s")
print(f"max|dΔf/dt| (Ka-band) = {np.max(np.abs(ddf_Ka[visible])):.1f} Hz/s")
この変化率カーブから、いくつかの設計的に重要な事実が見えてきます。第一に、ドップラー変化率は天頂通過の瞬間に絶対値最大となり、その点でカーブの傾きが最も急になっています。第二に、変化率の絶対値は周波数帯に正比例しており、S バンドで $\approx 300\,\text{Hz/s}$ 程度のところ、Ka バンドでは $\approx 3\,\text{kHz/s}$ に達します。第三に、変化率がパス全体を通してずっと符号を変えながら推移しているため、PLL は「正の周波数偏移を追尾している状態から、数分の間に負の偏移へ追従する」必要があります。これが LEO 受信機での アクセス取得 → 追尾 → 解放 のシーケンスを難しくする本質です。
4. 最大仰角を変えたパスの比較
実際の運用では衛星が地上局の真上を通ることは稀で、最大仰角 $\epsilon_{\max}$ が数 $10^\circ$ にとどまるパスのほうがずっと一般的です。最大仰角が下がると、視線距離が長くなり、ドップラーの形状も変わります。
import numpy as np
import matplotlib.pyplot as plt
c = 2.99792458e8
mu = 3.986004418e14
R_E = 6378.137e3
h = 550e3 # Starlink 想定
r = R_E + h
v_sat = np.sqrt(mu / r)
omega_orb = v_sat / r
f_Ka = 20e9
def pass_doppler(epsilon_max_deg, n=4001):
"""最大仰角を指定して、その通過パスのドップラー曲線を返す"""
# 最大仰角 ε_max を満たす最近接スラント距離 rho_min を逆算
eps_max = np.radians(epsilon_max_deg)
rho_min = np.sqrt(r**2 - R_E**2 * np.cos(eps_max)**2) - R_E * np.sin(eps_max)
cos_gamma_min = (R_E**2 + r**2 - rho_min**2) / (2 * R_E * r)
gamma_min = np.arccos(np.clip(cos_gamma_min, -1.0, 1.0))
# 軌道面と地上局の鉛直幾何で γ(t)^2 = γ_min^2 + (ω_orb t)^2 と近似
t = np.linspace(-600, 600, n)
gamma = np.sqrt(gamma_min**2 + (omega_orb * t)**2)
rho = np.sqrt(R_E**2 + r**2 - 2 * R_E * r * np.cos(gamma))
eps = np.arcsin(np.clip((r * np.cos(gamma) - R_E) / rho, -1.0, 1.0))
# 視線速度は dρ/dt を数値微分
dt = t[1] - t[0]
v_r = np.gradient(rho, dt)
df = -f_Ka * v_r / c
visible = eps > 0
return t[visible], df[visible], eps[visible]
plt.figure(figsize=(9, 5))
for eps_max_deg in [90, 60, 30, 10]:
t_v, df_v, eps_v = pass_doppler(eps_max_deg)
plt.plot(t_v, df_v / 1e3, label=f"ε_max = {eps_max_deg}°")
plt.xlabel("Time from closest approach [s]")
plt.ylabel("Doppler shift Δf [kHz] (Ka-band)")
plt.title("Doppler curves for different maximum elevations (h = 550 km)")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
この比較から、次の重要な振る舞いが読み取れます。最大仰角が低いほど可視時間(パス長)が長くなる一方、ドップラーシフトの絶対値最大は変わらない点です。これは、地平線出現時には必ず仰角 $\epsilon\to 0$ となるため、シフト最大値は最大仰角に依らず $(R_E/r)v_{sat}\cdot f_T/c$ で決まるからです。一方で、$\epsilon_{\max}=90^\circ$ の理想パスのみシフトがゼロを完全に横切るのに対して、$\epsilon_{\max}<90^\circ$ のパスでは「最近接時にも視線速度がゼロにならない」ため、ドップラー曲線がゼロを跨がないこともある、という違いが見えています。これは衛星 IoT 端末などで「ドップラーのゼロクロスを検出して衛星が真上を通った瞬間を測位ヒントに使う」アルゴリズムが、最大仰角に応じて挙動を変える理由でもあります。
ここまでで Python を使った具体計算の中身を見てきました。次は実用上重要な、周波数帯ごとのドップラー量の桁感をまとめておきましょう。
周波数帯ごとのドップラー量比較
LEO 通信で実際に使われる周波数帯はおおよそ表のように分布しています。ここで「最大ドップラーシフト」は、高度 $550\,\text{km}$、$\epsilon=0$(地平線通過時)の値を採用しています。$v_{sat}=7.59\,\text{km/s}$、$r=R_E+550\,\text{km}$ から $(R_E/r)v_{sat}\approx 7.0\,\text{km/s}$ となるため、
$$ |\Delta f|_{\max} \approx \frac{7.0\,\text{km/s}}{c}\cdot f_T \approx 2.34\times 10^{-5}\cdot f_T $$
という近似が使えます。
| 周波数帯 | 代表周波数 $f_T$ | $\|\Delta f\|_{\max}$ | 最大ドップラー変化率 |
|---|---|---|---|
| L band | $1.5\,\text{GHz}$ | $\approx 35\,\text{kHz}$ | $\approx 0.21\,\text{kHz/s}$ |
| S band | $2.2\,\text{GHz}$ | $\approx 52\,\text{kHz}$ | $\approx 0.30\,\text{kHz/s}$ |
| X band | $8.4\,\text{GHz}$ | $\approx 197\,\text{kHz}$ | $\approx 1.14\,\text{kHz/s}$ |
| Ku band | $12\,\text{GHz}$ | $\approx 281\,\text{kHz}$ | $\approx 1.63\,\text{kHz/s}$ |
| Ka band | $20\,\text{GHz}$ | $\approx 468\,\text{kHz}$ | $\approx 2.72\,\text{kHz/s}$ |
| V band | $40\,\text{GHz}$ | $\approx 936\,\text{kHz}$ | $\approx 5.43\,\text{kHz/s}$ |
この表から見えてくる設計上の含意を整理しておきます。L バンド / S バンドのレベル(数十 kHz)であれば、コヒーレント PLL でも比較的容易に追尾できます。1980 年代から続く Iridium(L バンド)の音声サービスが、アナログ的な周波数自動制御 (AFC) で十分動作してきたのはこのためです。
一方、Ku / Ka / V バンドの数百 kHz 〜 MHz オーダーになると、受信機は ドップラー予測値による粗追尾 + PLL による細追尾 のハイブリッド構成が事実上必須になります。Starlink の Ka バンド端末や OneWeb の Ku バンド端末は、衛星 ephemeris(軌道情報)を端末側に持たせ、「次の 10 秒間で周波数がここからここまで動く」とあらかじめ予測した上で局部発振器に補正をかけています。
Hz/s が PLL ループ帯域に課す要求
ドップラー変化率がループ帯域 $B_L$ を超えると、PLL は周波数を追従できなくなります。経験則として、変化率 $|d\Delta f/dt|$ に対して、PLL が定常追尾誤差を許容範囲に抑えるためには
$$ B_L \gtrsim \sqrt{\frac{|d\Delta f/dt|}{\zeta\cdot\omega_n}} $$
の形でループ帯域を取れ、と覚えておけば実用上十分です。Ka バンドの $\approx 3\,\text{kHz/s}$ では $B_L\sim 50\,\text{Hz}$ オーダーが目安となり、シンボルレートが数十 Msps の場合は十分小さく取れますが、低 SNR 環境では位相雑音と追尾性能のトレードオフがシビアになります。
ここまでで周波数帯ごとの定量比較がまとまったので、次は LEO 特有の「衛星が短時間で頭上を通り過ぎる」という制約と、ハンドオーバ周期の話につなげましょう。
可視時間とハンドオーバ周期の関係
1 パスの可視時間
最大仰角 $\epsilon_{\max}=90^\circ$(衛星が天頂を通る)のパスでは、可視時間は地平線出現 ($\epsilon=0$) から地平線消失までの時間で、円軌道近似のもとで
$$ \begin{equation} T_{vis} = \frac{2}{\omega_{orb}}\arccos\left(\frac{R_E}{r}\right) \end{equation} $$
で与えられます。これは「衛星が地心角で $\pm\arccos(R_E/r)$ の範囲に入っている時間」という幾何的事実です。高度 $550\,\text{km}$ の Starlink で具体値を入れると、$R_E/r=0.918$、$\arccos(0.918)=23.4^\circ=0.408\,\text{rad}$、$\omega_{orb}=0.0011\,\text{rad/s}$ から
$$ T_{vis}\approx \frac{2\times 0.408}{0.0011}\approx 740\,\text{s}\approx 12.3\,\text{min} $$
となります。これは「真上通過」の理想パスでの値で、最大仰角が低いほど短くなります。最大仰角 $\epsilon_{\max}=30^\circ$ 程度の典型的なパスでは可視時間が $5\,\text{min}$ を切ることも珍しくありません。
ハンドオーバ周期と要求される追尾アジリティ
LEO コンステレーションでは、ユーザ端末は数分おきに「次の衛星」へとリンクをハンドオーバする必要があります。Starlink の場合、典型的なハンドオーバ周期は 約 15 秒と公表されており、これは可視時間 12 分のうち多数の衛星が頭上を通過しているため、最良の衛星に「逐次乗り換え」していくセル設計を取っているからです。
ハンドオーバ周期 $T_{HO}$ の間、ユーザ端末は
$$ \Delta f_{HO} \approx |d\Delta f/dt|\cdot T_{HO} $$
の周波数変化を追従しなければなりません。Ka バンドの $3\,\text{kHz/s}$ で $T_{HO}=15\,\text{s}$ なら $\Delta f_{HO}\approx 45\,\text{kHz}$ となり、これは PLL のキャプチャ範囲(一般に数 kHz 〜数十 kHz)と同程度です。つまり、衛星 ephemeris を使った前方フィードフォワード補正がないと、ハンドオーバの瞬間にロックが外れる可能性が現実にあります。
逆に L バンドの $0.2\,\text{kHz/s}$ 程度であれば $T_{HO}=15\,\text{s}$ で $\Delta f_{HO}\approx 3\,\text{kHz}$ と小さく、フィードバックのみで追尾可能です。これが「衛星 IoT では L バンドが使われやすい」一因にもなっています。
コンステレーションサイズへの含意
可視時間 $T_{vis}$ とハンドオーバ周期 $T_{HO}$、要求カバレッジ確率は、コンステレーション全体の衛星数 $N$ と直結します。簡略的な見積もりとして、ある地上点に常に少なくとも 1 機が仰角 $\epsilon_{\min}$ 以上で見える条件は、各衛星のカバー面積(仰角 $\epsilon_{\min}$ で見える地球表面の面積)$A_{cov}$ と地球表面積 $4\pi R_E^2$ から
$$ N \gtrsim \frac{4\pi R_E^2}{A_{cov}} $$
として概算できます。Starlink の第 1 シェル(高度 $550\,\text{km}$、$\epsilon_{\min}=40^\circ$)では 1 機あたりのカバー面積が地球表面積のおよそ $0.27\%$ で、これに余裕係数を見込むと $\sim 1500$ 機程度というオーダーが見えてきます。実際の Shell-1 は約 1584 機 (72 軌道面 × 22 機) と発表されており、上記の幾何が確かにコンステレーション設計の基本制約になっていることがわかります。
ここまでで、ドップラー、可視時間、ハンドオーバ周期がコンステレーション設計まで一気通貫に効いていることが見えました。最後に、応用上気を付けるべき細かい補足と全体まとめに移ります。
実用上の補足
地球自転による補正
ここまで地上局を静止としてきましたが、地球は自転しており、緯度 $\phi$ の地上局は東向きに $v_{gs}=\omega_E R_E\cos\phi$(赤道で約 $0.465\,\text{km/s}$)で動いています。衛星の進行方向と地上局の動きが同じ向きなら視線速度が減り、逆向きなら増えます。LEO 衛星速度の 6% 程度なので、ドップラー量も最大 6% 程度の補正が入る、という見積もりです。極軌道衛星の昇交点・降交点でこの効果が最も強く出ます。
軌道面外通過と楕円軌道
実際の LEO 衛星は完全な円軌道ではなく、$e=0.001\sim 0.01$ 程度のわずかな離心率を持ち、また地上局は軌道面上にあるとは限りません。これらの補正は、軌道計算ライブラリ(pyephem や Skyfield、SGP4 propagator など)を用いれば自然に取り込まれます。詳しくは Pythonで衛星軌道を計算する — pyephemとSkyfield を参照してください。
双方向ドップラー(送信側と受信側の両方が動く場合)
衛星間光通信や LEO 間中継では、両端が秒速 $7.6\,\text{km}$ で動いているため、ドップラーは単純に「2 倍」とは限らず、視線方向に対する両側の速度成分を別々に評価する必要があります。実用上は相対速度ベクトル $\bm{v}_{rel}=\bm{v}_2-\bm{v}_1$ を視線方向に射影した量を $v_r$ とすればよく、本記事の式は双方向にも自然に拡張されます。
GNSS のドップラー航法との関係
地上での GNSS 測位では、衛星から届く擬似距離だけでなくドップラーシフトも測定し、受信機の三次元速度を推定するのに使います。本記事の式と同じ枠組みで、$f_R-f_T$ から $v_r$ が求まり、複数衛星の $v_r$ を連立すれば受信機速度ベクトル $\bm{v}_{rx}$ が解ける、という発想です。LEO に応用すると、衛星から地上端末に送られるダウンリンクのドップラーを測れば、端末側の自己位置も粗く推定できることになります。これは Iridium NEXT や Argos などの「LEO 信号を使った測位」研究で活発に取り組まれている分野です。
これらの実用上の補足を踏まえると、本記事の閉形式の式と Python のシミュレーションは、現実の LEO 通信システム設計に直接使える「最初の見積もり」として十分な精度を持っていることがわかります。
まとめ
本記事では、LEO 衛星のドップラーシフトを「軌道幾何 → 視線速度 → 周波数オフセット → ハンドオーバ周期」という一本の流れで解説しました。
- 古典ドップラー式 $f_R=f_T(1-v_r/c)$ が LEO で完全に通用すること($\beta\sim 10^{-5}$ なので相対論補正は無視可能)
- 視線速度を 仰角 $\epsilon$ と軌道速度 $v_{sat}$ だけで $v_r=(R_E/r)v_{sat}\cos\epsilon$ と書ける幾何関係
- 最大ドップラーシフトは 地平線通過時に発生し、$|\Delta f|_{\max}=(R_E/r)(v_{sat}/c)f_T$ で見積もれること
- S バンドで数十 kHz、Ka バンドで数百 kHz、V バンドで MHz オーダーになり、周波数帯が上がるほど線形に厳しくなること
- ドップラー変化率は 天頂通過時に最大で、Ka バンドで $\sim 3\,\text{kHz/s}$、PLL ループ帯域への要求を直接決めること
- 可視時間 $T_{vis}$ とハンドオーバ周期 $T_{HO}$ がドップラー設計に絡み、結果的にコンステレーションの最小衛星数まで決めること
LEO ドップラーは単なる「迷惑な現象」ではなく、軌道幾何と通信設計、コンステレーション規模、さらには測位応用まで一気に貫く中心的な物理量です。本記事で導入した式と Python のコードを土台に、より発展的なトピックへ進んでみてください。
次のステップとして、以下の記事も参考にしてください。
- 衛星リンクバジェットの計算 — ドップラーと並ぶ LEO 通信のもう一つの主役、自由空間損失と SNR 設計
- 衛星通信における多元接続方式 — TDMA/FDMA/CDMA と LEO 特有のドップラー考慮
- Pythonで衛星軌道を計算する — pyephemとSkyfield — SGP4 を使った現実の軌道伝播
- ドップラー効果の理論と応用 — 古典ドップラー効果と相対論的補正の物理的基礎