マルチパスフェージング対策の全体像 — アンテナ・変調・符号・等化

エレベーターの前でスマホを構えたまま、体を10センチ動かしただけでアンテナピクトが1本増えたり減ったりした経験はないでしょうか。あるいは、駅のホームで停止していた電車が動き出した瞬間に動画がカクつき、走行が安定するとまた滑らかになる、という経験もあるはずです。どちらも同じ現象が原因です。送信アンテナから出た電波が壁や地面や車体で何度も反射し、受信点にわずかに違う時間差で複数の波が到着します。それらが同相で重なれば信号は強くなり、逆相で重なればほとんど打ち消し合ってしまいます。これがマルチパスフェージングです。

マルチパス伝搬の模式図。送信アンテナから出た直接波・ビル反射波・地面反射波が違う遅延で受信点に届き、位相関係しだいで合成振幅が大きく目減りする様子

左の図が「電波が複数の道を通って届く」という幾何、右の図が「届いた3つの波が受信点でどう重なるか」です。3波の振幅が同じでも、位相がずれていれば合成波の振幅は3本分にはなりません。この例では、同相なら3本分の振幅が得られるはずのところ、位相のずれによって 33% まで目減りしています。位相のずれは受信点の位置がほんの数センチ変わるだけで変化するので、体を動かしただけでアンテナピクトが上下する、という日常の現象がこれで説明できます。

厄介なのは、フェージングが「平均的には十分な電力があるのに、時々だけ極端に落ち込む」という形で襲ってくることです。平均受信電力を10倍にしても、落ち込みの深さが確率的に決まっている以上、通信断は10分の1にしかなりません。後で導くように、フェージング下のビット誤り率は平均SNRの 1乗にしか反比例しません。雑音だけが敵の環境(AWGN)ではSNRを上げるとBERは指数関数的に落ちるのに、フェージングが入った途端に「SNRを10 dB上げてもBERは10分の1」という、絶望的に効率の悪い世界に変わってしまうのです。同じBER $10^{-3}$ を達成するのに、AWGNでは 6.8 dB で足りるのに、レイリーフェージング下では 24.0 dB が必要になります。17 dB以上の損失、電力にして50倍以上です。

この損失を電力で殴り倒すのは現実的ではありません。だから無線通信の歴史は、そのままフェージングと戦う技術の歴史でもあります。この記事で扱う対策は、あなたが毎日使っているシステムの中で今も動いています。

  • 携帯電話(4G/5G): OFDM+サイクリックプレフィクスで遅延波によるシンボル間干渉を消し、MIMO(複数アンテナ)で空間ダイバーシチを取り、ターボ符号/LDPC符号とインターリーブで時間・周波数ダイバーシチを作っています
  • 無線LAN(IEEE 802.11a/n/ac/ax): 同じくOFDM+CPを基本に、複数アンテナ、畳み込み符号(またはLDPC)+サブキャリアインターリーブを組み合わせています
  • 地上デジタル放送(ISDB-T): 移動受信でも映るよう、OFDMに加えて時間インターリーブ・周波数インターリーブを非常に深くかけています
  • 衛星通信・移動体衛星: 見通しがあってもマルチパスと遮蔽が効くため、偏波ダイバーシチや強力な符号化が使われます

問題は、これらの対策がそれぞれ別の敵を倒すために作られているという点です。等化器はシンボル間干渉に効きますが、フラットに落ち込むフェージングには無力です。逆に、空間ダイバーシチは落ち込みには効きますが、遅延波による波形歪みそのものは消せません。「フェージング対策」と一括りにされがちなこれらの技術を、チャネルの性格を2つの数値で測り、その値から使うべき対策を選ぶという一本の設計フローに整理するのが、この記事の目的です。

本記事の内容

  • フェージング対策の全体地図 — 4系統の技術が何を敵にしているか
  • 電力遅延プロファイルからRMS遅延スプレッド $\sigma_\tau$ とコヒーレンス帯域 $B_c$ を導く
  • ドップラースプレッドからコヒーレンス時間 $T_c$ を導く(Clarke/Jakesスペクトルの導出込み)
  • 「信号帯域 vs $B_c$」×「シンボル長 vs $T_c$」の4象限による対策の選び分け
  • レイリーフェージング下のBERが $\bar\gamma^{-1}$ になる理由の導出
  • ダイバーシチ次数 $L$ でBERが $\bar\gamma^{-L}$ になる理由の導出
  • 空間・周波数・時間・偏波・角度ダイバーシチの取り方と設計式
  • インターリーブ+誤り訂正符号がなぜ「時間ダイバーシチを作る」といえるのか
  • 等化器(ZF / MMSE / DFE / MLSE)の役割と限界
  • OFDM+サイクリックプレフィクスが循環畳み込みを作る仕組みの導出
  • Pythonによる4条件のBER比較とバーストエラー分布の可視化

前提知識

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

フェージング対策の地図 — なぜ「万能薬」がないのか

医者が薬を処方する前に、まず熱を測り血圧を測るように、フェージング対策も「チャネルの症状を測る」ところから始まります。同じ「電波が届かない」でも、原因が時間方向の落ち込みなのか周波数方向の歪みなのかで、処方箋はまったく違うからです。

対策技術は大きく4系統に分けられます。

第1系統:ダイバーシチ(分散させて賭ける)。「同じ情報を、互いに独立に落ち込む複数の経路で送る」という発想です。1本の経路が深く落ち込む確率が $p$ なら、独立な2本が同時に落ち込む確率は $p^2$ です。$p = 0.01$ なら $0.0001$、つまり100倍改善します。空間(アンテナを離す)、周波数(離れた周波数で送る)、時間(離れた時刻で送る)、偏波(直交する偏波で送る)、角度(違う方向を向いたビームで受ける)と、「独立性」を確保する軸が複数あります。

第2系統:誤り訂正符号+インターリーブ(時間・周波数ダイバーシチを人工的に作る)。同じビットを繰り返し送るのは帯域の無駄です。そこで、情報ビットを符号語に写像して冗長性を持たせ、その符号語のビットをチャネルのコヒーレンス時間より広くばらまいて送ります。受信側で並べ直すと、集中していたバースト誤りが散らばり、訂正能力の範囲に収まるようになります。

第3系統:等化(歪んだ波形を元に戻す)。遅延波が1シンボル長より長く遅れて到着すると、前のシンボルが次のシンボルに漏れ込むシンボル間干渉(ISI)が生じます。等化器はチャネルの伝達関数の逆特性をかけてこれを打ち消します。

第4系統:マルチキャリア化(そもそもISIが起きない波形にする)。1本の広帯域信号を、多数の狭帯域サブキャリアに分割します。各サブキャリアの帯域がコヒーレンス帯域より十分狭ければ、そのサブキャリアから見たチャネルは単なる複素定数(=フラットフェージング)になり、1タップの割り算で等化が終わります。OFDM+サイクリックプレフィクスがこれです。

ここで大事なのは、第3系統と第4系統は「周波数選択性」への処方箋であり、第1系統と第2系統は「落ち込み」への処方箋であるという区別です。等化器をどれだけ精緻に作っても、チャネル全体がフラットに20 dB落ち込んだら何もできません。逆に、アンテナを4本並べてもISIは消えません。

フェージング対策の全体地図。敵Aは深い落ち込み、敵Bは周波数選択性であり、それぞれにダイバーシチ・符号化+インターリーブ、等化・マルチキャリア化が対応する

この図が本記事の骨格です。上段の2つの箱が「倒すべき敵」、下段の4つの箱が「武器」で、矢印がどの武器がどの敵に効くかを示しています。矢印が敵Aから敵Bへ、あるいはその逆へ伸びていない点に注目してください。ダイバーシチと符号化は落ち込みにしか効かず、等化とマルチキャリア化は歪みにしか効きません。だから「フェージング対策は何が最強か」という問いには意味がなく、まず自分の敵がどちらなのかを測るところから始めるしかないのです。

では、自分のシステムがどちらの病気にかかっているのかを、どう測ればいいのでしょうか。答えは2つの数値、コヒーレンス帯域とコヒーレンス時間です。まずは遅延方向のものさしから作っていきましょう。

第一のものさし — 遅延スプレッドとコヒーレンス帯域

電力遅延プロファイル

送信側から幅ゼロに近い鋭いパルスを1発だけ打ったとします。受信側では、直接波がまず到着し、少し遅れて壁の反射波、さらに遅れてビルの反射波……と、複数のパルスが時間差をつけて並んで観測されます。この「遅延時間に対する受信電力の分布」を電力遅延プロファイル(PDP: Power Delay Profile) $P(\tau)$ と呼びます。

離散的な $K$ 本のパスからなるチャネルなら、遅延 $\tau_k$ のパスが電力 $P_k$ を運ぶ、という形で書けます。市街地では、反射回数が増えるほど電力が減るので、$P(\tau)$ はおおむね指数関数的に減衰する形になります。

$$ P(\tau) = \frac{1}{\tau_0} e^{-\tau/\tau_0} \quad (\tau \geq 0) $$

この $\tau_0$ が「どのくらい長く尾を引くか」の目安ですが、PDPの形は環境によって指数関数とは限りません。形によらず「広がりの大きさ」を1つの数値に要約したい。そこで、確率分布の標準偏差と同じ考え方を持ち込みます。

平均遅延とRMS遅延スプレッド

$P(\tau)$ を正規化して確率密度とみなせば、その平均値と標準偏差が定義できます。まず平均超過遅延 $\bar\tau$ は、電力で重みづけした遅延の期待値です。

$$ \bar\tau = \frac{\sum_k P_k \tau_k}{\sum_k P_k} $$

同様に、遅延の2乗の期待値を計算します。

$$ \overline{\tau^2} = \frac{\sum_k P_k \tau_k^2}{\sum_k P_k} $$

標準偏差の定義(2乗平均から平均の2乗を引いて平方根)をそのまま当てはめると、RMS遅延スプレッド $\sigma_\tau$ が得られます。

$$ \begin{equation} \sigma_\tau = \sqrt{\overline{\tau^2} – (\bar\tau)^2} \end{equation} $$

指数PDPの場合、$\bar\tau = \tau_0$、$\overline{\tau^2} = 2\tau_0^2$ なので、$\sigma_\tau = \sqrt{2\tau_0^2 – \tau_0^2} = \tau_0$ となります。指数PDPでは減衰時定数がそのままRMS遅延スプレッドになる、という覚えやすい関係です。

典型的な値を頭に入れておくと見通しが良くなります。屋内(オフィス・住宅)で $\sigma_\tau \approx 20$〜$50$ ns、郊外の屋外で $0.2$〜$0.5$ µs、市街地で $1$〜$3$ µs、山岳部や大規模な反射体がある環境では $10$ µs を超えることもあります。この数値のオーダーが3桁も違うことが、環境ごとに違う対策が必要になる根本の理由です。

電力遅延プロファイルとRMS遅延スプレッド。左は連続形の指数PDPで平均超過遅延と標準偏差が一致する様子、右は本文で使う4タップPDPと算出値

左の図は、PDPを確率密度とみなしたときの「重心」(平均超過遅延、赤破線)と「広がり」(RMS遅延スプレッド、緑の両矢印)の関係です。指数PDPではこの2つがどちらも $\tau_0$ に一致するので、減衰時定数を読めばそのまま $\sigma_\tau$ が得られます。右の図は本記事のシミュレーションで使う4タップPDPで、100 ns 間隔の4本のパスから $\sigma_\tau = 94.0$ ns、コヒーレンス帯域 $B_c \approx 2.13$ MHz が計算されます。緑の帯($\bar\tau \pm \sigma_\tau$)が先頭2タップをほぼ覆っていることから、電力の大半が最初の200 ns 以内に集まっているとわかります。

周波数相関関数とコヒーレンス帯域

RMS遅延スプレッドは時間軸の量ですが、私たちが本当に知りたいのは「信号の帯域内でチャネルの周波数特性がどれだけ変わるか」です。ここでフーリエ変換が効いてきます。

各パスの遅延が $\tau_k$、複素振幅が $a_k$ のとき、チャネルの伝達関数は各パスの位相回転の和です。

$$ H(f) = \sum_k a_k e^{-j2\pi f \tau_k} $$

パスごとの振幅 $a_k$ が互いに無相関(WSSUS: 広義定常無相関散乱の仮定)だとすると、$H(f)$ の周波数相関関数は次のように計算できます。$E[a_k a_l^*] = P_k \delta_{kl}$ を使うと、クロス項がすべて消えます。

$$ R_H(\Delta f) = E[H(f)H^*(f+\Delta f)] = \sum_k P_k e^{j2\pi \Delta f \tau_k} $$

つまり、周波数相関関数は電力遅延プロファイルのフーリエ変換です。これはウィーナー・ヒンチンの定理と同じ構造で、「遅延方向に広がっているほど、周波数方向には速く相関が落ちる」という不確定性関係を表しています。

指数PDPで具体的に計算してみましょう。連続形で書くと積分は初等的です。

$$ R_H(\Delta f) = \int_0^\infty \frac{1}{\tau_0} e^{-\tau/\tau_0} e^{j2\pi \Delta f \tau} \, d\tau $$

指数関数の肩をまとめると $\exp[-(1/\tau_0 – j2\pi\Delta f)\tau]$ となり、これは単なる指数積分なので、

$$ R_H(\Delta f) = \frac{1/\tau_0}{1/\tau_0 – j2\pi\Delta f} = \frac{1}{1 – j2\pi \Delta f \tau_0} $$

絶対値を取ると、$\sigma_\tau = \tau_0$ を使って次の形になります。

$$ |R_H(\Delta f)| = \frac{1}{\sqrt{1 + (2\pi \Delta f\, \sigma_\tau)^2}} $$

コヒーレンス帯域 $B_c$ は「チャネルがほぼ同じとみなせる周波数幅」であり、この相関がある閾値まで落ちる周波数差として定義されます。相関 $0.5$ を閾値にすると、$1 + (2\pi B_c \sigma_\tau)^2 = 4$ すなわち $2\pi B_c \sigma_\tau = \sqrt{3}$ から、

$$ B_c = \frac{\sqrt{3}}{2\pi \sigma_\tau} \approx \frac{0.276}{\sigma_\tau} $$

実務では、PDPの形が指数関数からずれることを見込んで、これより安全側に丸めた経験則が広く使われます。

$$ \begin{equation} B_c \approx \frac{1}{5\sigma_\tau} \quad (\text{相関 } 0.5 \text{ 基準}), \qquad B_c \approx \frac{1}{50\sigma_\tau} \quad (\text{相関 } 0.9 \text{ 基準}) \end{equation} $$

$1/(5\sigma_\tau) = 0.2/\sigma_\tau$ ですから、厳密解の $0.276/\sigma_\tau$ より確かに保守的です。相関 $0.9$ を要求する場合、指数PDPの厳密解は $0.077/\sigma_\tau \approx 1/(13\sigma_\tau)$ で、経験則の $1/(50\sigma_\tau)$ はかなり安全側に振ってあることがわかります。設計では「$0.5$ 基準は等化やOFDMの必要性を判断する目安、$0.9$ 基準は等化なしで済ませたい場合の厳しめの目安」と使い分けます。

周波数相関関数と2つのコヒーレンス帯域の定義。相関0.5基準の厳密解0.276/σと0.9基準の0.077/σ、および経験則1/(5σ)・1/(50σ)の位置関係

横軸は「周波数差 × RMS遅延スプレッド」という無次元量なので、この1本の曲線がすべての環境に共通で使えます。相関が0.5まで落ちる点(赤丸)が $0.276/\sigma_\tau$、0.9まで落ちる点(緑丸)が $0.077/\sigma_\tau$ で、経験則の破線($1/(5\sigma_\tau) = 0.2/\sigma_\tau$ と $1/(50\sigma_\tau) = 0.02/\sigma_\tau$)はどちらも厳密解より左、すなわちより狭い帯域しか「同じ」と認めない安全側に置かれていることが読み取れます。特に0.9基準の経験則は厳密解の約4分の1と、かなり保守的です。

周波数選択性かフラットか

これで第一の判定基準が立ちます。信号帯域を $B$(あるいはシンボル長 $T_s$)とすると、

  • $B \ll B_c$(等価的に $\sigma_\tau \ll T_s$): フラットフェージング。帯域内でチャネルはほぼ一定の複素数。波形歪みは起きないが、その複素数の絶対値が時々深く落ち込む
  • $B \gtrsim B_c$(等価的に $\sigma_\tau \gtrsim T_s$): 周波数選択性フェージング。帯域内に谷(ノッチ)ができ、時間領域ではシンボル間干渉になる

具体的な数字で確認しましょう。市街地で $\sigma_\tau = 1$ µs なら $B_c \approx 200$ kHz です。音声中心の旧来の狭帯域システム(帯域 25 kHz 程度)ならフラット、しかし帯域 5 MHz のシステムなら完全に周波数選択性です。屋内で $\sigma_\tau = 50$ ns なら $B_c \approx 4$ MHz。無線LANの 20 MHz 帯域は、屋内でも周波数選択性になります。つまり広帯域化すれば必ず周波数選択性の問題に突き当たるのであり、これがOFDMや等化器が必須になる理由です。

同一チャネルに対して狭帯域信号と広帯域信号を重ねた比較。0.5 MHz帯域では利得変動3.7 dBでフラット、20 MHz帯域では19.4 dBで周波数選択性になる

この2枚はまったく同じチャネルを描いたもので、違うのは信号が占有する帯域(色付きの帯)だけです。左の 0.5 MHz では帯域内の利得変動が 3.7 dB しかなく、チャネルはほぼ一定の複素数とみなせます。右の 20 MHz では同じチャネルが 19.4 dB も上下し、しかも深いノッチを2つ含んでいます。「フラットか選択性か」はチャネル固有の性質ではなく、チャネルと信号帯域の関係で決まるということが、この対比からはっきりします。

遅延方向のものさしができました。しかし、チャネルは静止しているわけではありません。次は「どれくらいの速さで変わるのか」を測るものさしを作りましょう。

第二のものさし — ドップラースプレッドとコヒーレンス時間

移動が周波数をずらす

受信機が速度 $v$ で動いているとき、到来方向と進行方向のなす角を $\alpha$ とすると、その波はドップラーシフトを受けます。

$$ f_d = \frac{v}{\lambda}\cos\alpha = f_D \cos\alpha, \qquad f_D \equiv \frac{v}{\lambda} = \frac{v f_c}{c} $$

$f_D$ を最大ドップラー周波数と呼びます。ここで重要なのは、マルチパス環境では到来方向が1つではないという点です。前から来る波は $+f_D$、後ろから来る波は $-f_D$、横から来る波は $0$ だけシフトします。すると受信信号のスペクトルは、元の単一周波数から $\pm f_D$ に広がった帯域を持つことになります。この広がりをドップラースプレッドと呼びます。

直感的には、「動くとチャネルが変わる」の正体がこれです。時間領域で見れば、各パスの位相が違う速さで回るため、合成された受信振幅が時間とともにランダムに変動します。

Clarke/Jakesスペクトルの導出

到来方向 $\alpha$ が $[0, 2\pi)$ 上で一様分布している、というのが古典的なClarkeモデルの仮定です(周囲を等方的に散乱体が取り囲む市街地を想定しています)。このとき、チャネル係数 $h(t)$ の時間自己相関を計算してみましょう。

$h(t)$ は各方向から来る成分の和なので、方向ごとの位相回転 $e^{j2\pi f_D t\cos\alpha}$ を $\alpha$ について平均すれば自己相関が出ます。

$$ R_h(\Delta t) = E[h(t)h^*(t+\Delta t)] = \frac{1}{2\pi}\int_0^{2\pi} e^{j2\pi f_D \Delta t \cos\alpha}\, d\alpha $$

ここで、0次ベッセル関数の積分表示

$$ J_0(z) = \frac{1}{2\pi}\int_0^{2\pi} e^{jz\cos\alpha}\, d\alpha $$

を使うと、右辺はそのままベッセル関数になります。

$$ \begin{equation} R_h(\Delta t) = J_0(2\pi f_D \Delta t) \end{equation} $$

これがフェージングの時間相関の核心です。$J_0$ は $\Delta t = 0$ で 1、そこから振動しながら減衰していく関数で、最初のゼロ点は $2\pi f_D \Delta t = 2.405$、すなわち $f_D\Delta t = 0.383$ に現れます。

この自己相関をフーリエ変換すると、ドップラースペクトルが得られます。$J_0(2\pi f_D \Delta t)$ のフーリエ変換は、$|f| < f_D$ の範囲で次のU字型(バスタブ型)になります。

$$ S(f) = \frac{1}{\pi\sqrt{f_D^2 – f^2}} \quad (|f| < f_D) $$

これがJakesスペクトル(Clarkeスペクトル)です。両端 $f = \pm f_D$ で発散するのは、前方と後方から来る波が $\cos\alpha \approx \pm 1$ の近傍で「角度が変わってもドップラーがあまり変わらない」ため、そこに密度が集中するからです。

左はベッセル関数J0による時間相関と実測相関の一致、右はU字型のJakesスペクトル。相関0.5からコヒーレンス時間0.242/fDが決まる

左の図では、理論の $J_0(2\pi f_D \Delta t)$(青実線)と、後の節で使う正弦波和法で生成した波形の実測自己相関(赤破線)が完全に重なっています。同じ内容を時間領域と周波数領域から見たのが左右の図で、片方が広がればもう片方は縮む、という不確定性関係が働いています。右のU字型スペクトルの幅 $2f_D$ が「チャネルがどれだけ速く変わるか」の直接の尺度であり、その逆数のスケールが左の図のコヒーレンス時間になります。

コヒーレンス時間

コヒーレンス帯域と同じ発想で、「チャネルがほぼ同じとみなせる時間幅」をコヒーレンス時間 $T_c$ と定義します。相関 $0.5$ を閾値にするなら、$J_0(2\pi f_D T_c) = 0.5$ を解けばよく、数値的に $2\pi f_D T_c = 1.5212$、すなわち

$$ T_c = \frac{0.242}{f_D} $$

が厳密な答えです。文献では、$J_0$ を原点付近で放物線近似した $T_c \approx 9/(16\pi f_D) \approx 0.18/f_D$ という値や、それと $1/f_D$ の幾何平均を取った

$$ \begin{equation} T_c \approx \sqrt{\frac{9}{16\pi f_D^2}} = \frac{0.423}{f_D} \end{equation} $$

という経験則もよく使われます。どれも同じオーダーで、要は「$T_c$ は $1/f_D$ の数分の1」という感覚を持てば十分です。以降では実務で最も見かける $T_c \approx 0.423/f_D$ を使います。

数字を入れてみましょう。搬送波 2 GHz($\lambda = 15$ cm)で、

移動速度 $f_D$ $T_c$
徒歩 3 km/h 5.6 Hz 76 ms
自転車 30 km/h 55.6 Hz 7.6 ms
自動車 100 km/h 185 Hz 2.3 ms
新幹線 300 km/h 556 Hz 0.76 ms
航空機 900 km/h 1667 Hz 0.25 ms

歩行者では 76 ms、これはLTEのサブフレーム(1 ms)の76倍ですから「ほぼ止まっている」チャネルです。逆に航空機では 0.25 ms、サブフレーム内でもチャネルが変わってしまいます。これが高速移動体で参照信号(パイロット)を密に入れなければならない理由です。

移動速度とコヒーレンス時間の関係(搬送波2 GHz)。徒歩76 msから航空機0.25 msまで両対数で直線的に減少し、LTEサブフレーム1 msの線を新幹線付近で下回る

両対数で描くと $T_c \propto 1/v$ がきれいな直線になり、速度が10倍になればチャネルの寿命が10分の1になることが一目でわかります。緑の水平線がLTEのサブフレーム長 1 ms で、この線を下回る速度域(およそ 230 km/h 以上)ではサブフレーム内でチャネルが変わってしまうことを意味します。新幹線と航空機がその領域に入っており、高速鉄道向けの通信システムがパイロット密度や追従アルゴリズムに特別な配慮をする理由がここにあります。

スローフェージングかファストフェージングか

シンボル長 $T_s$ と $T_c$ を比べると、第二の判定基準が立ちます。

  • $T_s \ll T_c$: スローフェージング。1シンボルの間はチャネルが一定とみなせる。ただし「遅い」ことは良いことばかりではありません。深い落ち込みに入ると長時間そこに留まるため、誤りが長いバーストになります
  • $T_s \gtrsim T_c$: ファストフェージング。1シンボル内でチャネルが変わり、位相追従が困難になります。時間方向の広がりはスペクトル広がりとして現れ、既約誤り率(いくらSNRを上げても消えない誤り床)を生みます

現実の移動通信はほぼ常にスローフェージング領域にあります。だから対策の主眼は「ファスト化を防ぐ」ことではなく、「長く続く落ち込みをどうやり過ごすか」になります。

2つのものさしが揃いました。次はこれらを組み合わせて、対策を選ぶ地図を作りましょう。

4象限の設計マップ

2つの判定基準は独立に働くので、チャネルは4つの象限に分類できます。それぞれで有効な対策が違います。

$T_s \ll T_c$(スロー) $T_s \gtrsim T_c$(ファスト)
$B \ll B_c$(フラット) ① フラット+スロー ③ フラット+ファスト
$B \gtrsim B_c$(周波数選択性) ② 選択性+スロー ④ 選択性+ファスト

4象限の設計マップ。フラット/選択性とスロー/ファストの組み合わせごとに有効な対策と代表的なシステムをまとめた図

この地図が「2つのものさしで測れば処方箋が決まる」という本記事の主張の中身です。縦軸が周波数方向の診断、横軸が時間方向の診断で、4つの箱それぞれに違う武器が並んでいることを確認してください。上部の帯に書いた $\sigma_\tau \ll T_s \ll T_c$ が、設計者が狙うべき「窓」です。以下、各象限を順に見ていきます。

象限①(フラット+スロー)は、狭帯域システムを歩行速度で使う場合です。波形歪みはなく、チャネルは1つの複素数 $h$ に縮退します。敵は「$|h|$ が時々深く落ちる」ことだけ。処方箋はダイバーシチ(空間・偏波が第一選択)と、深いインターリーブ+誤り訂正符号です。等化器やOFDMは不要です。

象限②(選択性+スロー)は、広帯域システムを歩行〜自動車速度で使う場合で、現代のほとんどのシステムがここに入ります。敵が2種類(ISI+落ち込み)いるので、処方箋も2階建てになります。まずOFDM+CPまたは等化器でISIを潰し、その上で符号化+周波数インターリーブおよび空間ダイバーシチで落ち込みに対処します。LTE、5G NR、Wi-Fiはすべてこの構成です。

象限③(フラット+ファスト)は、シンボルレートが極端に低いか、移動が極端に速い場合です。低ビットレートの衛星リンクや、非常に高いキャリア周波数での高速移動が該当します。処方箋はまずシンボルレートを上げる(それだけで象限①か②に移動できる)、次に差動変調や高速なチャネル追従です。

象限④(選択性+ファスト)は最悪の組み合わせで、$\sigma_\tau$ と $f_D$ の積が大きい「オーバースプレッドチャネル」に近づくと、原理的に信頼できる推定ができなくなります。実用システムはここに入らないよう、シンボル長を $\sigma_\tau \ll T_s \ll T_c$ の窓に収める設計をします。この窓が存在する条件は $\sigma_\tau f_D \ll 1$、すなわちアンダースプレッド条件です。市街地で $\sigma_\tau = 1$ µs、自動車速度で $f_D = 185$ Hz なら積は $1.9\times10^{-4}$ で、余裕をもって成立しています。

このマップで「どの対策が必要か」の見当はつきました。しかし、なぜダイバーシチがそこまで劇的に効くのでしょうか。それを理解するには、フェージングがBERにどう効くかを式で見る必要があります。

フェージングはなぜこれほど厳しいのか

AWGNでのBER

まずフェージングのない場合を確認します。BPSK(2値位相変調)を白色雑音下でコヒーレント検波すると、瞬時SNRを $\gamma$ として、ビット誤り率は

$$ P_b(\gamma) = Q(\sqrt{2\gamma}) = \frac{1}{2}\mathrm{erfc}(\sqrt{\gamma}) $$

です。$Q$ 関数は $\gamma$ が大きいところで $Q(x) \approx e^{-x^2/2}/(x\sqrt{2\pi})$ と指数関数的に落ちます。SNRを 1 dB 上げるだけでBERが桁で改善する、非常にありがたい特性です。

レイリーフェージングで平均を取る

ところがフェージングがあると、$\gamma$ 自体がランダム変数になります。多数の散乱波の重ね合わせで受信振幅 $|h|$ がレイリー分布に従うとき、電力 $|h|^2$ は指数分布に従います。したがって瞬時SNR $\gamma = |h|^2 \bar\gamma$($\bar\gamma$ は平均SNR)の確率密度は

$$ p(\gamma) = \frac{1}{\bar\gamma} e^{-\gamma/\bar\gamma}, \quad \gamma \geq 0 $$

平均BERは、瞬時BERをこの密度で平均したものです。

$$ \bar P_b = \int_0^\infty Q(\sqrt{2\gamma})\, \frac{1}{\bar\gamma}e^{-\gamma/\bar\gamma}\, d\gamma $$

この積分は部分積分で閉じた形に落ちます。よく知られた結果は次の通りです。

$$ \begin{equation} \bar P_b = \frac{1}{2}\left(1 – \sqrt{\frac{\bar\gamma}{1+\bar\gamma}}\right) \end{equation} $$

高SNRでの振る舞いを見るために、$\mu \equiv \sqrt{\bar\gamma/(1+\bar\gamma)}$ を展開します。まず $\bar\gamma/(1+\bar\gamma) = 1/(1+1/\bar\gamma)$ と書き直し、$1/\bar\gamma$ が小さいとして平方根をテイラー展開すると、

$$ \mu = \left(1 + \frac{1}{\bar\gamma}\right)^{-1/2} \approx 1 – \frac{1}{2\bar\gamma} + \frac{3}{8\bar\gamma^2} – \cdots $$

これを $\bar P_b = (1-\mu)/2$ に代入すると、最低次の項だけが残ります。

$$ \begin{equation} \bar P_b \approx \frac{1}{4\bar\gamma} \end{equation} $$

BERが平均SNRに反比例するという、AWGNとは質的に違う結論です。実際、$\bar\gamma = 20$ dB での厳密値は $2.481\times10^{-3}$、近似値は $2.500\times10^{-3}$ で、すでによく一致しています。

AWGNとレイリーフェージングのBER曲線比較。BER 10^-3 を達成するのにAWGNは6.8 dB、レイリーは24.0 dBを要し、17.2 dBの差がある

片対数でこの2本を並べると、質的な違いが形に出ます。緑のAWGN曲線は右へ行くほど加速度的に急降下するのに対し、赤のレイリー曲線はほとんど直線的、つまり冪則で緩やかに落ちるだけです。点線の $1/(4\bar\gamma)$ 近似が 10 dB 以上の領域で赤線とほぼ重なっている点にも注目してください。両者の水平距離、すなわち BER $10^{-3}$ を出すために追加で必要な電力が 17.2 dB(約52倍) で、これがフェージングに対して電力で殴りかかることの絶望的な効率の悪さを表しています。

なぜ「反比例」になるのか — 深いフェージングの確率

この $1/\bar\gamma$ という結果には、きれいな解釈があります。指数分布の密度は原点近傍で $p(\gamma) \approx 1/\bar\gamma$ とほぼ一定です。したがって、$\gamma$ がある小さな閾値 $\gamma_{\rm th}$ を下回る確率は

$$ \Pr[\gamma < \gamma_{\rm th}] = 1 - e^{-\gamma_{\rm th}/\bar\gamma} \approx \frac{\gamma_{\rm th}}{\bar\gamma} $$

となり、$\bar\gamma$ に反比例します。つまり、平均BERを支配しているのは「深いフェージングに落ち込む確率」そのものなのです。落ち込んだときはほぼ確実に誤り、落ち込まないときはほぼ確実に正しい。平均BERは前者の確率に等しくなります。

この見方は極めて重要です。BERを下げたければ、SNRを上げる(分母を大きくする)よりも、「同時に落ち込む確率」を下げる方が圧倒的に効率的だ、ということが読み取れるからです。それを実現するのがダイバーシチです。

ダイバーシチ次数 $L$ — BERを $\bar\gamma^{-L}$ にする

最大比合成(MRC)の出力SNR

互いに独立にフェージングする $L$ 本の枝(ブランチ)で同じシンボルを受信したとします。枝 $i$ の受信信号は $y_i = h_i x + n_i$ です。これらをどう合成すれば最良でしょうか。

答えはチャネル係数の複素共役で重みづけして足す最大比合成(MRC: Maximal Ratio Combining)です。

$$ z = \sum_{i=1}^{L} h_i^* y_i = \left(\sum_i |h_i|^2\right) x + \sum_i h_i^* n_i $$

信号項の振幅は $\sum_i |h_i|^2$、雑音項の分散は $\sum_i |h_i|^2 \sigma_n^2$ なので、出力SNRは

$$ \gamma_{\rm MRC} = \frac{\left(\sum_i |h_i|^2\right)^2 \sigma_x^2}{\left(\sum_i |h_i|^2\right)\sigma_n^2} = \sum_{i=1}^{L}\gamma_i $$

各枝のSNRの単純な和になります。弱い枝も足し込むだけで損はしない(重みが小さくなるので雑音も持ち込まない)という、美しい性質です。

なぜ傾きが $L$ 倍になるのか

$\gamma_i$ が独立に指数分布(平均 $\bar\gamma$)に従うとき、その和 $\gamma_{\rm MRC}$ は自由度 $2L$ のカイ二乗分布(=アーラン分布)に従います。

$$ p(\gamma) = \frac{\gamma^{L-1} e^{-\gamma/\bar\gamma}}{\bar\gamma^L (L-1)!} $$

ここがダイバーシチの本質です。$L = 1$ では原点で密度が $1/\bar\gamma$ と有限でしたが、$L \geq 2$ では $\gamma^{L-1}$ の因子があるため、原点近傍の密度が $\gamma^{L-1}$ で潰れます。深い落ち込みの確率を計算すると、

$$ \Pr[\gamma < \gamma_{\rm th}] \approx \int_0^{\gamma_{\rm th}}\frac{\gamma^{L-1}}{\bar\gamma^L (L-1)!}d\gamma = \frac{1}{L!}\left(\frac{\gamma_{\rm th}}{\bar\gamma}\right)^L $$

$\bar\gamma$ の $L$ 乗に反比例します。$L$ 本すべてが同時に落ち込まないと通信断にならないので当然です。

左はL=1から4のアーラン分布で原点近傍の密度が潰れていく様子、右は通信断確率が両対数で傾きLの直線になる様子

左の図で見るべきは、曲線の「山」ではなく原点のすぐ右側(赤く塗った領域)です。$L=1$ の指数分布だけが原点で有限の高さ $1/\bar\gamma$ を持ち、$L\geq2$ では $\gamma^{L-1}$ の因子によって原点に張り付くように潰れています。この潰れ方の違いがそのまま右の図の傾きになり、$\gamma_{\rm th}/\bar\gamma = 10^{-2}$ での通信断確率は、$L=1$ の $1.0\times10^{-2}$ から $L=4$ では $4.1\times10^{-10}$ へと7桁以上下がります。ダイバーシチが効くのは「平均が良くなるから」ではなく、最悪ケースの確率だけを選択的に叩き潰すからだ、というのがこの2枚の図の主張です。BERも同じ次数で落ち、高SNRでの厳密な漸近形は

$$ \begin{equation} \bar P_b \approx \binom{2L-1}{L}\frac{1}{(4\bar\gamma)^L} \end{equation} $$

となります。この $L$ をダイバーシチ次数と呼び、BER曲線を両対数でプロットしたときの傾きに一致します。数値で確認すると、$\bar\gamma = 20$ dB において $L=1$ で $2.48\times10^{-3}$、$L=2$ で $1.84\times10^{-5}$、$L=3$ で $1.52\times10^{-7}$、$L=4$ で $1.32\times10^{-9}$。枝を1本増やすたびにBERが2桁以上改善します。

何dB得をするのか

BER $= 10^{-3}$ を達成するのに必要な平均SNRで比べると、効果が体感できます。

構成 必要 $\bar\gamma$ AWGN比
AWGN(フェージングなし) 6.8 dB —
レイリー $L=1$ 24.0 dB +17.2 dB
レイリー $L=2$(MRC) 11.1 dB +4.3 dB
レイリー $L=3$(MRC) 6.6 dB −0.2 dB
レイリー $L=4$(MRC) 4.0 dB −2.8 dB

$L=1$ で払っていた 17.2 dB のペナルティが、たった2枝で 4.3 dB まで縮みます。12.9 dB、電力にして約20倍の節約です。$L=3$ 以降でAWGNを下回るのは、受信ダイバーシチでは枝を増やすと受信エネルギーの総和も増える(アレイゲイン)ためです。純粋なダイバーシチゲイン(傾きの改善)とアレイゲイン(曲線の左シフト)は別物であり、送信ダイバーシチではアレイゲインが得られない点に注意してください。

ダイバーシチ次数L=1から4のBER曲線。両対数の傾きがそのままLに一致し、BER 10^-3 に必要なSNRが24.0/11.1/6.6/4.0 dBと下がっていく

4本の曲線が扇のように開いていく様子が、$\bar P_b \propto \bar\gamma^{-L}$ という関係の視覚化そのものです。BER $10^{-3}$ の水平線上に打った点(各色の丸)が、表に挙げた 24.0 / 11.1 / 6.6 / 4.0 dB に対応します。$L=1$ から $L=2$ への改善幅(12.9 dB)が $L=2$ から $L=3$ への改善幅(4.5 dB)よりずっと大きい、つまり枝の追加は最初の1本が圧倒的に効き、後になるほど効きが鈍るという収穫逓減も同時に読み取れます。実用システムが2〜4枝で止まるのはこのためです。

これで「ダイバーシチ次数を上げる」ことがすべての対策の共通目標だと分かりました。では、独立な枝はどこから調達すればよいのでしょうか。

ダイバーシチをどこから取るか

空間ダイバーシチ

最も直接的なのは、アンテナを物理的に離すことです。問題は「どれだけ離せば独立になるか」。Clarkeモデルの空間相関は、時間相関 $J_0(2\pi f_D \Delta t)$ の $f_D\Delta t = \Delta d/\lambda$ という対応から、

$$ \rho(\Delta d) = \left|J_0\!\left(\frac{2\pi \Delta d}{\lambda}\right)\right|^2 $$

となります(電力相関)。数値を入れると、$\Delta d = 0.18\lambda$ で $\rho = 0.5$、$\Delta d = 0.383\lambda$($J_0$ の最初のゼロ点)で $\rho \approx 0$、$\Delta d = 0.5\lambda$ で $\rho = 0.093$ です。したがって半波長間隔が実用上の目安になります。2 GHz なら $\lambda/2 = 7.5$ cm、スマートフォンの筐体に2本入る寸法です。

アンテナ間隔と2枝の電力相関の関係。0.18λで相関0.5、0.383λでゼロ、半波長0.5λで0.093となり、半波長間隔が実用の目安になる

相関は $0.4\lambda$ 付近で一度ゼロになり、その後は振動しながらゆっくり減衰します。重要なのは、独立性を得るのに必要な距離が波長のスケールしかないという点で、$\Delta d = 0.5\lambda$ で相関 0.093 まで落ちるので実用上は十分です。振動があるため「離せば離すほど良い」わけではなく、$0.6\lambda$ 付近では相関がわずかに戻る(0.16程度)ことも図から読み取れます。設計では谷を狙うのではなく、半波長以上という余裕のある条件で押さえるのが定石です。

ただしこれは「散乱体に取り囲まれた移動局」の話です。基地局は高い位置にあり、到来角の広がりが小さいため、同じ相関を得るには $10\lambda$〜$20\lambda$ という大きな間隔が必要になります。基地局のアンテナが数メートル離して設置されているのはこのためです。

偏波ダイバーシチ

空間を確保できない場合の切り札が偏波です。垂直偏波と水平偏波(あるいは $\pm45°$ の斜め偏波)は、同じ場所に置いても散乱によるデポラライゼーションのおかげで相関が低くなります。アンテナ設置スペースを増やさずに2枝取れるのが最大の利点で、基地局アンテナで $\pm45°$ の交差偏波が標準になっているのはそのためです。欠点は、伝搬環境によって2偏波の平均受信電力に差(XPD: 交差偏波識別度)が出ることで、電力が偏るとダイバーシチゲインが目減りします。

周波数ダイバーシチ

同じ情報を $B_c$ 以上離れた2つの周波数で送れば、2つのチャネルは無相関になります。単純に2倍の帯域を使う「周波数ホッピング」や、広帯域信号に符号化を施す形で実現されます。$B_c$ が判定基準になるのは、まさにコヒーレンス帯域の定義そのものだからです。市街地($B_c = 200$ kHz)なら 200 kHz 以上、屋内($B_c = 4$ MHz)なら 4 MHz 以上離す必要があります。

時間ダイバーシチ

同じ情報を $T_c$ 以上離れた時刻に送れば独立になります。単純な繰り返し送信はスループットを半減させるので実用的ではありませんが、符号化と組み合わせれば冗長度をほとんど増やさずに時間ダイバーシチが取れます。これが次節の主題です。注意すべきは、静止した端末では $f_D \approx 0$ すなわち $T_c \to \infty$ となり、時間ダイバーシチが原理的に取れないことです。止まっている端末が谷に入ると、いつまでも谷から出てきません。

角度(パターン)ダイバーシチ

指向性の違うアンテナを複数用意し、それぞれが違う方向の散乱波を主に受けるようにする方法です。空間的に離せないが指向性は変えられる、という場面で使われます。ビームフォーミングと組み合わせると、干渉抑圧も同時に実現できます。

合成法の選択

複数の枝をどう合成するかにも選択肢があります。最良の枝だけを選ぶ選択合成(SC)、位相だけ揃えて等重みで足す等利得合成(EGC)、そして最適な最大比合成(MRC)です。ダイバーシチ次数はどれも $L$ で同じですが、アレイゲインが違います。MRCが最良ですが全枝のチャネル推定が必要で、SCは1枝分の受信機で済みます。実装コストとの兼ね合いで選びます。

物理的な枝が取れない場合はどうするか。実は、符号とインターリーブを使えばダイバーシチを「作る」ことができます。次に見ていきましょう。

符号化+インターリーブ — ダイバーシチを人工的に作る

符号だけではフェージングに勝てない

誤り訂正符号は、$d$ ビットの誤りまで訂正できるように冗長ビットを付ける技術です。AWGNでは誤りがランダムに散らばるので、符号は素直に効きます。ところがフェージングでは事情が違います。

$T_c$ が数ミリ秒、シンボル長が数マイクロ秒なら、1回の落ち込みの間に数百〜数千シンボルが連続して壊れます。訂正能力が数ビットの符号は、この物量の前に無力です。実際、後のシミュレーションで示すように、レート $1/2$ の畳み込み符号をインターリーブなしでフェージングチャネルに適用すると、BER曲線の傾きは符号化なしとほとんど変わりません($\bar\gamma^{-1}$ のまま)。それどころか中〜低SNR領域では、レート $1/2$ による実効エネルギー半減の分だけ符号化しないほうが良いという逆転すら起きます。

インターリーブが解決する

解決策は単純で、強力です。符号語のビットを送信前にバラバラに並べ替え、受信後に元に戻す。並べ替えの幅(インターリーブ深さ)を $T_c$ より大きく取れば、チャネル上で連続していた誤りは、デインターリーブ後にはバラバラに散らばります。符号から見れば、あたかもランダム誤りチャネルであるかのように見えるわけです。

ブロックインターリーバの場合、行数 $R$、列数 $C$ の行列に行方向に書き込み、列方向に読み出すと、元の隣接ビットは送信時に $R$ シンボル離れます。したがって設計条件は

$$ \begin{equation} R \cdot T_s > T_c \approx \frac{0.423}{f_D} \end{equation} $$

です。$T_s = 1$ µs、$f_D = 185$ Hz(自動車速度)なら $T_c = 2.3$ ms なので $R > 2300$ 行が必要になります。かなり大きな数字ですが、これがフェージング対策の代償です。

ブロックインターリーバの動作。符号語を行方向に書き込み列方向に読み出すことで、チャネル上で連続して壊れる区間が符号語では別々の行に散らばる

図の赤い列が「チャネルの谷にあたった送信区間」です。列方向に読み出して送るので、チャネル上で連続して壊れるのは1つの列になります。ところがその列に属するビットは、符号語の中では第1行から第5行までバラバラに散っています。デインターリーブして復号器に渡した時点で、5個の誤りが $C$ ビットずつ離れた位置に分散するわけです。並べ替えという「情報を1ビットも増やさない操作」だけで誤りの統計的な性質を作り変えられる、という点がこの技術の巧妙さです。

自由距離がダイバーシチ次数になる

インターリーブが理想的(=各符号ビットが独立にフェージングする)なら、符号のダイバーシチ次数は符号の最小ハミング距離(畳み込み符号なら自由距離 $d_{\rm free}$)に等しくなります。

理由は簡単です。ある符号語を別の符号語と誤認するには、$d_{\rm free}$ 個の位置すべてで誤りが起きる必要があります。各位置は独立にフェージングするので、その確率は $\bar\gamma^{-d_{\rm free}}$ に比例します。つまり、

$$ \bar P_b \propto \bar\gamma^{-d_{\rm free}} $$

符号の距離特性が、そのままダイバーシチ次数になるという美しい対応です。拘束長 3、生成多項式 $(7, 5)_8$ のレート $1/2$ 畳み込み符号は $d_{\rm free} = 5$ ですから、理想インターリーブ下では傾き $-5$ のBER曲線が得られます。アンテナを5本並べるのと同等の効果を、帯域を2倍にするだけで達成できる計算です。これが「符号化ダイバーシチ」の破壊力です。

コストは遅延とメモリ

もちろんタダではありません。インターリーブ深さ $R$ 行分のデータを溜めてから送るので、片道 $R \cdot T_s$ の遅延が発生します(受信側でも同じだけ)。上の例では 2.3 ms × 2 = 4.6 ms。音声通話(許容遅延 100 ms程度)や放送(数百 ms 許容)では問題になりませんが、超低遅延を要求するアプリケーションではインターリーブ深さを削らざるを得ず、その分ダイバーシチゲインを失います。遅延とダイバーシチのトレードオフは、フェージング対策の根本的な制約です。

ここまでは「落ち込み」への対策でした。次は、もう一方の敵であるシンボル間干渉に向き合います。

等化 — 周波数選択性に正面から立ち向かう

ISIの発生

$\sigma_\tau$ がシンボル長 $T_s$ と同程度以上になると、あるシンボルの遅延成分が次のシンボルの判定タイミングに漏れ込みます。受信信号は送信シンボル列とチャネルインパルス応答の畳み込みになります。

$$ y_n = \sum_{l=0}^{L_h-1} h_l x_{n-l} + n_n $$

$l = 0$ の項が欲しい信号、$l \geq 1$ の項がすべて干渉です。周波数領域で見れば、チャネル伝達関数 $H(f)$ に深いノッチができ、その周波数成分の情報が失われている状態に対応します。

4つの等化器

ゼロフォーシング(ZF)等化器は、$H(f)$ の逆特性 $1/H(f)$ をかけてISIを完全に消します。原理は明快ですが、ノッチのある周波数で $1/H(f)$ が巨大になり、雑音を猛烈に増幅してしまうという致命的な弱点があります。

MMSE等化器は、ISIの残留と雑音増幅の合計(平均二乗誤差)を最小化します。周波数領域では $H^*(f)/(|H(f)|^2 + \sigma_n^2/\sigma_x^2)$ という形になり、雑音項がノッチでの発散を抑えます。実用上のベースラインです。詳しくはMMSE等化器の理論を参照してください。

判定帰還等化器(DFE)は、すでに判定済みのシンボルを使って後方ISIを直接差し引きます。雑音増幅がないため線形等化器より強力ですが、一度判定を誤ると誤りが伝播するリスクがあります。

MLSE(最尤系列推定)は、ありうる送信系列すべての中から受信系列を最も良く説明するものをビタビアルゴリズムで探します。理論的に最良で、しかも多重路ダイバーシチ(遅延波のエネルギーを捨てずに活用することで生じるダイバーシチ、次数は最大で分解可能なパス数)が得られます。ただし計算量は変調多値数 $M$、チャネル長 $L_h$ に対して $M^{L_h-1}$ の状態数を持つトレリス探索になり、$\sigma_\tau/T_s$ が大きい広帯域システムでは爆発します。

まとめると、等化器は「遅延波を消す」だけでなく「遅延波のエネルギーを取り込んでダイバーシチにする」ポテンシャルを持ちますが、そのコストは広帯域化とともに急激に増大します。そこで発想を変えて、「ISIが起きないように波形を設計する」道を選んだのがOFDMです。

OFDM+サイクリックプレフィクス — 選択性をフラットの束に変える

分割統治のアイデア

ISIが起きるのは、シンボル長 $T_s$ が遅延広がり $\sigma_\tau$ に比べて短すぎるからです。ならば、シンボル長を長くすればよい。しかし、シンボル長を長くすると伝送レートが落ちます。

そこで、1本の高速なシンボル列を、$N$ 本の低速な並列シンボル列に分割し、それぞれ別の周波数(サブキャリア)に載せて同時に送るというのがOFDMの発想です。トータルのレートは保ったまま、各サブキャリアのシンボル長は $N$ 倍に伸びます。$N$ を十分大きく取れば、各サブキャリアの帯域 $B/N$ はコヒーレンス帯域より狭くなり、そのサブキャリアから見たチャネルは単なる複素定数になります。

たとえば IEEE 802.11a は 20 MHz の帯域を 64 サブキャリアに分け、サブキャリア間隔 312.5 kHz、シンボル長 3.2 µs としています。LTEはサブキャリア間隔 15 kHz、シンボル長 66.7 µs です。市街地の $B_c = 200$ kHz と比べると、LTEの 15 kHz は十分狭いことがわかります。

サイクリックプレフィクスが循環畳み込みを作る

ただし、これだけではまだ不十分です。OFDMシンボル同士の境界では、依然として前のシンボルの遅延成分が次のシンボルの先頭に漏れ込みます。この問題を鮮やかに解決するのがサイクリックプレフィクス(CP)です。

長さ $N$ の時間領域サンプル $x_0, x_1, \dots, x_{N-1}$(周波数領域シンボル $X_k$ のIDFT)に対し、末尾の $N_{cp}$ サンプルをコピーして先頭に付け足します。

$$ \tilde{x} = [\underbrace{x_{N-N_{cp}}, \dots, x_{N-1}}_{\text{CP}}, x_0, x_1, \dots, x_{N-1}] $$

これがなぜ効くのかを追いましょう。チャネルインパルス応答 $h_0, \dots, h_{L_h-1}$ との線形畳み込みの結果から、CP部分(先頭 $N_{cp}$ サンプル)を捨てて残りの $N$ サンプルを取り出します。$N_{cp} \geq L_h – 1$ ならば、まず前のOFDMシンボルの尾はCP部分にしか届かないので、捨てた時点でシンボル間干渉が完全に消えます。

さらに重要なのが、残った $N$ サンプルの中身です。$n$ 番目のサンプルは

$$ y_n = \sum_{l=0}^{L_h-1} h_l \tilde{x}_{n+N_{cp}-l} $$

ですが、$n – l < 0$ になるとき、$\tilde{x}$ のインデックスはCP領域を指します。CPは末尾のコピーなので $\tilde{x}_{N_{cp}+n-l} = x_{n-l+N}$、つまりインデックスが $N$ を法として巡回します。結果として、

$$ y_n = \sum_{l=0}^{L_h-1}h_l\, x_{(n-l) \bmod N} $$

これは循環畳み込みです。線形畳み込みを循環畳み込みに化けさせる、それがCPの正体です。

循環畳み込みは離散フーリエ変換で対角化されます。DFTを取ると、

$$ \begin{equation} Y_k = H_k X_k + N_k, \qquad H_k = \sum_{l=0}^{L_h-1}h_l e^{-j2\pi kl/N} \end{equation} $$

サブキャリアごとに単なる複素数の掛け算になりました。等化は $\hat{X}_k = Y_k / H_k$ という1タップの割り算で終わります。MLSEのトレリス探索が、$N$ 個の複素除算に置き換わったわけです。この計算量の削減こそ、OFDMが現代の無線通信を支配した理由です。

サイクリックプレフィクスの模式図。末尾のNcpサンプルを先頭にコピーして送り、受信側でCP部分を捨てると線形畳み込みが循環畳み込みに変わる

上段が送信波形で、オレンジのブロック($x_5, x_6, x_7$)が末尾からコピーしてきたCPです。下段が受信側で、点線の「捨てる」区間には前のシンボルの尾も自分のCPも混じっていますが、丸ごと廃棄するのでISIが残りません。そして残った $y_0 \dots y_7$ を計算すると、$n-l < 0$ になる項がCP領域(=末尾のコピー)を参照するため、インデックスが自動的に $N$ を法として巡回します。緑の枠に書いたとおり、この循環畳み込みはDFTで対角化され、等化が1タップ除算に落ちます。20% 前後のオーバヘッドと引き換えに得られるものとしては破格です。

CP長の設計とオーバヘッド

CPの長さは、チャネルの最大遅延を超えていることが絶対条件です。

$$ N_{cp} T_{\rm sample} > \tau_{\max} $$

実務では $\tau_{\max} \approx (3 \sim 5)\sigma_\tau$ を見積もります。802.11a の CP は 0.8 µs(16サンプル)で、$\sigma_\tau = 50$〜$150$ ns の屋内環境をカバーします。LTE の通常CPは 4.7 µs で、$\sigma_\tau = 1$ µs 級の市街地に対応します。

CPは情報を運ばないので、$N_{cp}/(N + N_{cp})$ の分だけスループットとエネルギーを損します。802.11a では $16/80 = 20\%$、LTEでは約 $7\%$ です。CPを長くすればロバストになるがレートが落ちる、というトレードオフがここにも現れます。

OFDM単体ではダイバーシチが取れない

ここで、非常に重要でありながら見落とされやすい事実を強調しておきます。OFDM+CPは周波数選択性を消しますが、ダイバーシチは一切与えません。

理由は明らかです。CPによって各サブキャリアは独立なフラットフェージングチャネルになりました。つまり、サブキャリア $k$ に載ったビットの運命は $H_k$ 一つで決まります。$|H_k|$ がレイリー分布に従う以上、そのビットのBERは $1/(4\bar\gamma)$、傾き $-1$ のままです。実際、後のシミュレーションで示すように、符号化なしのOFDM+CPのBER曲線は、フラットレイリーの理論曲線とぴたりと重なります。

周波数選択性チャネルは、$L_h$ 本の独立なパスという形で $L_h$ 次のダイバーシチを潜在的に持っています。MLSEはそれを引き出せます。しかしOFDMは、それをサブキャリアごとに分解してしまうため、そのままでは引き出せません。

引き出すには符号化が必要です。誤り訂正符号をかけ、符号語のビットを周波数方向にインターリーブして異なるサブキャリアにばらまくと、1つの符号語が複数の独立な $H_k$ にまたがることになり、$\min(d_{\rm free}, \text{独立サブキャリア数})$ 次のダイバーシチが得られます。これが COFDM(Coded OFDM) であり、実用OFDMシステムが例外なく符号化とインターリーブを併用している理由です。「OFDMは符号化とセットでなければ意味がない」と言われるゆえんです。

RAKE受信 — 遅延波を味方につけるもう一つの道

補足として、スペクトル拡散(CDMA)方式が使うRAKE受信機にも触れておきます。拡散符号のチップ長より長い遅延を持つ多重路は、相関器で分離できます。RAKE受信機は複数の相関器(フィンガー)を各遅延に割り当て、それぞれの出力をMRCで合成します。つまり、遅延波を干渉ではなくダイバーシチ枝として扱うわけです。名前の由来は熊手(rake)で、散らばったエネルギーを掻き集めるイメージです。3G(W-CDMA)はこの原理で周波数選択性を味方につけていました。

理論が一通り揃いました。ここからはPythonで実際に動かし、それぞれの対策がBER曲線をどう変えるかを確かめましょう。

設計フローのまとめ

実装に入る前に、ここまでの議論を1本の手順に圧縮しておきます。

  1. チャネルを測る — 電力遅延プロファイルから $\sigma_\tau$、想定移動速度と搬送波周波数から $f_D$ を求める
  2. 2つのものさしを計算する — $B_c \approx 1/(5\sigma_\tau)$、$T_c \approx 0.423/f_D$
  3. 象限を判定する — 信号帯域 $B$ と $B_c$、シンボル長 $T_s$ と $T_c$ を比較する
  4. 周波数選択性なら波形を選ぶ — 広帯域ならOFDM+CP($N_{cp}T_{\rm sample} > \tau_{\max}$)、狭帯域〜中帯域なら等化器(MMSE/DFE/MLSE)
  5. ダイバーシチ次数を積み上げる — 空間($\lambda/2$ 以上、基地局は $10\lambda$ 以上)、偏波($\pm45°$)、周波数($B_c$ 以上離す)、時間($T_c$ 以上離す)
  6. 符号化+インターリーブで仕上げる — インターリーブ深さ $> T_c/T_s$(時間方向)または $> B_c/\Delta f$ サブキャリア(周波数方向)、符号の $d_{\rm free}$ が実質的なダイバーシチ次数の上限になる
  7. 遅延予算と照合する — インターリーブ深さは遅延に直結する。許容遅延から逆算して深さを決め、その範囲で最大のダイバーシチを取る

この手順は紙の上ではきれいですが、本当に効くのかは動かしてみないと納得できません。次節では、各ステップに対応する量を実際に計算し、対策の有無でBER曲線がどう変わるかを実測します。

Pythonで確かめる

チャネルの2つのものさしを可視化する

まず、電力遅延プロファイルからRMS遅延スプレッドとコヒーレンス帯域を計算し、周波数相関関数と実際の伝達関数を描いてみます。

import numpy as np
import matplotlib, matplotlib.pyplot as plt

# 日本語フォント設定
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

# 指数型の電力遅延プロファイル(4タップ、サンプル間隔 Ts = 100 ns)
Ts = 100e-9
delays = np.arange(4) * Ts
pdp = np.exp(-np.arange(4) / 1.5)
pdp /= pdp.sum()

# 平均超過遅延と RMS 遅延スプレッド
tau_bar = np.sum(pdp * delays)
tau2_bar = np.sum(pdp * delays**2)
sigma_tau = np.sqrt(tau2_bar - tau_bar**2)
Bc = 1.0 / (5 * sigma_tau)
print(f"平均超過遅延 = {tau_bar*1e9:.1f} ns")
print(f"RMS遅延スプレッド = {sigma_tau*1e9:.1f} ns")
print(f"コヒーレンス帯域 Bc = 1/(5σ) = {Bc/1e6:.2f} MHz")

このPDPでは平均超過遅延 75.6 ns、RMS遅延スプレッド 94.0 ns、コヒーレンス帯域はおよそ 2.13 MHz になります。つまり、帯域 2 MHz 以下ならフラット、20 MHz の無線LANなら完全に周波数選択性だと即座に判定できます。遅延プロファイルという時間領域の測定量だけから、周波数領域の設計判断が下せるのがこのものさしの威力です。

続いて、同じチャネルの伝達関数を実際に描き、コヒーレンス帯域が「ノッチの間隔」に対応していることを見ます。

# 同じ PDP のレイリーチャネルを複数回発生させ、伝達関数を描く
rng = np.random.default_rng(3)
f = np.linspace(-10e6, 10e6, 2001)

plt.figure(figsize=(10, 4))
for trial in range(3):
    g = np.sqrt(pdp / 2) * (rng.standard_normal(4) + 1j * rng.standard_normal(4))
    H = np.array([np.sum(g * np.exp(-2j * np.pi * ff * delays)) for ff in f])
    plt.plot(f / 1e6, 20 * np.log10(np.abs(H)), label=f"試行 {trial+1}")
plt.axvspan(-Bc / 2e6, Bc / 2e6, color="orange", alpha=0.25,
            label=f"コヒーレンス帯域 ≈ {Bc/1e6:.1f} MHz")
plt.xlabel("周波数 [MHz]"); plt.ylabel("チャネル利得 |H(f)| [dB]")
plt.title("周波数選択性フェージングの伝達関数(RMS遅延スプレッド 94 ns)")
plt.legend(); plt.grid(alpha=0.3); plt.ylim(-35, 10)
plt.tight_layout(); plt.show()

同じPDPから発生させた3試行分のチャネル伝達関数。試行1では19.4 dBの変動と2つの深いノッチが現れ、試行2では3.5 dBしか変動しない

グラフから3つのことが読み取れます。第一に、20 MHz の窓の中で利得が大きく上下し、試行1(青)では $-9.1$ MHz と $+0.9$ MHz に $-12$ dB の深いノッチが立ちます。帯域全体の変動幅は試行1で 19.4 dB に達しました。第二に、試行ごとに様子がまったく違い、試行2(オレンジ)は同じPDPから発生させたのに変動が 3.5 dB しかなく、実質フラットです。ノッチの位置も深さも事前には知りようがありません。第三に、オレンジの帯(コヒーレンス帯域 2.1 MHz)の幅で見れば、どの試行でも利得はほぼ一定です。$B_c$ は「ノッチの間隔」ではなく「この幅なら同じとみなしてよい」という保証幅である、という点に注意してください。ノッチがどこに来ても大丈夫な設計が要る — これが周波数ダイバーシチと符号化を要求する理由です。

Jakesモデルで時変チャネルを作る

次に時間方向です。Zheng-Xiao型の正弦波和法でレイリーフェージングを生成し、その自己相関が理論の $J_0(2\pi f_D \Delta t)$ に一致するかを確認します。

import numpy as np
from scipy.special import j0

def jakes(n, fd_ts, M=16, rng=None):
    """Zheng-Xiao 正弦波和法によるレイリーフェージング生成"""
    t = np.arange(n) * fd_ts                     # fd_ts = 最大ドップラー × シンボル長
    theta = rng.uniform(-np.pi, np.pi)
    phi = rng.uniform(-np.pi, np.pi, M)
    beta = rng.uniform(-np.pi, np.pi, M)
    nn = np.arange(1, M + 1)
    alpha = (2 * np.pi * nn - np.pi + theta) / (4 * M)   # 到来角
    ph = 2 * np.pi * np.outer(t, np.cos(alpha)) + phi[None, :]
    amp = (np.cos(beta) + 1j * np.sin(beta))[None, :]
    return np.sqrt(2 / M) * (amp * np.cos(ph)).sum(1)

fd_ts = 0.004                       # 例: fD = 4 kHz, Ts = 1 us 相当
Tc = 0.423 / fd_ts                  # コヒーレンス時間(シンボル数換算)
rng = np.random.default_rng(1)
h = jakes(200000, fd_ts, rng=rng)
print(f"平均電力 = {np.mean(np.abs(h)**2):.4f}  (理論値 1.0)")
print(f"コヒーレンス時間 Tc = {Tc:.1f} シンボル")
for lag in [25, 50, 106]:
    r = np.mean(h[:-lag] * np.conj(h[lag:])).real / np.mean(np.abs(h)**2)
    print(f"  lag={lag:3d}: 実測相関={r:+.3f}  理論 J0={j0(2*np.pi*fd_ts*lag):+.3f}")

出力を見ると、平均電力は 0.998 で理論値 1.0 に一致し、自己相関も lag=25 で実測 $+0.904$ に対し理論 $+0.904$、lag=50 で $+0.644$ 対 $+0.643$、lag=106 で $-0.124$ 対 $-0.126$ と、小数点以下3桁レベルで合致しています。正弦波を16本足すだけで、ベッセル関数型の相関を持つ本物らしいフェージングが作れるわけです。コヒーレンス時間は 105.8 シンボルなので、この設定では約100シンボルにわたってチャネルがほぼ同じ値を取り続けます。

落ち込みとバースト誤りの関係を見る

生成したチャネルで実際にBPSKを送り、誤りがどこで起きるかを可視化します。

# 平均 Eb/N0 = 12 dB でのフラットレイリーチャネル
N = 16384 * 24
eb = 10 ** (12.0 / 10)
rng = np.random.default_rng(11)
h = jakes(N, fd_ts, rng=rng)
b = rng.integers(0, 2, N)
x = 1 - 2 * b                                  # BPSK
n0 = 1 / eb
nz = np.sqrt(n0/2) * (rng.standard_normal(N) + 1j*rng.standard_normal(N))
y = h * x + nz
dec = (np.real(np.conj(h) * y) < 0).astype(int)  # 完全CSI仮定のコヒーレント検波
err = dec != b
print(f"BER = {err.mean():.3e}")

# 落ち込みと誤りの対応を描く
seg = slice(0, 3000)
plt.figure(figsize=(11, 4))
plt.plot(20*np.log10(np.abs(h[seg])), lw=0.9, label="チャネル利得 |h| [dB]")
idx = np.where(err[seg])[0]
plt.plot(idx, 20*np.log10(np.abs(h[seg]))[idx], "rx", ms=4, label="ビット誤り")
plt.axhline(-10, color="gray", ls="--", label="平均より10 dB低い水準")
plt.xlabel("シンボル番号"); plt.ylabel("利得 [dB]")
plt.title("深いフェージングに誤りが集中する(Eb/N0 = 12 dB)")
plt.legend(loc="lower right"); plt.grid(alpha=0.3)
plt.tight_layout(); plt.show()

チャネル利得の時間変化と誤り発生位置。誤りを示す赤×が深い谷の区間だけに集中し、利得の高い区間ではほぼ発生しない

BERは $1.43\times10^{-2}$ でした。グラフを見ると、誤り(赤×)が一様に散らばっているのではなく、チャネル利得が谷に落ち込んだ区間に完全に集中していることが一目でわかります。利得が平均より 10 dB 以上低い区間では誤りが密集し、利得が高い区間ではほぼ皆無です。前に導いた「平均BERを支配するのは深いフェージングの確率」という結論が、そのまま目に見える形で現れています。

インターリーブがバーストを崩す

このバースト性を数値で捉え、インターリーブでどう変わるかを比べます。

# 256ビットの窓ごとの誤り数(=復号器が1回に見る誤りの量)
W = 256
ew = err.reshape(-1, W).sum(1)

# 128x128 ブロックインターリーバ(行書き込み・列読み出し)
rows, cols = 128, 128
perm = np.arange(N).reshape(-1, rows, cols).transpose(0, 2, 1).reshape(-1)
err_deint = np.empty(N, dtype=bool)
err_deint[perm] = err            # 送信順に並んだ誤りを復号器の順序へ戻す
edw = err_deint.reshape(-1, W).sum(1)

print(f"インターリーブなし: 平均={ew.mean():.2f} 分散={ew.var():.2f} "
      f"最大={ew.max()} P(誤り0個)={np.mean(ew==0):.3f} P(10個以上)={np.mean(ew>=10):.4f}")
print(f"インターリーブあり: 平均={edw.mean():.2f} 分散={edw.var():.2f} "
      f"最大={edw.max()} P(誤り0個)={np.mean(edw==0):.3f} P(10個以上)={np.mean(edw>=10):.4f}")

plt.figure(figsize=(10, 4))
bins = np.arange(0, 41)
plt.hist(ew, bins=bins, alpha=0.6, label="インターリーブなし(バースト)")
plt.hist(edw, bins=bins, alpha=0.6, label="インターリーブあり(散らばる)")
plt.xlabel("256ビット窓あたりの誤り数"); plt.ylabel("窓の個数")
plt.title("インターリーブは誤りの「かたまり」を崩す(Eb/N0 = 12 dB)")
plt.legend(); plt.grid(alpha=0.3)
plt.tight_layout(); plt.show()

256ビット窓あたりの誤り数のヒストグラム。インターリーブなしは0個の窓と10個以上の窓に二極化し、ありは平均3.66個の周りに集中する

ヒストグラムの形の違いが本質です。赤(インターリーブなし)は0個の窓が突出して多い一方で、右へ長く裾を引いています。青(インターリーブあり)は3〜5個あたりに山ができ、裾が短く切れています。つまり並べ替えは分布の裾を切って中央に集める操作であり、平均は動かさずに分散だけを下げているわけです。以下、数値でも確認しましょう。

数値がこの手法の効果を雄弁に語ります。平均誤り数はどちらも 3.66 個でまったく同じ(インターリーブは誤りの総数を減らしません)。しかし分散は 23.76 から 4.37 へと 5分の1以下に縮み、独立誤りの理論値 3.60 にほぼ達します。窓内の最大誤り数は 39 個から 13 個へ、「10個以上の誤りを含む窓」の割合は 10.6% から 1.0% へと1桁減りました。逆に「誤りがゼロの窓」は 34.4% から 3.4% に減ります。つまりインターリーブは、誤りのない窓を犠牲にして、壊滅的な窓をなくしているわけです。訂正能力に上限がある符号にとって、これがどれほどありがたいかは明らかでしょう。誤り間隔の中央値も 5 シンボルから 47 シンボルへと 9倍以上に伸びました。

4条件のBER曲線を比較する

いよいよ本題です。同じフラットレイリーチャネル上で、(1) 無対策、(2) 2枝MRC、(3) 畳み込み符号+インターリーブ、(4) 畳み込み符号のみ(インターリーブなし)の4条件を比較します。まず畳み込み符号器と軟判定ビタビ復号器を用意します。

import numpy as np

# 拘束長3・生成多項式 (7,5)8・レート1/2 の畳み込み符号(d_free = 5)
G, K = [0o7, 0o5], 3
NS = 1 << (K - 1)
nxt = np.zeros((NS, 2), dtype=int)
out = np.zeros((NS, 2, 2), dtype=int)
for s in range(NS):
    for bit in (0, 1):
        reg = (bit << (K - 1)) | s
        nxt[s, bit] = (reg >> 1) & (NS - 1)
        for gi, g in enumerate(G):
            out[s, bit, gi] = bin(reg & g).count("1") & 1
SYM = 1 - 2 * out.astype(float)     # 枝出力を BPSK シンボルに

def conv_encode(bits):
    """情報ビット列 -> 符号ビット列(レート1/2)"""
    s = 0
    o = np.empty(2 * len(bits), dtype=np.int8)
    for i, bit in enumerate(bits):
        o[2*i], o[2*i+1] = out[s, bit, 0], out[s, bit, 1]
        s = nxt[s, bit]
    return o

生成多項式 $(7,5)_8$ は拘束長3のレート $1/2$ 符号として最も有名なもので、自由距離 $d_{\rm free} = 5$ を持ちます。前節の理論によれば、理想インターリーブ下ではこの符号だけでダイバーシチ次数5が得られるはずです。以下のビタビ復号器で確かめましょう。

def viterbi_soft(m):
    """軟判定ビタビ復号。m[i] = (2,) の軟値(CSI重み付き相関値)"""
    n, INF = m.shape[0], 1e18
    pm = np.full(NS, INF); pm[0] = 0.0
    prev_st = np.zeros((n, NS), dtype=np.int8)
    prev_bit = np.zeros((n, NS), dtype=np.int8)
    for i in range(n):
        # 枝メトリック(相関を最大化=負の相関を最小化)
        br = -(SYM[:, :, 0]*m[i, 0] + SYM[:, :, 1]*m[i, 1]) + pm[:, None]
        new = np.full(NS, INF)
        for s in range(NS):
            for bit in (0, 1):
                ns, v = nxt[s, bit], br[s, bit]
                if v < new[ns]:
                    new[ns], prev_st[i, ns], prev_bit[i, ns] = v, s, bit
        pm = new
    s = int(np.argmin(pm))                     # トレースバック
    bits = np.zeros(n, dtype=np.int8)
    for i in range(n - 1, -1, -1):
        bits[i], s = prev_bit[i, s], prev_st[i, s]
    return bits

軟判定メトリックに $\mathrm{Re}[h^* y]$ を使っている点が重要です。これはチャネル状態情報(CSI)による重みづけそのもので、深く落ち込んだシンボルの軟値は自動的に小さくなり、復号器がそのビットをあまり信用しなくなります。硬判定(0/1に丸めてから復号)に比べて 2〜3 dB のゲインがあり、フェージング下ではさらに差が開きます。

# 4条件のBERを Eb/N0 掃引で測定
from scipy.special import comb

def ber_theory(gbar, L=1):
    """L枝MRCのレイリーBER(BPSK)理論値"""
    mu = np.sqrt(gbar / (1 + gbar))
    return ((1 - mu) / 2)**L * sum(comb(L-1+k, k) * ((1+mu)/2)**k for k in range(L))

rows, cols = 128, 128
Ninfo, Nunc = 200000, 400000
EbdB = np.arange(0, 31, 3.0)
res = {k: [] for k in ["無対策", "2枝MRC", "符号化のみ", "符号化+インターリーブ"]}
rng = np.random.default_rng(7)

for edb in EbdB:
    eb = 10 ** (edb / 10); n0 = 1 / eb
    # (1) 無対策
    h = jakes(Nunc, fd_ts, rng=rng); b = rng.integers(0, 2, Nunc); x = 1 - 2*b
    nz = np.sqrt(n0/2)*(rng.standard_normal(Nunc)+1j*rng.standard_normal(Nunc))
    res["無対策"].append(np.mean(((np.real(np.conj(h)*(h*x+nz))) < 0).astype(int) != b))
    # (2) 2枝空間ダイバーシチ(MRC)
    h1, h2 = jakes(Nunc, fd_ts, rng=rng), jakes(Nunc, fd_ts, rng=rng)
    n1 = np.sqrt(n0/2)*(rng.standard_normal(Nunc)+1j*rng.standard_normal(Nunc))
    n2 = np.sqrt(n0/2)*(rng.standard_normal(Nunc)+1j*rng.standard_normal(Nunc))
    z = np.real(np.conj(h1)*(h1*x+n1) + np.conj(h2)*(h2*x+n2))
    res["2枝MRC"].append(np.mean((z < 0).astype(int) != b))
    print(f"{edb:4.1f} dB 無対策={res['無対策'][-1]:.2e} MRC={res['2枝MRC'][-1]:.2e}")

無対策の曲線は理論値 $\frac{1}{2}(1-\sqrt{\bar\gamma/(1+\bar\gamma)})$ とよく一致します。12 dB で実測 $1.50\times10^{-2}$(理論 $1.51\times10^{-2}$)、30 dB で $2.45\times10^{-4}$(理論 $2.50\times10^{-4}$)。9 dB から 18 dB の 9 dB 分でBERが $2.85\times10^{-2}$ から $3.92\times10^{-3}$ へ、約 $1/7.3$ になっています。両対数の傾きに直すと $-0.96$、つまり実質傾きは $-1$、「SNRを10倍にしてもBERは10分の1」の世界です。一方 2枝MRCは、同じ 9 dB から 18 dB の区間で $2.37\times10^{-3}$ から $3.50\times10^{-5}$ へ、約 $1/68$ に落ちています。両対数で傾きがちょうど2倍、理論通り枝を1本増やすだけでダイバーシチ次数が1から2へ上がったことが実測で確認できます。

# (3)(4) 畳み込み符号 ± インターリーブ
for edb in EbdB:
    eb = 10 ** (edb / 10)
    blk = rows * cols
    nb = (Ninfo // (blk // 2)) * (blk // 2)
    bits = rng.integers(0, 2, nb)
    xc = 1 - 2 * conv_encode(bits).astype(float)
    hc = jakes(len(xc), fd_ts, rng=rng)
    n0c = 1 / (0.5 * eb)                       # レート1/2なので Es/N0 = R*Eb/N0
    nzc = np.sqrt(n0c/2)*(rng.standard_normal(len(xc))+1j*rng.standard_normal(len(xc)))
    for tag, use_il in (("符号化のみ", False), ("符号化+インターリーブ", True)):
        if use_il:
            perm = np.arange(len(xc)).reshape(-1, rows, cols).transpose(0, 2, 1).reshape(-1)
        else:
            perm = np.arange(len(xc))
        ys = hc * xc[perm] + nzc                # インターリーブして送信
        m = np.real(np.conj(hc) * ys)           # CSI重み付き軟値
        mm = np.empty_like(m); mm[perm] = m     # デインターリーブ
        res[tag].append(np.mean(viterbi_soft(mm.reshape(-1, 2)) != bits))
    print(f"{edb:4.1f} dB 符号のみ={res['符号化のみ'][-1]:.2e} "
          f"符号+IL={res['符号化+インターリーブ'][-1]:.2e}")

結果は劇的です。まず符号化のみ(インターリーブなし)を見ると、6 dB で $6.25\times10^{-2}$、9 dB で $3.01\times10^{-2}$、12 dB で $1.69\times10^{-2}$。無対策(それぞれ $5.23\times10^{-2}$、$2.85\times10^{-2}$、$1.50\times10^{-2}$)と比べると、むしろ悪くなっています。レート $1/2$ の符号を使うと同じ $E_b/N_0$ でもシンボルあたりのエネルギーが半分になるので、その損失を符号化利得が取り返せていないのです。15 dB あたりでようやく無対策を下回り、そこから 21 dB で 2.0 倍、24 dB で 3.5 倍、27 dB で 5.6 倍とじわじわ差を広げます。しかし 9 dB から 24 dB の傾きは $-1.4$ 程度で、$d_{\rm free}=5$ の符号を使っているのに ダイバーシチ次数は実質1〜1.5 のままです。

一方、符号化+インターリーブは 3 dB で $3.99\times10^{-2}$、6 dB で $2.29\times10^{-3}$、9 dB で $8.65\times10^{-5}$ と急峻に落ち、12 dB 以降は約20万ビット中に誤りゼロ(BER $< 5\times10^{-6}$)でした。6 dB から 9 dB のわずか 3 dB でBERが 26分の1、傾きにして $-4.7$ に相当します。$d_{\rm free}=5$ から予測される傾き $-5$ とほぼ一致しており、符号の距離特性がそのままダイバーシチ次数になるという理論が実測で裏づけられました。

この対比こそが、この記事で最も伝えたい点です。符号化は、インターリーブと組んで初めて力を発揮します。同じ符号器・同じ復号器を使い、送信順序を並べ替えただけで、9 dB におけるBERが $3.01\times10^{-2}$ から $8.65\times10^{-5}$ へ約350倍、12 dB では $1.69\times10^{-2}$ から測定限界以下(3000分の1以下)へと改善しました。追加のハードウェアコストは並べ替え用のメモリと遅延だけです。

plt.figure(figsize=(9, 6))
g = 10 ** (EbdB / 10)
plt.semilogy(EbdB, [ber_theory(x_, 1) for x_ in g], "k--", lw=1, label="理論: レイリー L=1")
plt.semilogy(EbdB, [ber_theory(x_, 2) for x_ in g], "k:",  lw=1, label="理論: レイリー L=2")
mk = {"無対策": "o-", "2枝MRC": "s-", "符号化のみ": "^-", "符号化+インターリーブ": "d-"}
for k, v in res.items():
    v = np.array(v, dtype=float); v[v == 0] = np.nan     # 誤りゼロ点は描かない
    plt.semilogy(EbdB, v, mk[k], ms=5, label=k)
plt.xlabel("平均 Eb/N0 [dB]"); plt.ylabel("ビット誤り率")
plt.title("フェージング対策のBER比較(フラットレイリー, fD·Ts = 0.004)")
plt.ylim(1e-7, 1); plt.grid(which="both", alpha=0.3); plt.legend()
plt.tight_layout(); plt.show()

無対策・2枝MRC・符号化のみ・符号化+インターリーブの4条件のBER曲線。符号化のみは無対策より悪く、符号化+インターリーブだけが崖のように落ちる

4本の曲線を重ねると、傾きの違いが視覚的にはっきりします。無対策は理論の $L=1$ 線(黒破線)にぴたりと乗り、符号化のみはそれよりわずかに急な程度(傾き $-1.4$)で、しかも中〜低SNRでは無対策より上(悪い側)を走ります。2枝MRCは理論の $L=2$ 線に沿って倍の傾きで落ち、符号化+インターリーブは崖のように落ちていきます。BER曲線の傾き=ダイバーシチ次数という理論が、4本すべてで確認できました。

OFDM+CPの効果を確かめる

最後に、周波数選択性チャネルでCPがあるかないかを比較します。CPは「ダイバーシチを増やす」のではなく「ISIによる誤り床をなくす」対策である、という点を数値で確認するのが目的です。

Nc, Ncp = 64, 16                                  # サブキャリア数・CP長

def ofdm_ber(edb, nsym, cp, seed):
    rng = np.random.default_rng(seed)
    eb = 10 ** (edb / 10); n0 = 1 / eb
    c = rng.integers(0, 2, nsym * Nc)
    X = (1 - 2 * c.astype(float)).reshape(nsym, Nc)
    dec = np.zeros((nsym, Nc), dtype=int)
    for s in range(nsym):
        g = np.sqrt(pdp/2) * (rng.standard_normal(4) + 1j*rng.standard_normal(4))
        H = np.fft.fft(g, Nc)
        xt = np.fft.ifft(X[s]) * np.sqrt(Nc)
        if cp:
            tx = np.concatenate([xt[-Ncp:], xt])       # CP付加
            rx = np.convolve(tx, g)[:len(tx)][Ncp:]    # CP除去
        else:
            rx = np.convolve(xt, g)[:Nc]               # CPなし(ISI/ICIが残る)
        nz = np.sqrt(n0/2)*(rng.standard_normal(Nc)+1j*rng.standard_normal(Nc))
        Y = np.fft.fft(rx + nz) / np.sqrt(Nc)
        dec[s] = (np.real(np.conj(H) * Y) < 0).astype(int)   # 1タップ等化+判定
    return np.mean(dec.reshape(-1) != c)

for edb in [0, 6, 12, 18, 24, 30]:
    a = ofdm_ber(edb, 3000, True, edb + 100)
    b_ = ofdm_ber(edb, 3000, False, edb + 200)
    print(f"{edb:4.1f} dB  OFDM+CP = {a:.2e}   CPなし = {b_:.2e}")

OFDM+CP・CPなし・COFDMのBER比較。CPありはフラットレイリー理論に重なり、CPなしは2×10^-3 の誤り床を作り、COFDMだけが急峻に落ちる

結果は明快です。OFDM+CPは 12 dB で $1.49\times10^{-2}$、24 dB で $1.12\times10^{-3}$、30 dB で $3.07\times10^{-4}$ と、フラットレイリーの理論値(12 dB で $1.51\times10^{-2}$、30 dB で $2.50\times10^{-4}$)にほぼ重なります。4タップの周波数選択性チャネルを使っているのに、結果は完全にフラットレイリーと同じ、傾き $-1$ の曲線です。

対してCPなしでは、18 dB あたりから曲線が寝始めます。18 dB で $5.77\times10^{-3}$(CPありの1.5倍)、24 dB で $3.14\times10^{-3}$(2.8倍)、30 dB で $2.24\times10^{-3}$(7.3倍)と差が開き続け、$2\times10^{-3}$ 付近に誤り床が形成されています。SNRをいくら上げても、シンボル間干渉・キャリア間干渉が残っている限りBERはそれ以上下がりません。CPという「情報を運ばない20%のオーバヘッド」が、この床を丸ごと取り除いているわけです。

この2つの事実を合わせると、OFDM+CPの立ち位置がはっきりします。CPは誤り床を取り除いて「まともなレイリーチャネル」に戻す装置であり、レイリーであること自体(傾き $-1$)は何も改善しないのです。だからこそ実用システムでは、この上に符号化+周波数インターリーブ(COFDM)を必ず載せます。実際、同じ4タップチャネルで $(7,5)_8$ 畳み込み符号+サブキャリアインターリーブを併用(=COFDM、図の緑線)して測ると、6 dB で $2.5\times10^{-3}$、9 dB で $1.3\times10^{-4}$、12 dB で $3.7\times10^{-6}$(約82万ビット中3誤り)と急峻に落ちました。6 dB から 12 dB の 6 dB 分でBERが 680分の1、両対数の傾きにして $-4.7$ 相当です。符号化なしのOFDM+CPが同じ区間で $5.3\times10^{-2} \to 1.5\times10^{-2}$ と 3.5 分の1にしかならないことと比べると、差は歴然としています。CPが土台を整え、符号化がその上でダイバーシチを稼ぐ — この二段構えが現代の無線通信の標準形です。

まとめ

本記事では、マルチパスフェージング対策を「チャネルを2つの数値で測り、その値から対策を選ぶ」という一本の設計フローに整理しました。

  • 遅延スプレッド $\sigma_\tau$ からコヒーレンス帯域 $B_c \approx 1/(5\sigma_\tau)$ を、ドップラー周波数 $f_D$ からコヒーレンス時間 $T_c \approx 0.423/f_D$ を求める。周波数相関関数がPDPのフーリエ変換であること、時間相関が $J_0(2\pi f_D \Delta t)$ になることが、この2つのものさしの理論的な裏付けです
  • 「信号帯域 vs $B_c$」×「シンボル長 vs $T_c$」の4象限で処方箋が決まる。周波数選択性ならOFDM+CPか等化器、落ち込みならダイバーシチと符号化。$\sigma_\tau \ll T_s \ll T_c$ の窓に設計を収めるのが基本方針です
  • フェージング下のBERは平均SNRの $-L$ 乗で落ち、この $L$(ダイバーシチ次数)がすべての対策の共通通貨になる。無対策の $L=1$ では BER $10^{-3}$ に 24 dB も必要ですが、$L=2$ なら 11.1 dB で済みます
  • ダイバーシチの調達先は空間($\lambda/2$ 以上、基地局は $10\lambda$ 以上)・偏波・周波数($B_c$ 以上)・時間($T_c$ 以上)・角度。物理的に取れない場合は符号化とインターリーブで人工的に作れます
  • 符号化はインターリーブと組んで初めて力を発揮する。実測では、同じ $(7,5)_8$ 畳み込み符号でも、インターリーブなしなら傾きは $-1$ のまま、インターリーブありなら $d_{\rm free}=5$ に対応する傾き $-4.7$ が得られ、9 dB でBERが約350倍、12 dB では3000分の1以下まで違いました
  • OFDM+CPは循環畳み込みを作ってISIを消すが、ダイバーシチは与えない。CPなしでは $2\times10^{-3}$ の誤り床が立ち、CPありでフラットレイリーの理論曲線に一致します。実用システムがCOFDM(符号化OFDM)である必然性はここにあります
  • すべての対策には代償がある。ダイバーシチはアンテナと受信機の数、周波数ダイバーシチは帯域、インターリーブは遅延とメモリ、CPはスループット、等化器は計算量。設計とは、許容できる代償の範囲で最大のダイバーシチ次数を積み上げる作業です

フェージング対策は、個々の技術を暗記するものではありません。$\sigma_\tau$ と $f_D$ を測り、$B_c$ と $T_c$ を計算し、自分のシステムがどの象限にいるかを判定する。そこから必要な対策が自動的に決まり、あとは遅延・帯域・計算量の予算の中でダイバーシチ次数を積み上げていく。この見取り図さえ持っていれば、新しい方式(MIMO、大規模アンテナ、非直交多重)に出会っても、「これはどの軸のダイバーシチを取っているのか」「何を代償にしているのか」という同じ問いで整理できるはずです。

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