MIMOアンテナの基礎 — 空間多重化で通信容量を飛躍的に増やす仕組み

スマートフォンで動画をストリーミングしながら、同時に何百万人もの人が同じことをしている — こんな状況を可能にしているのがMIMO(Multiple-Input Multiple-Output)技術です。MIMOの登場以前、通信速度を上げるには帯域幅を広げるか送信電力を上げるしかないと考えられていました。しかし、MIMOはアンテナを複数本使うというシンプルなアイデアで、帯域幅も送信電力も変えずに通信容量を飛躍的に向上させました。

これは単に「複数のアンテナで電波を強くする」という話ではありません。MIMOの本質は、空間そのものを「情報伝送の次元」として活用することにあります。1本のアンテナでは1つの「パイプ」しか使えませんが、$N$ 本のアンテナを使えば最大 $N$ 本の独立な「パイプ」を空間上に生み出せるのです。

MIMOの理解は、以下のような最先端技術の基盤となります。

  • 5G/6G通信: Massive MIMO(64〜256本のアンテナ素子)は5Gの中核技術であり、6Gではさらに大規模化が見込まれます
  • Wi-Fi 6/7: MU-MIMO(マルチユーザーMIMO)により、複数の端末への同時通信を実現しています
  • レーダー・センシング: MIMOレーダーは仮想的な大開口アンテナを実現し、角度分解能を大幅に向上させます

本記事の内容

  • SISOの限界 — なぜ複数アンテナが必要か
  • MIMOチャネルモデルの行列表現
  • MIMOチャネル容量の数式(シャノン容量の拡張)
  • SVD(特異値分解)に基づく空間多重化
  • ビームフォーミングとの関係
  • Pythonでチャネル容量のシミュレーション
  • アンテナ素子数・SNRとの関係の可視化

前提知識

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

SISOの限界

シャノンの通信路容量

まず、1本の送信アンテナと1本の受信アンテナからなるSISO(Single-Input Single-Output)システムの限界を確認しましょう。

SISOチャネルは、次のように表されます。

$$ y = hx + n $$

ここで $y$ は受信信号、$x$ は送信信号、$h$ はチャネル係数(複素数)、$n$ は加法性白色ガウス雑音(AWGN)です。

シャノンの通信路容量定理によれば、SISOチャネルの最大通信速度(チャネル容量)は次のように与えられます。

$$ C_{\text{SISO}} = B \log_2(1 + \text{SNR}) $$

ここで $B$ は帯域幅(Hz)、SNRは信号対雑音比です。チャネル係数 $h$ を考慮すると、

$$ C_{\text{SISO}} = B \log_2(1 + |h|^2 \cdot \text{SNR}) $$

容量の限界

SISOチャネル容量の式をよく見ると、容量はSNRの対数でしか増加しないことがわかります。SNRを2倍にしても、容量は約1 bit/s/Hz しか増えません。10倍にしても約3.3 bit/s/Hz です。

現代の通信システムではSNRはすでに十分高い値で運用されていることが多く、さらなるSNRの向上による容量増加は効率的ではありません。これが「SISOの限界」です。

$$ \text{SNR} \to \infty \; \text{のとき} \; C_{\text{SISO}} \approx B \log_2(\text{SNR}) \; (\text{対数的成長}) $$

帯域幅の制約

もう1つの手段は帯域幅 $B$ を広げることです。容量は $B$ に比例するので直接的ですが、周波数帯域は有限の資源であり、各事業者に割り当てられる帯域幅には上限があります。5Gでミリ波帯が導入されたのも、サブ6 GHz帯の帯域不足を補う目的がありました。

では、帯域幅もSNRも変えずに容量を増やす方法はないのでしょうか? この問いに対する答えが、MIMOです。

ここまでで、SISOシステムの容量がSNRの対数でしか成長しないという根本的な限界を確認しました。次に、複数アンテナを導入することでこの限界を打破するMIMOのチャネルモデルを構築しましょう。

MIMOチャネルモデル

システム構成

MIMO システムでは、送信側に $N_t$ 本、受信側に $N_r$ 本のアンテナを配置します。送信アンテナから放射された電磁波は、空間中を伝搬し、反射・散乱を経て受信アンテナに到達します。

行列表現

$N_t$ 本の送信アンテナから $N_r$ 本の受信アンテナへの信号伝搬を、以下のように行列で表現します。

$$ \bm{y} = \bm{H}\bm{x} + \bm{n} $$

ここで、

  • $\bm{x} \in \mathbb{C}^{N_t \times 1}$: 送信信号ベクトル
  • $\bm{y} \in \mathbb{C}^{N_r \times 1}$: 受信信号ベクトル
  • $\bm{n} \in \mathbb{C}^{N_r \times 1}$: 雑音ベクトル($\bm{n} \sim \mathcal{CN}(\bm{0}, \sigma^2 \bm{I})$)
  • $\bm{H} \in \mathbb{C}^{N_r \times N_t}$: チャネル行列

チャネル行列 $\bm{H}$ の $(i, j)$ 成分 $h_{ij}$ は、第 $j$ 送信アンテナから第 $i$ 受信アンテナへのチャネル係数を表します。

$$ \bm{H} = \begin{pmatrix} h_{11} & h_{12} & \cdots & h_{1N_t} \\ h_{21} & h_{22} & \cdots & h_{2N_t} \\ \vdots & \vdots & \ddots & \vdots \\ h_{N_r 1} & h_{N_r 2} & \cdots & h_{N_r N_t} \end{pmatrix} $$

チャネル行列の物理的意味

チャネル行列の各要素 $h_{ij}$ は、空間中の電波伝搬環境を反映した複素数です。これには直接波(見通し経路)、反射波、散乱波などが含まれます。

豊かな散乱環境(都市部など)では、多くの散乱体により多数のマルチパス成分が生じます。このとき $h_{ij}$ は中心極限定理により複素ガウス分布に従い、チャネル行列の各要素は独立同分布(i.i.d.)の複素ガウス確率変数となります。このモデルをレイリーフェージングチャネル(Rayleigh fading channel)と呼びます。

$$ h_{ij} \sim \mathcal{CN}(0, 1) $$

散乱が豊かであるほど、チャネル行列のランクが高くなる傾向があり、これがMIMOの性能を向上させます。逆に、見通し環境(LOS: Line of Sight)のみの場合、チャネル行列のランクは1に近づき、MIMOの効果は限定的になります。

送信電力制約

送信電力の合計に制約 $P$ を課します。

$$ \text{E}[\|\bm{x}\|^2] = \text{tr}(\bm{R}_x) \leq P $$

ここで $\bm{R}_x = \text{E}[\bm{x}\bm{x}^H]$ は送信信号の共分散行列です。

チャネル情報が送信側で未知の場合(オープンループMIMO)、最適な戦略は各送信アンテナに等電力を配分することで、$\bm{R}_x = (P/N_t) \bm{I}$ となります。

ここまでで、MIMOのチャネルモデルを行列で表現しました。次に、このモデルにおけるチャネル容量の公式を導出しましょう。

MIMOチャネル容量

容量公式の導出

MIMOチャネル $\bm{y} = \bm{H}\bm{x} + \bm{n}$ の容量は、相互情報量の最大化から導かれます。

$$ C_{\text{MIMO}} = \max_{\bm{R}_x: \text{tr}(\bm{R}_x) \leq P} B \log_2 \det\left(\bm{I}_{N_r} + \frac{1}{\sigma^2} \bm{H} \bm{R}_x \bm{H}^H\right) $$

ここで $\det$ は行列式、$\bm{I}_{N_r}$ は $N_r \times N_r$ の単位行列です。

チャネル情報が送信側で未知の場合(等電力配分): $\bm{R}_x = (P/N_t)\bm{I}$ として、

$$ C_{\text{MIMO}} = B \log_2 \det\left(\bm{I}_{N_r} + \frac{\text{SNR}}{N_t} \bm{H}\bm{H}^H\right) $$

ここで $\text{SNR} = P / \sigma^2$ は全体のSNRです。

固有値分解による解釈

この容量公式の物理的意味を理解するために、チャネル行列の特異値分解(SVD)を使いましょう。

$\bm{H} = \bm{U}\bm{\Sigma}\bm{V}^H$ と分解すると、

$$ \bm{H}\bm{H}^H = \bm{U}\bm{\Sigma}\bm{\Sigma}^H\bm{U}^H = \bm{U}\bm{\Lambda}\bm{U}^H $$

ここで $\bm{\Lambda} = \text{diag}(\lambda_1, \lambda_2, \ldots, \lambda_r)$ は $\bm{H}\bm{H}^H$ の非ゼロ固有値を対角に並べた行列、$r = \text{rank}(\bm{H}) \leq \min(N_t, N_r)$ はチャネル行列のランクです。

行列式の性質 $\det(\bm{I} + \bm{A}\bm{B}) = \det(\bm{I} + \bm{B}\bm{A})$ と、対角行列の行列式が対角要素の積であることを使うと、

$$ C_{\text{MIMO}} = B \sum_{i=1}^{r} \log_2\left(1 + \frac{\text{SNR}}{N_t} \lambda_i\right) $$

MIMOの本質: 並列チャネルへの分解

上の結果は極めて重要な物理的意味を持っています。MIMOチャネルは、SVDによって $r$ 個の独立な並列SISOチャネルに分解されるのです。各並列チャネルのSNRは $\frac{\text{SNR}}{N_t}\lambda_i$ です。

これを水道管のアナロジーで考えると、SISOは1本の太い水道管、MIMOは $r$ 本の独立した水道管で同時に水を送るようなものです。各水道管の太さ(容量)は固有値 $\lambda_i$ に比例します。

容量のスケーリング

理想的な条件(i.i.d. レイリーフェージング、$N_t = N_r = N$)のもとでは、高SNR領域で、

$$ C_{\text{MIMO}} \approx N \cdot B \log_2\left(\frac{\text{SNR}}{N}\right) \propto N $$

つまり、MIMOの容量はアンテナ素子数 $N$ に線形に比例します。SISOではSNRの対数でしか成長しなかった容量が、アンテナ数に比例して増加するのです。これがMIMOの革命的な点です。

4×4 MIMOなら理論的に4倍、8×8 MIMOなら8倍の容量が得られる可能性があります。

注水定理(チャネル既知の場合)

送信側がチャネル情報を知っている場合(クローズドループMIMO)、各並列チャネルへの電力配分を最適化できます。最適な配分は注水定理(water-filling theorem)で与えられます。

第 $i$ チャネルに配分する電力 $p_i$ は、

$$ p_i = \left(\mu – \frac{\sigma^2}{\lambda_i}\right)^+ $$

ここで $(x)^+ = \max(0, x)$ であり、$\mu$ は全電力制約 $\sum_i p_i = P$ を満たすように決定される水位(water level)です。

注水定理の直感的意味は「条件の良いチャネル($\lambda_i$ が大きい)に多くの電力を配分し、条件の悪いチャネル($\lambda_i$ が小さい)には電力を配分しない(あるいは少なくする)」ということです。バケツに水を注ぐと、深いバケツ($\sigma^2/\lambda_i$ が大きい)には少ししか入らず、浅いバケツには多く入る — この様子が「注水(water-filling)」のアナロジーです。

ここまでで、MIMOチャネル容量の理論を理解しました。次に、SVDによる空間多重化がどのように実現されるかを具体的に見ていきましょう。

SVDに基づく空間多重化

SVDビームフォーミング

チャネル行列 $\bm{H}$ のSVDを $\bm{H} = \bm{U}\bm{\Sigma}\bm{V}^H$ とします。ここで、

  • $\bm{U} \in \mathbb{C}^{N_r \times N_r}$: 受信側のユニタリ行列
  • $\bm{\Sigma} \in \mathbb{R}^{N_r \times N_t}$: 特異値の対角行列
  • $\bm{V} \in \mathbb{C}^{N_t \times N_t}$: 送信側のユニタリ行列

送信側でプリコーディング $\bm{x} = \bm{V}\tilde{\bm{x}}$ を行い、受信側で空間フィルタリング $\tilde{\bm{y}} = \bm{U}^H \bm{y}$ を行うと、

$$ \tilde{\bm{y}} = \bm{U}^H(\bm{H}\bm{V}\tilde{\bm{x}} + \bm{n}) = \bm{U}^H\bm{U}\bm{\Sigma}\bm{V}^H\bm{V}\tilde{\bm{x}} + \bm{U}^H\bm{n} = \bm{\Sigma}\tilde{\bm{x}} + \tilde{\bm{n}} $$

$\bm{\Sigma}$ は対角行列なので、各成分は独立です。

$$ \tilde{y}_i = \sigma_i \tilde{x}_i + \tilde{n}_i, \quad i = 1, 2, \ldots, r $$

つまり、SVDビームフォーミングにより、MIMOチャネルは $r$ 個の完全に独立な並列チャネルに分解されます。各チャネルの利得は特異値 $\sigma_i$ で、SNRは $\sigma_i^2 \cdot \text{SNR} / N_t$ です。

空間多重化の実現

SVDに基づく空間多重化の具体的な手順は以下の通りです。

送信側: 1. $r$ 個の独立なデータストリーム $\tilde{x}_1, \tilde{x}_2, \ldots, \tilde{x}_r$ を準備 2. プリコーディング行列 $\bm{V}$ を適用: $\bm{x} = \bm{V}\tilde{\bm{x}}$ 3. $N_t$ 本のアンテナから $\bm{x}$ の各成分を同時に送信

受信側: 1. $N_r$ 本のアンテナで信号 $\bm{y}$ を受信 2. 空間フィルタ $\bm{U}^H$ を適用: $\tilde{\bm{y}} = \bm{U}^H \bm{y}$ 3. 各成分 $\tilde{y}_i$ を独立に復調

このプロセスにより、同一の周波数帯域・同一の時間スロットで、最大 $r$ 個の独立なデータストリームを同時に伝送できます。

ランクと多重化利得

空間多重化で同時に送れるストリーム数はチャネル行列のランク $r = \text{rank}(\bm{H})$ で制限されます。最大ランクは $\min(N_t, N_r)$ です。

ランクが最大になるための条件は、チャネル行列の各要素が十分に独立であることです。物理的には、これは以下の条件が満たされる場合に実現されます。

  • 豊かなマルチパス環境: 多くの散乱体があり、各送受信アンテナペア間で異なる伝搬経路が存在する
  • 十分なアンテナ間隔: 各アンテナが受信する信号が空間的に独立である(一般に半波長以上の間隔が目安)
  • 角度広がり: 到来波の角度が広い範囲に分布している

見通し環境(LOS)のみの場合、全てのアンテナペア間のチャネル係数が相関を持ち、チャネル行列のランクが低下するため、空間多重化の利得が制限されます。

ここまでで、SVDに基づく空間多重化の原理を理解しました。次に、MIMOと密接に関連するビームフォーミング技術との関係を整理しましょう。

ビームフォーミングとの関係

ビームフォーミングとは

ビームフォーミング(beamforming)は、複数のアンテナ素子に供給する信号の振幅と位相を制御することで、電波の放射(または受信)パターンを特定の方向に集中させる技術です。

物理的には、各アンテナ素子からの電磁波が特定の方向で強め合い、他の方向で弱め合うように位相を調整します。これにより、アンテナアレイ全体の指向性を電子的に制御できます。

MIMOとビームフォーミングの関係

MIMOとビームフォーミングは密接に関連していますが、目的が異なります。

ビームフォーミングの目的: SNRの最大化。特定の方向に電力を集中させることで、受信SNRを向上させます。これはダイバーシティ利得アレイ利得とも呼ばれます。

空間多重化の目的: データレートの最大化。複数の独立なデータストリームを同時に送ることで、スループットを向上させます。

SVDビームフォーミングは、この2つを統一的に扱います。

  • $r = 1$(ランク1チャネル): SVDの第1特異ベクトルのみを使い、全電力を1つのビームに集中させます。これは通常のビームフォーミングと同じです。SNRは $\sigma_1^2 \cdot \text{SNR}$ に向上します。

  • $r > 1$(高ランクチャネル): 複数の特異ベクトルを使い、$r$ 個の独立なビームを同時に形成します。各ビームに独立なデータストリームを載せることで、空間多重化を実現します。

Massive MIMO

5Gで注目されるMassive MIMOは、基地局側に非常に多くのアンテナ素子(64〜256本以上)を配置するシステムです。

Massive MIMOでは、$N_t \gg N_r$(基地局のアンテナ数が端末のアンテナ数よりはるかに多い)という非対称な構成になります。この場合の特徴的な性質として、

$$ \frac{1}{N_t}\bm{H}^H\bm{H} \to \bm{I} \quad (N_t \to \infty) $$

が成り立ちます(大数の法則による)。つまり、アンテナ数を十分に増やせば、チャネル行列は直交化し、ユーザー間干渉は消失します。これにより、単純な整合フィルタ(MF: Matched Filter)やゼロフォーシング(ZF)のような低複雑度の信号処理でも、理論限界に近い性能が達成できるのです。

Massive MIMOは、ビームフォーミングと空間多重化を大規模に組み合わせた技術であり、基地局から複数のユーザーに対して同時に異なるビームを向けるマルチユーザーMIMO(MU-MIMO)を効率的に実現します。

ここまでで、MIMOの理論的な枠組みを包括的に理解しました。次に、Pythonを使ってチャネル容量のシミュレーションを行い、理論の予測を数値的に確認しましょう。

Pythonによるチャネル容量シミュレーション

基本的なチャネル容量計算

まず、MIMOチャネル容量をモンテカルロシミュレーションで計算する基本コードを実装します。

import numpy as np
import matplotlib.pyplot as plt

def mimo_capacity(H, SNR, Nt):
    """MIMOチャネル容量を計算(等電力配分)"""
    Nr = H.shape[0]
    # C = log2(det(I + SNR/Nt * H @ H^H))
    HHH = H @ H.conj().T
    C = np.real(np.log2(np.linalg.det(np.eye(Nr) + (SNR / Nt) * HHH)))
    return C

def mimo_capacity_waterfilling(H, SNR, Nt):
    """MIMOチャネル容量を計算(注水定理による最適電力配分)"""
    # SVD
    U, s, Vh = np.linalg.svd(H)
    lambdas = s**2
    r = len(lambdas)

    # 注水定理
    # p_i = (mu - sigma^2/lambda_i)^+
    sigma2 = 1.0  # 雑音分散(正規化)
    P = SNR  # 全送信電力(正規化)

    # 水位の探索(二分法)
    sorted_idx = np.argsort(-lambdas)  # 大きい順にソート
    lambdas_sorted = lambdas[sorted_idx]

    # 使用するチャネル数を決定
    for k in range(r, 0, -1):
        mu = (P + np.sum(sigma2 / lambdas_sorted[:k])) / k
        p = mu - sigma2 / lambdas_sorted[:k]
        if np.all(p > 0):
            break

    # 容量計算
    C = 0
    for i in range(k):
        C += np.log2(1 + lambdas_sorted[i] * p[i] / sigma2)

    return C

# モンテカルロシミュレーション
np.random.seed(42)
n_trials = 5000
SNR_dB_range = np.arange(-10, 35, 1)
SNR_range = 10**(SNR_dB_range / 10)

# 異なるアンテナ構成
configs = [
    (1, 1, "1×1 SISO"),
    (2, 2, "2×2 MIMO"),
    (4, 4, "4×4 MIMO"),
    (8, 8, "8×8 MIMO"),
]

fig, ax = plt.subplots(figsize=(10, 7))
colors = ["#00e5ff", "#e040fb", "#ffca28", "#76ff03"]

for (Nt, Nr, label), color in zip(configs, colors):
    avg_capacities = []
    for SNR in SNR_range:
        capacities = []
        for _ in range(n_trials):
            # i.i.d. レイリーフェージングチャネル
            H = (np.random.randn(Nr, Nt) + 1j * np.random.randn(Nr, Nt)) / np.sqrt(2)
            C = mimo_capacity(H, SNR, Nt)
            capacities.append(C)
        avg_capacities.append(np.mean(capacities))

    ax.plot(SNR_dB_range, avg_capacities, color=color, linewidth=2.5, label=label)

ax.set_xlabel("SNR [dB]", fontsize=13)
ax.set_ylabel("Ergodic Capacity [bit/s/Hz]", fontsize=13)
ax.set_title("MIMO Channel Capacity (Equal Power, Rayleigh Fading)", fontsize=14)
ax.legend(fontsize=12, loc="upper left")
ax.grid(True, alpha=0.3)
ax.set_xlim([-10, 34])

plt.tight_layout()
plt.savefig("mimo_capacity_snr.png", dpi=150, bbox_inches="tight")
plt.show()

MIMOチャネル容量のSNR依存性から、MIMOの威力が明確に読み取れます。

  1. 線形スケーリング: 高SNR領域で、容量はアンテナ数にほぼ比例しています。4×4 MIMOはSISOの約4倍、8×8 MIMOは約8倍の容量を達成しています。これは理論的予測 $C \approx \min(N_t, N_r) \cdot \log_2(\text{SNR}/N_t)$ と一致しています。

  2. 低SNR領域: 低SNRでは各構成の差が小さく、MIMOの利点が限定的です。これは、SNRが低いと各並列チャネルの容量が小さく、多重化の効果が発揮されにくいためです。

  3. 高SNR領域の傾き: 各曲線の傾き(容量のSNRに対する増加率)は、高SNRで $\min(N_t, N_r)$ に近づきます。SISOの傾きは約3.3 bit/s/Hz per 10 dB ですが、4×4 MIMOでは約13.3 bit/s/Hz per 10 dB です。

アンテナ素子数と容量の関係

次に、アンテナ素子数を連続的に変化させたときの容量を見てみましょう。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
n_trials = 3000

# 固定SNR値
SNR_dB_values = [0, 10, 20, 30]
N_range = np.arange(1, 33)

fig, ax = plt.subplots(figsize=(10, 7))
colors = ["#00e5ff", "#e040fb", "#ffca28", "#76ff03"]

for SNR_dB, color in zip(SNR_dB_values, colors):
    SNR = 10**(SNR_dB / 10)
    avg_capacities = []

    for N in N_range:
        capacities = []
        for _ in range(n_trials):
            H = (np.random.randn(N, N) + 1j * np.random.randn(N, N)) / np.sqrt(2)
            Nr = H.shape[0]
            HHH = H @ H.conj().T
            C = np.real(np.log2(np.linalg.det(np.eye(Nr) + (SNR / N) * HHH)))
            capacities.append(C)
        avg_capacities.append(np.mean(capacities))

    ax.plot(N_range, avg_capacities, "o-", color=color, linewidth=2, markersize=4,
            label=f"SNR = {SNR_dB} dB")

# 理論的な線形参照線
for SNR_dB, color in zip(SNR_dB_values, colors):
    SNR = 10**(SNR_dB / 10)
    # 高SNR近似: C ≈ N × log2(SNR/N) (N=1の値を基準にスケーリング)
    C1 = np.log2(1 + SNR)
    ax.plot([0, 32], [0, 32 * C1 / 4], "--", color=color, alpha=0.3, linewidth=1)

ax.set_xlabel("Number of Antennas (N = Nt = Nr)", fontsize=13)
ax.set_ylabel("Ergodic Capacity [bit/s/Hz]", fontsize=13)
ax.set_title("MIMO Capacity vs Number of Antennas", fontsize=14)
ax.legend(fontsize=12, loc="upper left")
ax.grid(True, alpha=0.3)
ax.set_xlim([0, 32])

plt.tight_layout()
plt.savefig("mimo_capacity_antennas.png", dpi=150, bbox_inches="tight")
plt.show()

アンテナ素子数に対する容量のグラフから、MIMOシステム設計に関する重要な洞察が得られます。

  1. 線形成長の確認: 容量はアンテナ数 $N$ にほぼ線形に比例して増加しています。これは「アンテナを2倍にすれば容量も2倍」という、MIMOの最も強力な特性です。

  2. SNRによるスケール効果: 高SNR(30 dB)ではアンテナ1本あたりの容量寄与が大きく、低SNR(0 dB)では小さくなります。システム設計では、SNR環境に応じてアンテナ数を適切に選択する必要があります。

  3. 実用上の上限: 理想的なi.i.d.チャネルでは容量は単調に増加しますが、実際にはアンテナ間の相関、チャネル推定の困難さ、ハードウェアの複雑さなどにより、アンテナ数を増やす利点は次第に飽和します。

等電力配分 vs 注水定理の比較

チャネル情報の有無(等電力配分 vs 注水定理)による容量の差を比較しましょう。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
n_trials = 3000
Nt = Nr = 4
SNR_dB_range = np.arange(-10, 35, 1)
SNR_range = 10**(SNR_dB_range / 10)

avg_C_equal = []
avg_C_wf = []

for SNR in SNR_range:
    C_equal_list = []
    C_wf_list = []

    for _ in range(n_trials):
        H = (np.random.randn(Nr, Nt) + 1j * np.random.randn(Nr, Nt)) / np.sqrt(2)

        # 等電力配分
        HHH = H @ H.conj().T
        C_eq = np.real(np.log2(np.linalg.det(np.eye(Nr) + (SNR / Nt) * HHH)))
        C_equal_list.append(C_eq)

        # 注水定理
        U, s, Vh = np.linalg.svd(H)
        lambdas = s**2
        r = len(lambdas)
        sigma2 = 1.0
        P = SNR

        # 使用チャネル数を決定
        sorted_lam = np.sort(lambdas)[::-1]
        C_wf = 0
        for k in range(r, 0, -1):
            mu = (P + np.sum(sigma2 / sorted_lam[:k])) / k
            p = mu - sigma2 / sorted_lam[:k]
            if np.all(p > 0):
                for i in range(k):
                    C_wf += np.log2(1 + sorted_lam[i] * p[i] / sigma2)
                break
        C_wf_list.append(C_wf)

    avg_C_equal.append(np.mean(C_equal_list))
    avg_C_wf.append(np.mean(C_wf_list))

fig, ax = plt.subplots(figsize=(10, 7))

ax.plot(SNR_dB_range, avg_C_equal, "c-", linewidth=2.5, label="Equal power allocation")
ax.plot(SNR_dB_range, avg_C_wf, "m--", linewidth=2.5, label="Water-filling (optimal)")

# 差を網掛け
ax.fill_between(SNR_dB_range, avg_C_equal, avg_C_wf, alpha=0.15, color="#e040fb")

ax.set_xlabel("SNR [dB]", fontsize=13)
ax.set_ylabel("Ergodic Capacity [bit/s/Hz]", fontsize=13)
ax.set_title("4×4 MIMO: Equal Power vs Water-Filling", fontsize=14)
ax.legend(fontsize=12, loc="upper left")
ax.grid(True, alpha=0.3)
ax.set_xlim([-10, 34])

plt.tight_layout()
plt.savefig("mimo_waterfilling.png", dpi=150, bbox_inches="tight")
plt.show()

# 差の解析
diff = np.array(avg_C_wf) - np.array(avg_C_equal)
print(f"低SNR (-5 dB) での容量差: {diff[5]:.2f} bit/s/Hz")
print(f"中SNR (10 dB) での容量差: {diff[20]:.2f} bit/s/Hz")
print(f"高SNR (30 dB) での容量差: {diff[40]:.2f} bit/s/Hz")

等電力配分と注水定理の比較から、チャネル情報の価値に関する重要な知見が得られます。

  1. 低SNRでの大きな差: 低SNR領域(-10〜0 dB)では、注水定理による容量改善が顕著です。低SNRでは一部のチャネルのSNRが非常に低く、データを送っても雑音に埋もれてしまうため、良いチャネルに電力を集中させる注水定理の戦略が有効です。

  2. 高SNRでの収束: 高SNR領域(20 dB以上)では、両者の差はほとんどなくなります。高SNRでは全てのチャネルが十分なSNRを持つため、等電力配分でもほぼ最適な性能が得られます。

  3. 実用上の意味: 5Gのような高SNR環境では、チャネル情報のフィードバック(CSI: Channel State Information)がなくても等電力配分で十分な性能が得られます。一方、セルエッジ(低SNR)では、CSIフィードバックを活用した注水定理的な電力配分が有効です。

チャネル相関の影響

最後に、アンテナ間の空間相関がチャネル容量に与える影響を調べましょう。

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import sqrtm

def generate_correlated_channel(Nr, Nt, Rr, Rt):
    """相関のあるMIMOチャネルを生成(クロネッカーモデル)"""
    # H = Rr^(1/2) @ Hw @ Rt^(1/2)
    Hw = (np.random.randn(Nr, Nt) + 1j * np.random.randn(Nr, Nt)) / np.sqrt(2)
    Rr_sqrt = sqrtm(Rr)
    Rt_sqrt = sqrtm(Rt)
    H = Rr_sqrt @ Hw @ Rt_sqrt
    return H

np.random.seed(42)
n_trials = 3000
Nt = Nr = 4
SNR_dB = 20
SNR = 10**(SNR_dB / 10)

# 異なる相関レベル
rho_values = np.linspace(0, 0.99, 50)

avg_capacities = []

for rho in rho_values:
    # 指数相関モデル: R(i,j) = rho^|i-j|
    R = np.zeros((Nr, Nr), dtype=complex)
    for i in range(Nr):
        for j in range(Nr):
            R[i, j] = rho ** abs(i - j)

    capacities = []
    for _ in range(n_trials):
        H = generate_correlated_channel(Nr, Nt, R, R)
        HHH = H @ H.conj().T
        C = np.real(np.log2(np.linalg.det(np.eye(Nr) + (SNR / Nt) * HHH)))
        capacities.append(C)
    avg_capacities.append(np.mean(capacities))

# i.i.d.の参考値
C_iid = avg_capacities[0]

fig, ax = plt.subplots(figsize=(10, 7))

ax.plot(rho_values, avg_capacities, "c-", linewidth=2.5)
ax.axhline(y=C_iid, color="#e040fb", linestyle="--", linewidth=1.5, alpha=0.7,
           label=f"i.i.d. capacity = {C_iid:.1f} bit/s/Hz")

# SISO容量の参考線
C_siso = np.log2(1 + SNR)
ax.axhline(y=C_siso, color="#ffca28", linestyle=":", linewidth=1.5, alpha=0.7,
           label=f"SISO capacity = {C_siso:.1f} bit/s/Hz")

ax.set_xlabel("Correlation coefficient ρ", fontsize=13)
ax.set_ylabel("Ergodic Capacity [bit/s/Hz]", fontsize=13)
ax.set_title(f"Effect of Spatial Correlation on 4×4 MIMO Capacity (SNR = {SNR_dB} dB)",
             fontsize=14)
ax.legend(fontsize=12, loc="upper right")
ax.grid(True, alpha=0.3)
ax.set_xlim([0, 1])

plt.tight_layout()
plt.savefig("mimo_correlation.png", dpi=150, bbox_inches="tight")
plt.show()

# 相関 = 0.5 と 0.9 での容量低下
C_05 = avg_capacities[25]
C_09 = avg_capacities[45]
print(f"ρ = 0.0: C = {C_iid:.2f} bit/s/Hz")
print(f"ρ = 0.5: C = {C_05:.2f} bit/s/Hz (低下 {(1 - C_05/C_iid)*100:.1f}%)")
print(f"ρ = 0.9: C = {C_09:.2f} bit/s/Hz (低下 {(1 - C_09/C_iid)*100:.1f}%)")

チャネル相関の影響を示すグラフから、MIMOアンテナの物理設計に関する重要な知見が読み取れます。

  1. 相関による容量低下: 相関係数 $\rho$ が増加するにつれて、チャネル容量は単調に減少します。$\rho = 0$(独立チャネル)で最大容量が達成され、$\rho \to 1$(完全相関)ではSISO容量に近づきます。

  2. 中程度の相関でも十分な性能: $\rho = 0.5$ 程度であれば、容量低下は比較的穏やかです。実用的なアンテナ間隔(半波長程度)でこの程度の相関に抑えることが多く、MIMOの利点は十分に発揮されます。

  3. 高相関での急激な劣化: $\rho > 0.8$ を超えると容量が急速に低下します。これは、高相関のチャネル行列はランクが低下し、独立な並列チャネルの数が実質的に減少するためです。アンテナ間隔が波長に比べて非常に小さい場合(コンパクトな端末)にこの問題が生じます。

  4. SISO限界への収束: $\rho \to 1$ で容量はSISO容量に漸近します。これは、全アンテナが同一の信号を受信することになり、MIMOの多重化利得が完全に失われることを意味しています。

まとめ

本記事では、MIMOアンテナの基礎について、SISOの限界から出発し、チャネルモデル、容量理論、空間多重化、ビームフォーミングまで一貫した流れで解説しました。

  • SISOの限界: 容量はSNRの対数でしか成長しない。帯域幅やSNRを変えずに容量を増やすにはMIMOが必要
  • MIMOチャネルモデル: $\bm{y} = \bm{H}\bm{x} + \bm{n}$ の行列表現。チャネル行列 $\bm{H}$ が伝搬環境を記述する
  • チャネル容量: $C = \sum_{i=1}^{r} \log_2(1 + \frac{\text{SNR}}{N_t}\lambda_i)$。容量はアンテナ数に線形に比例して増加する
  • SVDに基づく空間多重化: チャネル行列のSVDにより、MIMOチャネルを $r$ 個の独立な並列チャネルに分解。送受信ビームフォーミングで実現
  • 注水定理: チャネル既知の場合、条件の良いチャネルに電力を集中させることで容量を最大化。低SNRで特に有効
  • チャネル相関の影響: アンテナ間の空間相関が高いと容量が低下。豊かなマルチパス環境と十分なアンテナ間隔が重要

MIMOは現代の無線通信の根幹をなす技術であり、5G/6Gではさらに大規模なMassive MIMOへと発展しています。本記事の理論的基盤を踏まえて、実際のシステム設計やアルゴリズム開発に進んでいくことができます。

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