CDMA通信の理論 — 符号分割多元接続の原理から容量解析まで

携帯電話で通話しているとき、同じ基地局の電波を何十人もの人が同時に使っています。周波数も時間帯も同じなのに、なぜ自分宛ての音声だけが聞こえるのでしょうか? その答えが CDMA(Code Division Multiple Access:符号分割多元接続) です。

CDMA では、各ユーザに固有の「符号」を割り当て、全員が同じ周波数帯・同じ時間スロットを共有しながら通信します。受信側は自分の符号を「鍵」として使い、目的の信号だけを取り出します。この仕組みは、騒がしいパーティ会場で特定の相手の声だけを聞き分ける「カクテルパーティ効果」に似ています。ただし人間の脳の代わりに、数学的な直交性や相関演算が使われます。

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

  • 第3世代携帯電話(3G / WCDMA / cdma2000) の物理層設計
  • GPS衛星測位 における衛星信号の分離(各衛星がGold符号で識別される)
  • 軍事通信 における耐妨害性・低被探知性の確保(スペクトラム拡散の応用)
  • 5G以降 でも用いられるNOMA(非直交多元接続)の理論的基盤

本記事の内容

  • CDMAの基本概念と他の多元接続方式(FDMA, TDMA)との比較
  • Walsh-Hadamard符号(直交符号)の構成と性質
  • Gold符号(準直交符号)の構成と相関特性
  • DS-CDMAの送受信モデルの数学的定式化
  • 多元接続干渉(MAI)の定量的評価
  • 近遠問題(Near-Far Problem)と電力制御
  • RAKE受信機によるマルチパスダイバーシティ
  • CDMAの容量(干渉制限系としての解析)
  • WCDMA(3G)の概要
  • Pythonによるマルチユーザ CDMA シミュレーションと近遠問題の可視化

前提知識

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

CDMAの基本概念

なぜ符号で多重化できるのか

まず、多元接続の3つの方式を日常の比喩で整理しましょう。

  • FDMA(周波数分割): 部屋をパーティションで区切り、各自が個室で話す。隣の部屋の声は壁で遮断される。
  • TDMA(時分割): 全員が同じ部屋にいるが、順番に1人ずつ話す。自分の番が来るまで黙って待つ。
  • CDMA(符号分割): 全員が同じ部屋で同時に話す。ただし、各ペアが異なる言語を使っている。英語の会話をしている人はフランス語の会話を「雑音」として無視でき、自分のパートナーの声だけを理解する。

CDMA の本質は「異なる言語」、すなわち 拡散符号(spreading code)直交性(もしくは準直交性) です。2つの符号 $\bm{c}_i$ と $\bm{c}_j$ が直交するとは、それらの内積がゼロになること、すなわち

$$ \bm{c}_i \cdot \bm{c}_j = \sum_{k=0}^{N-1} c_i[k] \, c_j[k] = 0 \quad (i \neq j) $$

を意味します。ここで $N$ は拡散符号の長さ(チップ数)です。受信側で目的ユーザの符号と受信信号の相関をとると、直交する他ユーザの成分は消え、目的の信号だけが残ります。

FDMA・TDMA との定量的比較

帯域幅 $W$ を $K$ 人のユーザで共有する場合を考えます。

方式 1ユーザあたりの帯域 1ユーザあたりの時間 干渉の扱い
FDMA $W/K$ 全時間 ガードバンドで分離
TDMA $W$ $1/K$ の時間スロット ガードタイムで分離
CDMA $W$(全帯域) 全時間 符号の直交性で分離

FDMA と TDMA は 資源を物理的に分割 するため、ユーザ数の上限は分割数で厳密に決まります。一方、CDMA は全ユーザが同じ資源を共有し、干渉をどこまで許容するか で容量が決まります。このため CDMA は「干渉制限系(interference-limited system)」と呼ばれます。

ここまでで CDMA の概念的な枠組みを把握しました。次に、「異なる言語」にあたる拡散符号を具体的に構成する方法を見ていきましょう。まず最も基本的な直交符号である Walsh-Hadamard 符号から始めます。

Walsh-Hadamard 符号(直交符号)

直感的理解

Walsh-Hadamard 符号は、$N$ 個のユーザに $N$ チップ長の完全に直交する符号を割り当てる方法です。イメージとしては、$N$ 次元空間に互いに直角な $N$ 本の軸を取るようなものです。どの2本の軸も内積がゼロなので、任意の軸方向の成分を独立に取り出せます。

Hadamard 行列の再帰的構成

長さ $N = 2^n$ の Walsh-Hadamard 符号は、Hadamard 行列 $\bm{H}_N$ の各行として得られます。Hadamard 行列は次の再帰式で構成されます。

初期条件として、$\bm{H}_1 = [1]$ から始めます。

$$ \bm{H}_{2N} = \begin{bmatrix} \bm{H}_N & \bm{H}_N \\ \bm{H}_N & -\bm{H}_N \end{bmatrix} $$

この構成を Sylvester の構成法 と呼びます。具体的に $N = 1$ から順に展開すると、まず $\bm{H}_2$ は

$$ \bm{H}_2 = \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} $$

となります。さらに再帰を1段進めると $\bm{H}_4$ が得られます。

$$ \bm{H}_4 = \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & -1 & 1 & -1 \\ 1 & 1 & -1 & -1 \\ 1 & -1 & -1 & 1 \end{bmatrix} $$

直交性の証明

Hadamard 行列は次の性質を満たします。

$$ \bm{H}_N \bm{H}_N^T = N \bm{I}_N $$

ここで $\bm{I}_N$ は $N \times N$ の単位行列です。$\bm{H}_N$ の第 $i$ 行を $\bm{h}_i$、第 $j$ 行を $\bm{h}_j$ とすると、上の関係式の $(i, j)$ 成分は

$$ \bm{h}_i \cdot \bm{h}_j = \sum_{k=0}^{N-1} h_i[k] \, h_j[k] = N \delta_{ij} $$

を意味します。$\delta_{ij}$ はクロネッカーのデルタです。$i \neq j$ のとき内積はゼロ、つまり任意の異なる2行は完全に直交します。$i = j$ のとき内積は $N$ となり、これは各符号のエネルギー(二乗和)に対応します。

この証明は数学的帰納法で示せます。$N = 1$ のときは自明です。$\bm{H}_N \bm{H}_N^T = N \bm{I}_N$ が成り立つと仮定して $\bm{H}_{2N}$ を計算します。

$$ \bm{H}_{2N} \bm{H}_{2N}^T = \begin{bmatrix} \bm{H}_N & \bm{H}_N \\ \bm{H}_N & -\bm{H}_N \end{bmatrix} \begin{bmatrix} \bm{H}_N^T & \bm{H}_N^T \\ \bm{H}_N^T & -\bm{H}_N^T \end{bmatrix} $$

右辺のブロック積を展開すると、$(1,1)$ ブロックは $\bm{H}_N \bm{H}_N^T + \bm{H}_N \bm{H}_N^T = 2N \bm{I}_N$ です。$(1,2)$ ブロックは $\bm{H}_N \bm{H}_N^T – \bm{H}_N \bm{H}_N^T = \bm{O}$ です。同様に $(2,1)$ ブロックも $\bm{O}$、$(2,2)$ ブロックは $2N \bm{I}_N$ となるので、

$$ \bm{H}_{2N} \bm{H}_{2N}^T = 2N \bm{I}_{2N} $$

が成り立ち、帰納法の仮定が確認できました。

Walsh 符号の限界

Walsh-Hadamard 符号は同期環境(全ユーザのチップタイミングが完全に揃っている場合)では理想的に直交しますが、非同期環境では直交性が崩れます。各ユーザの信号が異なる遅延で到着すると、符号間の相互相関がゼロにならなくなるのです。このため、非同期環境では「準直交符号」が必要になります。

では、非同期環境で使える符号はどのように構成するのでしょうか。次にGold符号を見ていきましょう。

Gold 符号(準直交符号)

なぜ準直交符号が必要なのか

基地局(下り回線)のように送信タイミングを厳密に制御できる場合はWalsh符号で十分ですが、移動局から基地局への上り回線(アップリンク)では、各端末と基地局の距離が異なるため、信号の到着時刻がばらつきます。このような非同期環境では、符号のずれた位置での相互相関(部分相互相関)が小さい符号が求められます。

Gold符号は、2つの m系列(最長線形帰還シフトレジスタ系列) を組み合わせて生成される擬似雑音(PN)符号で、以下の優れた性質を持ちます。

  • 符号長 $N = 2^n – 1$ に対して $N + 2$ 本の符号を生成できる(Walsh符号の $N$ 本より多い)
  • 任意の相対遅延 に対する相互相関の最大値が3値($\{-1, -t(n), t(n)-2\}$)に限定される
  • 相互相関の上限が理論的に保証されている

Gold 符号の構成

Gold符号の構成手順を説明します。

ステップ1: 次数 $n$ の 好適ペア(preferred pair) と呼ばれる2つのm系列 $\bm{a}$ と $\bm{b}$ を選びます。好適ペアの条件は、相互相関の最大絶対値が

$$ t(n) = \begin{cases} 2^{(n+1)/2} + 1 & (n \text{ が奇数}) \\ 2^{(n+2)/2} + 1 & (n \text{ が偶数}) \end{cases} $$

で抑えられることです。

ステップ2: $\bm{b}$ を巡回シフトさせた系列 $\bm{b}^{(\tau)}$($\tau = 0, 1, \dots, N-1$)を生成し、各シフト量に対して要素ごとのモジュロ2加算(XOR)を取ります。

$$ \bm{g}^{(\tau)} = \bm{a} \oplus \bm{b}^{(\tau)}, \quad \tau = 0, 1, \dots, N-1 $$

ステップ3: Gold符号族は、$\bm{a}$ 自身、$\bm{b}$ 自身、および $N$ 個の $\bm{g}^{(\tau)}$ からなる $N + 2$ 本の符号集合です。

Gold 符号の相関特性

Gold符号族内の任意の2つの符号 $\bm{g}_i$ と $\bm{g}_j$ の相互相関値は

$$ R_{ij}(\tau) = \frac{1}{N}\sum_{k=0}^{N-1} g_i[k] \, g_j[(k+\tau) \bmod N] $$

で定義され、$\{-1, -t(n), t(n)-2\}$ の3値のいずれかの値を(正規化前の値として)取ります。$\{+1, -1\}$ 表現に変換した場合の最大相互相関値 $|R_{ij}(\tau)|$ の上限は $t(n)/N$ 程度です。$N$ が大きくなるほどこの値は小さくなり、ユーザ間の干渉が減少します。

Walsh-Hadamard符号が同期環境で理想的、Gold符号が非同期環境で実用的であることがわかりました。これらの拡散符号を使った実際の送受信モデルを、数学的に定式化していきましょう。

DS-CDMAの送受信モデル

直接拡散方式の概要

DS-CDMA(Direct Sequence CDMA)は、情報ビットに拡散符号を乗じて広帯域信号に変換し、受信側で同じ符号を乗じて逆拡散する方式です。「拡散」と「逆拡散」の2段階の操作が、CDMA の心臓部です。

ユーザ $k$ の情報ビット $b_k \in \{-1, +1\}$ を考えます。このビットに拡散符号 $\bm{c}_k = (c_k[0], c_k[1], \dots, c_k[N-1])$(各要素は $\{-1, +1\}$)を乗じると、チップレートの信号が得られます。

$$ s_k(t) = b_k \sum_{n=0}^{N-1} c_k[n] \, p(t – nT_c) $$

ここで $T_c$ はチップ周期、$p(t)$ はチップ波形(通常は矩形パルス)、$N$ は拡散率(Processing Gain)です。ビット周期 $T_b$ とチップ周期の関係は

$$ T_b = N T_c $$

です。拡散率 $N$ はしばしば $G_p$(Processing Gain)とも書かれます。帯域幅は元の信号の $N$ 倍に拡散されますが、その分だけ干渉に対する耐性が $N$ 倍向上します。

同期CDMAのベースバンドモデル

$K$ 人のユーザが同時に通信する同期CDMAシステムを考えます。全ユーザの送信信号が完全に時刻同期している場合、基地局における受信信号のベースバンドモデルは

$$ \bm{r} = \sum_{k=1}^{K} A_k b_k \bm{c}_k + \bm{n} $$

と表されます。ここで $A_k$ はユーザ $k$ の受信振幅、$b_k \in \{-1, +1\}$ はユーザ $k$ の情報ビット、$\bm{c}_k$ は長さ $N$ の拡散符号ベクトル、$\bm{n}$ は加法性白色ガウス雑音(AWGN)ベクトルで、各成分は $n_i \sim \mathcal{N}(0, \sigma^2)$ です。

逆拡散(相関受信)

目的ユーザ $k$ の信号を検出するため、受信信号 $\bm{r}$ と拡散符号 $\bm{c}_k$ の相関をとります。これが マッチドフィルタ もしくは 相関受信機 です。

$$ z_k = \frac{1}{N} \bm{c}_k^T \bm{r} = \frac{1}{N} \bm{c}_k^T \left( \sum_{j=1}^{K} A_j b_j \bm{c}_j + \bm{n} \right) $$

右辺を展開すると、目的信号の成分と干渉成分に分離できます。

$$ z_k = A_k b_k \underbrace{\frac{1}{N} \bm{c}_k^T \bm{c}_k}_{= 1} + \sum_{j \neq k} A_j b_j \underbrace{\frac{1}{N} \bm{c}_k^T \bm{c}_j}_{\rho_{kj}} + \underbrace{\frac{1}{N} \bm{c}_k^T \bm{n}}_{\eta_k} $$

ここで $\rho_{kj} = \frac{1}{N} \bm{c}_k^T \bm{c}_j$ は符号 $k$ と符号 $j$ の正規化相互相関です。第1項は目的信号の成分です。自己相関は $\frac{1}{N} \bm{c}_k^T \bm{c}_k = 1$ となります($\{-1, +1\}$ の符号なので)。第2項が他ユーザからの干渉(MAI: Multiple Access Interference)です。第3項は雑音成分で、$\eta_k \sim \mathcal{N}(0, \sigma^2/N)$ となります。

整理すると、逆拡散後の出力は

$$ z_k = A_k b_k + \underbrace{\sum_{j \neq k} A_j b_j \rho_{kj}}_{\text{MAI}} + \eta_k $$

となります。もし符号が完全に直交($\rho_{kj} = 0$, $\forall j \neq k$)ならば MAI はゼロになり、単一ユーザのAWGN通信と等価になります。しかし現実には完全な直交性を維持できない場面が多く、MAI が性能を制限する主要因となります。

このモデルから、CDMAの性能を左右する2つの重要な問題が浮かび上がります。1つは MAI そのもの、もう1つはユーザ間の受信電力差です。次に、これらの問題を詳しく見ていきます。

多元接続干渉(MAI)

MAI の統計的性質

$K$ 人のユーザが送信しているとき、ユーザ $k$ が受ける MAI は

$$ I_k = \sum_{j \neq k} A_j b_j \rho_{kj} $$

です。$b_j$ が等確率で $\{-1, +1\}$ をとり、各ユーザが独立に送信すると仮定すると、$I_k$ の平均はゼロです。

$$ E[I_k] = \sum_{j \neq k} A_j \, E[b_j] \, \rho_{kj} = 0 $$

分散は以下のようになります。全ユーザの受信電力が等しい($A_j = A$, $\forall j$)理想的な場合を考えます。

$$ \text{Var}[I_k] = \sum_{j \neq k} A^2 \rho_{kj}^2 $$

ランダム符号を用いる場合、$\rho_{kj}^2$ の期待値は $1/N$ 程度になるため、

$$ \text{Var}[I_k] \approx \frac{(K-1) A^2}{N} $$

と見積もれます。

SINR(信号対干渉雑音比)

ユーザ $k$ の SINR は、逆拡散後の出力において、目的信号の電力を MAI 電力と雑音電力の和で割ったものです。

$$ \text{SINR}_k = \frac{A_k^2}{\sum_{j \neq k} A_j^2 \rho_{kj}^2 + \sigma^2/N} $$

全ユーザの受信電力が等しい場合は

$$ \text{SINR}_k = \frac{A^2}{\frac{(K-1)A^2}{N} + \frac{\sigma^2}{N}} = \frac{N}{\frac{(K-1) + \sigma^2/A^2}{1}} = \frac{N}{(K-1) + 1/\text{SNR}_{\text{chip}}} $$

ここで $\text{SNR}_{\text{chip}} = A^2/\sigma^2$ はチップレベルの SNR です。高 SNR 領域($\sigma^2 \to 0$)では、SINR は

$$ \text{SINR}_k \approx \frac{N}{K-1} $$

に近づき、雑音ではなく干渉が性能の上限を決めることがわかります。これが CDMA が「干渉制限系」と呼ばれる所以です。

ここまでで MAI の影響を定量的に評価しました。しかし、上の解析では全ユーザの受信電力が等しいと仮定しました。実際の移動通信では、この仮定が成り立たないことが大きな問題になります。

近遠問題(Near-Far Problem)と電力制御

近遠問題とは

近遠問題を日常の体験で理解しましょう。あなたが教室の後ろの席にいて、前に座っている友人と小声で話しているとします。すぐ隣で別の人が大声で話し始めたら、友人の声はかき消されてしまいます。これが近遠問題の本質です。

CDMA では、基地局に近いユーザの信号は強く、遠いユーザの信号は弱く受信されます。逆拡散後の出力をもう一度見ると

$$ z_k = A_k b_k + \sum_{j \neq k} A_j b_j \rho_{kj} + \eta_k $$

において、$A_j \gg A_k$ となるユーザ $j$ が存在すると、たとえ $\rho_{kj}$ が小さくても MAI の項 $A_j b_j \rho_{kj}$ が支配的になります。

数値例で見る近遠問題の深刻さ

具体的な数値で確認しましょう。拡散率 $N = 64$、ユーザ数 $K = 10$ の場合を考えます。ランダム符号の平均相互相関を $\rho_{kj}^2 \approx 1/N = 1/64$ と仮定します。

電力制御なし: ユーザ1(遠方)の受信電力が $A_1^2 = 1$、ユーザ2(近傍)の受信電力が $A_2^2 = 100$(20 dB 強い)とします。ユーザ1の SINR は

$$ \text{SINR}_1 \approx \frac{1}{100/64 \times 1 + 8 \times 1/64} = \frac{1}{1.5625 + 0.125} \approx 0.59 \quad (-2.3 \text{ dB}) $$

これでは BPSK で BER $\approx 0.25$ となり、通信が成立しません。

完全電力制御: 全ユーザの受信電力を $A_j^2 = 1$ に揃えると

$$ \text{SINR}_1 = \frac{1}{9/64} = \frac{64}{9} \approx 7.1 \quad (8.5 \text{ dB}) $$

となり、BPSK で BER $\approx 10^{-4}$ 以下の良好な通信が可能になります。

電力制御の方式

近遠問題を解決するため、移動通信では 電力制御(Power Control) が不可欠です。

開ループ電力制御(Open-Loop Power Control): 移動局が基地局からの受信電力を測定し、伝搬損失を推定して送信電力を調整します。受信電力が弱ければ送信電力を上げ、強ければ下げます。フェージングの変動が速い場合は追従が困難です。

閉ループ電力制御(Closed-Loop Power Control): 基地局が各移動局の受信 SIR(信号対干渉比)を測定し、目標 SIR からの偏差に応じて「電力を上げろ / 下げろ」の1ビットコマンドを移動局にフィードバックします。IS-95/cdmaOne では 800 Hz(1.25 ms ごと)、WCDMA では 1500 Hz(0.667 ms ごと)の頻度で電力制御コマンドが送信されます。

閉ループ電力制御の目標は、全ユーザの受信 SIR を目標値 $\gamma_{\text{target}}$ に揃えることです。

$$ \text{SIR}_k = \frac{A_k^2}{\sum_{j \neq k} A_j^2 \rho_{kj}^2} \to \gamma_{\text{target}}, \quad \forall k $$

この条件を満たすためには、基地局から遠いユーザほど大きな送信電力が必要になります。全ユーザの SIR を等しく保つことで、セル全体の容量を最大化できます。

外部ループ電力制御(Outer-Loop Power Control): 目標 SIR $\gamma_{\text{target}}$ 自体を BER の実測値に基づいて動的に調整します。フェージング環境やユーザの移動速度によって必要な SIR が変わるため、この仕組みが必要です。

電力制御により近遠問題が緩和されましたが、移動通信ではもう1つの課題があります。電波がビルや山に反射して複数の経路で到達する マルチパス伝搬 です。次に、マルチパスを逆に利用してダイバーシティ利得を得る RAKE 受信機を見ていきましょう。

RAKE 受信機によるマルチパスダイバーシティ

マルチパス環境のモデル

移動通信では、送信信号が建物や地形に反射・回折して、複数の経路(マルチパス)を通って受信機に到達します。$L$ 本のパスがある場合、受信信号は

$$ r(t) = \sum_{\ell=1}^{L} \alpha_\ell \, s(t – \tau_\ell) + n(t) $$

と表されます。ここで $\alpha_\ell$ は第 $\ell$ パスの複素減衰係数(振幅と位相の変化)、$\tau_\ell$ は第 $\ell$ パスの遅延時間です。

狭帯域通信ではマルチパスは深刻なフェージングの原因となりますが、CDMA のような広帯域信号では状況が異なります。チップ周期 $T_c$ よりも遅延差 $|\tau_\ell – \tau_m|$ が大きいパス同士は、拡散符号の自己相関特性により 分離可能 です。この性質を利用するのが RAKE 受信機です。

RAKE 受信機の構造

RAKE 受信機は、くし(rake)のような構造で複数のパスを並列に捕捉します。各「指(finger)」が1つのパスに対応する相関器です。

RAKE 受信機の動作は次の通りです。

ステップ1 — パス探索: パイロット信号やプリアンブルを用いて、各パスの遅延 $\tau_\ell$ と複素振幅 $\alpha_\ell$ を推定します。

ステップ2 — 各 finger での逆拡散: 第 $\ell$ finger は、遅延 $\tau_\ell$ に合わせた拡散符号のレプリカ $\bm{c}_k(t – \tau_\ell)$ で受信信号を逆拡散します。

$$ z_\ell = \frac{1}{N} \int_0^{T_b} r(t) \, c_k(t – \tau_\ell) \, dt = \alpha_\ell A_k b_k + (\text{他パスの残留干渉}) + \eta_\ell $$

ステップ3 — MRC(最大比合成): 各 finger の出力を、チャネル推定値の複素共役で重み付けして合成します。

$$ z_{\text{RAKE}} = \sum_{\ell=1}^{L} \alpha_\ell^* z_\ell $$

最大比合成(MRC)は、各パスを SNR に比例した重みで合成するため、理論的に最適な合成法です。合成後の SNR は

$$ \text{SNR}_{\text{RAKE}} = \sum_{\ell=1}^{L} |\alpha_\ell|^2 \, \text{SNR}_\ell $$

となり、個々のパスの SNR の総和 が得られます。これは $L$ 次のダイバーシティ利得に相当します。

RAKE 受信機の利得の直感

マルチパスが「敵」ではなく「味方」になる点が重要です。単一パスの信号がフェージングで弱くなっても、別のパスが強ければそちらで補えます。パス数 $L$ が増えるほどダイバーシティ次数が上がり、フェージングに対するロバスト性が向上します。これは CDMA の広帯域性がもたらす大きなメリットです。

RAKE 受信機によりマルチパスの問題を解決する方法がわかりました。次に、CDMA システム全体として何ユーザまで収容できるのか、容量の理論的解析に進みましょう。

CDMAの容量解析

干渉制限系としてのモデル

CDMA の容量を解析するために、単一セルの上り回線を考えます。完全電力制御により全ユーザの受信電力が等しい($A_k = A$, $\forall k$)と仮定します。

ユーザ $k$ のビットエネルギー対干渉雑音密度比 $E_b/I_0$ は

$$ \frac{E_b}{I_0} = \frac{A^2 T_b}{(K-1) A^2 T_c + N_0} = \frac{N}{(K-1) + N_0/(A^2 T_c)} $$

で与えられます。ここでビットエネルギーの $A^2 T_b$ を分子に、干渉の電力スペクトル密度 $(K-1) A^2 T_c$ と雑音の電力スペクトル密度 $N_0$ の和を分母に置きました。

高 SNR($N_0 \to 0$)の極限では

$$ \frac{E_b}{I_0} \approx \frac{N}{K-1} $$

となります。目標 $E_b/I_0$ を $\gamma_{\text{req}}$ とすると、ユーザ数の上限は

$$ K \leq 1 + \frac{N}{\gamma_{\text{req}}} $$

で与えられます。拡散率 $N$ が大きいほど、また目標 $E_b/I_0$ が小さいほど、より多くのユーザを収容できます。

音声活性率とセクタ化による容量向上

実際の音声通信では、通話の約60%の時間は沈黙です。この 音声活性率(Voice Activity Factor) $v \approx 0.4$ を考慮すると、平均的な干渉は $(K-1)v$ に減少します。

また、基地局アンテナを3セクタに分割する セクタ化 を行うと、各セクタが受ける干渉は約 $1/3$ に減ります。セクタ化利得を $G_s$ とします。

さらに、隣接セルからの干渉を 他セル干渉比 $f$(自セル干渉に対する比率、典型値 $f \approx 0.6$)で表すと、最終的なユーザ容量は

$$ K = 1 + \frac{N / \gamma_{\text{req}}}{v \cdot (1 + f) / G_s} $$

と表されます。$v = 0.4$, $f = 0.6$, $G_s = 3$ を代入し、$N = 128$, $\gamma_{\text{req}} = 5$(7 dB)とすると

$$ K = 1 + \frac{128/5}{0.4 \times 1.6 / 3} = 1 + \frac{25.6}{0.213} \approx 121 $$

となり、拡散率128のシステムで約121ユーザを収容できる計算になります。FDMA/TDMA では物理チャネル数の上限で決まりますが、CDMA では干渉管理の品質に応じてソフトに容量が変化する点が特徴的です。

シャノン限界との関係

CDMA の容量は、シャノンの通信路容量とも関係づけられます。帯域幅 $W$、1ユーザあたりのビットレート $R_b$ とすると、$N = W/R_b$ です。$K$ ユーザがそれぞれ電力 $P$ で送信し、雑音電力が $N_0 W$ のとき、通信路容量の条件は

$$ K R_b \leq W \log_2\left(1 + \frac{KP}{N_0 W}\right) $$

です。$W/R_b = N$ を代入して両辺を $W$ で割ると

$$ \frac{K}{N} \leq \log_2\left(1 + \frac{K}{N} \cdot \frac{E_b}{N_0/2}\right) $$

ここで $E_b = P/R_b$ です。この不等式は、CDMA のユーザ密度 $K/N$ がシャノン限界で上から抑えられることを示しています。

容量の理論的な枠組みを把握したところで、CDMA の技術が実際の通信規格でどのように使われているかを見てみましょう。

WCDMAの概要

3G移動通信における CDMA

WCDMA(Wideband CDMA)は、第3世代移動通信(3G)の国際標準規格 UMTS(Universal Mobile Telecommunications System)の無線アクセス方式です。IS-95/cdmaOne の発展形として、より広い帯域幅と高いデータレートを実現しました。

WCDMA の主要パラメータを以下にまとめます。

パラメータ
チップレート 3.84 Mcps(メガチップ/秒)
帯域幅 5 MHz
フレーム長 10 ms(15スロット)
拡散率(下り) 4〜512(可変)
拡散率(上り) 4〜256(可変)
電力制御周期 1500 Hz(0.667 ms)
変調方式(上り) BPSK(データ)+ BPSK(制御)
変調方式(下り) QPSK

二重拡散

WCDMA では、チャネライゼーション符号(Walsh/OVSF符号)と スクランブリング符号(Gold符号系列)の2段階の拡散を行います。

チャネライゼーション符号: OVSF(Orthogonal Variable Spreading Factor)符号は、Walsh符号を拡張して異なる拡散率を混在させたものです。同一セル内のユーザ(下り回線)や同一ユーザの複数チャネル(上り回線)を直交分離します。

スクランブリング符号: Gold符号をベースとしたスクランブリング符号で、下り回線ではセル(基地局)を識別し、上り回線ではユーザ(移動局)を識別します。スクランブリング符号は直交性を持ちませんが、干渉のランダム化(干渉平均化)の効果があり、MAI を統計的に平準化します。

この二重拡散の構造により、同一セル内の分離は直交符号で、セル間の分離はスクランブリング符号で行うという、階層的な多元接続が実現されています。

ソフトハンドオーバー

CDMA システムのもう1つの特徴が ソフトハンドオーバー です。FDMA/TDMA のハードハンドオーバーでは、移動局がセル境界を越えるとき一瞬通信が途切れます。一方、CDMA では全セルが同じ周波数を使うため、移動局は複数の基地局と同時に通信でき、切れ目のない接続(make-before-break)が可能です。これは RAKE 受信機の finger を異なる基地局からのパスに割り当てることで実現されます。

理論とアーキテクチャの解説が一通り終わりました。ここからは Python シミュレーションで、これまでの理論を実際に確認していきましょう。

Pythonによるマルチユーザ CDMA シミュレーション

Walsh-Hadamard 符号の生成と直交性の確認

まず、Walsh-Hadamard符号を再帰的に生成し、直交性を視覚的に確認します。

import numpy as np
import matplotlib.pyplot as plt

def hadamard_matrix(n):
    """再帰的にHadamard行列を生成"""
    if n == 1:
        return np.array([[1]])
    H_half = hadamard_matrix(n // 2)
    return np.block([
        [H_half,  H_half],
        [H_half, -H_half]
    ])

# N=8のHadamard行列
N = 8
H = hadamard_matrix(N)

# 相互相関行列(正規化)
corr_matrix = (H @ H.T) / N

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

# Walsh符号の波形
ax = axes[0]
for i in range(N):
    ax.step(range(N), H[i] + 2.5 * i, where='mid', linewidth=1.5)
    ax.text(-0.8, 2.5 * i, f'W{i}', fontsize=9, va='center')
ax.set_xlabel('Chip index')
ax.set_ylabel('Walsh code (offset)')
ax.set_title(f'Walsh-Hadamard Codes (N={N})')
ax.set_xlim(-1, N)
ax.grid(True, alpha=0.3)

# 相互相関行列のヒートマップ
ax = axes[1]
im = ax.imshow(corr_matrix, cmap='RdBu_r', vmin=-1, vmax=1)
ax.set_xlabel('Code index j')
ax.set_ylabel('Code index i')
ax.set_title('Normalized Cross-Correlation Matrix')
fig.colorbar(im, ax=ax, shrink=0.8)
for i in range(N):
    for j in range(N):
        ax.text(j, i, f'{corr_matrix[i,j]:.0f}', ha='center', va='center', fontsize=8)

plt.tight_layout()
plt.savefig('walsh_hadamard.png', dpi=150, bbox_inches='tight')
plt.show()

左のグラフには $N = 8$ の Walsh 符号8本の波形が表示されます。各符号は $\{-1, +1\}$ の値を取るチップ系列で、見た目も互いに異なるパターンです。右の相互相関行列は対角成分が1(自己相関)、非対角成分が全て0(相互相関ゼロ)の完全な単位行列になっています。これにより、Walsh 符号が理論通り完全直交であることが数値的に確認できます。

DS-CDMAのマルチユーザ送受信シミュレーション

次に、$K$ ユーザの DS-CDMA 送受信をシミュレーションし、BER(ビット誤り率)を理論値と比較します。

import numpy as np
import matplotlib.pyplot as plt

def simulate_cdma_ber(N, K, snr_db_range, n_bits=10000):
    """同期DS-CDMAのBERをモンテカルロシミュレーションで計算"""
    # Walsh符号の生成
    def hadamard(n):
        if n == 1:
            return np.array([[1]])
        H_half = hadamard(n // 2)
        return np.block([[H_half, H_half], [H_half, -H_half]])

    H = hadamard(N)
    codes = H[:K]  # K人分の符号

    ber_sim = []
    for snr_db in snr_db_range:
        snr_linear = 10 ** (snr_db / 10)
        sigma = 1.0 / np.sqrt(2 * snr_linear)

        errors = 0
        total = 0
        for _ in range(n_bits // K):
            # 全ユーザのビット生成
            bits = 2 * np.random.randint(0, 2, K) - 1  # {-1, +1}

            # 拡散と重畳
            tx_signal = np.zeros(N)
            for k in range(K):
                tx_signal += bits[k] * codes[k]

            # AWGN付加
            noise = sigma * np.random.randn(N)
            rx_signal = tx_signal + noise

            # 各ユーザの逆拡散と判定
            for k in range(K):
                z = np.dot(codes[k], rx_signal) / N
                bit_hat = 1 if z > 0 else -1
                if bit_hat != bits[k]:
                    errors += 1
                total += 1

        ber_sim.append(errors / total)

    return np.array(ber_sim)

# パラメータ設定
N = 32
snr_db = np.arange(0, 16, 1)

# 異なるユーザ数でシミュレーション
from scipy.special import erfc

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

for K in [1, 4, 8, 16, 32]:
    ber = simulate_cdma_ber(N, K, snr_db, n_bits=50000)
    ax.semilogy(snr_db, np.maximum(ber, 1e-6), 'o-', label=f'K={K} users', markersize=4)

# BPSK理論値(単一ユーザ)
snr_fine = np.linspace(0, 15, 100)
ber_theory = 0.5 * erfc(np.sqrt(10 ** (snr_fine / 10)))
ax.semilogy(snr_fine, ber_theory, 'k--', linewidth=2, label='BPSK theory (K=1)')

ax.set_xlabel('Eb/N0 [dB]')
ax.set_ylabel('BER')
ax.set_title(f'DS-CDMA BER vs Eb/N0 (N={N}, Walsh codes)')
ax.legend()
ax.grid(True, which='both', alpha=0.3)
ax.set_ylim(1e-6, 1)
plt.tight_layout()
plt.savefig('cdma_ber.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから以下の重要な特徴が読み取れます。

  1. $K = 1$(単一ユーザ)の場合: BER は BPSK の理論曲線と完全に一致します。これは当然で、他ユーザがいなければ MAI がゼロとなり、通常の AWGN 通信と等価だからです。
  2. $K \leq N$ でWalsh符号を使う場合: 同期環境では Walsh 符号が完全に直交するため、ユーザ数を増やしても BER はほとんど劣化しません。$K = 32 = N$ の場合でも、理論曲線からのずれはわずかです。これが直交符号の威力です。
  3. $K$ が $N$ に近づくと: わずかに性能が劣化する場合がありますが、これは有限のシミュレーション回数による統計的揺らぎです。理論的には同期直交符号では MAI は完全にゼロです。

近遠問題の可視化

次に、近遠問題の深刻さと電力制御の効果を可視化します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erfc

def simulate_near_far(N, K, snr_db, power_ratios, n_bits=100000):
    """近遠問題のシミュレーション: ユーザ1(目的ユーザ)のBERを計算"""
    def hadamard(n):
        if n == 1:
            return np.array([[1]])
        H_half = hadamard(n // 2)
        return np.block([[H_half, H_half], [H_half, -H_half]])

    # ランダム符号を使用(非直交)
    np.random.seed(42)
    codes = 2 * np.random.randint(0, 2, (K, N)) - 1  # {-1, +1}ランダム符号

    snr_linear = 10 ** (snr_db / 10)
    sigma = 1.0 / np.sqrt(2 * snr_linear)
    amplitudes = np.sqrt(power_ratios)

    errors = 0
    for _ in range(n_bits):
        bits = 2 * np.random.randint(0, 2, K) - 1
        tx_signal = np.zeros(N)
        for k in range(K):
            tx_signal += amplitudes[k] * bits[k] * codes[k]

        noise = sigma * np.random.randn(N)
        rx_signal = tx_signal + noise

        # ユーザ1の逆拡散
        z = np.dot(codes[0], rx_signal) / N
        bit_hat = 1 if z > 0 else -1
        if bit_hat != bits[0]:
            errors += 1

    return errors / n_bits

この関数は、ランダム符号(非直交)を用いたDS-CDMAのマルチユーザ環境で、目的ユーザ(ユーザ1)のBERをモンテカルロシミュレーションで計算します。各ユーザの受信振幅を power_ratios で個別に設定できるため、電力制御の有無による近遠問題の影響を定量的に評価できます。ランダム符号を使う点が先のWalsh符号によるシミュレーションとは異なり、非直交な符号間のMAIが性能劣化として現れることになります。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erfc

# 近遠問題の影響: 干渉ユーザの電力比を変化させる
N = 64
K = 10
snr_db = 10  # Eb/N0 = 10 dB

# 干渉ユーザの電力比(目的ユーザ=1に対する比率)をスイープ
power_ratio_db = np.arange(0, 25, 2)

ber_no_pc = []
for pr_db in power_ratio_db:
    pr = 10 ** (pr_db / 10)
    # ユーザ1の電力=1, 他ユーザの電力=pr
    ratios = np.ones(K)
    ratios[1:] = pr
    ber = simulate_near_far(N, K, snr_db, ratios, n_bits=50000)
    ber_no_pc.append(ber)

# 完全電力制御(全ユーザ電力=1)
ber_perfect_pc = simulate_near_far(N, K, snr_db, np.ones(K), n_bits=50000)

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

# 左: 近遠問題
ax = axes[0]
ax.semilogy(power_ratio_db, np.maximum(ber_no_pc, 1e-6), 'ro-', linewidth=2,
            markersize=6, label='No power control')
ax.axhline(y=ber_perfect_pc, color='b', linestyle='--', linewidth=2,
           label=f'Perfect power control (BER={ber_perfect_pc:.1e})')
ax.set_xlabel('Interferer power ratio [dB]')
ax.set_ylabel('BER of user 1')
ax.set_title(f'Near-Far Problem (N={N}, K={K}, Eb/N0={snr_db}dB)')
ax.legend()
ax.grid(True, which='both', alpha=0.3)
ax.set_ylim(1e-5, 1)

# 右: ユーザ数 vs BER(電力制御あり/なし)
K_range = np.arange(2, 60, 2)
ber_with_pc = []
ber_without_pc = []

for K_val in K_range:
    # 電力制御あり
    ratios_eq = np.ones(K_val)
    ber_w = simulate_near_far(N, K_val, snr_db, ratios_eq, n_bits=30000)
    ber_with_pc.append(ber_w)

    # 電力制御なし(ランダムな電力差)
    np.random.seed(K_val)
    ratios_rand = 10 ** (np.random.uniform(0, 2, K_val) / 10 * 10)  # 0~20dBの電力差
    ratios_rand[0] = 1.0  # 目的ユーザ
    ber_wo = simulate_near_far(N, K_val, snr_db, ratios_rand, n_bits=30000)
    ber_without_pc.append(ber_wo)

ax = axes[1]
ax.semilogy(K_range, np.maximum(ber_with_pc, 1e-6), 'b^-', linewidth=2,
            markersize=5, label='With power control')
ax.semilogy(K_range, np.maximum(ber_without_pc, 1e-6), 'rs-', linewidth=2,
            markersize=5, label='Without power control')
ax.set_xlabel('Number of users K')
ax.set_ylabel('BER of user 1')
ax.set_title(f'BER vs Number of Users (N={N}, Eb/N0={snr_db}dB)')
ax.legend()
ax.grid(True, which='both', alpha=0.3)
ax.set_ylim(1e-5, 1)

plt.tight_layout()
plt.savefig('near_far_problem.png', dpi=150, bbox_inches='tight')
plt.show()

このシミュレーション結果から、以下のことが明確に読み取れます。

  1. 左図(近遠問題): 干渉ユーザの電力比が増加するにつれ、目的ユーザの BER が急激に悪化しています。電力比がわずか 10 dB(10倍)でも BER は 0.1 近くまで上昇し、20 dB(100倍)ではほぼ 0.5(ランダム推測と同じ)に達します。一方、完全電力制御を行った場合(青い破線)は、BER が大幅に低い値に保たれています。近遠問題の深刻さと電力制御の重要性が一目瞭然です。
  2. 右図(ユーザ数と BER): 電力制御ありの場合、ユーザ数が拡散率 $N = 64$ に近づくまで BER は緩やかに増加します。これは MAI が徐々に蓄積するためですが、その増加はグレースフル(緩やか)です。電力制御なしの場合は、少ないユーザ数でも BER が大きく悪化しています。CDMA の容量は電力制御の精度に強く依存することが確認できます。

RAKE 受信機のシミュレーション

最後に、RAKE 受信機によるマルチパスダイバーシティの効果を確認します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erfc

def simulate_rake(N, L_paths, snr_db_range, n_bits=50000):
    """RAKE受信機のBERシミュレーション(レイリーフェージング)"""
    ber_no_rake = []
    ber_rake = []

    for snr_db in snr_db_range:
        snr_linear = 10 ** (snr_db / 10)

        errors_no_rake = 0
        errors_rake = 0

        for _ in range(n_bits):
            bit = 2 * np.random.randint(0, 2) - 1  # {-1, +1}
            code = 2 * np.random.randint(0, 2, N) - 1

            # レイリーフェージングチャネル(L本のパス)
            h = (np.random.randn(L_paths) + 1j * np.random.randn(L_paths)) / np.sqrt(2)

            # 各パスの受信信号(逆拡散後)
            sigma = 1.0 / np.sqrt(2 * snr_linear)
            z_fingers = np.zeros(L_paths, dtype=complex)
            for ell in range(L_paths):
                noise = sigma * (np.random.randn() + 1j * np.random.randn()) / np.sqrt(2)
                z_fingers[ell] = h[ell] * bit + noise

            # 単一パス(RAKEなし): 最初のパスのみ
            z_single = np.real(np.conj(h[0]) * z_fingers[0])
            bit_hat_no_rake = 1 if z_single > 0 else -1
            if bit_hat_no_rake != bit:
                errors_no_rake += 1

            # MRC合成(RAKE受信機)
            z_mrc = np.real(np.sum(np.conj(h) * z_fingers))
            bit_hat_rake = 1 if z_mrc > 0 else -1
            if bit_hat_rake != bit:
                errors_rake += 1

        ber_no_rake.append(errors_no_rake / n_bits)
        ber_rake.append(errors_rake / n_bits)

    return np.array(ber_no_rake), np.array(ber_rake)

snr_db = np.arange(0, 30, 2)

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

# AWGN理論値
snr_fine = np.linspace(0, 29, 200)
ber_awgn = 0.5 * erfc(np.sqrt(10 ** (snr_fine / 10)))
ax.semilogy(snr_fine, ber_awgn, 'k-', linewidth=2, label='AWGN (no fading)')

# レイリー理論値(単一パス)
snr_lin = 10 ** (snr_fine / 10)
ber_rayleigh = 0.5 * (1 - np.sqrt(snr_lin / (1 + snr_lin)))
ax.semilogy(snr_fine, ber_rayleigh, 'k--', linewidth=2, label='Rayleigh (L=1, theory)')

# 異なるパス数でシミュレーション
for L in [1, 2, 4, 8]:
    ber_no_rake, ber_rake = simulate_rake(32, L, snr_db, n_bits=50000)
    ax.semilogy(snr_db, np.maximum(ber_rake, 1e-6), 'o-',
                label=f'RAKE (L={L} paths)', markersize=5)

ax.set_xlabel('Average Eb/N0 per path [dB]')
ax.set_ylabel('BER')
ax.set_title('RAKE Receiver: BER vs Eb/N0 (Rayleigh fading)')
ax.legend()
ax.grid(True, which='both', alpha=0.3)
ax.set_ylim(1e-6, 1)
ax.set_xlim(0, 29)
plt.tight_layout()
plt.savefig('rake_receiver.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから RAKE 受信機の効果が明確に見て取れます。

  1. $L = 1$(単一パス): レイリーフェージングの理論曲線(黒の破線)とよく一致しています。AWGN に比べて BER の減衰が緩やかで、同じ BER を達成するために数十 dB 余計な SNR が必要です。これがフェージングの厳しさです。
  2. $L = 2$, $4$: パス数が増えるごとに BER 曲線の傾きが急になります。$L = 2$ でも $L = 1$ と比較して約 5-10 dB の改善が見られます。$L = 4$ ではさらに改善され、AWGN の曲線に近づいていきます。
  3. $L = 8$: 8パスの RAKE 受信機では、BER 曲線は AWGN の場合にかなり近くなります。これは8次のダイバーシティにより、全パスが同時に深い落ち込みを経験する確率が極めて小さくなるためです。CDMA の広帯域性が自然にマルチパスダイバーシティを提供することが、数値的に確認できました。

CDMAの容量曲線

最後に、CDMA の容量(ユーザ数と必要 $E_b/N_0$ の関係)を理論曲線として描きます。

import numpy as np
import matplotlib.pyplot as plt

N = 128  # 拡散率
K_range = np.arange(1, 130)

# 理論的なSINR: N/(K-1) (高SNR近似)
sinr_theory = N / np.maximum(K_range - 1, 0.5)
sinr_db = 10 * np.log10(sinr_theory)

# 音声活性率・セクタ化を考慮した等価SINR
v = 0.4   # 音声活性率
f = 0.6   # 他セル干渉比
Gs = 3    # セクタ化利得
sinr_enhanced = N / (np.maximum(K_range - 1, 0.5) * v * (1 + f) / Gs)
sinr_enhanced_db = 10 * np.log10(sinr_enhanced)

# シャノン限界
# K*Rb <= W * log2(1 + K*P/(N0*W))
# K/N <= log2(1 + (K/N) * Eb/N0 * 2)
# Eb/N0の関数としてK/Nの上限を計算
eb_n0_db = np.linspace(0, 20, 200)
eb_n0_lin = 10 ** (eb_n0_db / 10)

# 二分探索でK/Nの上限を求める
def shannon_capacity_ratio(eb_n0):
    """シャノン限界から K/N の上限を数値的に計算"""
    lo, hi = 0.0, 100.0
    for _ in range(100):
        mid = (lo + hi) / 2
        if mid * np.log(2) < np.log(1 + mid * 2 * eb_n0):
            lo = mid
        else:
            hi = mid
    return lo

K_over_N_shannon = [shannon_capacity_ratio(e) for e in eb_n0_lin]

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

# 左: ユーザ数 vs SINR
ax = axes[0]
ax.plot(K_range, sinr_db, 'b-', linewidth=2, label='Basic CDMA')
ax.plot(K_range, sinr_enhanced_db, 'r-', linewidth=2,
        label=f'Enhanced (v={v}, f={f}, Gs={Gs})')
ax.axhline(y=7, color='g', linestyle='--', linewidth=1.5,
           label='Typical Eb/I0 target (7 dB)')
ax.set_xlabel('Number of users K')
ax.set_ylabel('SINR [dB]')
ax.set_title(f'CDMA SINR vs Users (N={N})')
ax.legend()
ax.grid(True, alpha=0.3)
ax.set_xlim(1, 130)

# 右: シャノン限界との比較
ax = axes[1]
ax.plot(eb_n0_db, np.array(K_over_N_shannon), 'k-', linewidth=2,
        label='Shannon limit')
# CDMA動作点(BPSK, Eb/N0 = 7dB)
K_cdma_basic = 1 + N / (10 ** (7/10))
K_cdma_enhanced = 1 + N / (10 ** (7/10)) / (v * (1 + f) / Gs)
ax.plot(7, K_cdma_basic/N, 'bo', markersize=10, label=f'Basic CDMA (K={K_cdma_basic:.0f})')
ax.plot(7, K_cdma_enhanced/N, 'rs', markersize=10,
        label=f'Enhanced CDMA (K={K_cdma_enhanced:.0f})')
ax.set_xlabel('Eb/N0 [dB]')
ax.set_ylabel('Spectral efficiency K/N [users/chip]')
ax.set_title('CDMA Capacity vs Shannon Limit')
ax.legend()
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 20)
ax.set_ylim(0, max(K_over_N_shannon) * 1.1)

plt.tight_layout()
plt.savefig('cdma_capacity.png', dpi=150, bbox_inches='tight')
plt.show()

この容量解析のグラフから、以下のことが読み取れます。

  1. 左図(ユーザ数とSINR): ユーザ数が増加するとSINRは単調に減少し、目標 $E_b/I_0 = 7$ dB のラインを下回る点がシステムの容量上限です。基本CDMAでは約26ユーザですが、音声活性率・セクタ化・他セル干渉比を考慮すると約121ユーザまで拡大します。この約5倍の改善がソフトキャパシティの実践的な威力です。
  2. 右図(シャノン限界との比較): CDMA のスペクトル効率はシャノン限界に比べて大幅に低い位置にあります。これは、CDMAが単純な相関受信を用いている(最適なマルチユーザ検出を行っていない)ためです。マルチユーザ検出(MUD)やサクセッシブ干渉キャンセラ(SIC)を導入することで、シャノン限界により近づけることができます。

まとめ

本記事では、CDMA(符号分割多元接続)の原理から容量解析までを体系的に解説しました。

  • CDMAの基本原理: 全ユーザが同じ周波数・同じ時間を共有し、拡散符号の直交性(または準直交性)で信号を分離する。FDMA・TDMAのような「資源分割」ではなく「干渉管理」で容量が決まる
  • Walsh-Hadamard符号: 再帰構成 $\bm{H}_{2N} = [\bm{H}_N, \bm{H}_N; \bm{H}_N, -\bm{H}_N]$ で生成される完全直交符号。同期環境ではMAIゼロを実現するが、非同期環境では直交性が崩れる
  • Gold符号: m系列の好適ペアから構成される準直交符号。相互相関が3値に限定され、非同期環境でも低い干渉特性を維持する
  • DS-CDMAの送受信モデル: 逆拡散後の出力 $z_k = A_k b_k + \sum_{j \neq k} A_j b_j \rho_{kj} + \eta_k$ において、第2項の MAI が性能を支配する
  • 近遠問題と電力制御: ユーザ間の受信電力差が MAI を劇的に悪化させる。閉ループ電力制御(IS-95で800Hz、WCDMAで1500Hz)が不可欠
  • RAKE受信機: マルチパスの各成分を個別に捕捉し、MRC合成することで $L$ 次のダイバーシティ利得を獲得。CDMA の広帯域性がフェージング耐性を自然に提供する
  • 容量解析: 高SNR近似で $K \leq 1 + N/\gamma_{\text{req}}$。音声活性率・セクタ化・他セル干渉を考慮すると実効容量は約5倍に向上する

CDMA は第3世代移動通信(WCDMA, cdma2000)の基盤技術であり、その理論的枠組みは4G(LTE)の SC-FDMA/OFDMA や 5G 以降の NOMA(非直交多元接続)を理解する上でも重要な土台となります。特に「干渉をどう管理するか」という視点は、あらゆる無線通信システムに共通する設計思想です。

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