ターボ符号

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ターボ符号(ターボふごう、: Turbo code)は、1993年に開発された高性能な誤り訂正符号であり、宇宙探査機での通信など、ノイズのある限られた帯域幅で情報転送量を可能な限り最大化したい場合に使われている。

利点と欠点[編集]

既知の誤り訂正符号の中では、ターボ符号と低密度パリティ検査符号 (LDPC) がシャノン限界(ノイズのある伝送路における最大情報転送量の理論的限界値)に最も近い。

ターボ符号は送信機の出力を上げずにデータレートを上げることができ、逆に言えばあるデータレートでの消費電力を低減できる。主な欠点は、復号処理が複雑でレイテンシが比較的大きい点であり、このため低レイテンシが重視される用途には向かない。宇宙探査機ではレイテンシは大きな問題ではない(距離が非常に大きいため、電波が光速で伝播する際のレイテンシ自体が大きいから)

ターボ符号以前には、LDPCの実用的実装も開発されていなかったため、シャノン限界に最も近い技法としては、リード・ソロモン誤り訂正ブロック符号ビタビ復号の短拘束長畳み込み符号を組み合わせた RSV 符号があった。

これらのアルゴリズムは複雑であり、ソフトウェア特許で守られているため、システムに採用するのを避ける場合がある。

歴史[編集]

1993年、Claude Berrou、Alain Glavieux、Punya Thitimajshima(ENSTブルターニュ)が論文 "Near Shannon Limit error-correcting coding and decoding: Turbo-codes" を Proceedings of IEEE International Communications Conference で発表した[1]。Berrou は「80年代末に確率過程の面白さを教えてくれた G. Battail、J. Hagenauer、P. Hoeher に負うところがある」としている。また、「R. Gallager と M. Tanner はこれと非常に近い原理の符号化・復号技法を既に構想していた」とも書いているが、当時は必要な計算ができていなかった[1]

符号化[編集]

符号器はビット列を3つのサブブロックとして送信する。第一のサブブロックは m-ビットのペイロードデータである。第二のサブブロックはそのペイロードデータの n/2 パリティビット列であり、再帰系統的畳み込み符号(RSC符号)を使って計算する。第三のサブブロックはペイロードデータの既知の並べ替えn/2 パリティビット列であり、こちらもRSC畳み込み符号を使って計算する。従って、ペイロードと共に2つの冗長だが異なるパリティビット列が送信される。ブロック長は m+n ビットであり、符号レートは m/(m+n) である。ペイロードデータの並べ替えは、インターリーバ(interleaver)というデバイスを使う。

ハードウェアによるターボ符号器は2つのRSC符号器 C1 と C2 から構成され、これらの出力を並列連結と呼ばれる手法で連結する。

Turbo encoder.svg

入力ビット列 dk は C1 にはそのまま入力され、C2 にはインターリーバを通して並べ替えた上で入力される。出力は、入力 dk をそのまま出力する系統出力 xk と C1 の出力 y1k、C2 の出力 y2k がある。

復号[編集]

復号器も符号器と似たような形で構築され、2つの復号器を相互接続するが、こちらは直列接続であって並列接続ではない。一段目の復号器 DEC1 が符号器 C1 に対応し、二段目の復号器 DEC2 が符号器 C2 に対応している。DEC1 は軟判定を行い、それによって L1 の遅延が生じる。同じ遅延は符号器のインタリーバ部分にあるレジスタでも生じる。DEC2 では L2 の遅延を生じる。

Turbo decoder.svg

2つの復号器の中間にインターリーバが置かれ、DEC1 の出力におけるバースト誤りを分散させる。受信信号のうち xk はそのまま DEC1 に入力されるが、y1k または y2k に相当する部分はデマルチプレクサによって DEC1DEC2 に振り分けられる。

伝送路が履歴の影響がないガウスノイズのある加算的伝送路(AWGN)とし、反復が k 番目の場合、復号器は以下のような確率変数の対を受け取る。

~x_k=(2d_k-1)+a_k,
~y_k=2(Y_k-1)+b_k

ここで akbk は独立ノイズ成分であり、共に分散は σ2 である。Ykyk 符号器出力の k 番目のビットである。

冗長情報はデマルチプレックスされた後、(yk=y1k のとき)DEC1 に送られるか(yk=y2k のとき)DEC2 に送られる。

DEC1 は軟判定を行う。すなわち、

\Lambda(d_k)=\log\frac{p(d_k=1)}{p(d_k=0)}

であり、その結果を DEC2 に渡す。Λ(dk) は logarithm of likelihood ratio (LLR) と呼ばれる。p(dk=i), i=0,1 は dk データビットの事後確率(APP)であり、受信した dki と解釈する確率を示している。LLR を考慮することで、DEC2 は硬判定、すなわち復号を行う。

ビタビアルゴリズムではAPPを計算できないことが知られている。そのため DEC1 には使えない。その代わりに修正を加えたBCJRアルゴリズムを使う。DEC2 にはビタビアルゴリズムがよく使われる。

なお、ここで示した流れは最適ではない。DEC1 は利用可能な冗長情報の一部しか使っていない。一般に DEC2 の出力を DEC1フィードバックすることで最適化する。

軟判定手法[編集]

復号器の前半部はデータストリームの各ビットについて、ある整数値を生成する。この整数はそのビットが 0 または 1 である確からしさを示すものである。例えば、その整数が [-127, 127] の範囲とした場合、

  • -127 なら「確実に 0 である」
  • -100 なら「ほぼ確実に 0 である」
  • 0 なら「0 または 1 のどちらかである」
  • 100 なら「ほぼ確実に 1 である」
  • 127 なら「確実に 1 である」

などと解釈できる。

これはフロントエンドからのデータストリームに確率的な面を導入するが、単にビットが0か1かというよりも多くの情報を伝えられる。

例えば、従来型の無線受信機のフロントエンドなら、各ビットは信号の電圧が所定のしきい電圧の上か下かで判別されていた。ターボ符号の復号器の場合、フロントエンドは電圧がしきい値からどれだけ離れているかを数値的に表すことになる。

m+n ビットのデータブロックを復号するため、復号器のフロントエンドは個々のビットの可能性測度をまとめた可能性測度のブロックを生成する。2つの並列の復号器が、それぞれ n/2 ビットのパリティサブブロックを扱う。これら復号器はペイロードデータのために m 個の可能性測度のサブブロックを使う。2番目のパリティのサブブロックを扱う復号器は、符号器が行った並べ替えを知っている。

2つのビットパターン仮説[編集]

ターボ符号の鍵となる発明は、可能性データをどのように使って2つの復号器の違いを調和させるかという点である。2つの畳み込み復号器はそれぞれ m ビットのパターンの仮説(と可能性)を生成する。仮説ビットパターンを比較し、差異があれば、復号器は仮説内の各ビットに対応した可能性測度を交換する。それぞれの復号器はもう一方の復号器が生成した可能性測度列を持っていて、それを使って新たな仮説ビットパターンを生成する。その後、それらは新たな仮説を比較する。このような反復プロセスは2つの復号器が同じ仮説ビットパターンで合意するまで繰り返され、通常15から18回反復される。

これは、言ってみればクロスワードパズル数独を解くようなものである。部分的に解かれ一部改ざんされた可能性のあるクロスワードパズルを2人の人間(=復号器)が解くことを想定してみよう。1人は縦のヒント(パリティビット)だけを処理し、もう1人は横のヒントだけを処理する。2人はまず自分の持つヒントに基づいてパズルを解き、それぞれの文字についてどれだけ自信があるかを添える。そして、それぞれの結果を比較し、互いに解と自信度を交換し、どこがどう違うのかを知る。この新たな知識に基づいて、解と自信度を更新し、最終的に同じ解になるまでこれを繰り返すのである。

ターボ符号の具体的応用[編集]

ベイズ的定式化[編集]

人工知能の観点では、ターボ符号はベイジアンネットワークでのループのある確率伝播と見なすことができる。

関連項目[編集]

脚注[編集]

外部リンク[編集]