アレイアンテナとビームフォーミングの理論を解説

アレイアンテナは、複数のアンテナ素子を空間的に配列し、各素子への給電振幅・位相を制御することで、放射パターン(指向性)を自在に操る技術です。レーダー、衛星通信、5G基地局など、現代の無線通信システムで幅広く利用されています。

単一のアンテナ素子では実現困難な鋭い指向性やビームの電子的な走査(ビームステアリング)が可能になるため、アレイアンテナの理論は電波工学の中核をなすテーマの一つです。

本記事の内容

  • アレイアンテナの基本原理(素子パターンとアレイファクター)
  • 等間隔線形アレイのアレイファクターの導出
  • 等振幅等間隔アレイの閉形式の導出
  • 主ローブ方向と素子間位相の関係
  • グレーティングローブの発生条件の導出
  • ビームステアリング(位相制御による指向性走査)
  • テーパリングによるサイドローブ抑圧
  • Pythonでのアレイファクター計算と可視化

前提知識

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

アレイアンテナとは

アレイアンテナ(Array Antenna)とは、複数のアンテナ素子を規則的に配置し、それぞれの素子に適切な振幅と位相で給電することで、所望の放射パターンを形成するアンテナシステムです。

アレイアンテナの最大の特長は、物理的にアンテナを動かすことなく、電気的にビームの方向を変えられる点です。これにより、機械式のアンテナ回転に比べて圧倒的に高速なビーム走査が可能となります。

パターン乗算の定理

アレイアンテナの放射パターンを理解する鍵は、パターン乗算の定理(Pattern Multiplication Theorem)です。

全体の放射パターン $E_{\text{total}}(\theta, \phi)$ は、単一素子の放射パターン $E_{\text{element}}(\theta, \phi)$ と、素子の配列のみから決まるアレイファクター $\text{AF}(\theta, \phi)$ の積で表されます。

$$ E_{\text{total}}(\theta, \phi) = E_{\text{element}}(\theta, \phi) \times \text{AF}(\theta, \phi) $$

この定理は、すべての素子が同一の放射パターンを持つ(同種素子)場合に成立します。つまり、アレイアンテナの設計問題は、個々の素子の設計と、アレイファクターの設計に分離できるのです。

等間隔線形アレイのアレイファクター

モデルの設定

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

各素子に対して、振幅 $a_n$ と位相 $\alpha_n$ を与えます。遠方界(far field)において、$\theta$ 方向($z$ 軸からの角度)への放射を考えると、$n$ 番目の素子からの電波は、基準素子($n = 0$)と比べて $n d \cos\theta$ だけ余分な経路差を持ちます。

アレイファクターの導出

$n$ 番目の素子からの寄与は、振幅 $a_n$、位相進み $k \cdot n d \cos\theta + \alpha_n$ で表されます。ここで $k = 2\pi / \lambda$ は波数です。

全素子の寄与を重ね合わせると、アレイファクターは次のように書けます。

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

等振幅($a_n = 1$ for all $n$)かつ等間隔位相差($\alpha_n = n \alpha_0$、ただし $\alpha_0$ は隣接素子間の位相差)の場合、

$$ \text{AF}(\theta) = \sum_{n=0}^{N-1} e^{jn(kd\cos\theta + \alpha_0)} $$

ここで、$\psi = kd\cos\theta + \alpha_0$ とおくと、

$$ \text{AF} = \sum_{n=0}^{N-1} e^{jn\psi} $$

これは等比級数(公比 $e^{j\psi}$)ですので、公式を用いて閉形式を求めます。

等比級数の閉形式の導出

等比級数の和の公式を適用します。

$$ \sum_{n=0}^{N-1} r^n = \frac{1 – r^N}{1 – r} $$

$r = e^{j\psi}$ を代入すると、

$$ \text{AF} = \frac{1 – e^{jN\psi}}{1 – e^{j\psi}} $$

分子と分母をそれぞれ半分の指数で括り出します。

分子について:

$$ 1 – e^{jN\psi} = e^{jN\psi/2} \left( e^{-jN\psi/2} – e^{jN\psi/2} \right) = -e^{jN\psi/2} \cdot 2j \sin\!\left(\frac{N\psi}{2}\right) $$

分母について:

$$ 1 – e^{j\psi} = e^{j\psi/2} \left( e^{-j\psi/2} – e^{j\psi/2} \right) = -e^{j\psi/2} \cdot 2j \sin\!\left(\frac{\psi}{2}\right) $$

したがって、

$$ \text{AF} = \frac{-e^{jN\psi/2} \cdot 2j \sin\!\left(\frac{N\psi}{2}\right)}{-e^{j\psi/2} \cdot 2j \sin\!\left(\frac{\psi}{2}\right)} = e^{j(N-1)\psi/2} \cdot \frac{\sin\!\left(\frac{N\psi}{2}\right)}{\sin\!\left(\frac{\psi}{2}\right)} $$

位相項 $e^{j(N-1)\psi/2}$ はアレイの中心を基準にとると消えるため、パターンの振幅(指向性パターン)を議論する上では無視できます。正規化したアレイファクターは次のようになります。

$$ \boxed{ \text{AF}_N(\theta) = \frac{1}{N} \frac{\sin\!\left(\frac{N\psi}{2}\right)}{\sin\!\left(\frac{\psi}{2}\right)}, \quad \psi = kd\cos\theta + \alpha_0 } $$

$1/N$ は最大値が1となるように正規化した係数です。$\psi = 0$ のとき、ロピタルの定理により $\text{AF}_N = N/N = 1$ であることが確認できます。

主ローブの方向

主ローブ(main lobe)は $|\text{AF}|$ が最大となる方向です。$\text{AF}$ が最大となるのは $\psi = 0$ のとき、すなわち

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

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

$$ \boxed{ \theta_0 = \arccos\!\left( -\frac{\alpha_0 \lambda}{2\pi d} \right) } $$

この式は極めて重要です。素子間の位相差 $\alpha_0$ を変えるだけで、主ローブの方向 $\theta_0$ を制御できることを示しています。これがビームステアリングの原理です。

例えば、$\alpha_0 = 0$ のとき $\theta_0 = 90°$(ブロードサイド方向)、$\alpha_0 = -kd$ のとき $\theta_0 = 0°$(エンドファイア方向)となります。

ヌル(零点)の方向

$\text{AF} = 0$ となるのは、分子 $\sin(N\psi/2) = 0$ かつ分母 $\sin(\psi/2) \neq 0$ のとき、すなわち

$$ \frac{N\psi}{2} = m\pi, \quad m = \pm 1, \pm 2, \ldots \quad (m \neq 0, \pm N, \pm 2N, \ldots) $$

$$ \psi_{\text{null}} = \frac{2m\pi}{N} $$

$\psi = kd\cos\theta + \alpha_0$ に代入すると、

$$ \cos\theta_{\text{null}} = \frac{1}{kd}\left( \frac{2m\pi}{N} – \alpha_0 \right) $$

最初のヌル($m = 1$)が主ローブの隣に位置し、主ローブの半値幅(ビーム幅)を規定します。素子数 $N$ が大きいほど、ヌルの間隔が狭くなり、ビームが鋭くなります。

半値ビーム幅(HPBW)

ブロードサイドアレイ($\alpha_0 = 0$, $\theta_0 = 90°$)の場合、主ローブの半値ビーム幅(Half Power Beam Width: HPBW)の近似式を導出します。

半値点は $|\text{AF}|^2 = 1/2$($|\text{AF}|$ の最大値を1に正規化)となる点です。$\theta = \pi/2 + \Delta\theta$ とおくと、$\cos\theta \approx -\Delta\theta$(微小角近似)より、

$$ \psi = kd \cos\theta \approx -kd \, \Delta\theta $$

$\psi$ が小さい範囲では $\sin(x) \approx x$ と近似できるため、

$$ |\text{AF}| \approx \left| \frac{\sin(N\psi/2)}{N \sin(\psi/2)} \right| \approx \left| \frac{\sin(Nkd\Delta\theta/2)}{Nkd\Delta\theta/2} \right| = \left| \text{sinc}\!\left( \frac{Nkd\Delta\theta}{2\pi} \right) \right| $$

$\text{sinc}(x) = 1/\sqrt{2}$ となるのは $x \approx 0.4429$ のとき($\sin(\pi x)/(\pi x) = 1/\sqrt{2}$ を数値的に解く)です。したがって、

$$ \frac{Nkd \, \Delta\theta_{3\text{dB}}}{2\pi} \approx 0.4429 $$

$$ \Delta\theta_{3\text{dB}} \approx \frac{2\pi \times 0.4429}{Nkd} = \frac{0.886\lambda}{Nd} $$

HPBWは $2\Delta\theta_{3\text{dB}}$ ですから、

$$ \boxed{ \text{HPBW} \approx \frac{0.886 \lambda}{Nd} \approx \frac{0.886 \lambda}{L} } $$

ここで $L = Nd$ はアレイの全長です。アレイが長いほどビームが鋭くなる(角度分解能が高い)ことがわかります。

グレーティングローブの発生条件

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

アレイファクターの分母 $\sin(\psi/2)$ もゼロになる点では、$\text{AF}$ が主ローブと同じ大きさの極大値を持ちます。この不要なローブをグレーティングローブ(grating lobe)と呼びます。

発生条件の導出

分母 $\sin(\psi/2) = 0$ となるのは $\psi = 2m\pi$($m$ は整数)のときです。$m = 0$ が主ローブに対応し、$m \neq 0$ がグレーティングローブです。

$\psi = kd\cos\theta + \alpha_0 = 2m\pi$ より、

$$ \cos\theta_m = \frac{2m\pi – \alpha_0}{kd} = \frac{m\lambda}{d} – \frac{\alpha_0}{kd} $$

ブロードサイドアレイ($\alpha_0 = 0$)の場合、

$$ \cos\theta_m = \frac{m\lambda}{d} $$

グレーティングローブが実空間に現れない条件は $|\cos\theta_m| > 1$($m \neq 0$)、すなわち、

$$ \left| \frac{m\lambda}{d} \right| > 1 \quad \text{for} \quad m = \pm 1, \pm 2, \ldots $$

最も厳しい条件は $|m| = 1$ のときで、

$$ \frac{\lambda}{d} > 1 \quad \Longrightarrow \quad \boxed{ d < \lambda } $$

つまり、素子間隔 $d$ を波長 $\lambda$ 未満にすればグレーティングローブは発生しません。

ビームステアリング時の条件

ビームステアリングにより主ローブを $\theta_0$ 方向に向ける場合($\alpha_0 = -kd\cos\theta_0$)、$m = -1$ のグレーティングローブの方向は

$$ \cos\theta_{-1} = -\frac{\lambda}{d} + \cos\theta_0 $$

これが実空間に現れない条件 $\cos\theta_{-1} < -1$ より、

$$ -\frac{\lambda}{d} + \cos\theta_0 < -1 $$

$$ \frac{\lambda}{d} > 1 + \cos\theta_0 $$

最も厳しいのは $\theta_0 = 0°$($\cos\theta_0 = 1$)のときで、

$$ d < \frac{\lambda}{2} $$

したがって、全方向にビームステアリングする場合は $d < \lambda/2$ が必要です。

ビームステアリング

ビームステアリング(Beam Steering)とは、各素子への給電位相を制御することで主ローブの方向を電気的に変える技術です。

主ローブを $\theta_0$ 方向に向けるには、

$$ \alpha_0 = -kd\cos\theta_0 $$

と設定します。このとき $n$ 番目の素子への位相設定は

$$ \alpha_n = n \alpha_0 = -nkd\cos\theta_0 $$

これは物理的に解釈すると、$\theta_0$ 方向に向かう平面波の位相面が全素子に同時に到達するような位相補償を与えることに相当します。

テーパリングによるサイドローブ抑圧

サイドローブの問題

等振幅給電のアレイでは、最大サイドローブレベル(SLL: Side Lobe Level)は素子数 $N$ によらず約 $-13.3$ dB です。これは $\text{sinc}$ 関数の最初のサイドローブレベルに対応します。

多くの応用では、サイドローブが大きいと不要な方向からの干渉を受けるため、サイドローブを抑圧する必要があります。

振幅テーパリング

振幅テーパリング(Amplitude Tapering)とは、アレイの端に行くほど素子の給電振幅を下げる手法です。代表的なテーパリング手法を紹介します。

コサインテーパリング

$$ a_n = \cos\!\left( \frac{\pi (n – (N-1)/2)}{N} \right), \quad n = 0, 1, \ldots, N-1 $$

SLLは約 $-23$ dB まで改善されますが、主ローブが広がるトレードオフがあります。

チェビシェフテーパリング

チェビシェフ多項式を用いて、すべてのサイドローブが指定したレベル以下で等しくなるように重み係数を設計します。等リップルの特性を持つため、指定SLLに対してビーム幅が最小になるという最適性を持ちます。

テイラー分布

テイラー分布(Taylor distribution)は、チェビシェフ分布の主ローブに近い $\bar{n}$ 本のサイドローブのみを等レベルに制御し、遠方のサイドローブは自然に減衰させる手法です。実用上よく使われます。

テーパリングのトレードオフ

テーパリングにはサイドローブ抑圧とビーム幅の間にトレードオフがあります。

テーパリング SLL (dB) ビーム幅の拡大率
等振幅(なし) -13.3 1.00
コサイン -23.0 1.36
ハニング -31.5 1.63
チェビシェフ (-30 dB) -30.0 1.40

Pythonでの実装

アレイファクターの計算と可視化

import numpy as np
import matplotlib.pyplot as plt

def array_factor(theta, N, d_lambda, alpha0=0.0, weights=None):
    """
    アレイファクターを計算する
    theta: 角度 [rad](z軸からの角度)
    N: 素子数
    d_lambda: 素子間隔(波長で正規化 d/lambda)
    alpha0: 隣接素子間の位相差 [rad]
    weights: 各素子の振幅重み(Noneの場合は等振幅)
    """
    if weights is None:
        weights = np.ones(N)

    k = 2 * np.pi  # k*lambda = 2*pi なので k*d = 2*pi*d_lambda
    psi = k * d_lambda * np.cos(theta) + alpha0

    # 各素子の寄与を足し合わせる
    af = np.zeros(len(theta), dtype=complex)
    for n in range(N):
        af += weights[n] * np.exp(1j * n * psi)

    return af

# パラメータ設定
theta = np.linspace(0, np.pi, 1000)
N_list = [4, 8, 16, 32]
d_lambda = 0.5  # d = lambda/2

# 素子数による指向性の変化
fig, axes = plt.subplots(1, 2, figsize=(14, 6))

for N in N_list:
    af = array_factor(theta, N, d_lambda)
    af_norm = np.abs(af) / N  # 正規化
    af_dB = 20 * np.log10(np.maximum(af_norm, 1e-10))

    axes[0].plot(np.degrees(theta), af_norm, label=f'N = {N}')
    axes[1].plot(np.degrees(theta), af_dB, label=f'N = {N}')

axes[0].set_xlabel('Angle [deg]')
axes[0].set_ylabel('Normalized |AF|')
axes[0].set_title('Array Factor (Linear Scale)')
axes[0].legend()
axes[0].grid(True)
axes[0].set_xlim(0, 180)

axes[1].set_xlabel('Angle [deg]')
axes[1].set_ylabel('|AF| [dB]')
axes[1].set_title('Array Factor (dB Scale)')
axes[1].legend()
axes[1].grid(True)
axes[1].set_xlim(0, 180)
axes[1].set_ylim(-40, 0)

plt.tight_layout()
plt.show()

素子数 $N$ を増やすと主ローブが鋭くなり、サイドローブの数が増える様子が確認できます。

ビームステアリングの可視化

import numpy as np
import matplotlib.pyplot as plt

def array_factor(theta, N, d_lambda, alpha0=0.0, weights=None):
    """アレイファクターを計算する"""
    if weights is None:
        weights = np.ones(N)
    k = 2 * np.pi
    psi = k * d_lambda * np.cos(theta) + alpha0
    af = np.zeros(len(theta), dtype=complex)
    for n in range(N):
        af += weights[n] * np.exp(1j * n * psi)
    return af

theta = np.linspace(0, np.pi, 1000)
N = 16
d_lambda = 0.5
k = 2 * np.pi

# ビームステアリング角度
steer_angles = [90, 75, 60, 45, 30]

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

for theta0_deg in steer_angles:
    theta0 = np.radians(theta0_deg)
    alpha0 = -k * d_lambda * np.cos(theta0)  # ビームステアリング位相

    af = array_factor(theta, N, d_lambda, alpha0)
    af_norm = np.abs(af) / N
    af_dB = 20 * np.log10(np.maximum(af_norm, 1e-10))

    axes[0].plot(np.degrees(theta), af_norm,
                 label=f'Steer = {theta0_deg}°')
    axes[1].plot(np.degrees(theta), af_dB,
                 label=f'Steer = {theta0_deg}°')

axes[0].set_xlabel('Angle [deg]')
axes[0].set_ylabel('Normalized |AF|')
axes[0].set_title(f'Beam Steering (N={N}, d=lambda/2)')
axes[0].legend()
axes[0].grid(True)
axes[0].set_xlim(0, 180)

axes[1].set_xlabel('Angle [deg]')
axes[1].set_ylabel('|AF| [dB]')
axes[1].set_title(f'Beam Steering (dB, N={N})')
axes[1].legend()
axes[1].grid(True)
axes[1].set_xlim(0, 180)
axes[1].set_ylim(-40, 0)

plt.tight_layout()
plt.show()

位相差 $\alpha_0$ を変えるだけで主ローブの方向が変わることが確認できます。しかし、ステアリング角が大きくなる($\theta_0$ が小さくなる)につれて主ローブが広がり、利得が低下する傾向があります。

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

import numpy as np
import matplotlib.pyplot as plt

def array_factor(theta, N, d_lambda, alpha0=0.0, weights=None):
    """アレイファクターを計算する"""
    if weights is None:
        weights = np.ones(N)
    k = 2 * np.pi
    psi = k * d_lambda * np.cos(theta) + alpha0
    af = np.zeros(len(theta), dtype=complex)
    for n in range(N):
        af += weights[n] * np.exp(1j * n * psi)
    return af

theta = np.linspace(0.001, np.pi - 0.001, 2000)
N = 8

# 素子間隔による変化
d_lambda_list = [0.25, 0.5, 0.75, 1.0, 1.5]

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

for i, d_lam in enumerate(d_lambda_list):
    af = array_factor(theta, N, d_lam)
    af_norm = np.abs(af) / N
    af_dB = 20 * np.log10(np.maximum(af_norm, 1e-10))

    axes[i].plot(np.degrees(theta), af_dB, 'b-', linewidth=1)
    axes[i].set_xlabel('Angle [deg]')
    axes[i].set_ylabel('|AF| [dB]')
    axes[i].set_title(f'd = {d_lam}λ (N={N})')
    axes[i].grid(True)
    axes[i].set_xlim(0, 180)
    axes[i].set_ylim(-40, 5)

    # グレーティングローブがあるかどうか判定
    if d_lam >= 1.0:
        axes[i].set_title(f'd = {d_lam}λ (Grating Lobes!)', color='red')

# 不要なサブプロットを非表示
axes[5].axis('off')

plt.suptitle('Grating Lobe Occurrence vs Element Spacing', fontsize=14)
plt.tight_layout()
plt.show()

$d = \lambda$ 以上では主ローブと同等の大きさを持つグレーティングローブが出現し、指向性が劣化していることが確認できます。

テーパリングによるサイドローブ抑圧

import numpy as np
import matplotlib.pyplot as plt

def array_factor(theta, N, d_lambda, alpha0=0.0, weights=None):
    """アレイファクターを計算する"""
    if weights is None:
        weights = np.ones(N)
    k = 2 * np.pi
    psi = k * d_lambda * np.cos(theta) + alpha0
    af = np.zeros(len(theta), dtype=complex)
    for n in range(N):
        af += weights[n] * np.exp(1j * n * psi)
    return af

theta = np.linspace(0, np.pi, 2000)
N = 32
d_lambda = 0.5
n_arr = np.arange(N)

# 各テーパリングの重み係数
# 等振幅
w_uniform = np.ones(N)

# コサインテーパリング
w_cosine = np.cos(np.pi * (n_arr - (N-1)/2) / N)

# ハニングテーパリング
w_hanning = 0.5 * (1 - np.cos(2 * np.pi * n_arr / (N - 1)))

# テイラー窓(近似:numpyのblackman窓で代用)
w_blackman = np.blackman(N)

taperings = {
    'Uniform': w_uniform,
    'Cosine': w_cosine,
    'Hanning': w_hanning,
    'Blackman': w_blackman,
}

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

for name, w in taperings.items():
    af = array_factor(theta, N, d_lambda, weights=w)
    af_norm = np.abs(af) / np.max(np.abs(af))  # 最大値で正規化
    af_dB = 20 * np.log10(np.maximum(af_norm, 1e-10))

    axes[0].plot(np.degrees(theta), af_dB, label=name, linewidth=1)

axes[0].set_xlabel('Angle [deg]')
axes[0].set_ylabel('|AF| [dB]')
axes[0].set_title(f'Tapering Comparison (N={N}, d=λ/2)')
axes[0].legend()
axes[0].grid(True)
axes[0].set_xlim(60, 120)
axes[0].set_ylim(-60, 0)

# 重み係数の比較
for name, w in taperings.items():
    axes[1].plot(n_arr, w / np.max(w), 'o-', markersize=3, label=name)

axes[1].set_xlabel('Element Index')
axes[1].set_ylabel('Normalized Weight')
axes[1].set_title('Tapering Weights')
axes[1].legend()
axes[1].grid(True)

plt.tight_layout()
plt.show()

テーパリングによってサイドローブが大幅に抑制される一方、主ローブが広がることが確認できます。

極座標プロットによる放射パターンの可視化

import numpy as np
import matplotlib.pyplot as plt

def array_factor(theta, N, d_lambda, alpha0=0.0, weights=None):
    """アレイファクターを計算する"""
    if weights is None:
        weights = np.ones(N)
    k = 2 * np.pi
    psi = k * d_lambda * np.cos(theta) + alpha0
    af = np.zeros(len(theta), dtype=complex)
    for n in range(N):
        af += weights[n] * np.exp(1j * n * psi)
    return af

theta = np.linspace(0, 2 * np.pi, 3600)
N = 16
d_lambda = 0.5
k = 2 * np.pi

fig, axes = plt.subplots(1, 3, figsize=(18, 6),
                          subplot_kw={'projection': 'polar'})

# ブロードサイド
alpha0 = 0
af = array_factor(theta, N, d_lambda, alpha0)
af_norm = np.abs(af) / N
af_dB = 20 * np.log10(np.maximum(af_norm, 1e-10))
af_dB_plot = np.maximum(af_dB, -40) + 40  # -40dBをゼロに
axes[0].plot(theta, af_dB_plot, 'b-', linewidth=1)
axes[0].set_title('Broadside (θ₀ = 90°)', pad=20)
axes[0].set_theta_zero_location('N')

# 45度ステアリング
theta0 = np.radians(60)
alpha0 = -k * d_lambda * np.cos(theta0)
af = array_factor(theta, N, d_lambda, alpha0)
af_norm = np.abs(af) / N
af_dB = 20 * np.log10(np.maximum(af_norm, 1e-10))
af_dB_plot = np.maximum(af_dB, -40) + 40
axes[1].plot(theta, af_dB_plot, 'r-', linewidth=1)
axes[1].set_title('Steered (θ₀ = 60°)', pad=20)
axes[1].set_theta_zero_location('N')

# テーパリング付き
alpha0 = 0
w_hanning = 0.5 * (1 - np.cos(2 * np.pi * np.arange(N) / (N - 1)))
af = array_factor(theta, N, d_lambda, alpha0, weights=w_hanning)
af_norm = np.abs(af) / np.max(np.abs(af))
af_dB = 20 * np.log10(np.maximum(af_norm, 1e-10))
af_dB_plot = np.maximum(af_dB, -40) + 40
axes[2].plot(theta, af_dB_plot, 'g-', linewidth=1)
axes[2].set_title('Hanning Taper (θ₀ = 90°)', pad=20)
axes[2].set_theta_zero_location('N')

plt.suptitle(f'Polar Radiation Patterns (N={N}, d=λ/2)', fontsize=14, y=1.02)
plt.tight_layout()
plt.show()

極座標プロットにより、ビームの空間的な放射パターンを直感的に把握できます。

まとめ

本記事では、アレイアンテナとビームフォーミングの理論について解説しました。

  • アレイアンテナの放射パターンは、素子パターンとアレイファクターの積で表される(パターン乗算の定理)
  • 等間隔線形アレイのアレイファクターは $\text{AF} = \frac{1}{N}\frac{\sin(N\psi/2)}{\sin(\psi/2)}$ の閉形式で表される
  • 素子間の位相差 $\alpha_0$ を変えることで、主ローブの方向を電気的に制御できる(ビームステアリング)
  • グレーティングローブを防ぐには素子間隔を $d < \lambda$(全方向ステアリングでは $d < \lambda/2$)にする
  • テーパリング(コサイン、ハニング、チェビシェフ等)によりサイドローブを抑圧できるが、ビーム幅が広がるトレードオフがある
  • 素子数 $N$ を増やすとビーム幅は $\text{HPBW} \approx 0.886\lambda/(Nd)$ に従って狭くなる

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