フェーズドアレイレーダーの原理と理論を解説

フェーズドアレイレーダー(Phased Array Radar)は、多数のアンテナ素子に与える位相を電子的に制御することで、機械的な回転なしにビームの向きを瞬時に切り替えるレーダーシステムです。航空管制、弾道ミサイル追尾、気象観測、戦闘機搭載レーダーなど、現代のレーダーシステムの中核技術として広く使われています。

機械式レーダーではアンテナを物理的に回転させるため、ビーム走査速度に限界がありますが、フェーズドアレイでは電子的にマイクロ秒オーダーでビーム方向を切り替えられるため、同時に複数の目標を追尾する「マルチファンクション」運用が可能になります。

本記事の内容

  • フェーズドアレイの基本原理(位相制御によるビームステアリング)
  • ビームステアリング角と素子間位相差の関係の導出
  • 走査に伴うビーム幅の劣化($\cos\theta$ 劣化)の証明
  • グレーティングローブ抑圧のための素子間隔条件の導出
  • PESA(パッシブ電子走査)とAESA(アクティブ電子走査)の違い
  • デジタルビームフォーミング(DBF)の原理
  • Pythonによるビームステアリングのシミュレーション

前提知識

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

フェーズドアレイレーダーとは

フェーズドアレイレーダーとは、アンテナ面に並べた多数の素子それぞれに対して位相シフタを設け、各素子の送受信位相を電子的に制御することで、ビーム方向を機械的な駆動なしに走査(スキャン)するレーダーです。

通常のアレイアンテナの理論を理解していれば、フェーズドアレイの原理は自然に理解できます。すべての素子が同一の位相で給電されると、ビームは開口面に垂直な方向(ブロードサイド方向)に形成されます。ここで各素子に一定の位相勾配を与えると、同位相面(等位相波面)が傾き、ビームの方向が変わります。これがビームステアリングの本質です。

ビームステアリングの数学的導出

等間隔線形アレイのモデル

$z$ 軸上に $N$ 個の素子を等間隔 $d$ で配置した等間隔線形アレイ(ULA: Uniform Linear Array)を考えます。$n$ 番目の素子の位置は $z_n = nd$($n = 0, 1, \ldots, N-1$)です。

ブロードサイド方向を $\theta = 90°$($z$ 軸に垂直な方向)とし、$z$ 軸からの角度を $\theta$ で表します。このとき、アレイファクターは次のように書けます。

$$ \text{AF}(\theta) = \sum_{n=0}^{N-1} a_n \, e^{j n (k d \cos\theta + \alpha_0)} $$

ここで、$k = 2\pi/\lambda$ は波数、$a_n$ は $n$ 番目の素子の振幅、$\alpha_0$ は隣接素子間の位相差です。

ビームステアリング角と位相差の関係

ビームの主ローブを方向 $\theta_s$ に向けたいとします。主ローブの条件は、アレイファクターの指数部分がすべての $n$ に対して同一になる、すなわち $\psi = kd\cos\theta + \alpha_0 = 0$ となることです。

ビーム方向 $\theta_s$ で $\psi = 0$ とすると、

$$ kd \cos\theta_s + \alpha_0 = 0 $$

これを $\alpha_0$ について解きます。

$$ \alpha_0 = -kd \cos\theta_s $$

波数 $k = 2\pi/\lambda$ を代入すると、

$$ \alpha_0 = -\frac{2\pi d}{\lambda} \cos\theta_s $$

ブロードサイドからの角度 $\theta_{\text{steer}} = 90° – \theta_s$ を走査角とすると、$\cos\theta_s = \sin\theta_{\text{steer}}$ であるから、

$$ \begin{align} \alpha_0 &= -\frac{2\pi d}{\lambda} \cos\theta_s \\ &= -\frac{2\pi d}{\lambda} \sin\theta_{\text{steer}} \\ &= -kd \sin\theta_{\text{steer}} \end{align} $$

つまり、隣接素子間の位相差 $\Delta\phi$ を

$$ \boxed{\Delta\phi = -kd \sin\theta_{\text{steer}} = -\frac{2\pi d}{\lambda} \sin\theta_{\text{steer}}} $$

に設定すると、ビームはブロードサイドから $\theta_{\text{steer}}$ 傾いた方向に向くことが導けました。

具体例

素子間隔 $d = \lambda/2$、走査角 $\theta_{\text{steer}} = 30°$ の場合を計算してみましょう。

$$ \begin{align} \Delta\phi &= -\frac{2\pi \cdot \lambda/2}{\lambda} \sin 30° \\ &= -\pi \cdot \frac{1}{2} \\ &= -\frac{\pi}{2} \approx -90° \end{align} $$

各素子に $-90°$ ずつの位相差を与えると、ビームはブロードサイドから $30°$ 傾くことがわかります。

走査に伴うビーム幅の劣化

フェーズドアレイでビームを走査すると、ビーム幅が走査角に依存して広がります。これは直感的には、走査方向から見たアンテナの実効的な開口長が短くなることに対応します。

ビーム幅劣化の導出

ブロードサイド方向($\theta_{\text{steer}} = 0$)におけるアレイアンテナの半値幅は、$N$ 素子の等間隔アレイに対して近似的に次のように与えられます。

$$ \Delta\theta_{\text{HPBW},0} \approx \frac{0.886 \lambda}{N d} $$

ビームを $\theta_{\text{steer}}$ 方向に走査した場合、走査方向から見たアレイの実効長は $Nd \cos\theta_{\text{steer}}$ に短縮されます。これは、走査方向に対するアレイの射影長に対応します。

したがって、走査時のビーム幅は、

$$ \Delta\theta_{\text{HPBW}}(\theta_{\text{steer}}) \approx \frac{0.886 \lambda}{N d \cos\theta_{\text{steer}}} $$

ブロードサイドにおけるビーム幅との比をとると、

$$ \begin{align} \frac{\Delta\theta_{\text{HPBW}}(\theta_{\text{steer}})}{\Delta\theta_{\text{HPBW},0}} &= \frac{0.886\lambda / (Nd\cos\theta_{\text{steer}})}{0.886\lambda / (Nd)} \\ &= \frac{1}{\cos\theta_{\text{steer}}} \end{align} $$

$$ \boxed{\Delta\theta_{\text{HPBW}}(\theta_{\text{steer}}) = \frac{\Delta\theta_{\text{HPBW},0}}{\cos\theta_{\text{steer}}}} $$

これが $\cos\theta$ 劣化 と呼ばれる現象です。走査角が大きくなるほどビーム幅が広がり、空間分解能が低下します。

例えば、$\theta_{\text{steer}} = 60°$ では $\cos 60° = 0.5$ なので、ビーム幅はブロードサイドの 2倍 に広がります。このため、フェーズドアレイレーダーの実用的な走査範囲は通常 $\pm 60°$ 程度に制限されます。

ゲインの劣化

ビーム幅の広がりに加え、走査方向に対するアンテナの実効面積も $\cos\theta_{\text{steer}}$ に比例して減少します。これはアンテナの物理開口面を斜めから見ることに対応します。

したがって、走査角 $\theta_{\text{steer}}$ でのアンテナゲインは、

$$ G(\theta_{\text{steer}}) \approx G_0 \cos\theta_{\text{steer}} $$

ここで $G_0$ はブロードサイドにおけるゲインです。dB表示では、$60°$ 走査時に約 $3\,\text{dB}$ のゲイン低下が発生します。

グレーティングローブの抑圧条件

グレーティングローブとは

アレイアンテナにおいて、主ローブと同等の振幅を持つ副ローブが出現することがあります。これをグレーティングローブ(Grating Lobe)と呼びます。グレーティングローブは、ビーム走査時に可視領域内に入り込むと、偽の目標信号を検出する原因となるため、レーダーでは絶対に避けなければなりません。

発生条件の導出

グレーティングローブは、$\psi = kd\cos\theta + \alpha_0 = 2m\pi$($m = \pm 1, \pm 2, \ldots$)を満たす方向 $\theta$ に出現します。

ビームを $\theta_s$ 方向にステアリングしている場合($\alpha_0 = -kd\cos\theta_s$)、$m = -1$ のグレーティングローブの方向 $\theta_g$ は次の式を満たします。

$$ kd\cos\theta_g – kd\cos\theta_s = -2\pi $$

$$ \cos\theta_g = \cos\theta_s – \frac{\lambda}{d} $$

グレーティングローブが可視領域($-1 \le \cos\theta_g \le 1$)に入らないための条件は、

$$ \cos\theta_s – \frac{\lambda}{d} < -1 $$

これを変形します。

$$ \begin{align} \cos\theta_s – \frac{\lambda}{d} &< -1 \\ \frac{\lambda}{d} &> 1 + \cos\theta_s \end{align} $$

ブロードサイドからの走査角表記 $\theta_{\text{steer}}$ を使うと、$\cos\theta_s = \sin\theta_{\text{steer}}$ なので、

$$ \frac{\lambda}{d} > 1 + \sin\theta_{\text{steer}} $$

$$ \boxed{d < \frac{\lambda}{1 + \sin\theta_{\text{max}}}} $$

ここで $\theta_{\text{max}}$ はビーム走査の最大角度です。

具体例

最大走査角 $\theta_{\text{max}} = 60°$ の場合、

$$ d < \frac{\lambda}{1 + \sin 60°} = \frac{\lambda}{1 + 0.866} = \frac{\lambda}{1.866} \approx 0.536\lambda $$

つまり、$\pm 60°$ の走査を行いたい場合、素子間隔は約 $0.54\lambda$ 以下にする必要があります。$d = \lambda/2 = 0.5\lambda$ は、この条件を満たしており、広く採用される素子間隔です。

走査を行わない場合($\theta_{\text{max}} = 0°$)は、$d < \lambda$ が条件となり、より緩い制約になります。

PESAとAESAの違い

フェーズドアレイレーダーは、送信機の構成によって大きく2種類に分類されます。

PESA(Passive Electronically Scanned Array)

PESAは単一の高出力送信機で生成した電力を、パワーディバイダで各素子に分配し、各素子に取り付けた位相シフタで位相を制御する構成です。

PESAの特徴は以下の通りです。

  • 送信機が1台のため、システムが比較的単純
  • 位相シフタのみで各素子を制御(振幅制御は一般に行わない)
  • 送信機が故障するとシステム全体が停止する(単一障害点)
  • 同時に形成できるビームは1本

代表例として、AN/SPY-1レーダー(イージス艦搭載)が挙げられます。

AESA(Active Electronically Scanned Array)

AESAは各素子にT/Rモジュール(送受信モジュール)を搭載し、素子ごとに独立した送信機と受信機を持つ構成です。

AESAの特徴は以下の通りです。

  • 各素子が独立に振幅と位相を制御可能
  • 一部の素子が故障しても全体の性能低下は緩やか(グレースフル・デグラデーション)
  • 同時に複数のビームを形成可能
  • 周波数アジリティ(瞬時的な周波数切替え)が容易
  • T/Rモジュールのコストが高い

代表例として、AN/APG-77レーダー(F-22搭載)、AN/APG-81(F-35搭載)が挙げられます。

性能比較

項目 PESA AESA
送信機 単一の高出力送信機 各素子にT/Rモジュール
位相制御 位相シフタのみ 振幅+位相の独立制御
ビーム数 1本 同時に複数本
冗長性 低い 高い(グレースフル・デグラデーション)
コスト 比較的安価 高価
帯域幅 狭帯域 広帯域対応可能

デジタルビームフォーミング(DBF)

DBFの基本原理

AESAの発展形として、デジタルビームフォーミング(Digital Beam Forming: DBF)があります。DBFでは、各素子の受信信号を直接A/D変換してデジタル信号に変換し、デジタル領域で重み付けと合成を行います。

従来のアナログビームフォーミングでは、位相シフタというハードウェアで位相を制御しますが、DBFではデジタル演算で行うため、以下の利点があります。

  • 同時マルチビーム形成: 同一の受信データから、異なる方向に複数のビームを同時に形成可能
  • 適応的ヌル制御: 妨害波方向にヌル(ゼロゲイン点)を適応的に配置可能
  • 最適ビームフォーミング: 環境に応じた最適な重み係数を計算可能

DBFの数学的記述

$N$ 素子アレイの受信信号ベクトルを $\bm{x}(t) = [x_0(t), x_1(t), \ldots, x_{N-1}(t)]^T$ とします。角度 $\theta$ 方向のステアリングベクトルは次のように定義されます。

$$ \bm{a}(\theta) = \begin{bmatrix} 1 \\ e^{jkd\cos\theta} \\ e^{j2kd\cos\theta} \\ \vdots \\ e^{j(N-1)kd\cos\theta} \end{bmatrix} $$

DBFの出力は、重み係数ベクトル $\bm{w}$ と受信信号の内積で与えられます。

$$ y(t) = \bm{w}^H \bm{x}(t) $$

ここで、$(\cdot)^H$ はエルミート転置を表します。

従来のビームフォーミング(遅延和ビームフォーマ)では、$\bm{w} = \bm{a}(\theta_{\text{steer}})$ とすることで、$\theta_{\text{steer}}$ 方向の信号を強調します。

最小分散無歪応答(MVDR: Minimum Variance Distortionless Response)ビームフォーマでは、

$$ \bm{w}_{\text{MVDR}} = \frac{\bm{R}^{-1} \bm{a}(\theta_{\text{steer}})}{\bm{a}^H(\theta_{\text{steer}}) \bm{R}^{-1} \bm{a}(\theta_{\text{steer}})} $$

ここで、$\bm{R} = E[\bm{x}\bm{x}^H]$ は受信信号の相関行列です。MVDRビームフォーマは、所望方向のゲインを1に保ちつつ、出力パワーを最小化する最適化問題の解です。

$$ \begin{align} \min_{\bm{w}} \quad & \bm{w}^H \bm{R} \bm{w} \\ \text{subject to} \quad & \bm{w}^H \bm{a}(\theta_{\text{steer}}) = 1 \end{align} $$

ラグランジュ乗数法を用いて、ラグランジアンを構成します。

$$ \mathcal{L}(\bm{w}, \mu) = \bm{w}^H \bm{R} \bm{w} – \mu (\bm{w}^H \bm{a}(\theta_{\text{steer}}) – 1) $$

$\bm{w}$ で微分して $0$ とおくと、

$$ \frac{\partial \mathcal{L}}{\partial \bm{w}^*} = \bm{R}\bm{w} – \mu \bm{a}(\theta_{\text{steer}}) = \bm{0} $$

$$ \bm{w} = \mu \bm{R}^{-1} \bm{a}(\theta_{\text{steer}}) $$

制約条件 $\bm{w}^H \bm{a}(\theta_{\text{steer}}) = 1$ に代入すると、

$$ \mu \bm{a}^H(\theta_{\text{steer}}) \bm{R}^{-1} \bm{a}(\theta_{\text{steer}}) = 1 $$

$$ \mu = \frac{1}{\bm{a}^H(\theta_{\text{steer}}) \bm{R}^{-1} \bm{a}(\theta_{\text{steer}})} $$

これを $\bm{w}$ に代入すると、MVDR重みベクトルが得られます。

$$ \boxed{\bm{w}_{\text{MVDR}} = \frac{\bm{R}^{-1} \bm{a}(\theta_{\text{steer}})}{\bm{a}^H(\theta_{\text{steer}}) \bm{R}^{-1} \bm{a}(\theta_{\text{steer}})}} $$

Pythonによるビームステアリングシミュレーション

基本的なビームステアリング

まず、位相制御によるビームステアリングの基本をシミュレーションします。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
N = 16          # 素子数
d_lambda = 0.5  # 素子間隔 d/λ
theta = np.linspace(0, 180, 1000)  # 角度 [deg]
theta_rad = np.deg2rad(theta)

# ステアリング角の一覧 [deg](ブロードサイドからの角度)
steer_angles = [0, 15, 30, 45, 60]

plt.figure(figsize=(12, 6))

for theta_s_deg in steer_angles:
    theta_s_rad = np.deg2rad(theta_s_deg)
    # 隣接素子間の位相差
    alpha0 = -2 * np.pi * d_lambda * np.sin(theta_s_rad)
    # ψ = kd cosθ + α0
    psi = 2 * np.pi * d_lambda * np.cos(theta_rad) + alpha0
    # アレイファクター(等振幅)
    AF = np.zeros_like(psi, dtype=complex)
    for n in range(N):
        AF += np.exp(1j * n * psi)
    AF_dB = 20 * np.log10(np.abs(AF) / N + 1e-12)
    plt.plot(theta, AF_dB, label=f'$\\theta_{{steer}}={theta_s_deg}°$')

plt.xlabel('Angle θ [deg]')
plt.ylabel('Array Factor [dB]')
plt.title(f'Phased Array Beam Steering (N={N}, d=λ/2)')
plt.xlim([0, 180])
plt.ylim([-40, 5])
plt.grid(True, alpha=0.3)
plt.legend(fontsize=10)
plt.tight_layout()
plt.show()

上のコードでは、$N = 16$ 素子、$d = \lambda/2$ の等間隔線形アレイに対して、走査角 $0°$〜$60°$ でのアレイファクターをプロットしています。走査角が大きくなるとビーム幅が広がる($\cos\theta$ 劣化)ことが確認できます。

グレーティングローブの発生確認

素子間隔を $\lambda/2$ から $\lambda$ に広げた場合のグレーティングローブの発生を確認します。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
N = 16
theta = np.linspace(0, 180, 2000)
theta_rad = np.deg2rad(theta)
steer_deg = 30  # 走査角 30°
steer_rad = np.deg2rad(steer_deg)

# 2つの素子間隔で比較
d_lambdas = [0.5, 1.0]
labels = ['d = λ/2 (グレーティングローブなし)', 'd = λ (グレーティングローブあり)']

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

for idx, (d_lam, label) in enumerate(zip(d_lambdas, labels)):
    alpha0 = -2 * np.pi * d_lam * np.sin(steer_rad)
    psi = 2 * np.pi * d_lam * np.cos(theta_rad) + alpha0
    AF = np.zeros_like(psi, dtype=complex)
    for n in range(N):
        AF += np.exp(1j * n * psi)
    AF_norm = np.abs(AF) / N
    AF_dB = 20 * np.log10(AF_norm + 1e-12)

    axes[idx].plot(theta, AF_dB, 'b-', linewidth=1.2)
    axes[idx].axvline(x=90 - steer_deg, color='r', linestyle='--',
                      label=f'主ローブ ({90 - steer_deg}°)')
    axes[idx].set_xlabel('Angle θ [deg]')
    axes[idx].set_ylabel('Array Factor [dB]')
    axes[idx].set_title(label)
    axes[idx].set_xlim([0, 180])
    axes[idx].set_ylim([-40, 5])
    axes[idx].grid(True, alpha=0.3)
    axes[idx].legend()

plt.tight_layout()
plt.show()

$d = \lambda$ の場合、主ローブに加えてグレーティングローブが可視領域内に出現していることが確認できます。

ビーム幅のcos θ劣化の検証

ビーム幅が走査角に対して $1/\cos\theta_{\text{steer}}$ で広がることを数値的に検証します。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
N = 32
d_lambda = 0.5
theta = np.linspace(0, 180, 10000)
theta_rad = np.deg2rad(theta)

# 各走査角でのビーム幅を測定
steer_angles = np.arange(0, 65, 5)
measured_bw = []

for theta_s_deg in steer_angles:
    theta_s_rad = np.deg2rad(theta_s_deg)
    alpha0 = -2 * np.pi * d_lambda * np.sin(theta_s_rad)
    psi = 2 * np.pi * d_lambda * np.cos(theta_rad) + alpha0
    AF = np.zeros_like(psi, dtype=complex)
    for n in range(N):
        AF += np.exp(1j * n * psi)
    AF_norm = np.abs(AF) / N
    AF_dB = 20 * np.log10(AF_norm + 1e-12)

    # ピーク方向の検出
    peak_idx = np.argmax(AF_norm)
    # -3dB幅の測定
    peak_val_dB = AF_dB[peak_idx]
    half_power = peak_val_dB - 3.0
    above_hp = AF_dB >= half_power
    # ピーク周辺の-3dBポイントを検出
    indices = np.where(above_hp)[0]
    # ピークに最も近い連続領域
    diff_idx = np.diff(indices)
    splits = np.where(diff_idx > 1)[0]
    if len(splits) > 0:
        for i in range(len(splits) + 1):
            if i == 0:
                group = indices[:splits[0] + 1]
            elif i == len(splits):
                group = indices[splits[-1] + 1:]
            else:
                group = indices[splits[i-1] + 1:splits[i] + 1]
            if peak_idx in group:
                bw_deg = theta[group[-1]] - theta[group[0]]
                break
    else:
        bw_deg = theta[indices[-1]] - theta[indices[0]]
    measured_bw.append(bw_deg)

measured_bw = np.array(measured_bw)
# 理論値: BW(0) / cos(θ)
bw0 = measured_bw[0]
theoretical_bw = bw0 / np.cos(np.deg2rad(steer_angles))

plt.figure(figsize=(10, 6))
plt.plot(steer_angles, measured_bw, 'bo-', label='シミュレーション値', markersize=6)
plt.plot(steer_angles, theoretical_bw, 'r--', label=r'理論値 $\Delta\theta_0 / \cos\theta_s$', linewidth=2)
plt.xlabel('Scan Angle [deg]')
plt.ylabel('Half-Power Beamwidth [deg]')
plt.title(f'Beamwidth vs Scan Angle (N={N}, d=λ/2)')
plt.grid(True, alpha=0.3)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()

シミュレーション結果は理論曲線 $\Delta\theta_0 / \cos\theta_{\text{steer}}$ と良く一致しており、$\cos\theta$ 劣化が確認できます。

2D放射パターンのアニメーション

走査角を変化させながら2Dの放射パターンを極座標で描画します。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# パラメータ設定
N = 20
d_lambda = 0.5
theta = np.linspace(-90, 90, 1000)  # ブロードサイドからの角度
theta_rad = np.deg2rad(theta)

# 走査角のフレーム
steer_frames = np.concatenate([
    np.linspace(-60, 60, 60),
    np.linspace(60, -60, 60)
])

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection': 'polar'})

def compute_af(steer_deg):
    """指定走査角でのアレイファクターを計算"""
    steer_rad = np.deg2rad(steer_deg)
    alpha0 = -2 * np.pi * d_lambda * np.sin(steer_rad)
    # θ=90°からの角度体系(z軸から)に変換
    psi = 2 * np.pi * d_lambda * np.sin(theta_rad) + alpha0
    AF = np.zeros_like(psi, dtype=complex)
    for n in range(N):
        AF += np.exp(1j * n * psi)
    AF_norm = np.abs(AF) / N
    return AF_norm

# 初期プロット
AF_init = compute_af(0)
line, = ax.plot(theta_rad, AF_init, 'b-', linewidth=1.5)
title = ax.set_title('Scan Angle: 0°', fontsize=14, pad=20)
ax.set_thetamin(-90)
ax.set_thetamax(90)
ax.set_ylim(0, 1.05)
ax.set_ylabel('Normalized AF', labelpad=30)

def update(frame):
    steer_deg = steer_frames[frame]
    AF_norm = compute_af(steer_deg)
    line.set_ydata(AF_norm)
    title.set_text(f'Scan Angle: {steer_deg:.1f}°')
    return line, title

ani = FuncAnimation(fig, update, frames=len(steer_frames),
                    interval=50, blit=True)
plt.tight_layout()
plt.show()

このアニメーションでは、ビームが $-60°$ から $+60°$ まで電子的に走査される様子を極座標で確認できます。走査角が大きくなるとビーム幅が広がる $\cos\theta$ 劣化の効果も視覚的に理解できます。

MVDRビームフォーマのシミュレーション

DBFの一例として、MVDRビームフォーマの性能をシミュレーションします。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
N = 16          # 素子数
d_lambda = 0.5  # 素子間隔 d/λ
SNR_dB = 20     # 信号のSNR [dB]
INR_dB = 30     # 妨害波のINR [dB]

# ステアリングベクトルの計算
def steering_vector(theta_deg, N, d_lambda):
    theta_rad = np.deg2rad(theta_deg)
    n = np.arange(N)
    return np.exp(1j * 2 * np.pi * d_lambda * n * np.sin(theta_rad))

# 信号方向と妨害波方向
signal_dir = 20.0   # 信号方向 [deg]
jammer_dir = -30.0  # 妨害波方向 [deg]

# ステアリングベクトル
a_s = steering_vector(signal_dir, N, d_lambda).reshape(-1, 1)
a_j = steering_vector(jammer_dir, N, d_lambda).reshape(-1, 1)

# 相関行列の構成
sigma_s2 = 10 ** (SNR_dB / 10)  # 信号パワー
sigma_j2 = 10 ** (INR_dB / 10)  # 妨害波パワー
sigma_n2 = 1.0                   # 雑音パワー

# R = σ_s^2 a_s a_s^H + σ_j^2 a_j a_j^H + σ_n^2 I
R = sigma_s2 * (a_s @ a_s.conj().T) + \
    sigma_j2 * (a_j @ a_j.conj().T) + \
    sigma_n2 * np.eye(N)

# MVDR重みの計算(所望方向 = signal_dir)
a_steer = steering_vector(signal_dir, N, d_lambda).reshape(-1, 1)
R_inv = np.linalg.inv(R)
w_mvdr = R_inv @ a_steer / (a_steer.conj().T @ R_inv @ a_steer)

# 従来ビームフォーマの重み
w_conv = a_steer / N

# ビームパターンの計算
theta_scan = np.linspace(-90, 90, 1000)
P_mvdr = np.zeros(len(theta_scan))
P_conv = np.zeros(len(theta_scan))

for i, th in enumerate(theta_scan):
    a_th = steering_vector(th, N, d_lambda).reshape(-1, 1)
    P_conv[i] = np.abs(w_conv.conj().T @ a_th).item() ** 2
    P_mvdr[i] = np.abs(w_mvdr.conj().T @ a_th).item() ** 2

P_conv_dB = 10 * np.log10(P_conv / P_conv.max() + 1e-12)
P_mvdr_dB = 10 * np.log10(P_mvdr / P_mvdr.max() + 1e-12)

# 可視化
plt.figure(figsize=(12, 6))
plt.plot(theta_scan, P_conv_dB, 'b-', label='Conventional BF', linewidth=1.5)
plt.plot(theta_scan, P_mvdr_dB, 'r-', label='MVDR BF', linewidth=1.5)
plt.axvline(x=signal_dir, color='g', linestyle='--', alpha=0.7,
            label=f'Signal ({signal_dir}°)')
plt.axvline(x=jammer_dir, color='m', linestyle='--', alpha=0.7,
            label=f'Jammer ({jammer_dir}°)')
plt.xlabel('Angle [deg]')
plt.ylabel('Beam Pattern [dB]')
plt.title('Conventional BF vs MVDR BF')
plt.xlim([-90, 90])
plt.ylim([-60, 5])
plt.grid(True, alpha=0.3)
plt.legend(fontsize=11)
plt.tight_layout()
plt.show()

このシミュレーションでは、従来のビームフォーマ(遅延和)とMVDRビームフォーマの性能を比較しています。従来のビームフォーマでは妨害波方向のサイドローブが高いままですが、MVDRビームフォーマでは妨害波方向に深いヌルが自動的に形成されていることが確認できます。これがDBFの大きな利点です。

まとめ

本記事では、フェーズドアレイレーダーの原理と理論について解説しました。

  • ビームステアリングは、隣接素子間に位相差 $\Delta\phi = -kd\sin\theta_{\text{steer}}$ を与えることで実現される
  • 走査角が大きくなるとビーム幅は $1/\cos\theta_{\text{steer}}$ で劣化する($\cos\theta$ 劣化)
  • グレーティングローブを抑圧するには、素子間隔を $d < \lambda/(1 + \sin\theta_{\text{max}})$ にする必要がある
  • PESAは単一送信機+位相シフタの構成で、AESAは各素子にT/Rモジュールを搭載する構成
  • AESAの発展としてDBFがあり、受信信号をデジタル処理することで同時マルチビームや適応ヌル制御が可能

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