SAR(合成開口レーダー)の原理を導出して理解する

SAR(Synthetic Aperture Radar: 合成開口レーダー)は、プラットフォーム(航空機や人工衛星)の移動を利用して仮想的に巨大なアンテナ開口を合成し、実際のアンテナサイズでは到底得られない高いアジマス分解能を実現するレーダー技術です。天候や昼夜に左右されずに地表面を高解像度で観測できるため、リモートセンシングの主力技術として広く利用されています。

本記事では、実開口レーダーの分解能限界からスタートし、なぜ合成開口が必要なのか、そしてSARのアジマス分解能がアンテナ長 $D$ の半分 $D/2$ になるという一見逆説的な結果を数式で丁寧に導出します。さらに、レンジ方向の分解能改善のためのパルス圧縮、SARの信号処理であるレンジ-ドップラーアルゴリズムについても解説し、最後にPythonで点目標のSARシミュレーションを実装します。

本記事の内容

  • 実開口レーダー(RAR)のアジマス分解能の限界
  • 合成開口レーダーの原理と仮想的な大開口アンテナ
  • SARのアジマス分解能 $D/2$ の導出
  • レンジ分解能 $c/(2B)$ とパルス圧縮
  • レンジ-ドップラーアルゴリズムの概要
  • SARの応用分野
  • Pythonでの点目標SARシミュレーション

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

実開口レーダー(RAR)の分解能限界

アジマス分解能

まず、通常のレーダー(実開口レーダー, Real Aperture Radar: RAR)のアジマス方向(進行方向)の分解能を確認しましょう。

アンテナの長さ(開口径)を $D$、波長を $\lambda$ とすると、アンテナのビーム幅(半値全幅)はおおよそ次のように与えられます。

$$ \theta_{3\mathrm{dB}} \approx \frac{\lambda}{D} $$

この角度ビーム幅を持つレーダーが、距離 $R$ にある目標を照射する場合、アジマス方向の分解能(地上での分解可能な最小距離)は次のようになります。

$$ \delta_{az}^{\mathrm{RAR}} = R \cdot \theta_{3\mathrm{dB}} = \frac{R\lambda}{D} $$

数値例で限界を体感する

具体的な数値を入れてみましょう。人工衛星SARの典型的なパラメータとして、軌道高度 $R = 800 \, \mathrm{km}$、波長 $\lambda = 0.056 \, \mathrm{m}$(Cバンド, 5.3 GHz)、アンテナ長 $D = 10 \, \mathrm{m}$ を考えます。

$$ \delta_{az}^{\mathrm{RAR}} = \frac{800 \times 10^3 \times 0.056}{10} = 4{,}480 \, \mathrm{m} \approx 4.5 \, \mathrm{km} $$

アジマス分解能が約4.5 kmでは、地表面の詳細な観測は到底できません。分解能を1 mにするためには、アンテナ長 $D$ を次のように計算できます。

$$ D = \frac{R\lambda}{\delta_{az}} = \frac{800 \times 10^3 \times 0.056}{1} = 44{,}800 \, \mathrm{m} \approx 45 \, \mathrm{km} $$

約45 kmのアンテナを衛星に搭載するのは不可能です。この実開口レーダーの根本的な分解能限界を打ち破るのが、合成開口レーダーです。

合成開口の原理

基本アイデア

SARの基本アイデアは非常にシンプルです。プラットフォームが移動しながらレーダーパルスを繰り返し送受信し、各パルスの受信信号を記録します。そして、移動経路に沿った各受信位置を仮想的なアンテナ素子とみなすことで、非常に長い仮想アンテナ(合成開口)を形成するのです。

これは、アレイアンテナのビームフォーミングと本質的に同じ原理です。実際のアレイアンテナでは空間的に配置された多数のアンテナ素子で同時に信号を受信しますが、SARではプラットフォームの移動に伴い時間的に順次受信した信号を「あたかも同時に受信したかのように」処理します。

合成開口長

ある地上の点目標がレーダービームの照射域内にある時間(照射時間)を考えましょう。実開口アンテナのビーム幅は $\theta_{3\mathrm{dB}} = \lambda / D$ なので、距離 $R$ における地上でのビームフットプリント幅は次のようになります。

$$ W_{az} = R \cdot \theta_{3\mathrm{dB}} = \frac{R\lambda}{D} $$

プラットフォームが速度 $v$ で移動するとき、点目標がビーム内に留まる照射時間 $T_s$ は次の通りです。

$$ T_s = \frac{W_{az}}{v} = \frac{R\lambda}{Dv} $$

この照射時間にプラットフォームが移動する距離が合成開口長 $L_s$ です。

$$ L_s = v \cdot T_s = \frac{R\lambda}{D} $$

合成開口長 $L_s$ は、まさにビームフットプリント幅 $W_{az}$ に等しいことがわかります。

SARのアジマス分解能の導出

合成開口アンテナの分解能

合成開口長 $L_s$ を持つ仮想アンテナの角度分解能を求めましょう。通常のアレイアンテナ(実開口アンテナ)の角度分解能は $\lambda / L$ で与えられます($L$ はアンテナ全長)。

しかし、SARの場合は重要な違いがあります。実開口アンテナでは送信と受信が同じ位置で行われますが、SARでは送信と受信のパスが分かれるため、位相の変化は往復で2倍になります。

つまり、送信波がアンテナから目標まで距離 $R$ を伝搬し、反射波が目標からアンテナまで同じ距離 $R$ を戻るため、合計の伝搬距離は $2R$ です。これにより、実効的な合成開口長は $2L_s$ と等価になります。

したがって、合成開口アンテナの角度分解能は次のようになります。

$$ \theta_{3\mathrm{dB}}^{\mathrm{SAR}} = \frac{\lambda}{2L_s} $$

アジマス分解能の導出

合成開口長 $L_s = R\lambda / D$ を代入します。

$$ \begin{align} \delta_{az}^{\mathrm{SAR}} &= R \cdot \theta_{3\mathrm{dB}}^{\mathrm{SAR}} \\ &= R \cdot \frac{\lambda}{2L_s} \\ &= R \cdot \frac{\lambda}{2 \cdot \frac{R\lambda}{D}} \\ &= R \cdot \frac{\lambda D}{2 R \lambda} \\ &= \frac{D}{2} \end{align} $$

結果の解釈

$$ \boxed{\delta_{az}^{\mathrm{SAR}} = \frac{D}{2}} $$

この結果は非常に注目すべきものです。SARのアジマス分解能はアンテナ長 $D$ の半分であり、距離 $R$ にも波長 $\lambda$ にも依存しません。

直感に反するように思えますが、理由は次の通りです。

  1. 距離 $R$ が大きくなると、実開口のビーム幅が広がり分解能は悪化する
  2. しかし同時に、点目標がビーム内に留まる時間が長くなり、合成開口長 $L_s$ も長くなる
  3. これら2つの効果がちょうど打ち消し合い、結果的に分解能は $R$ に依存しなくなる

さらに、アンテナ長 $D$ を小さくすると分解能が良くなるという逆説的な結果も得られます。これは、小さなアンテナほどビーム幅が広く、照射時間が長くなり、合成開口長がより長くなるためです。

先ほどの数値例に戻ると、$D = 10 \, \mathrm{m}$ のアンテナでSARを使えば、次のようになります。

$$ \delta_{az}^{\mathrm{SAR}} = \frac{D}{2} = \frac{10}{2} = 5 \, \mathrm{m} $$

実開口の4.5 kmと比べて、約900倍もの改善です。

レンジ分解能

レンジ方向の分解能

SARのレンジ方向(レーダーから目標への方向)の分解能は、送信パルスの帯域幅 $B$ によって決まります。

パルス幅 $\tau$ の単純パルスを送信する場合、距離分解能は次の通りです。

$$ \delta_r = \frac{c\tau}{2} $$

ここで $c$ は光速です。分子に $c\tau$ が現れるのは、パルスが空間的に占める長さが $c\tau$ だからであり、分母の2は往復を考慮するためです。

信号の帯域幅 $B$ と時間幅 $\tau$ の間には $B \approx 1/\tau$ の関係があるため、次のように書き換えられます。

$$ \delta_r = \frac{c}{2B} $$

パルス圧縮との組み合わせ

高い距離分解能のためには広い帯域幅 $B$ が必要ですが、単純パルスで広帯域にすると送信時間が短くなり、送信エネルギーが低下して探知距離が犠牲になります。

この問題を解決するのがパルス圧縮です。チャープ信号(線形FM変調信号)を用いることで、長い送信パルス(高エネルギー)と広い帯域幅(高分解能)を両立できます。SARでは、レンジ方向にパルス圧縮を適用するのが標準的な手法です。

チャープ信号のパルス幅を $T$、帯域幅を $B$ とすると、時間-帯域幅積 $TB$ がパルス圧縮比(Processing Gain)を表します。

$$ \text{PCR} = TB $$

パルス圧縮後のレンジ分解能は次のようになります。

$$ \delta_r = \frac{c}{2B} $$

例えば帯域幅 $B = 150 \, \mathrm{MHz}$ の場合、レンジ分解能は次の通りです。

$$ \delta_r = \frac{3 \times 10^8}{2 \times 150 \times 10^6} = 1 \, \mathrm{m} $$

SARの信号モデル

送信信号

SARが送信するチャープ信号は次のように表されます。

$$ s_t(t) = \mathrm{rect}\!\left(\frac{t}{T}\right) \exp\!\left(j2\pi f_c t + j\pi K_r t^2\right) $$

ここで、$f_c$ は搬送波周波数、$K_r = B/T$ はチャープレート(周波数変化率)、$T$ はパルス幅です。$\mathrm{rect}(t/T)$ は幅 $T$ の矩形窓関数です。

受信信号

$n$ 番目のパルス送信時のプラットフォーム位置を $(x_n, 0, H)$ とし、地上の点目標を $(x_0, y_0, 0)$ とします。プラットフォームの速度 $v$ に対して $x_n = v \cdot n T_r$ です($T_r$ はパルス繰り返し間隔)。

点目標との瞬時距離は次の通りです。

$$ R_n = \sqrt{(x_n – x_0)^2 + y_0^2 + H^2} $$

受信信号のベースバンド表現は、遅延 $\tau_n = 2R_n / c$ を用いて次のように書けます。

$$ s_r(t, n) = A \cdot \mathrm{rect}\!\left(\frac{t – \tau_n}{T}\right) \exp\!\left(j\pi K_r (t – \tau_n)^2\right) \exp\!\left(-j\frac{4\pi f_c R_n}{c}\right) $$

最後の指数項 $\exp(-j 4\pi f_c R_n / c)$ は、距離 $R_n$ の往復伝搬に伴う位相遅延です。

スラントレンジの近似

$R_n$ をテイラー展開で近似します。スラントレンジ方向の最近接距離を $R_0 = \sqrt{y_0^2 + H^2}$ とおくと、次のようになります。

$$ \begin{align} R_n &= \sqrt{(x_n – x_0)^2 + R_0^2} \\ &= R_0 \sqrt{1 + \frac{(x_n – x_0)^2}{R_0^2}} \\ &\approx R_0 + \frac{(x_n – x_0)^2}{2R_0} \quad (\because \text{2次のテイラー近似}) \end{align} $$

この近似は $(x_n – x_0) \ll R_0$ のとき有効であり、通常のSAR観測ジオメトリでは十分な精度で成立します。

レンジ-ドップラーアルゴリズム

SAR画像の再構成(フォーカシング)のために、レンジ-ドップラー(Range-Doppler)アルゴリズムが広く用いられています。基本的な処理の流れは以下の通りです。

ステップ1: レンジ圧縮

各パルスの受信信号に対して、レンジ方向のマッチドフィルタを適用します。送信チャープ信号の参照関数(時間反転かつ共役)を用いた畳み込みで、レンジ方向のパルス圧縮を行います。

周波数領域での処理が効率的です。$n$ 番目のパルスについて次のように計算します。

$$ S_{\mathrm{RC}}(f, n) = S_r(f, n) \cdot H_r^*(f) $$

ここで $S_r(f, n)$ は受信信号のレンジ方向FFT、$H_r(f)$ は参照チャープのFFTです。逆FFTによりレンジ圧縮後の信号を得ます。

ステップ2: アジマスFFT(ドップラー領域への変換)

レンジ圧縮後のデータに対して、アジマス方向(パルス番号方向)にFFTを適用します。これにより各レンジビンのドップラースペクトルが得られ、レンジ-ドップラー領域のデータに変換されます。

ステップ3: レンジセル移動補正(RCMC)

点目標はパルスごとに距離が変化するため、レンジ-ドップラー領域でレンジセルの位置がドップラー周波数に依存してずれます(Range Cell Migration)。この補正をレンジ-ドップラー領域で行います。

レンジセル移動量は次のように表されます。

$$ \Delta R(f_\eta) = \frac{R_0}{\sqrt{1 – \left(\frac{\lambda f_\eta}{2v}\right)^2}} – R_0 $$

ここで $f_\eta$ はドップラー周波数です。

ステップ4: アジマス圧縮

レンジ-ドップラー領域でアジマス方向のマッチドフィルタを適用します。アジマス方向の参照関数は、放物線的な位相履歴に対応するチャープ信号です。

$$ H_a(f_\eta) = \exp\!\left(j\frac{4\pi R_0 f_c}{c} \sqrt{1 – \left(\frac{\lambda f_\eta}{2v}\right)^2}\right) $$

アジマスマッチドフィルタリング後にアジマス逆FFTを適用して、最終的なSAR画像を得ます。

SARの応用

SARは多くの分野で活用されています。主な応用例を挙げます。

地表面観測: 地形図作成、農作物のモニタリング、森林の観測、都市域の変化検出などに利用されます。干渉SAR(InSAR)では、2つの観測から地表面の標高を求めたり、地殻変動を検出したりできます。

海面監視: 船舶の検出・追跡、海面の波浪観測、油膜の検出、海氷のモニタリングなどに利用されます。

災害監視: 地震による地殻変動の検出、洪水の浸水域の把握、火山活動のモニタリング、地すべりの検出などに威力を発揮します。マイクロ波を使うため、雲や噴煙を透過して観測できる点が大きな強みです。

軍事・安全保障: 全天候型の地上監視、移動目標検出(GMTI: Ground Moving Target Indication)などに利用されます。

Pythonでの点目標SARシミュレーション

それでは、Pythonで点目標のSARエコー信号を生成し、レンジ圧縮とアジマス圧縮による2D画像再構成を実装してみましょう。

エコー信号の生成

import numpy as np
import matplotlib.pyplot as plt

# --- SARパラメータ設定 ---
c = 3e8                    # 光速 [m/s]
fc = 5.3e9                 # 搬送波周波数 (Cバンド) [Hz]
lam = c / fc               # 波長 [m]
B = 50e6                   # チャープ帯域幅 [Hz]
T_chirp = 10e-6            # チャープパルス幅 [s]
Kr = B / T_chirp           # チャープレート [Hz/s]
PRF = 500                  # パルス繰り返し周波数 [Hz]
v = 150                    # プラットフォーム速度 [m/s]
R0 = 10000                 # 目標までのスラントレンジ(最近接距離) [m]

# --- 点目標の配置 ---
# (アジマス位置 [m], スラントレンジ [m])
targets = [
    (0, R0),
    (20, R0 + 30),
    (-15, R0 - 20),
]

# --- サンプリングパラメータ ---
fs_range = 2 * B                     # レンジサンプリング周波数 [Hz]
N_range = 1024                        # レンジ方向のサンプル数
N_az = 512                            # アジマス方向のパルス数

# レンジ時間軸
t_range = np.arange(N_range) / fs_range - N_range / (2 * fs_range)

# アジマス位置(パルスインデックス→プラットフォーム位置)
az_indices = np.arange(N_az) - N_az // 2
x_platform = az_indices * (v / PRF)   # 各パルス送信時のプラットフォーム位置

# --- エコー信号行列の生成 ---
# 行: アジマス(パルス番号), 列: レンジ(高速時間)
echo = np.zeros((N_az, N_range), dtype=complex)

for (x_tgt, R_tgt) in targets:
    for i in range(N_az):
        # 瞬時スラントレンジ
        R_inst = np.sqrt((x_platform[i] - x_tgt)**2 + R_tgt**2)
        # 遅延時間
        tau = 2 * R_inst / c
        # チャープエコー信号(ベースバンド)
        t_shifted = t_range - tau
        # パルス幅内のみ有効
        valid = np.abs(t_shifted) <= T_chirp / 2
        signal = np.zeros(N_range, dtype=complex)
        signal[valid] = np.exp(1j * np.pi * Kr * t_shifted[valid]**2) * \
                        np.exp(-1j * 4 * np.pi * fc * R_inst / c)
        echo[i, :] += signal

print(f"エコー信号行列のサイズ: {echo.shape}")
print(f"レンジ分解能 (理論値): {c / (2 * B):.2f} m")
print(f"アジマス分解能 (理論値): {lam / (2 * v / PRF * N_az * (lam / (fc * 2))):.2f} m")

レンジ圧縮

# --- レンジ圧縮(マッチドフィルタ処理) ---
# 参照チャープ信号の生成
ref_chirp = np.zeros(N_range, dtype=complex)
valid_ref = np.abs(t_range) <= T_chirp / 2
ref_chirp[valid_ref] = np.exp(1j * np.pi * Kr * t_range[valid_ref]**2)

# 周波数領域でのマッチドフィルタ処理
Ref_chirp_fft = np.fft.fft(ref_chirp)

echo_rc = np.zeros_like(echo)
for i in range(N_az):
    Echo_fft = np.fft.fft(echo[i, :])
    # マッチドフィルタ = 参照信号の共役との乗算
    echo_rc[i, :] = np.fft.ifft(Echo_fft * np.conj(Ref_chirp_fft))

print("レンジ圧縮完了")

アジマス圧縮と画像再構成

# --- アジマス圧縮 ---
# 各レンジビンに対してアジマス方向のマッチドフィルタを適用

# 参照位相関数の生成
# 中心目標距離 R0 に対するアジマス参照関数
R_ref = R0

echo_sar = np.zeros_like(echo_rc)

for j in range(N_range):
    # アジマス方向のFFT
    Az_fft = np.fft.fft(echo_rc[:, j])

    # アジマスマッチドフィルタ
    # ドップラー周波数軸
    f_eta = np.fft.fftfreq(N_az, d=1.0 / PRF)

    # アジマス参照関数(位相履歴補償)
    # 放物線近似: φ = -4πR0/(λ) * (1 + λ²f²/(8v²)) ≈ ...
    # ここでは二次位相近似を使用
    Ka = 2 * v**2 / (lam * R_ref)  # アジマスチャープレート
    H_az = np.exp(1j * np.pi * f_eta**2 / Ka)

    # マッチドフィルタ適用
    Az_compressed = Az_fft * np.conj(H_az)

    # アジマス逆FFT
    echo_sar[:, j] = np.fft.ifft(Az_compressed)

print("アジマス圧縮完了")

SAR画像の表示

# --- SAR画像の可視化 ---
fig, axes = plt.subplots(1, 3, figsize=(18, 6))

# レンジ軸 [m]
range_axis = t_range * c / 2 + R0
# アジマス軸 [m]
az_axis = x_platform

# (1) 生のエコー信号
im0 = axes[0].imshow(
    20 * np.log10(np.abs(echo) / np.max(np.abs(echo)) + 1e-10),
    aspect='auto',
    cmap='jet',
    vmin=-40, vmax=0,
    extent=[range_axis[0], range_axis[-1], az_axis[-1], az_axis[0]]
)
axes[0].set_title('Raw Echo Signal')
axes[0].set_xlabel('Range [m]')
axes[0].set_ylabel('Azimuth [m]')
plt.colorbar(im0, ax=axes[0], label='dB')

# (2) レンジ圧縮後
im1 = axes[1].imshow(
    20 * np.log10(np.abs(echo_rc) / np.max(np.abs(echo_rc)) + 1e-10),
    aspect='auto',
    cmap='jet',
    vmin=-40, vmax=0,
    extent=[range_axis[0], range_axis[-1], az_axis[-1], az_axis[0]]
)
axes[1].set_title('After Range Compression')
axes[1].set_xlabel('Range [m]')
axes[1].set_ylabel('Azimuth [m]')
plt.colorbar(im1, ax=axes[1], label='dB')

# (3) SAR画像(レンジ+アジマス圧縮後)
im2 = axes[2].imshow(
    20 * np.log10(np.abs(echo_sar) / np.max(np.abs(echo_sar)) + 1e-10),
    aspect='auto',
    cmap='jet',
    vmin=-40, vmax=0,
    extent=[range_axis[0], range_axis[-1], az_axis[-1], az_axis[0]]
)
axes[2].set_title('SAR Image (Focused)')
axes[2].set_xlabel('Range [m]')
axes[2].set_ylabel('Azimuth [m]')
plt.colorbar(im2, ax=axes[2], label='dB')

plt.tight_layout()
plt.show()

分解能の確認

# --- 分解能の確認(中央目標のカット) ---
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# SAR画像の振幅
sar_image = np.abs(echo_sar)

# 最大値の位置を検出
max_idx = np.unravel_index(np.argmax(sar_image), sar_image.shape)

# レンジ方向カット
range_cut = sar_image[max_idx[0], :]
range_cut_norm = range_cut / np.max(range_cut)
axes[0].plot(range_axis, 20 * np.log10(range_cut_norm + 1e-10), 'b-', linewidth=1.5)
axes[0].set_xlabel('Range [m]')
axes[0].set_ylabel('Amplitude [dB]')
axes[0].set_title('Range Cut through Peak')
axes[0].set_ylim([-40, 3])
axes[0].axhline(y=-3, color='r', linestyle='--', label='-3 dB')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

# アジマス方向カット
az_cut = sar_image[:, max_idx[1]]
az_cut_norm = az_cut / np.max(az_cut)
axes[1].plot(az_axis, 20 * np.log10(az_cut_norm + 1e-10), 'b-', linewidth=1.5)
axes[1].set_xlabel('Azimuth [m]')
axes[1].set_ylabel('Amplitude [dB]')
axes[1].set_title('Azimuth Cut through Peak')
axes[1].set_ylim([-40, 3])
axes[1].axhline(y=-3, color='r', linestyle='--', label='-3 dB')
axes[1].legend()
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# 理論値の表示
delta_r_theory = c / (2 * B)
D_antenna = lam * R0 / (v / PRF * N_az)  # 近似的なアンテナ長
print(f"\n--- 分解能の理論値 ---")
print(f"レンジ分解能: {delta_r_theory:.2f} m")
print(f"波長 λ = {lam*100:.2f} cm")
print(f"合成開口長 L_s = {v / PRF * N_az:.1f} m")

上記のコードを実行すると、3つの点目標に対する生のエコー信号、レンジ圧縮後の信号、最終的なSAR画像が可視化されます。生のエコー信号では各点目標の応答が広がっていますが、レンジ圧縮によりレンジ方向に圧縮され、さらにアジマス圧縮により両方向で鋭いピークとなり、点目標が明確に分離されることが確認できます。

まとめ

本記事では、SAR(合成開口レーダー)の原理を数式で丁寧に導出しました。

  • 実開口レーダーのアジマス分解能は $\delta_{az}^{\mathrm{RAR}} = R\lambda/D$ であり、遠距離ほど劣化する根本的な限界がある
  • SARはプラットフォームの移動により合成開口長 $L_s = R\lambda/D$ の仮想アンテナを形成する
  • SARのアジマス分解能は $\delta_{az}^{\mathrm{SAR}} = D/2$ となり、距離や波長に依存しないという驚くべき結果が得られる
  • レンジ分解能は $\delta_r = c/(2B)$ であり、パルス圧縮により帯域幅 $B$ を確保する
  • レンジ-ドップラーアルゴリズムにより、レンジ圧縮→RCMC→アジマス圧縮の手順でSAR画像を再構成する
  • Pythonで点目標のSARシミュレーションを実装し、2D画像再構成を確認した

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