MIMO通信の基礎 — 空間多重とダイバーシティで通信容量を増やす

スマートフォンの通信速度は年々高速化していますが、使える周波数帯域には物理的な上限があります。帯域を広げずに通信速度を何倍にも引き上げる方法はあるのでしょうか? その答えの一つが MIMO(Multiple-Input Multiple-Output:多入力多出力) です。

MIMO は送信側と受信側の両方に複数のアンテナを配置し、電波が空間を伝わるときの多重経路(マルチパス)を 資源 として積極的に活用する技術です。従来のシングルアンテナ通信では、マルチパスはフェージングの原因として嫌われていました。ところが MIMO の視点では、独立な伝搬経路が増えるほど、同じ帯域で同時に複数のデータストリームを流す「空間の高速道路」が増えることになります。

MIMO を理解すると、以下のような幅広い応用に直結します。

  • 4G LTE / 5G NR の物理層設計 — 5G では Massive MIMO(数十〜数百アンテナ)が標準技術
  • Wi-Fi(802.11n/ac/ax/be) の高速化 — MIMO による空間多重で数 Gbps を実現
  • レーダー・ソナー における MIMO 信号処理 — 仮想開口面の拡大
  • 衛星通信 におけるマルチビーム容量増大

本記事の内容

  • シャノン容量の限界と MIMO のモチベーション
  • MIMO チャネルモデル $\bm{y} = \bm{H}\bm{x} + \bm{n}$ の定式化
  • チャネル行列 $\bm{H}$ の特異値分解(SVD)とチャネル容量
  • 空間多重(V-BLAST, SVD-MIMO)の原理
  • ダイバーシティ(Alamouti 符号, STBC)
  • ビームフォーミングの基礎
  • Python シミュレーション: チャネル容量の CDF、BER 比較

前提知識

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

SISO の限界と MIMO のモチベーション

シャノン容量の壁

まず、送信アンテナ1本・受信アンテナ1本の従来型通信(SISO: Single-Input Single-Output)の限界を確認しましょう。シャノンの通信路容量定理によれば、帯域幅 $W$、信号対雑音比 $\mathrm{SNR}$ の AWGN(加法性白色ガウス雑音)通信路の容量は

$$ C_{\mathrm{SISO}} = W \log_2(1 + \mathrm{SNR}) \quad [\mathrm{bps}] $$

です。この式から2つの事実が読み取れます。

  1. 帯域 $W$ を2倍にすれば容量は2倍 — しかし周波数資源は有限で高価
  2. SNR を上げても容量は対数的にしか伸びない — 送信電力を10倍にしても、容量はおよそ $3.3W$ bps しか増えない

つまり、帯域も電力も使わずに容量を飛躍的に増やすには、まったく新しい次元の資源が必要です。その「新しい次元」こそが 空間 です。

空間次元の活用

部屋の中に1本のホースで水を流すのと、3本のホースで同時に水を流すのでは、当然3倍の量を運べます。MIMO はこれと同じ発想です。送信側に $N_t$ 本、受信側に $N_r$ 本のアンテナを設置し、空間に $\min(N_t, N_r)$ 本の独立なデータストリームを同時に流します。

理想的な条件下では、MIMO のチャネル容量は

$$ C_{\mathrm{MIMO}} \approx \min(N_t, N_r) \cdot W \log_2\left(1 + \frac{\mathrm{SNR}}{N_t}\right) \quad [\mathrm{bps}] $$

と近似できます。この式の最も重要なポイントは、容量が $\min(N_t, N_r)$ に 線形にスケール することです。アンテナを4本ずつ使えば、理想的には SISO の約4倍の通信速度が得られます。帯域も電力も増やさずに、です。

ただし、この「理想的な条件」には重要な前提があります。各アンテナ間の伝搬経路が十分に独立であること、すなわちチャネル行列のランクが $\min(N_t, N_r)$ であることです。この条件を数学的に記述するために、次にMIMOチャネルモデルを定式化しましょう。

MIMO チャネルモデル

信号モデルの直感的理解

MIMO 通信を考える前に、簡単な例で感覚をつかみましょう。送信アンテナ2本(Tx1, Tx2)、受信アンテナ2本(Rx1, Rx2)の $2 \times 2$ MIMO を考えます。

Tx1 が送信した信号は、Rx1 にも Rx2 にも届きます。同様に Tx2 の信号も両方の受信アンテナに届きます。つまり、受信アンテナ Rx1 で観測される信号は、Tx1 からの信号と Tx2 からの信号の重ね合わせ(プラス雑音)です。

各送信アンテナ $j$ から受信アンテナ $i$ への伝搬経路の複素利得を $h_{ij}$ と書くと、受信信号は次のように表せます。

$$ \begin{cases} y_1 = h_{11} x_1 + h_{12} x_2 + n_1 \\ y_2 = h_{21} x_1 + h_{22} x_2 + n_2 \end{cases} $$

ここで $x_j$ は送信アンテナ $j$ の送信信号、$y_i$ は受信アンテナ $i$ の受信信号、$n_i$ は受信アンテナ $i$ の雑音です。

行列表現

上の連立方程式は、行列を使えばすっきりと書けます。受信信号ベクトル $\bm{y}$、送信信号ベクトル $\bm{x}$、雑音ベクトル $\bm{n}$ を定義すると、MIMO の基本方程式が得られます。

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

ここで各要素は次の通りです。

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

チャネル行列 $\bm{H}$ の $(i, j)$ 成分 $h_{ij}$ は、送信アンテナ $j$ から受信アンテナ $i$ への複素チャネル利得を表します。$2 \times 2$ MIMO では

$$ \bm{H} = \begin{bmatrix} h_{11} & h_{12} \\ h_{21} & h_{22} \end{bmatrix} $$

です。一般の $N_r \times N_t$ MIMO では $\bm{H}$ は $N_r$ 行 $N_t$ 列の複素行列になります。

レイリーフェージングモデル

散乱体が十分に多い環境(都市部など)では、各経路の複素利得 $h_{ij}$ は互いに独立な複素ガウス分布に従うとモデル化できます。

$$ h_{ij} \sim \mathcal{CN}(0, 1) \quad \text{(i.i.d. レイリーフェージング)} $$

このとき $|h_{ij}|$ はレイリー分布に従い、$|h_{ij}|^2$ は平均1の指数分布に従います。このモデルは i.i.d. レイリー MIMO チャネル と呼ばれ、MIMO の理論解析における標準的なベンチマークです。

実際の伝搬環境では見通し波(LOS: Line-of-Sight)が存在する場合もあり、そのときはライシアンフェージングモデルを使いますが、本記事ではまず理論の骨格を理解するために i.i.d. レイリーモデルを仮定します。

チャネル行列の統計的性質はわかりました。では、この行列の構造からどのようにして通信容量を求めるのでしょうか。その鍵を握るのが 特異値分解(SVD) です。

チャネル行列の SVD と等価並列チャネル

特異値分解の復習

任意の $N_r \times N_t$ 複素行列 $\bm{H}$ は、次のように特異値分解できます。

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

ここで

  • $\bm{U} \in \mathbb{C}^{N_r \times N_r}$: ユニタリ行列($\bm{U}^H \bm{U} = \bm{I}_{N_r}$)
  • $\bm{V} \in \mathbb{C}^{N_t \times N_t}$: ユニタリ行列($\bm{V}^H \bm{V} = \bm{I}_{N_t}$)
  • $\bm{\Sigma} \in \mathbb{R}^{N_r \times N_t}$: 対角要素に特異値 $\sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r \geq 0$ を持つ行列($r = \mathrm{rank}(\bm{H}) \leq \min(N_t, N_r)$)

特異値 $\sigma_i$ はチャネルの各「空間モード」の利得を表します。水道のホースの太さに例えると、$\sigma_1$ が最も太いホース、$\sigma_r$ が最も細いホースに対応します。

等価並列チャネルへの変換

SVD を使うと、MIMO チャネルを $r$ 本の独立な SISO チャネルの並列接続に変換できます。これが MIMO 理論の最も美しい結果の一つです。

送信側で $\bm{V}$ による プリコーディング を行い、受信側で $\bm{U}^H$ による 空間フィルタリング を行います。具体的には、送信したいデータベクトル $\tilde{\bm{x}}$ に対して、実際に送信する信号を $\bm{x} = \bm{V}\tilde{\bm{x}}$ とし、受信信号 $\bm{y}$ に $\bm{U}^H$ を左から掛けます。

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

ここで $\bm{H} = \bm{U} \bm{\Sigma} \bm{V}^H$ を代入すると

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

$\bm{U}$ と $\bm{V}$ はユニタリ行列なので $\bm{U}^H \bm{U} = \bm{I}$、$\bm{V}^H \bm{V} = \bm{I}$ が成り立ちます。また、ユニタリ変換は雑音の統計的性質を変えない($\tilde{\bm{n}} = \bm{U}^H \bm{n} \sim \mathcal{CN}(\bm{0}, \sigma^2 \bm{I})$)ので、結果は驚くほどシンプルになります。

$$ \tilde{\bm{y}} = \bm{\Sigma} \tilde{\bm{x}} + \tilde{\bm{n}} $$

成分ごとに書くと

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

です。これは $r$ 本の独立な SISO チャネルが並列に存在していることを意味します。第 $i$ チャネルの利得は特異値 $\sigma_i$ です。MIMO という複雑に見えるシステムが、SVD を通じてシンプルな並列チャネルに分解されるのです。

この等価並列チャネルの描像が得られたので、次にこれを使って MIMO チャネルの容量を求めましょう。

MIMO チャネル容量

容量の導出

等価並列チャネル $\tilde{y}_i = \sigma_i \tilde{x}_i + \tilde{n}_i$ の各サブチャネルの SNR は

$$ \mathrm{SNR}_i = \frac{\sigma_i^2 P_i}{\sigma_n^2} $$

です。ここで $P_i$ は第 $i$ サブチャネルへの送信電力、$\sigma_n^2$ は雑音電力です。各サブチャネルは独立なので、総容量はそれぞれの容量の和になります。

$$ C = W \sum_{i=1}^{r} \log_2\left(1 + \frac{\sigma_i^2 P_i}{\sigma_n^2}\right) \quad [\mathrm{bps}] $$

ここで特異値 $\sigma_i^2$ がチャネル行列 $\bm{H}$ の性質で決まることに注意してください。$\sigma_i^2$ は $\bm{H}^H \bm{H}$(または $\bm{H}\bm{H}^H$)の固有値 $\lambda_i$ に等しいので、容量は固有値を使って次のようにも書けます。

$$ C = W \sum_{i=1}^{r} \log_2\left(1 + \frac{\lambda_i P_i}{\sigma_n^2}\right) $$

注水定理(Water-Filling)

総送信電力に制約 $\sum_{i=1}^{r} P_i = P_{\mathrm{total}}$ がある場合、容量を最大化する電力配分はどうすべきでしょうか? これはラグランジュ乗数法で解ける古典的な最適化問題です。

結果は 注水定理(Water-Filling Theorem) として知られています。最適な電力配分は

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

です。ここで $(x)^+ = \max(x, 0)$ を意味し、$\mu$ は総電力制約を満たすように定められる注水レベルです。

この式の直感的意味は次の通りです。各サブチャネルを「深さの異なる容器」と考えます。深さは $\sigma_n^2 / \lambda_i$、つまり「雑音が大きい or チャネル利得が小さい」ほど深い容器です。総電力 $P_{\mathrm{total}}$ という量の「水」を注ぎ込むと、水は浅い容器(良いサブチャネル)から先に溜まり、深すぎる容器(悪いサブチャネル)には水が入りません。つまり、状態の良いサブチャネルに多くの電力を、状態の悪いサブチャネルには少ない電力(場合によってはゼロ)を配分するのが最適です。

CSI(チャネル状態情報)の有無による容量

注水定理を適用するには、送信側がチャネル行列 $\bm{H}$(またはその固有値)を知っている必要があります。この情報を CSIT(Channel State Information at the Transmitter) と呼びます。

  • CSIT あり(送信側がチャネルを知っている場合): 注水定理で電力配分を最適化し、容量を最大化できる
  • CSIT なし(送信側がチャネルを知らない場合): 全サブチャネルに等電力 $P_i = P_{\mathrm{total}} / N_t$ を配分するしかない

CSIT なしの場合の容量は

$$ C_{\text{no CSIT}} = W \sum_{i=1}^{r} \log_2\left(1 + \frac{\lambda_i P_{\mathrm{total}}}{N_t \sigma_n^2}\right) $$

もしくは、行列の行列式を使って次のようにコンパクトに書けます。

$$ C_{\text{no CSIT}} = W \log_2 \det\left(\bm{I}_{N_r} + \frac{P_{\mathrm{total}}}{N_t \sigma_n^2} \bm{H}\bm{H}^H\right) $$

この行列式の形は非常に重要で、MIMO 容量の解析で最も頻繁に現れる表現です。

ここまでで MIMO チャネルの理論的な容量限界を導出しました。次に、この容量に近づくための実際の伝送技術を見ていきましょう。まずは、複数のデータストリームを同時に送る「空間多重」からです。

空間多重

空間多重の考え方

空間多重(Spatial Multiplexing)は、MIMO の容量利得を直接活用する技術です。$\min(N_t, N_r)$ 本の独立なデータストリームを同時に送信し、受信側で信号分離を行って元のデータを復元します。1本のアンテナで送信していた時間に $\min(N_t, N_r)$ 倍のデータを送れるため、伝送レートが大幅に向上します。

ただし、空間多重を実現するには受信側で混ざった信号を分離する必要があります。この分離手法によって、性能と計算量にトレードオフが生じます。

V-BLAST

V-BLAST(Vertical Bell Laboratories Layered Space-Time) は、1998年にベル研究所で提案された実用的な空間多重方式です。送信側では特別な処理を行わず、各アンテナから独立にデータストリームを送信します(CSITは不要)。

受信側でのV-BLASTのアルゴリズムは、直感的には「一番強い信号から順に検出し、検出した信号の影響を取り除いてから次の信号を検出する」という逐次干渉キャンセレーション(SIC: Successive Interference Cancellation)です。

具体的な手順は以下の通りです。

ステップ1: 最も SNR の高いストリームを検出する

まず、線形フィルタ(ZF: ゼロフォーシングまたはMMSE)で各ストリームの検出後 SNR を計算し、最も高い SNR を持つストリーム $k_1$ を選びます。ZF フィルタの場合、フィルタ行列 $\bm{G}$ は

$$ \bm{G}_{\mathrm{ZF}} = (\bm{H}^H \bm{H})^{-1} \bm{H}^H $$

です。$\bm{G}$ の第 $j$ 行を使ってストリーム $j$ を推定し、最も信頼性の高いストリームを検出・判定します。

ステップ2: 検出した信号を差し引く

ストリーム $k_1$ の検出結果 $\hat{x}_{k_1}$ を用いて、受信信号からその寄与を差し引きます。

$$ \bm{y}^{(1)} = \bm{y} – \bm{h}_{k_1} \hat{x}_{k_1} $$

ここで $\bm{h}_{k_1}$ はチャネル行列 $\bm{H}$ の第 $k_1$ 列です。

ステップ3: 繰り返す

残りの受信信号 $\bm{y}^{(1)}$ に対して同じ処理を繰り返し、次に強いストリームを検出します。正しく検出できていれば、前のストリームの干渉が除去されているため、後のストリームの検出精度が向上します。

V-BLAST は CSIT が不要で実装が比較的容易な反面、最初のストリームの検出を誤ると、そのエラーが後続のストリームに伝搬する「エラー伝搬」の問題があります。

SVD-MIMO(固有ビームフォーミング)

送信側がチャネル行列 $\bm{H}$ を知っている場合、前節で説明した SVD に基づくプリコーディングが最適です。

$$ \bm{x} = \bm{V} \tilde{\bm{x}} $$

として送信し、受信側で $\tilde{\bm{y}} = \bm{U}^H \bm{y}$ を計算すれば、$r$ 本の独立なサブチャネルが得られます。注水定理で電力配分を最適化すれば、チャネル容量を達成できます。

SVD-MIMO はチャネル容量を達成できる理論的に最適な方式ですが、送信側へのチャネル情報のフィードバックが必要という実用上の課題があります。FDD(周波数分割復信)システムでは、受信側がチャネルを推定して送信側にフィードバックする必要があるため、オーバーヘッドが大きくなります。一方、TDD(時分割復信)システムでは、チャネルの相反性を利用して送信側がチャネルを推定できるため、SVD-MIMO と相性が良いです。

空間多重は通信レートを高める技術でした。しかし、通信路の品質が悪い場合(低 SNR 環境)には、レートよりも通信の信頼性を高めたいことがあります。そのための技術がダイバーシティです。

ダイバーシティ

ダイバーシティの考え方

フェージング通信路では、特定の瞬間にチャネル利得が極端に小さくなる「深いフェード」が発生します。シングルアンテナ系では深いフェードに陥ると通信品質が急激に劣化しますが、複数のアンテナを使って独立な複数の経路で同じ情報を伝送すれば、全ての経路が同時に深いフェードに陥る確率は劇的に低下します。

これがダイバーシティの基本原理です。日常の例で言えば、大事な荷物を1台のトラックで運ぶのではなく、3台のトラックに同じ荷物のコピーを積んで別々のルートで運ぶようなものです。1台が事故に遭っても、残りの2台が無事に届けてくれます。

ダイバーシティの効果は ダイバーシティ次数(diversity order) $d$ で定量化されます。ダイバーシティ次数 $d$ の系では、高 SNR 領域でのビット誤り率(BER)は

$$ P_e \propto \mathrm{SNR}^{-d} $$

のようにスケールします。$N_t$ 本の送信アンテナと $N_r$ 本の受信アンテナを持つ MIMO 系で達成可能な最大ダイバーシティ次数は $d_{\max} = N_t \times N_r$ です。

受信ダイバーシティ(MRC)

最も単純なダイバーシティ方式は、送信アンテナ1本・受信アンテナ $N_r$ 本の SIMO(Single-Input Multiple-Output) 系です。各受信アンテナの信号を適切に重み付け合成する MRC(Maximum Ratio Combining:最大比合成) により、ダイバーシティ次数 $d = N_r$ を達成できます。

MRC では、受信信号ベクトル $\bm{y} = \bm{h}x + \bm{n}$($\bm{h}$ はチャネルベクトル)に対して、重みベクトル $\bm{w} = \bm{h}^* / \|\bm{h}\|$ を適用します。

$$ \hat{x}_{\mathrm{MRC}} = \bm{w}^H \bm{y} = \frac{\bm{h}^H}{\|\bm{h}\|} \bm{y} = \frac{\bm{h}^H \bm{h}}{\|\bm{h}\|} x + \frac{\bm{h}^H \bm{n}}{\|\bm{h}\|} $$

合成後の SNR は

$$ \mathrm{SNR}_{\mathrm{MRC}} = \frac{\|\bm{h}\|^2 P}{\sigma_n^2} = \sum_{i=1}^{N_r} \frac{|h_i|^2 P}{\sigma_n^2} = \sum_{i=1}^{N_r} \mathrm{SNR}_i $$

となり、各アンテナの SNR の総和になります。これは直感的にも納得できます — 各アンテナが独立に受け取ったエネルギーを全て集約するため、合計のSNRは個々のSNRの和になるのです。

Alamouti 符号 — 送信ダイバーシティの画期的方式

受信ダイバーシティは受信アンテナを増やせば実現できますが、端末側(スマートフォン等)にアンテナを多数設置するのはサイズ的に難しい場合があります。送信側(基地局)のアンテナを増やして送信ダイバーシティを実現できれば、端末の負担が軽減されます。

1998年に Siavash Alamouti が提案した Alamouti 符号 は、送信アンテナ2本・受信アンテナ1本の MISO(Multiple-Input Single-Output) 系で最大ダイバーシティ次数 $d = 2$ を達成する画期的な方式です。

Alamouti 符号化

2つのシンボル $s_1, s_2$ を2つの時間スロットで次のように送信します。

時間スロット1 時間スロット2
アンテナ1 $s_1$ $-s_2^*$
アンテナ2 $s_2$ $s_1^*$

ここで $(\cdot)^*$ は複素共役を表します。この符号化行列を $\bm{S}$ と書くと

$$ \bm{S} = \begin{bmatrix} s_1 & -s_2^* \\ s_2 & s_1^* \end{bmatrix} $$

です。この行列には重要な性質があります。

$$ \bm{S}^H \bm{S} = (|s_1|^2 + |s_2|^2) \bm{I}_2 $$

を満たします。これは $\bm{S}$ の列が直交していることを意味し、後述する復号の簡素化につながります。

Alamouti 復号

チャネル $\bm{h} = [h_1, h_2]^T$ が2スロットにわたって一定(準静的フェージング)と仮定すると、受信信号は

$$ \begin{cases} y_1 = h_1 s_1 + h_2 s_2 + n_1 \\ y_2 = -h_1 s_2^* + h_2 s_1^* + n_2 \end{cases} $$

です。ここで $y_2^*$ を計算すると

$$ y_2^* = -h_1^* s_2 + h_2^* s_1 + n_2^* $$

これらを行列形式で書くと

$$ \begin{bmatrix} y_1 \\ y_2^* \end{bmatrix} = \begin{bmatrix} h_1 & h_2 \\ h_2^* & -h_1^* \end{bmatrix} \begin{bmatrix} s_1 \\ s_2 \end{bmatrix} + \begin{bmatrix} n_1 \\ n_2^* \end{bmatrix} $$

となります。等価チャネル行列 $\tilde{\bm{H}}$ を

$$ \tilde{\bm{H}} = \begin{bmatrix} h_1 & h_2 \\ h_2^* & -h_1^* \end{bmatrix} $$

と定義すると、この行列は直交性を持ちます。

$$ \tilde{\bm{H}}^H \tilde{\bm{H}} = (|h_1|^2 + |h_2|^2) \bm{I}_2 $$

両辺に $\tilde{\bm{H}}^H$ を左から掛けると

$$ \tilde{\bm{H}}^H \begin{bmatrix} y_1 \\ y_2^* \end{bmatrix} = (|h_1|^2 + |h_2|^2) \begin{bmatrix} s_1 \\ s_2 \end{bmatrix} + \tilde{\bm{H}}^H \begin{bmatrix} n_1 \\ n_2^* \end{bmatrix} $$

つまり、$s_1$ と $s_2$ が完全に分離され、各シンボルは $|h_1|^2 + |h_2|^2$ のダイバーシティ利得を得ます。これは2本の受信アンテナで MRC を行った場合と等価なダイバーシティです。

Alamouti 符号の画期的な点は、送信側にチャネル情報が不要 で、かつ 最尤復号が線形演算で実現できる ことです。この性質のおかげで、実装コストが極めて低く、3G(WCDMA)や 4G(LTE)の下りリンクで広く採用されています。

STBC(時空間ブロック符号)の一般化

Alamouti 符号は送信アンテナ2本の場合に特化した符号ですが、これを一般の送信アンテナ数に拡張したものが STBC(Space-Time Block Code:時空間ブロック符号) です。

$N_t$ 本の送信アンテナと $T$ 個の時間スロットで $K$ 個のシンボルを送信する STBC の符号化行列 $\bm{C}$ は $N_t \times T$ の行列で、次の 直交条件 を満たすように設計されます。

$$ \bm{C}^H \bm{C} = (|s_1|^2 + |s_2|^2 + \cdots + |s_K|^2) \bm{I}_T $$

直交 STBC の符号化レートは $R = K / T$ で定義されます。Alamouti 符号は $N_t = 2, T = 2, K = 2$ で $R = 1$(フルレート)です。

Tarokh らの重要な結果として、複素シンボルに対するフルレート直交 STBC は 送信アンテナ2本の場合(Alamouti 符号)のみ 存在することが知られています。送信アンテナ3本以上ではレートを $R < 1$ に落とす必要があります(例: $N_t = 4$ では $R = 3/4$)。

ダイバーシティは通信の信頼性を向上させる技術でした。実は、MIMO には空間多重とダイバーシティの中間的な利用法もあります。それがビームフォーミングです。

ビームフォーミング

ビームフォーミングの直感

ビームフォーミング(Beamforming)は、複数のアンテナから送信する信号の位相と振幅を調整して、電波のエネルギーを特定の方向に集中させる技術です。

日常の例で言えば、懐中電灯のようなものです。1つの電球は全方向に光を散らしますが、反射鏡で光を1方向に集めれば、遠くまで明るく照らせます。ビームフォーミングは電波版の「反射鏡」です。

送信ビームフォーミング

送信アンテナ $N_t$ 本で1つのデータストリーム $s$ を送信する場合、送信信号ベクトルを

$$ \bm{x} = \bm{w} s $$

と設定します。ここで $\bm{w} \in \mathbb{C}^{N_t \times 1}$ はビームフォーミングベクトル(重みベクトル)で、$\|\bm{w}\|^2 = 1$ と正規化します。受信信号は

$$ y = \bm{h}^T \bm{w} s + n $$

です($\bm{h}$ は $N_t \times 1$ のチャネルベクトル)。受信 SNR は

$$ \mathrm{SNR} = \frac{|\bm{h}^T \bm{w}|^2 P}{\sigma_n^2} $$

となります。SNR を最大化する $\bm{w}$ は、コーシー・シュワルツの不等式から

$$ \bm{w}_{\mathrm{opt}} = \frac{\bm{h}^*}{\|\bm{h}\|} $$

であり、このとき

$$ \mathrm{SNR}_{\max} = \frac{\|\bm{h}\|^2 P}{\sigma_n^2} $$

が達成されます。これは MRC と同じ形であり、送信ビームフォーミングと受信 MRC は数学的に双対な関係にあることがわかります。

MIMO ビームフォーミング

$N_t \times N_r$ の MIMO 系でビームフォーミングを行う場合、SVD に基づくアプローチが最適です。チャネル行列 $\bm{H}$ の SVD を $\bm{H} = \bm{U}\bm{\Sigma}\bm{V}^H$ とすると、送信側で $\bm{V}$ の第1列 $\bm{v}_1$(最大特異値に対応)を使ってビームフォーミングし、受信側で $\bm{U}$ の第1列 $\bm{u}_1$ でフィルタリングすれば、最大の SNR が得られます。

$$ \mathrm{SNR}_{\max} = \frac{\sigma_1^2 P}{\sigma_n^2} $$

ここで $\sigma_1$ はチャネル行列の最大特異値です。

1本のストリームだけを最良のサブチャネルに送信するため、空間多重のようなレート向上は得られませんが、最大の SNR 利得(アレイ利得)を享受でき、低 SNR 環境で有効です。

ここまでで MIMO の3つの主要技術 — 空間多重、ダイバーシティ、ビームフォーミング — を理論的に理解しました。それでは、これらの性能を Python シミュレーションで実際に確認してみましょう。

多重化利得とダイバーシティ利得のトレードオフ

空間多重(高レート)とダイバーシティ(高信頼性)は、MIMO が提供する2つの異なる利得です。Zheng-Tse(2003)の DMT(Diversity-Multiplexing Tradeoff) の理論は、この2つの利得の間に根本的なトレードオフがあることを示しました。

空間多重利得 $r$ とダイバーシティ利得 $d$ は次のように定義されます。

$$ r = \lim_{\mathrm{SNR} \to \infty} \frac{R(\mathrm{SNR})}{W \log_2(\mathrm{SNR})}, \quad d = -\lim_{\mathrm{SNR} \to \infty} \frac{\log P_e(\mathrm{SNR})}{\log \mathrm{SNR}} $$

ここで $R$ はデータレート、$P_e$ は誤り率です。$N_t \times N_r$ MIMO チャネルにおける最適な DMT 曲線は、区分線形関数で

$$ d(r) = (N_t – r)(N_r – r), \quad 0 \leq r \leq \min(N_t, N_r) $$

と与えられます。この関係から

  • $r = 0$(レートが SNR に依存しない)のとき最大ダイバーシティ $d = N_t N_r$ を達成
  • $r = \min(N_t, N_r)$(最大の空間多重)のとき $d = 0$(ダイバーシティ利得なし)

となり、両者を同時に最大化することはできないことがわかります。Alamouti 符号は $(r, d) = (0, 2N_r)$ で DMT 曲線の左端に位置し、V-BLAST は高い多重利得を狙いますがダイバーシティは限定的です。

実際のシステム設計では、通信環境の SNR や要求される信頼性に応じて、空間多重とダイバーシティのバランスを調整します。この理論的な枠組みを踏まえて、Python シミュレーションで各方式の性能を定量的に比較してみましょう。

Python シミュレーション

MIMO チャネル容量の CDF

まず、i.i.d. レイリーフェージング環境における MIMO チャネル容量の累積分布関数(CDF)をシミュレーションで求めます。アンテナ構成を変えて、容量がどのように変化するかを確認しましょう。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
num_trials = 10000      # モンテカルロ試行回数
snr_db = 20             # SNR [dB]
snr_linear = 10 ** (snr_db / 10)

# アンテナ構成のリスト: (Nt, Nr)
configs = [(1, 1), (2, 2), (4, 4), (8, 8)]

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

for Nt, Nr in configs:
    capacities = np.zeros(num_trials)

    for trial in range(num_trials):
        # i.i.d. レイリーフェージングチャネル行列
        H = (np.random.randn(Nr, Nt) + 1j * np.random.randn(Nr, Nt)) / np.sqrt(2)

        # チャネル容量(CSIT なし、等電力配分)
        # C = log2(det(I + SNR/Nt * H H^H))
        HHH = H @ H.conj().T
        capacity = np.real(np.log2(np.linalg.det(
            np.eye(Nr) + (snr_linear / Nt) * HHH
        )))
        capacities[trial] = capacity

    # CDFをプロット
    sorted_cap = np.sort(capacities)
    cdf = np.arange(1, num_trials + 1) / num_trials
    plt.plot(sorted_cap, cdf, label=f'{Nt}x{Nr} MIMO')

plt.xlabel('Channel Capacity [bps/Hz]')
plt.ylabel('CDF')
plt.title(f'MIMO Channel Capacity CDF (SNR = {snr_db} dB)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

上のグラフから、いくつかの重要な特徴が読み取れます。

  1. アンテナ数の増加に伴い容量が線形にスケールする — $1 \times 1$ MIMO(SISO)の中央値が約 6.7 bps/Hz であるのに対し、$4 \times 4$ MIMO では約 24 bps/Hz、$8 \times 8$ MIMO では約 46 bps/Hz と、ほぼアンテナ数倍の容量が得られています。これは理論的な予測 $C \approx \min(N_t, N_r) \cdot \log_2(1 + \mathrm{SNR}/N_t)$ と整合しています。
  2. CDF 曲線がアンテナ数の増加に伴い急峻になる — $8 \times 8$ MIMO のCDF曲線は $1 \times 1$ に比べて傾きが急で、容量のばらつきが小さいことを意味します。これはチャネル硬化(channel hardening)と呼ばれる現象で、アンテナ数が増えると多数の独立なサブチャネルの平均効果により、瞬時容量が平均容量に近づきます。Massive MIMO ではこの効果が顕著になります。
  3. 低確率領域(CDF の左端)での容量差が特に大きい — 10% アウテージ容量(CDF = 0.1 に対応する容量)で比較すると、MIMO の優位性がさらに際立ちます。これはフェージングによる深い落ち込みが、ダイバーシティ効果で軽減されるためです。

SNR 対容量特性

次に、SNR を変化させたときの平均チャネル容量(エルゴード容量)を比較します。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
num_trials = 5000
snr_db_range = np.arange(-5, 35, 1)
configs = [(1, 1), (2, 2), (4, 4)]

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

for Nt, Nr in configs:
    avg_capacities = []

    for snr_db in snr_db_range:
        snr_linear = 10 ** (snr_db / 10)
        capacities = np.zeros(num_trials)

        for trial in range(num_trials):
            H = (np.random.randn(Nr, Nt) + 1j * np.random.randn(Nr, Nt)) / np.sqrt(2)
            HHH = H @ H.conj().T
            capacity = np.real(np.log2(np.linalg.det(
                np.eye(Nr) + (snr_linear / Nt) * HHH
            )))
            capacities[trial] = capacity

        avg_capacities.append(np.mean(capacities))

    plt.plot(snr_db_range, avg_capacities, '-o', markersize=3, label=f'{Nt}x{Nr} MIMO')

# SISO理論値
siso_theory = np.log2(1 + 10 ** (snr_db_range / 10))
plt.plot(snr_db_range, siso_theory, 'k--', alpha=0.5, label='SISO (theory)')

plt.xlabel('SNR [dB]')
plt.ylabel('Ergodic Capacity [bps/Hz]')
plt.title('MIMO Ergodic Capacity vs SNR')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

上のグラフから、以下の点が確認できます。

  1. 高 SNR 領域では MIMO の容量が SISO の $\min(N_t, N_r)$ 倍に近づく — SNR 30 dB 付近で、$4 \times 4$ MIMO の容量は SISO の約4倍になっています。これは理論の予測通りです。
  2. 低 SNR 領域では MIMO の利得が相対的に小さい — SNR が低いと、各サブチャネルの SNR も低くなるため、空間多重の効果が薄れます。低 SNR 環境では、ビームフォーミングやダイバーシティの方が効果的です。
  3. SISO のシミュレーション結果が理論曲線(点線)と一致する — これはシミュレーションの妥当性を裏付けています。

Alamouti 符号の BER シミュレーション

最後に、Alamouti 符号の BER(ビット誤り率)性能をシミュレーションし、SISO および MRC と比較します。変調方式は BPSK を使用します。

import numpy as np
import matplotlib.pyplot as plt

def simulate_siso_bpsk(snr_db_range, num_bits=100000):
    """SISO BPSK over Rayleigh fading"""
    ber_list = []
    for snr_db in snr_db_range:
        snr_linear = 10 ** (snr_db / 10)

        # BPSK シンボル生成
        bits = np.random.randint(0, 2, num_bits)
        symbols = 2 * bits - 1  # 0 -> -1, 1 -> +1

        # レイリーフェージング
        h = (np.random.randn(num_bits) + 1j * np.random.randn(num_bits)) / np.sqrt(2)

        # 雑音
        noise = (np.random.randn(num_bits) + 1j * np.random.randn(num_bits)) / np.sqrt(2)
        noise = noise / np.sqrt(snr_linear)

        # 受信信号
        y = h * symbols + noise

        # コヒーレント検出(等化 + 判定)
        y_eq = np.real(np.conj(h) * y / (np.abs(h) ** 2))
        detected = (y_eq > 0).astype(int)

        ber = np.mean(detected != bits)
        ber_list.append(max(ber, 1e-7))

    return np.array(ber_list)

def simulate_mrc_1x2_bpsk(snr_db_range, num_bits=100000):
    """1x2 SIMO (MRC) BPSK over Rayleigh fading"""
    ber_list = []
    for snr_db in snr_db_range:
        snr_linear = 10 ** (snr_db / 10)

        bits = np.random.randint(0, 2, num_bits)
        symbols = 2 * bits - 1

        # 2本の受信アンテナ
        h1 = (np.random.randn(num_bits) + 1j * np.random.randn(num_bits)) / np.sqrt(2)
        h2 = (np.random.randn(num_bits) + 1j * np.random.randn(num_bits)) / np.sqrt(2)

        n1 = (np.random.randn(num_bits) + 1j * np.random.randn(num_bits)) / np.sqrt(2) / np.sqrt(snr_linear)
        n2 = (np.random.randn(num_bits) + 1j * np.random.randn(num_bits)) / np.sqrt(2) / np.sqrt(snr_linear)

        # 受信信号
        y1 = h1 * symbols + n1
        y2 = h2 * symbols + n2

        # MRC合成
        y_mrc = np.conj(h1) * y1 + np.conj(h2) * y2
        detected = (np.real(y_mrc) > 0).astype(int)

        ber = np.mean(detected != bits)
        ber_list.append(max(ber, 1e-7))

    return np.array(ber_list)

def simulate_alamouti_bpsk(snr_db_range, num_symbols=100000):
    """2x1 Alamouti BPSK over Rayleigh fading"""
    ber_list = []
    for snr_db in snr_db_range:
        snr_linear = 10 ** (snr_db / 10)
        num_pairs = num_symbols // 2

        # BPSKシンボルをペアで生成
        bits = np.random.randint(0, 2, num_symbols)
        symbols = (2 * bits - 1).astype(complex)
        s1 = symbols[0::2]  # 奇数番目
        s2 = symbols[1::2]  # 偶数番目

        # チャネル(2スロット間で一定)
        h1 = (np.random.randn(num_pairs) + 1j * np.random.randn(num_pairs)) / np.sqrt(2)
        h2 = (np.random.randn(num_pairs) + 1j * np.random.randn(num_pairs)) / np.sqrt(2)

        # 送信電力を正規化(2本のアンテナで分割)
        scale = 1.0 / np.sqrt(2)

        # 雑音
        n1 = (np.random.randn(num_pairs) + 1j * np.random.randn(num_pairs)) / np.sqrt(2) / np.sqrt(snr_linear)
        n2 = (np.random.randn(num_pairs) + 1j * np.random.randn(num_pairs)) / np.sqrt(2) / np.sqrt(snr_linear)

        # スロット1: [h1*s1 + h2*s2] * scale + n1
        y1 = scale * (h1 * s1 + h2 * s2) + n1
        # スロット2: [-h1*s2* + h2*s1*] * scale + n2
        y2 = scale * (-h1 * np.conj(s2) + h2 * np.conj(s1)) + n2

        # Alamouti復号
        # ~s1 = h1* y1 + h2 y2*
        # ~s2 = h2* y1 - h1 y2*
        s1_hat = np.conj(h1) * y1 + h2 * np.conj(y2)
        s2_hat = np.conj(h2) * y1 - h1 * np.conj(y2)

        # 判定
        det_s1 = (np.real(s1_hat) > 0).astype(int)
        det_s2 = (np.real(s2_hat) > 0).astype(int)

        # BER計算
        errors = np.sum(det_s1 != bits[0::2]) + np.sum(det_s2 != bits[1::2])
        ber = errors / num_symbols
        ber_list.append(max(ber, 1e-7))

    return np.array(ber_list)

# シミュレーション実行
snr_db_range = np.arange(0, 31, 2)
ber_siso = simulate_siso_bpsk(snr_db_range)
ber_mrc = simulate_mrc_1x2_bpsk(snr_db_range)
ber_alamouti = simulate_alamouti_bpsk(snr_db_range)

# 理論値(レイリーフェージング BPSK)
snr_theory = 10 ** (snr_db_range / 10)
# SISO理論値: Pe = 0.5 * (1 - sqrt(gamma/(1+gamma)))
ber_siso_theory = 0.5 * (1 - np.sqrt(snr_theory / (1 + snr_theory)))
# ダイバーシティ次数2の理論近似(高SNR)
ber_div2_theory = 3 / (16 * snr_theory ** 2)

# プロット
plt.figure(figsize=(10, 7))
plt.semilogy(snr_db_range, ber_siso, 'bo-', label='SISO (1x1)')
plt.semilogy(snr_db_range, ber_siso_theory, 'b--', alpha=0.5, label='SISO theory')
plt.semilogy(snr_db_range, ber_mrc, 'rs-', label='MRC (1x2)')
plt.semilogy(snr_db_range, ber_alamouti, 'g^-', label='Alamouti (2x1)')
plt.semilogy(snr_db_range, np.clip(ber_div2_theory, 1e-7, 1), 'k:', alpha=0.5, label='Diversity order 2 (approx)')

plt.xlabel('SNR [dB]')
plt.ylabel('BER')
plt.title('BER Comparison: SISO vs MRC vs Alamouti (BPSK, Rayleigh)')
plt.legend()
plt.grid(True, alpha=0.3, which='both')
plt.ylim([1e-6, 1])
plt.tight_layout()
plt.show()

上のグラフから、ダイバーシティ技術の効果が明確に読み取れます。

  1. SISO(青線)は SNR を上げても BER の改善が緩やか — レイリーフェージング下では BER が $1/\mathrm{SNR}$ に比例するため、BER を1桁下げるのに SNR を10 dB も上げなければなりません。これはダイバーシティ次数1の特徴です。
  2. MRC と Alamouti は傾きが急 — 両者ともダイバーシティ次数2を達成しているため、BER は $1/\mathrm{SNR}^2$ に比例し、BER を1桁下げるのに必要な SNR の増加量が半分(約5 dB)になります。高 SNR 領域でのBER曲線の傾きの違いが、ダイバーシティ次数の違いを直接反映しています。
  3. MRC と Alamouti の性能がほぼ同等 — Alamouti 符号(送信2本・受信1本)は MRC(送信1本・受信2本)と同じダイバーシティ次数を達成しています。ただし、Alamouti は送信電力を2本のアンテナに分配するため、約3 dB の損失が生じることがあります(送信電力の正規化方法に依存)。
  4. 理論近似曲線との一致 — SISO のシミュレーション結果は理論値(点線)とよく一致しており、ダイバーシティ次数2の高 SNR 近似も傾きが合っています。

空間多重のBERシミュレーション(ZF検出)

空間多重方式の性能も確認しましょう。$2 \times 2$ MIMO でZF(ゼロフォーシング)検出を行い、SISO と比較します。

import numpy as np
import matplotlib.pyplot as plt

def simulate_zf_mimo_bpsk(Nt, Nr, snr_db_range, num_bits=100000):
    """MIMO空間多重 + ZF検出 (BPSK)"""
    ber_list = []
    for snr_db in snr_db_range:
        snr_linear = 10 ** (snr_db / 10)
        total_errors = 0
        total_bits = 0

        num_symbols_per_stream = num_bits // Nt

        for _ in range(num_symbols_per_stream):
            # 各アンテナからBPSKシンボルを送信
            bits = np.random.randint(0, 2, Nt)
            x = (2 * bits - 1).astype(complex)

            # チャネル行列
            H = (np.random.randn(Nr, Nt) + 1j * np.random.randn(Nr, Nt)) / np.sqrt(2)

            # 雑音(送信電力をNtで正規化)
            noise_power = Nt / snr_linear
            n = np.sqrt(noise_power / 2) * (np.random.randn(Nr) + 1j * np.random.randn(Nr))

            # 受信信号
            y = H @ x + n

            # ZF検出
            G_zf = np.linalg.pinv(H)  # (H^H H)^{-1} H^H
            x_hat = G_zf @ y

            # 判定
            detected = (np.real(x_hat) > 0).astype(int)
            total_errors += np.sum(detected != bits)
            total_bits += Nt

        ber = total_errors / total_bits
        ber_list.append(max(ber, 1e-7))

    return np.array(ber_list)

# シミュレーション
snr_db_range = np.arange(0, 36, 2)
ber_siso = simulate_siso_bpsk(snr_db_range, num_bits=200000)
ber_zf_2x2 = simulate_zf_mimo_bpsk(2, 2, snr_db_range, num_bits=200000)
ber_zf_2x4 = simulate_zf_mimo_bpsk(2, 4, snr_db_range, num_bits=200000)
ber_zf_4x4 = simulate_zf_mimo_bpsk(4, 4, snr_db_range, num_bits=200000)

plt.figure(figsize=(10, 7))
plt.semilogy(snr_db_range, ber_siso, 'bo-', label='SISO (1x1)')
plt.semilogy(snr_db_range, ber_zf_2x2, 'rs-', label='ZF 2x2 (rate x2)')
plt.semilogy(snr_db_range, ber_zf_2x4, 'g^-', label='ZF 2x4 (rate x2)')
plt.semilogy(snr_db_range, ber_zf_4x4, 'md-', label='ZF 4x4 (rate x4)')

plt.xlabel('SNR [dB]')
plt.ylabel('BER')
plt.title('Spatial Multiplexing BER with ZF Detection (BPSK, Rayleigh)')
plt.legend()
plt.grid(True, alpha=0.3, which='both')
plt.ylim([1e-6, 1])
plt.tight_layout()
plt.show()

上のグラフから、空間多重方式の特性が読み取れます。

  1. $2 \times 2$ ZF は SISO より高い SNR が必要 — 同じ BER を達成するために SISO よりも多くの SNR が必要です。これは ZF 検出がノイズ増強(noise enhancement)を引き起こすためです。ZF フィルタ $(\bm{H}^H \bm{H})^{-1} \bm{H}^H$ の逆行列計算で雑音が増幅されます。ただし、2倍のデータレートで送信していることを考慮すれば、スペクトル効率は優れています。
  2. $2 \times 4$ ZF は $2 \times 2$ ZF より大幅に性能が良い — 受信アンテナを4本に増やすと、余分な自由度がダイバーシティとして機能し、ZF のノイズ増強が軽減されます。一般に、$N_r > N_t$ であるほど ZF 検出の性能が向上します。
  3. $4 \times 4$ ZF は4倍のデータレートを達成しつつ、十分な SNR があれば低い BER を実現 — SNR 30 dB 以上では実用的な BER レベルに達しています。

まとめ

本記事では、MIMO通信の基礎について解説しました。

  • MIMO チャネルモデル $\bm{y} = \bm{H}\bm{x} + \bm{n}$ において、チャネル行列 $\bm{H}$ の SVD により、MIMO チャネルは $r = \mathrm{rank}(\bm{H})$ 本の独立な並列チャネルに分解される
  • チャネル容量 は $C = \sum_i \log_2(1 + \lambda_i P_i / \sigma_n^2)$ で与えられ、アンテナ数に線形にスケールする。CSIT ありの場合は注水定理で電力配分を最適化する
  • 空間多重(V-BLAST, SVD-MIMO)は同じ帯域で複数のデータストリームを同時に送信し、通信レートを向上させる
  • ダイバーシティ(Alamouti 符号, STBC)は同じ情報を複数の経路で冗長に伝送し、フェージングに対する耐性を向上させる
  • ビームフォーミング は電波のエネルギーを特定の方向に集中させ、SNR を最大化する
  • 空間多重利得とダイバーシティ利得の間には DMT トレードオフ が存在し、$d(r) = (N_t – r)(N_r – r)$ で特徴づけられる

MIMO は現代の無線通信の根幹を成す技術であり、5G NR では64本以上のアンテナを用いる Massive MIMO が標準化されています。Massive MIMO ではチャネル硬化やユーザ間干渉の自然な除去といった大次元ならではの現象が生じ、さらなる理論的展開があります。

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