等化器(イコライザ)の設計 — 符号間干渉を除去する受信信号処理

スマートフォンで動画を視聴しているとき、電波環境が悪い場所に入ると映像が途切れたり、音声が乱れたりします。しかし多くの場合、少しの劣化はあっても通信は維持されます。これは受信機の内部で、通信路が信号に与えた歪みを自動的に補正する「等化器(イコライザ)」が働いているからです。

ディジタル通信では、送信信号が通信路を通過する際に周波数選択性フェージングやマルチパス伝搬の影響を受け、隣接するシンボルが互いに干渉し合う符号間干渉(ISI: Inter-Symbol Interference)が発生します。ISIを放置すると、受信側でシンボルを正しく判定できず、ビット誤り率(BER)が大幅に劣化します。等化器はこのISIを除去・低減し、通信品質を維持するための核心技術です。

等化器の理論を理解すると、以下のような幅広い応用分野が見えてきます。

  • 無線通信(5G/6G、Wi-Fi): マルチパス環境での高速データ伝送に不可欠
  • 有線通信(ADSL、光ファイバー): 長距離伝送による波形歪みの補償
  • 磁気記録(HDD): 記録密度向上に伴うISIの除去
  • 水中音響通信: 強い多重反射環境での信号復元

本記事の内容

  • 通信路の周波数特性モデルとISIの発生メカニズム
  • ゼロフォーシング(ZF)等化器の理論と導出
  • MMSE(最小平均二乗誤差)等化器の理論と導出
  • ZFとMMSEの比較 — 雑音増幅の問題
  • 線形等化と判定帰還等化(DFE)
  • LMSアルゴリズムによる適応等化
  • トレーニングシーケンスとブラインド等化
  • OFDMにおける1タップ等化の利点
  • Python実装: ZF/MMSE等化のBER比較、適応等化の収束過程

前提知識

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

等化の必要性 — なぜ受信信号をそのまま判定できないのか

まずは等化器がなぜ必要なのか、直感的に理解しましょう。

理想的な通信路を考えます。送信機がシンボル列 $s[0], s[1], s[2], \dots$ を送ると、受信機には各シンボルがそのままの形で、ただしノイズが加わった状態で届きます。このとき、受信信号 $r[n]$ は単純に次のように書けます。

$$ r[n] = s[n] + w[n] $$

ここで $w[n]$ は加法性白色ガウス雑音(AWGN)です。受信機は $r[n]$ に対して閾値判定を行えば、ノイズが極端に大きくない限りシンボルを正しく復元できます。

しかし現実の通信路は、信号に「ぼかし」を与えます。建物の反射で複数の経路を通った信号が異なる遅延で受信機に到達したり(マルチパス)、ケーブルの周波数特性で高域が減衰したりします。この効果を数学的にモデル化すると、通信路はインパルス応答 $h[n]$ を持つ線形フィルタとして表現できます。受信信号は次のように書き換わります。

$$ r[n] = \sum_{k=0}^{L-1} h[k] \, s[n-k] + w[n] = (h * s)[n] + w[n] $$

ここで $L$ は通信路のタップ数(インパルス応答の長さ)、$*$ は畳み込み演算です。この式の右辺第1項を展開すると、$r[n]$ には現在のシンボル $s[n]$ だけでなく、過去のシンボル $s[n-1], s[n-2], \dots$ の影響が混入していることがわかります。これがISIです。

たとえば $L = 3$、$h = [0.8, 0.5, 0.3]$ の通信路を考えると、

$$ r[n] = 0.8 \, s[n] + 0.5 \, s[n-1] + 0.3 \, s[n-2] + w[n] $$

となり、現在のシンボル $s[n]$ を判定しようとしても、1つ前と2つ前のシンボルの影響が含まれてしまいます。ISIの大きさは通信路の特性(タップ係数の大きさや数)に依存し、通信路の周波数応答の変動が激しいほどISIは深刻になります。

等化器の役割は、通信路が行った畳み込み操作を「逆に戻す」ことです。通信路フィルタ $H(z)$ に対して、等化器 $W(z)$ を設計し、合成特性 $H(z) W(z)$ を理想的な無歪み伝送(単なる遅延)に近づけます。この考え方をもう少し具体的に定式化するために、通信路の周波数特性モデルを整理しましょう。

通信路の周波数特性モデル

通信路の影響を周波数領域で理解すると、等化器の設計がより明快になります。

時間領域で通信路のインパルス応答を $h[n]$($n = 0, 1, \dots, L-1$)とすると、その周波数応答(伝達関数)は離散時間フーリエ変換(DTFT)により次のように表せます。

$$ H(e^{j\omega}) = \sum_{k=0}^{L-1} h[k] \, e^{-j\omega k} $$

ここで $\omega$ は正規化角周波数です。$H(e^{j\omega})$ は一般に複素数値をとり、その振幅 $|H(e^{j\omega})|$ は各周波数成分がどれだけ増幅・減衰されるかを、位相 $\angle H(e^{j\omega})$ は各周波数成分にどれだけの位相回転が加わるかを表します。

ISIが生じない理想的な通信路は、すべての周波数に対して一様な振幅特性と線形な位相特性を持ちます。つまり、

$$ H_{\text{ideal}}(e^{j\omega}) = e^{-j\omega d} $$

です。これは単に $d$ サンプルの遅延を表すだけで、信号の形は変わりません。しかし現実の通信路では $|H(e^{j\omega})|$ が周波数によって大きく変動し、特定の周波数帯で深いヌル(零点)が生じることもあります。

周波数領域では、受信信号のスペクトルは次のように書けます。

$$ R(e^{j\omega}) = H(e^{j\omega}) \, S(e^{j\omega}) + W(e^{j\omega}) $$

等化器を周波数応答 $G(e^{j\omega})$ を持つフィルタとして設計する場合、等化後の信号は次のようになります。

$$ \hat{S}(e^{j\omega}) = G(e^{j\omega}) \, R(e^{j\omega}) = G(e^{j\omega}) H(e^{j\omega}) \, S(e^{j\omega}) + G(e^{j\omega}) \, W(e^{j\omega}) $$

右辺の第1項は信号成分、第2項は雑音成分です。理想的には $G(e^{j\omega}) H(e^{j\omega}) = e^{-j\omega d}$ としたいのですが、そのとき $G(e^{j\omega}) = e^{-j\omega d} / H(e^{j\omega})$ となり、$|H(e^{j\omega})|$ が小さい周波数では $|G(e^{j\omega})|$ が非常に大きくなってしまいます。これは雑音成分も同じだけ増幅されることを意味します。

この「ISI除去と雑音増幅のトレードオフ」が等化器設計の本質的な課題です。この課題に対する2つのアプローチ — ゼロフォーシング等化とMMSE等化 — を順に見ていきましょう。

ゼロフォーシング(ZF)等化器の理論

ゼロフォーシング等化器は「ISIを完全にゼロにする」ことだけを目標とする、最もシンプルな等化器です。名前の通り、ISIを「強制的にゼロにする(force to zero)」という発想です。

周波数領域でのZF等化

周波数領域でISIを完全に除去するには、通信路の周波数応答を完全に打ち消せばよいので、ZF等化器の周波数応答は次のようになります。

$$ G_{\text{ZF}}(e^{j\omega}) = \frac{e^{-j\omega d}}{H(e^{j\omega})} $$

ここで $d$ は等化器が導入する遅延です。合成周波数応答は、

$$ G_{\text{ZF}}(e^{j\omega}) \, H(e^{j\omega}) = e^{-j\omega d} $$

となり、確かに理想的な遅延のみの伝送が実現されます。

時間領域でのZF等化

実装の観点から、時間領域での定式化も重要です。等化器をFIR(有限インパルス応答)フィルタとして設計する場合を考えます。等化器のタップ係数を $\bm{g} = [g_0, g_1, \dots, g_{M-1}]^T$ とし、タップ数を $M$ とします。

等化後の出力は次のように書けます。

$$ \hat{s}[n] = \sum_{m=0}^{M-1} g_m \, r[n-m] = \bm{g}^T \bm{r}[n] $$

ここで $\bm{r}[n] = [r[n], r[n-1], \dots, r[n-M+1]]^T$ は受信信号ベクトルです。

ZF条件は「等化器と通信路の合成インパルス応答がデルタ関数(の遅延版)になること」です。合成インパルス応答を $q[n] = (g * h)[n]$ とすると、ZF条件は次のように書けます。

$$ q[n] = \delta[n – d] $$

これを行列形式で表現しましょう。通信路の畳み込み行列 $\bm{H}$ を次のように構成します。

$$ \bm{H} = \begin{bmatrix} h[0] & 0 & \cdots & 0 \\ h[1] & h[0] & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ h[L-1] & h[L-2] & \cdots & h[0] \\ 0 & h[L-1] & \cdots & h[1] \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & h[L-1] \end{bmatrix} $$

この行列は $(M + L – 1) \times M$ のToeplitz行列です。ZF条件 $\bm{H}^T \bm{g} = \bm{e}_d$($\bm{e}_d$ は $d$ 番目の要素が1のベクトル)を満たす $\bm{g}$ を求めます。

$\bm{H}$ が列フルランクの場合、最小ノルム解は擬似逆行列を使って次のように得られます。

$$ \bm{g}_{\text{ZF}} = (\bm{H}^T \bm{H})^{-1} \bm{H}^T \bm{e}_d $$

あるいは、受信信号の自己相関行列を用いた定式化も可能です。受信信号ベクトル $\bm{r}[n]$ と送信シンボル $s[n-d]$ の関係から、ZF等化器の係数は次の連立方程式を解くことでも求まります。

$$ \bm{R}_{rr} \, \bm{g}_{\text{ZF}} = \bm{p} $$

ここで $\bm{R}_{rr} = E[\bm{r}[n] \bm{r}^H[n]]$ は受信信号の自己相関行列、$\bm{p} = E[\bm{r}[n] s^*[n-d]]$ は受信信号と所望信号の相互相関ベクトルです。ZF等化では、雑音の影響を考慮せずに $\bm{p}$ を設定するため、雑音の多い環境では性能が劣化します。

ZF等化器はISIを完全に除去できるという明快な利点がありますが、通信路に深いヌルがある場合に等化器の利得が極端に大きくなり、雑音を大幅に増幅してしまうという重大な弱点があります。この雑音増幅の問題を解決するのが、次に紹介するMMSE等化器です。

MMSE(最小平均二乗誤差)等化器

MMSE等化器は「ISI除去」と「雑音増幅の抑制」のバランスを最適にとる等化器です。ZF等化器が「ISIをゼロにする」という幾何学的な条件に基づいていたのに対し、MMSE等化器は「推定誤差の二乗平均を最小化する」という統計的な基準に基づきます。

最適化問題の定式化

MMSE等化器は、等化後の出力 $\hat{s}[n] = \bm{g}^T \bm{r}[n]$ と所望信号 $s[n-d]$ の平均二乗誤差(MSE)を最小化する係数 $\bm{g}$ を求めます。

$$ \bm{g}_{\text{MMSE}} = \arg\min_{\bm{g}} \, E\!\left[ \left| s[n-d] – \bm{g}^T \bm{r}[n] \right|^2 \right] $$

この目的関数を $J(\bm{g})$ と書き、$\bm{g}$ について展開します。

$$ J(\bm{g}) = E\!\left[ |s[n-d]|^2 \right] – 2 \, \text{Re}\!\left\{ \bm{g}^H \bm{p} \right\} + \bm{g}^H \bm{R}_{rr} \bm{g} $$

ここで $\bm{R}_{rr} = E[\bm{r}[n] \bm{r}^H[n]]$ は受信信号の自己相関行列、$\bm{p} = E[\bm{r}[n] s^*[n-d]]$ は受信信号と所望信号の相互相関ベクトルです。

ウィーナー-ホップフ方程式の導出

$J(\bm{g})$ を $\bm{g}$ で微分してゼロとおきます。$J(\bm{g})$ は $\bm{g}$ に関する二次関数(放物面)なので、勾配がゼロになる点が唯一の最小解です。

$$ \frac{\partial J}{\partial \bm{g}^*} = -\bm{p} + \bm{R}_{rr} \bm{g} = \bm{0} $$

これを整理すると、ウィーナー-ホップフ方程式が得られます。

$$ \bm{R}_{rr} \, \bm{g}_{\text{MMSE}} = \bm{p} $$

自己相関行列が正則であれば、解は一意に定まります。

$$ \bm{g}_{\text{MMSE}} = \bm{R}_{rr}^{-1} \, \bm{p} $$

この式の形はZF等化と同じに見えますが、$\bm{R}_{rr}$ の中身が決定的に異なります。受信信号 $\bm{r}[n]$ には通信路の出力だけでなく雑音も含まれるため、自己相関行列は次のようになります。

$$ \bm{R}_{rr} = \sigma_s^2 \, \bm{H}^H \bm{H} + \sigma_w^2 \, \bm{I} $$

ここで $\sigma_s^2 = E[|s[n]|^2]$ はシンボルの平均電力、$\sigma_w^2 = E[|w[n]|^2]$ は雑音電力、$\bm{I}$ は単位行列です。

ZF等化との関係

MMSE等化器の解を変形すると、ZF等化との関係が明確になります。$\bm{p} = \sigma_s^2 \bm{H}^H \bm{e}_d$ であることを用いると、

$$ \bm{g}_{\text{MMSE}} = \left( \sigma_s^2 \bm{H}^H \bm{H} + \sigma_w^2 \bm{I} \right)^{-1} \sigma_s^2 \bm{H}^H \bm{e}_d $$

と書けます。ここで $\sigma_w^2 \to 0$(雑音がない極限)を考えると、

$$ \bm{g}_{\text{MMSE}} \to (\bm{H}^H \bm{H})^{-1} \bm{H}^H \bm{e}_d = \bm{g}_{\text{ZF}} $$

となり、MMSE等化はZF等化に帰着します。つまり、ZF等化はMMSE等化の雑音ゼロ極限における特殊ケースです。

周波数領域での理解

MMSE等化器の周波数応答は次のように表されます。

$$ G_{\text{MMSE}}(e^{j\omega}) = \frac{H^*(e^{j\omega})}{|H(e^{j\omega})|^2 + \frac{\sigma_w^2}{\sigma_s^2}} $$

分母の $\sigma_w^2 / \sigma_s^2$ は雑音対信号電力比(逆SNR)です。この項が正則化の役割を果たし、$|H(e^{j\omega})|$ が小さい周波数帯でも $G_{\text{MMSE}}$ が発散しないようにしています。

ZF等化器の周波数応答 $G_{\text{ZF}}(e^{j\omega}) = 1/H(e^{j\omega})$ と比較すると、MMSE等化器は通信路のヌル付近で等化利得を「抑える」ことで、ISI除去は不完全になるものの雑音増幅を防いでいます。SNRが高い場合は $\sigma_w^2 / \sigma_s^2 \approx 0$ となり、MMSE等化はZF等化とほぼ同じ振る舞いをします。逆にSNRが低い場合は、MMSE等化が大幅に優れた性能を示します。

この2つの等化器の性能差を定量的に理解するために、次にZFとMMSEを直接比較してみましょう。

ZF等化とMMSE等化の比較 — 雑音増幅の問題

ZF等化とMMSE等化の本質的な違いは、通信路の周波数応答にヌル(深い減衰)がある場合に顕著に現れます。

雑音増幅のメカニズム

具体例で考えましょう。通信路の周波数応答がある周波数 $\omega_0$ 付近で $|H(e^{j\omega_0})| = 0.01$ と非常に小さいとします。ZF等化器は $G_{\text{ZF}}(e^{j\omega_0}) = 1/0.01 = 100$ という巨大な利得を持つことになります。このとき、信号成分は正しく復元されますが、同時に雑音も100倍に増幅されます。結果として、等化後のSNRは全体として大幅に劣化します。

一方、MMSE等化器は同じ周波数で次のような利得を持ちます(例えば $\sigma_w^2 / \sigma_s^2 = 0.01$ の場合)。

$$ G_{\text{MMSE}}(e^{j\omega_0}) = \frac{0.01}{0.01^2 + 0.01} = \frac{0.01}{0.0101} \approx 0.99 $$

MMSE等化器はヌル付近で等化利得をほぼ1程度に抑え、雑音の過度な増幅を避けています。その代償として、この周波数帯ではISIが完全には除去されませんが、全体のMSEは最小になります。

等化後SNRの比較

等化後の出力SNRを理論的に評価してみます。ZF等化の場合、等化後の雑音電力は次のようになります。

$$ \sigma_{w,\text{ZF}}^2 = \frac{\sigma_w^2}{2\pi} \int_{-\pi}^{\pi} \frac{1}{|H(e^{j\omega})|^2} d\omega $$

この積分は $|H(e^{j\omega})|$ が小さい周波数帯で発散的に大きくなります。特に、通信路にヌルがあると等化後の雑音電力は非常に大きくなり、BERが著しく悪化します。

MMSE等化の場合、最小MSEは次のように表されます。

$$ \text{MMSE} = \frac{\sigma_w^2}{2\pi} \int_{-\pi}^{\pi} \frac{1}{|H(e^{j\omega})|^2 + \frac{\sigma_w^2}{\sigma_s^2}} d\omega $$

分母に $\sigma_w^2 / \sigma_s^2$ が加わることで、積分が発散することはなく、常に有限の値に留まります。

実用的な選択指針

実用上、ZF等化とMMSE等化のどちらを選ぶかは、通信路の特性と運用するSNR領域に依存します。

  • 通信路が比較的平坦(深いヌルがない)で、SNRが高い場合: ZF等化でも十分な性能が得られ、実装もシンプルです
  • 通信路に深いヌルがある場合、または中〜低SNRで運用する場合: MMSE等化が圧倒的に有利です
  • 多くの実用システムではMMSE等化がデフォルトとして採用されます。計算量の増加はわずかで、性能向上が大きいからです

ここまでで、受信信号を線形フィルタに通して等化する「線形等化」の2つの基本方式を理解しました。しかし、線形等化には原理的な限界があります。ISI除去と雑音増幅のトレードオフから完全には逃れられないのです。この限界を打破するアプローチとして、判定帰還等化(DFE)を見ていきましょう。

線形等化と判定帰還等化(DFE)

線形等化の限界

これまで見てきたZF等化器やMMSE等化器は、いずれも受信信号を線形フィルタ $\bm{g}^T \bm{r}[n]$ に通すだけの構造でした。このような「線形等化器」は、ISI成分を打ち消すために通信路の逆特性に近いフィルタをかける必要があり、その際に雑音も増幅されてしまいます。

線形等化器の性能は通信路のスペクトルヌルの深さに強く依存し、深いヌルを持つ通信路では大幅に性能が低下します。これは、線形等化が「前方のシンボルからの干渉」と「後方のシンボルからの干渉」の両方を同じ線形フィルタで処理しようとすることに起因します。

DFEの基本アイデア

判定帰還等化器(DFE: Decision Feedback Equalizer)は、この問題に対してエレガントな解決策を提供します。DFEの基本アイデアは次のようなものです。

すでに判定済み(復号済み)のシンボルがわかっているなら、それらが現在のシンボルに与えるISI成分を正確に計算して差し引くことができるはずです。判定済みシンボルからの干渉は「通信路の逆をかける」必要がなく、直接的に除去できるため、雑音増幅の問題が生じません。

DFEは2つのフィルタから構成されます。

  1. フォワードフィルタ(FF) $\bm{f} = [f_0, f_1, \dots, f_{N_f – 1}]^T$: 受信信号に対して線形フィルタリングを行い、未来のシンボルからの干渉(先行ISI)を除去します
  2. フィードバックフィルタ(FB) $\bm{b} = [b_1, b_2, \dots, b_{N_b}]^T$: 過去の判定結果を用いて、過去のシンボルからの干渉(後行ISI)を除去します

DFEの出力は次のように書けます。

$$ \hat{s}[n] = \sum_{m=0}^{N_f – 1} f_m \, r[n-m] – \sum_{k=1}^{N_b} b_k \, \tilde{s}[n-k] $$

ここで $\tilde{s}[n-k]$ は時刻 $n-k$ における判定結果(推定シンボル)です。第1項がフォワードフィルタの出力、第2項がフィードバックフィルタによる後行ISIの除去です。フィードバックフィルタは判定結果に直接乗じるだけなので、通信路の逆特性をかける必要がなく、雑音増幅が起こりません。

MMSE-DFEの最適設計

DFEのフォワードフィルタとフィードバックフィルタをMMSE基準で同時に最適化できます。最適化問題は次のように定式化されます。

$$ (\bm{f}_{\text{opt}}, \bm{b}_{\text{opt}}) = \arg\min_{\bm{f}, \bm{b}} \, E\!\left[ \left| s[n-d] – \bm{f}^T \bm{r}[n] + \bm{b}^T \tilde{\bm{s}}[n] \right|^2 \right] $$

ここで $\tilde{\bm{s}}[n] = [\tilde{s}[n-1], \dots, \tilde{s}[n-N_b]]^T$ は過去の判定結果ベクトルです。

判定が正しい($\tilde{s}[n-k] = s[n-k]$)と仮定すると、最適なフィードバックフィルタ係数は、フォワードフィルタと通信路の合成応答から直接求まります。具体的には、合成インパルス応答 $q[n] = (\bm{f} * h)[n]$ の $n > d$ の部分がフィードバック係数になります。

$$ b_k = q[d + k] \quad (k = 1, 2, \dots, N_b) $$

つまり、フォワードフィルタで除去しきれなかった後行ISI成分を、フィードバックフィルタで正確にキャンセルするのです。

DFEの利点と課題

DFEの最大の利点は、線形等化器よりも大幅に性能が向上することです。特に通信路に深いヌルがある場合、後行ISIをフィードバックで完全に除去できるため、フォワードフィルタは先行ISIの除去だけに専念でき、雑音増幅が大幅に軽減されます。

一方、DFEには誤り伝搬(error propagation)という固有の問題があります。判定結果が誤っている場合、誤った値がフィードバックフィルタに入力され、後続のシンボルの判定にも悪影響を及ぼします。1つの判定誤りが連鎖的に複数のシンボルの誤りを引き起こす可能性があるのです。

誤り伝搬を緩和する方法として、以下のようなアプローチが知られています。

  • 誤り訂正符号との組み合わせ: ターボ等化のように、等化と復号を繰り返す
  • 軟判定フィードバック: 硬判定の代わりに尤度情報を用いる
  • 定期的なリセット: トレーニングシーケンスで等化器の状態をリセットする

ここまでで、通信路の特性が既知である場合の等化器設計を見てきました。しかし実際の通信では、通信路の特性は時々刻々と変化します。この変動に追従するためには、等化器の係数をリアルタイムに更新する「適応等化」が必要になります。

適応等化 — LMSアルゴリズムの応用

なぜ適応等化が必要か

これまでの議論では、通信路のインパルス応答 $h[n]$ が既知であることを暗黙に仮定していました。しかし現実の無線通信では、送受信機の移動やフェージングにより通信路は常に変動しています。固定的な等化器では変動する通信路に対応できないため、係数を逐次更新する適応等化が不可欠です。

適応等化の中で最も広く用いられるのがLMS(Least Mean Squares)アルゴリズムです。適応フィルタ入門で詳しく解説したLMSアルゴリズムを、等化器の係数更新に適用します。

LMS等化器のアルゴリズム

LMS等化器は、MMSE等化器の解を確率的勾配降下法で逐次的に求めるものです。具体的な更新手順は以下の通りです。

ステップ1: 等化器の出力を計算します。

$$ \hat{s}[n] = \bm{g}^T[n] \, \bm{r}[n] $$

ステップ2: 誤差信号を計算します。

$$ e[n] = d[n] – \hat{s}[n] $$

ここで $d[n]$ は所望信号(参照信号)です。トレーニング期間中は既知のトレーニングシンボル、データ伝送期間中は判定結果 $\tilde{s}[n]$ を用います。

ステップ3: 等化器の係数を更新します。

$$ \bm{g}[n+1] = \bm{g}[n] + \mu \, e^*[n] \, \bm{r}[n] $$

ここで $\mu$ はステップサイズ(学習率)です。

ステップサイズの選択

LMS等化器の収束速度と定常状態の誤差は、ステップサイズ $\mu$ に強く依存します。適応フィルタ入門で導出したように、安定性の条件は次の通りです。

$$ 0 < \mu < \frac{2}{\lambda_{\max}} $$

ここで $\lambda_{\max}$ は受信信号の自己相関行列 $\bm{R}_{rr}$ の最大固有値です。実用的な上界として、$\lambda_{\max} \leq \text{tr}(\bm{R}_{rr}) = M \cdot E[|r[n]|^2]$ が使えるので、次の条件がよく用いられます。

$$ 0 < \mu < \frac{2}{M \cdot \hat{P}_r} $$

ここで $\hat{P}_r$ は受信信号の推定電力、$M$ は等化器のタップ数です。

ステップサイズを大きくすると収束は速くなりますが、定常状態での誤差(ミスアジャストメント)が増加します。逆に小さくすると定常状態の誤差は減りますが、通信路の時変に追従できなくなります。この収束速度と追従性のトレードオフが、適応等化の設計において最も重要な判断ポイントです。

LMS-DFEへの拡張

LMSアルゴリズムはDFE構造にも自然に拡張できます。フォワードフィルタとフィードバックフィルタの両方の係数をLMSで同時に更新します。

$$ \bm{f}[n+1] = \bm{f}[n] + \mu_f \, e^*[n] \, \bm{r}[n] $$

$$ \bm{b}[n+1] = \bm{b}[n] + \mu_b \, e^*[n] \, \tilde{\bm{s}}[n] $$

フォワードフィルタとフィードバックフィルタで異なるステップサイズ $\mu_f, \mu_b$ を使うことも可能です。

適応等化器の性能は、所望信号 $d[n]$ として何を用いるかに大きく依存します。次に、所望信号の生成方法であるトレーニングシーケンスとブラインド等化について見ていきましょう。

トレーニングシーケンスとブラインド等化

トレーニングベース等化

最も基本的なアプローチは、送受信間で既知のトレーニングシーケンス(パイロット信号)を事前に取り決めておく方法です。通信の開始時(またはフレームの先頭)にトレーニングシーケンスを送信し、受信機はこの既知系列を所望信号 $d[n]$ としてLMSアルゴリズム等で等化器の係数を学習します。

トレーニングベース等化の動作は2つのフェーズに分かれます。

  1. トレーニングフェーズ: 既知系列 $d[n]$ を用いて等化器の係数を収束させる
  2. 判定指向(DD: Decision-Directed)フェーズ: トレーニング終了後、等化器の出力を判定した結果 $\tilde{s}[n]$ を $d[n]$ の代わりに用いて係数を追従させる

トレーニングシーケンスには、自己相関特性が良好な系列(たとえばPN系列やZadoff-Chu系列)が用いられます。自己相関がインパルス的な系列を使うと、等化器の収束が速く、推定精度も高くなります。

トレーニングベース等化の欠点は、トレーニングシーケンスの送信に帯域と時間を消費することです。データ伝送効率を上げるにはトレーニング期間を短くしたいですが、等化器の収束に必要な最低限の長さは確保しなければなりません。一般に、等化器のタップ数 $M$ に対してトレーニング系列は $5M$ 〜 $10M$ シンボル程度が目安とされます。

ブラインド等化

トレーニングシーケンスを使わずに等化器の係数を学習する方法がブラインド等化です。ブラインド等化は送信信号の統計的性質(確率分布、高次統計量など)のみを利用して等化を行います。

代表的なブラインド等化アルゴリズムとして、CMA(Constant Modulus Algorithm)があります。CMAは「送信信号の振幅が一定である」という性質を利用します。PSKのような一定包絡線変調方式では、送信シンボルはすべて $|s[n]| = R$(一定値)を満たします。ISIと雑音により受信信号の振幅は変動するので、CMAは等化後の信号振幅を一定に戻すように係数を更新します。

CMAのコスト関数は次のように定義されます。

$$ J_{\text{CMA}} = E\!\left[ \left( |\hat{s}[n]|^2 – R^2 \right)^2 \right] $$

ここで $R^2 = E[|s[n]|^4] / E[|s[n]|^2]$ です。このコスト関数を確率的勾配降下法で最小化すると、更新式は次のようになります。

$$ \bm{g}[n+1] = \bm{g}[n] + \mu \, \hat{s}^*[n] \left( R^2 – |\hat{s}[n]|^2 \right) \bm{r}[n] $$

CMAはトレーニング不要という大きな利点がありますが、一般にトレーニングベース等化よりも収束が遅く、位相の曖昧性が残る(回転等価な解に収束する可能性がある)という課題があります。実用的には、CMAでおおまかに等化した後、判定指向モードに切り替えてさらに精度を高める方法がよく使われます。

ここまでの議論はすべて「シングルキャリア伝送」を前提としていました。しかし現代の高速通信では、等化をより効率的に行える「マルチキャリア伝送」が広く採用されています。その代表であるOFDMにおける等化のシンプルさを最後に見ていきましょう。

OFDMにおける1タップ等化の利点

シングルキャリアにおける等化の複雑さ

シングルキャリア伝送では、通信路のISIに対処するために多タップの等化器が必要です。等化器のタップ数 $M$ は通信路のインパルス応答の長さ $L$ と同程度かそれ以上が必要であり、MMSE等化では $M \times M$ の行列の逆行列計算が必要になります。通信路の遅延スプレッドが大きい場合、$M$ は数十〜数百に達し、計算量が膨大になります。

OFDMの基本原理と巡回接頭辞

OFDM(Orthogonal Frequency Division Multiplexing)は、広帯域の通信路を多数の狭帯域サブキャリアに分割し、各サブキャリアで独立にデータを伝送する方式です。

OFDMの鍵は巡回接頭辞(CP: Cyclic Prefix)にあります。各OFDMシンボルの先頭に、シンボル末尾のコピーを付加します。CPの長さが通信路のインパルス応答の長さ以上であれば、通信路による線形畳み込みがDFT領域で巡回畳み込みに変換されます。

巡回畳み込みの性質により、DFT後の各サブキャリアでの入出力関係は次のように極めてシンプルになります。

$$ R[k] = H[k] \cdot S[k] + W[k], \quad k = 0, 1, \dots, N-1 $$

ここで $R[k]$, $S[k]$, $W[k]$ はそれぞれ受信信号、送信信号、雑音のDFT係数、$H[k] = H(e^{j2\pi k/N})$ は通信路の周波数応答を $N$ 点でサンプリングした値、$N$ はサブキャリア数です。

重要なのは、この式が各 $k$ について独立であることです。シングルキャリアでは時間領域のISIにより全シンボルが結合していましたが、OFDMでは各サブキャリアが独立な平坦フェージング通信路を経験します。

1タップ等化

各サブキャリアが独立であるため、等化は各サブキャリアに対して1タップの乗算で行えます。

ZF等化の場合は次のようになります。

$$ \hat{S}_{\text{ZF}}[k] = \frac{R[k]}{H[k]} = S[k] + \frac{W[k]}{H[k]} $$

MMSE等化の場合は次の通りです。

$$ \hat{S}_{\text{MMSE}}[k] = \frac{H^*[k]}{|H[k]|^2 + \sigma_w^2/\sigma_s^2} \, R[k] $$

どちらもサブキャリアごとに1回の複素除算(または乗算)で済みます。$N$ 本のサブキャリアに対して合計 $N$ 回の複素乗算で等化が完了し、シングルキャリアの $M \times M$ 行列逆行列計算と比較して劇的に計算量が削減されます。FFTの計算量 $O(N \log N)$ を含めても、大幅に効率的です。

OFDMの等化における注意点

ただし、OFDMの1タップ等化が成立するためには以下の条件が必要です。

  1. CPの長さが通信路の最大遅延以上であること: この条件が破れると、サブキャリア間干渉(ICI)が発生し、1タップ等化の前提が崩れます
  2. 通信路がOFDMシンボル時間内で時不変であること: 高速移動環境ではドップラー効果によりICIが発生します
  3. 通信路の周波数応答 $H[k]$ が既知であること: パイロットサブキャリアを用いた通信路推定が別途必要です

これらの条件が満たされる場合、OFDMは等化の複雑さを劇的に低減できるため、Wi-Fi(IEEE 802.11a/g/n/ac/ax)、LTE、5G NRなどの現代の無線通信規格で広く採用されています。

理論を一通り理解したところで、PythonでZF等化とMMSE等化のBER性能を比較し、さらにLMS適応等化の収束過程を確認しましょう。

Python実装①: ZF/MMSE等化のBER比較

まず、シングルキャリアBPSK伝送において、ZF等化器とMMSE等化器のBER性能を比較します。通信路にISIを引き起こすマルチパスチャネルを設定し、SNRを変化させたときのBER曲線を描きます。

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

def bpsk_modulate(bits):
    """BPSK変調: 0 -> -1, 1 -> +1"""
    return 2 * bits - 1

def build_channel_matrix(h, N_symbols, N_taps):
    """通信路の畳み込み行列を構築"""
    L = len(h)
    N_out = N_symbols + L - 1
    H = np.zeros((N_out, N_symbols))
    for i in range(N_symbols):
        H[i:i+L, i] = h
    return H

def zf_equalizer(h, N_taps, delay):
    """ZF等化器の係数を計算"""
    L = len(h)
    # 通信路の畳み込み行列(等化器入力 -> 合成出力)
    N_out = N_taps + L - 1
    H = np.zeros((N_out, N_taps))
    for i in range(N_taps):
        H[i:i+L, i] = h
    # ZF解: H^T g = e_d の最小ノルム解
    e_d = np.zeros(N_out)
    e_d[delay] = 1.0
    g = np.linalg.lstsq(H, e_d, rcond=None)[0]
    return g

def mmse_equalizer(h, N_taps, delay, snr_linear):
    """MMSE等化器の係数を計算"""
    L = len(h)
    N_out = N_taps + L - 1
    H = np.zeros((N_out, N_taps))
    for i in range(N_taps):
        H[i:i+L, i] = h
    # MMSE解
    sigma_s2 = 1.0  # BPSK信号電力
    sigma_w2 = sigma_s2 / snr_linear
    R_rr = sigma_s2 * H.T @ H + sigma_w2 * np.eye(N_taps)
    p = sigma_s2 * H.T @ np.eye(N_out)[:, delay]
    g = np.linalg.solve(R_rr, p)
    return g

def simulate_ber(h, snr_db_list, N_symbols=50000, N_taps=15):
    """ZF/MMSE等化のBERをシミュレーション"""
    L = len(h)
    delay = (N_taps + L - 2) // 2  # 等化器の遅延

    ber_zf = []
    ber_mmse = []
    ber_awgn = []

    # ZF等化器の係数(SNRに依存しない)
    g_zf = zf_equalizer(h, N_taps, delay)

    for snr_db in snr_db_list:
        snr_linear = 10 ** (snr_db / 10)
        sigma_w = np.sqrt(1.0 / snr_linear)

        # 送信ビットと変調
        bits = np.random.randint(0, 2, N_symbols)
        s = bpsk_modulate(bits)

        # 通信路通過 + 雑音付加
        r = np.convolve(s, h) + sigma_w * np.random.randn(N_symbols + L - 1)

        # --- ZF等化 ---
        y_zf = np.convolve(r, g_zf, mode='full')
        y_zf = y_zf[delay:delay + N_symbols]
        bits_zf = (y_zf > 0).astype(int)
        ber_zf.append(np.mean(bits_zf != bits))

        # --- MMSE等化 ---
        g_mmse = mmse_equalizer(h, N_taps, delay, snr_linear)
        y_mmse = np.convolve(r, g_mmse, mode='full')
        y_mmse = y_mmse[delay:delay + N_symbols]
        bits_mmse = (y_mmse > 0).astype(int)
        ber_mmse.append(np.mean(bits_mmse != bits))

        # --- AWGN(等化なし、ISIなし)理論値 ---
        from scipy.special import erfc
        ber_awgn.append(0.5 * erfc(np.sqrt(snr_linear)))

    return np.array(ber_zf), np.array(ber_mmse), np.array(ber_awgn)

# マルチパス通信路(深いヌルを持つ)
h = np.array([1.0, 0.8, -0.5, 0.3])
h = h / np.linalg.norm(h)  # 正規化

snr_db_list = np.arange(0, 26, 2)
ber_zf, ber_mmse, ber_awgn = simulate_ber(h, snr_db_list)

# BER曲線のプロット
plt.figure(figsize=(9, 6))
plt.semilogy(snr_db_list, ber_awgn, 'k--', linewidth=1.5, label='AWGN (no ISI)')
plt.semilogy(snr_db_list, ber_zf, 'bs-', markersize=6, linewidth=1.5, label='ZF Equalizer')
plt.semilogy(snr_db_list, ber_mmse, 'ro-', markersize=6, linewidth=1.5, label='MMSE Equalizer')
plt.xlabel('Eb/N0 [dB]', fontsize=12)
plt.ylabel('BER', fontsize=12)
plt.title('BER Comparison: ZF vs MMSE Equalization (4-tap multipath channel)', fontsize=13)
plt.grid(True, which='both', alpha=0.3)
plt.legend(fontsize=11)
plt.ylim([1e-5, 1])
plt.tight_layout()
plt.show()

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

  1. MMSE等化はZF等化よりも全SNR領域で優れたBER性能を示します。特に低〜中SNR領域(0〜15 dB付近)での差が顕著です。これはMMSE等化がISI除去と雑音増幅のバランスを最適にとっているためです。
  2. ZF等化は高SNR領域でもBERが十分に下がりきらない場合があります。この通信路は深いヌルを持つため、ZF等化器がヌル付近で大きな利得を持ち、雑音を増幅してしまうのです。一方MMSE等化は高SNRではZF等化に漸近しつつも、より良い性能を保ちます。
  3. 両方とも理想的なAWGN(ISIなし)の理論曲線には届きません。これは線形等化の限界を示しており、DFEや最尤系列推定(MLSE)等の非線形手法でさらなる改善が期待できます。

次に、通信路の周波数応答を可視化して、等化器がどのように通信路特性を補償しているかを確認しましょう。

Python実装②: 通信路と等化器の周波数応答

import numpy as np
import matplotlib.pyplot as plt

# 通信路
h = np.array([1.0, 0.8, -0.5, 0.3])
h = h / np.linalg.norm(h)

# 周波数応答の計算
N_fft = 512
omega = np.linspace(-np.pi, np.pi, N_fft)
H = np.fft.fftshift(np.fft.fft(h, N_fft))

# ZF等化器の周波数応答
G_zf = 1.0 / H

# MMSE等化器の周波数応答(SNR = 10 dB)
snr_linear = 10 ** (10 / 10)
inv_snr = 1.0 / snr_linear
G_mmse = np.conj(H) / (np.abs(H)**2 + inv_snr)

# 合成周波数応答
HG_zf = H * G_zf
HG_mmse = H * G_mmse

fig, axes = plt.subplots(2, 2, figsize=(12, 8))

# 通信路の振幅応答
axes[0, 0].plot(omega / np.pi, 20 * np.log10(np.abs(H)), 'b-', linewidth=1.5)
axes[0, 0].set_title('Channel |H(ω)| [dB]', fontsize=12)
axes[0, 0].set_xlabel('ω/π', fontsize=11)
axes[0, 0].set_ylabel('Magnitude [dB]', fontsize=11)
axes[0, 0].grid(True, alpha=0.3)

# 等化器の振幅応答
axes[0, 1].plot(omega / np.pi, 20 * np.log10(np.abs(G_zf)),
                'b-', linewidth=1.5, label='ZF')
axes[0, 1].plot(omega / np.pi, 20 * np.log10(np.abs(G_mmse)),
                'r-', linewidth=1.5, label='MMSE (10 dB)')
axes[0, 1].set_title('Equalizer |G(ω)| [dB]', fontsize=12)
axes[0, 1].set_xlabel('ω/π', fontsize=11)
axes[0, 1].set_ylabel('Magnitude [dB]', fontsize=11)
axes[0, 1].legend(fontsize=10)
axes[0, 1].grid(True, alpha=0.3)

# 合成振幅応答
axes[1, 0].plot(omega / np.pi, 20 * np.log10(np.abs(HG_zf)),
                'b-', linewidth=1.5, label='ZF')
axes[1, 0].plot(omega / np.pi, 20 * np.log10(np.abs(HG_mmse)),
                'r-', linewidth=1.5, label='MMSE (10 dB)')
axes[1, 0].set_title('Combined |H(ω)G(ω)| [dB]', fontsize=12)
axes[1, 0].set_xlabel('ω/π', fontsize=11)
axes[1, 0].set_ylabel('Magnitude [dB]', fontsize=11)
axes[1, 0].legend(fontsize=10)
axes[1, 0].set_ylim([-10, 5])
axes[1, 0].grid(True, alpha=0.3)

# 雑音増幅の比較
noise_gain_zf = np.abs(G_zf)**2
noise_gain_mmse = np.abs(G_mmse)**2
axes[1, 1].plot(omega / np.pi, 10 * np.log10(noise_gain_zf),
                'b-', linewidth=1.5, label='ZF')
axes[1, 1].plot(omega / np.pi, 10 * np.log10(noise_gain_mmse),
                'r-', linewidth=1.5, label='MMSE (10 dB)')
axes[1, 1].set_title('Noise Enhancement |G(ω)|² [dB]', fontsize=12)
axes[1, 1].set_xlabel('ω/π', fontsize=11)
axes[1, 1].set_ylabel('Noise gain [dB]', fontsize=11)
axes[1, 1].legend(fontsize=10)
axes[1, 1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

この4枚のグラフから、ZFとMMSEの違いが視覚的に明確になります。

  1. 左上(通信路の振幅応答): 通信路は特定の周波数で深い落ち込み(ヌル)を持っています。この周波数帯の信号成分は大幅に減衰します。
  2. 右上(等化器の振幅応答): ZF等化器は通信路のヌルに対応する周波数で非常に大きな利得を持ちます(通信路の逆特性)。一方、MMSE等化器はヌル付近の利得が抑制されています。
  3. 左下(合成振幅応答): ZF等化では $|H \cdot G| = 0$ dB(完全に平坦)ですが、MMSE等化ではヌル付近でわずかに落ち込みます。これはMMSEがISI除去を不完全にする代わりに雑音増幅を抑えていることの表れです。
  4. 右下(雑音増幅): ZF等化の雑音増幅はヌル付近で極端に大きくなるのに対し、MMSE等化の雑音増幅は全帯域にわたって穏やかです。この差がBER性能の差に直結しています。

Python実装③: LMS適応等化の収束過程

最後に、LMS適応等化器のリアルタイムな収束過程を可視化します。トレーニングシーケンスを使って等化器の係数が最適値に収束していく様子と、その後の判定指向モードでの追従を確認します。

import numpy as np
import matplotlib.pyplot as plt

def lms_equalizer_simulation(h, N_train, N_data, N_taps, mu, snr_db):
    """LMS適応等化のシミュレーション"""
    L = len(h)
    delay = (N_taps + L - 2) // 2
    N_total = N_train + N_data
    snr_linear = 10 ** (snr_db / 10)
    sigma_w = np.sqrt(1.0 / snr_linear)

    # 送信シンボル(BPSK)
    bits = np.random.randint(0, 2, N_total)
    s = 2 * bits - 1

    # 通信路通過 + 雑音
    r_full = np.convolve(s, h) + sigma_w * np.random.randn(N_total + L - 1)

    # 等化器の初期化
    g = np.zeros(N_taps)
    g[delay] = 1.0  # センタータップ初期化

    mse_history = []
    coeff_history = []
    errors = []

    for n in range(delay, N_total):
        # 受信信号ベクトル
        r_vec = r_full[n:n - N_taps:-1] if n >= N_taps else np.zeros(N_taps)
        if n >= N_taps:
            r_vec = r_full[n - N_taps + 1:n + 1][::-1]
        else:
            temp = r_full[:n + 1][::-1]
            r_vec = np.zeros(N_taps)
            r_vec[:len(temp)] = temp

        # 等化器出力
        s_hat = np.dot(g, r_vec)

        # 所望信号の選択
        desired_idx = n - delay
        if desired_idx < 0 or desired_idx >= N_total:
            continue

        if n - delay < N_train:
            # トレーニングフェーズ: 既知シンボルを使用
            d_n = s[desired_idx]
        else:
            # 判定指向フェーズ: 判定結果を使用
            d_n = np.sign(s_hat) if s_hat != 0 else 1.0

        # 誤差
        e_n = d_n - s_hat
        errors.append(e_n)

        # 係数更新
        g = g + mu * e_n * r_vec

        # MSE記録(移動平均)
        mse_history.append(e_n ** 2)
        coeff_history.append(g.copy())

    return mse_history, coeff_history, errors, delay

# パラメータ設定
h = np.array([1.0, 0.8, -0.5, 0.3])
h = h / np.linalg.norm(h)

N_train = 500     # トレーニングシンボル数
N_data = 1500     # データシンボル数
N_taps = 11       # 等化器タップ数
mu = 0.03         # ステップサイズ
snr_db = 15       # SNR

mse_hist, coeff_hist, errors, delay = lms_equalizer_simulation(
    h, N_train, N_data, N_taps, mu, snr_db
)

# 移動平均MSE
window = 50
mse_arr = np.array(mse_hist)
mse_smooth = np.convolve(mse_arr, np.ones(window)/window, mode='valid')

上のコードでは、4タップのマルチパス通信路に対してLMS適応等化器を動作させ、トレーニングフェーズ(500シンボル)と判定指向フェーズ(1500シンボル)を通してシミュレーションを実行しています。等化器はセンタータップを1に初期化し、各シンボルごとにLMS更新則で係数を逐次更新しながら、MSE・係数・誤差の履歴を記録します。最後に、MSE系列に対してウィンドウ幅50の移動平均を適用し、確率的変動を平滑化した学習曲線を準備しています。

続けて、得られた結果を4枚のグラフで可視化します。

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(12, 8))

# 1. 学習曲線(MSE vs イテレーション)
axes[0, 0].semilogy(mse_smooth, 'b-', linewidth=0.8, alpha=0.8)
axes[0, 0].axvline(x=N_train, color='r', linestyle='--',
                     linewidth=1.5, label='Training → DD')
axes[0, 0].set_title('Learning Curve (MSE)', fontsize=12)
axes[0, 0].set_xlabel('Iteration', fontsize=11)
axes[0, 0].set_ylabel('MSE', fontsize=11)
axes[0, 0].legend(fontsize=10)
axes[0, 0].grid(True, alpha=0.3)

# 2. 等化器係数の収束
coeff_arr = np.array(coeff_hist)
for i in range(min(N_taps, 6)):
    axes[0, 1].plot(coeff_arr[:, i], linewidth=0.8, label=f'g[{i}]')
axes[0, 1].axvline(x=N_train, color='r', linestyle='--', linewidth=1.5)
axes[0, 1].set_title('Equalizer Coefficients', fontsize=12)
axes[0, 1].set_xlabel('Iteration', fontsize=11)
axes[0, 1].set_ylabel('Coefficient value', fontsize=11)
axes[0, 1].legend(fontsize=8, ncol=2)
axes[0, 1].grid(True, alpha=0.3)

# 3. 誤差信号
axes[1, 0].plot(errors[:300], 'b-', linewidth=0.5, alpha=0.7)
axes[1, 0].set_title('Error Signal (first 300 symbols)', fontsize=12)
axes[1, 0].set_xlabel('Symbol index', fontsize=11)
axes[1, 0].set_ylabel('Error e[n]', fontsize=11)
axes[1, 0].grid(True, alpha=0.3)

# 4. 異なるステップサイズの比較
mu_list = [0.005, 0.01, 0.03, 0.08]
for mu_val in mu_list:
    mse_h, _, _, _ = lms_equalizer_simulation(
        h, N_train, N_data, N_taps, mu_val, snr_db
    )
    mse_s = np.convolve(np.array(mse_h),
                         np.ones(window)/window, mode='valid')
    axes[1, 1].semilogy(mse_s, linewidth=1.2, label=f'μ={mu_val}')

axes[1, 1].axvline(x=N_train, color='r', linestyle='--', linewidth=1.5)
axes[1, 1].set_title('Effect of Step Size μ', fontsize=12)
axes[1, 1].set_xlabel('Iteration', fontsize=11)
axes[1, 1].set_ylabel('MSE', fontsize=11)
axes[1, 1].legend(fontsize=10)
axes[1, 1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

この4枚のグラフから、適応等化の振る舞いについて以下のことがわかります。

  1. 左上(学習曲線): MSEは初期の数十イテレーションで急速に減少し、その後定常状態に収束します。赤い破線で示したトレーニング期間から判定指向期間への切り替え後も、MSEが大きく変動しないことから、等化器が十分に収束した状態で判定指向モードに移行できていることがわかります。
  2. 右上(係数の収束): 各タップ係数が初期値(センタータップ = 1, 他 = 0)から最適値に向かって収束していく過程が見えます。係数の変動が小さくなる速度が収束速度に対応し、ステップサイズ $\mu$ に依存します。
  3. 左下(誤差信号): 最初の数十シンボルでは大きな誤差が見られますが、等化器の学習が進むにつれて誤差の振幅が減少していきます。完全にゼロにならないのは、雑音と残留ISIのためです。
  4. 右下(ステップサイズの影響): $\mu$ が大きいほど収束は速いですが、定常状態のMSEも大きくなります(ミスアジャストメント)。$\mu$ が小さすぎると収束に非常に長い時間がかかります。実用的には $\mu = 0.01$ 〜 $0.03$ 程度が良好なバランスを示しています。これは理論で予測した「収束速度と定常状態誤差のトレードオフ」を実験的に確認した結果です。

まとめ

本記事では、ディジタル通信における等化器(イコライザ)の設計について、理論と実装の両面から解説しました。

  • ISIの発生メカニズム: マルチパス通信路による畳み込みが原因で、隣接シンボルが干渉し合うISIが発生します。等化器は通信路の逆特性に近いフィルタをかけることでISIを除去します
  • ZF等化とMMSE等化: ZF等化はISIを完全に除去しますが、通信路のヌル付近で雑音を大幅に増幅する弱点があります。MMSE等化はISI除去と雑音抑制のバランスを最適にとり、全SNR領域でZFを上回る性能を示します
  • 判定帰還等化(DFE): 線形等化の限界を打破するため、判定済みシンボルを帰還して後行ISIを直接除去します。雑音増幅なしにISIを除去でき、大幅な性能向上が得られますが、誤り伝搬の問題があります
  • 適応等化: 時変通信路に追従するため、LMSアルゴリズムで等化器の係数をリアルタイムに更新します。ステップサイズの選択が収束速度と定常誤差のトレードオフを決定します
  • トレーニング/ブラインド等化: トレーニングシーケンスを用いた方法が基本ですが、CMAのようなブラインド等化により帯域効率を改善できます
  • OFDMの1タップ等化: 巡回接頭辞の導入により、各サブキャリアで独立な1タップ等化が可能になり、等化の計算量が劇的に削減されます

等化器の理論は、現代の無線通信規格(5G NR、Wi-Fi 6/7)や有線通信(光ファイバー)の根幹をなす技術です。本記事で扱った基本原理を押さえた上で、さらに深い理解を目指す場合は以下のトピックに進むとよいでしょう。

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