(57)【要約】【課題】規模を削減する。【解決手段】メッセージを用いて、LDPC符号を定義する検査行列に基づき、バリアブルノードの演算、又はチェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算部２０１は、バリアブルノードの演算、又はチェックノードの演算に用いるメッセージを一時記憶することにより遅延する小FIFOメモリ３１７を有する。小FIFOメモリ３１７は、検査行列の重みの最大値よりも少ない数のメッセージを記憶する。本発明は、例えば、LDPC符号を復号する復号装置に適用できる。【選択図】図２６
2008278187.tif 000002
【特許請求の範囲】
【請求項１】
LDPC(Low Density Parity Check)符号を復号する復号装置において、
前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段と、
前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段と
を備え、
前記メッセージ計算手段は、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリを有し、
前記遅延メモリは、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する
復号装置。
【請求項２】
前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から２回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行う制御手段をさらに備え、
前記メッセージ計算手段は、前記記憶手段から２回読み出される同一のメッセージのうちの１回目に読み出されるメッセージが供給されるポートと、２回目に読み出されるメッセージが供給されるポートとの２つのポートを有する
請求項１に記載の復号装置。
【請求項３】
前記遅延メモリで遅延されたメッセージと、前記記憶手段から２回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段をさらに備える
請求項２に記載の復号装置。
【請求項４】
前記制御手段は、さらに、
前記バリアブルノードの演算において、前記バリアブルノードに対応する前記検査行列の列の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記列の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択し、
前記チェックノードの演算において、前記チェックノードに対応する前記検査行列の行の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記行の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択する
ように、前記選択手段を制御する
請求項３に記載の復号装置。
【請求項５】
前記メッセージ計算手段は、
前記バリアブルノードの演算を行う回路と、前記チェックノードの演算を行う回路との一部が共有化されており、
前記バリアブルノードの演算と、前記チェックノードの演算とを、選択的に行う
請求項４に記載の復号装置。
【請求項６】
前記メッセージ計算手段は、
チェックノードに入力される入力データxに対して、非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力する１のLUT(Look Up Table)と、
チェックノードから出力された出力データxに対して、前記非線形関数の逆関数φ-1(x)=2tanh-1(e-x)の演算結果を出力する他の１のLUTと
を有し、
チェックノードの演算時には、データを、前記１のLUTと他の１のLUTを経由させ、
バリアブルノードの演算時には、データを、前記１のLUTと他の１のLUTをバイパスさせる
請求項５に記載の復号装置。
【請求項７】
前記メッセージ計算手段は、チェックノードに入力される入力データxに対して、逆関数φ-1(x)=2tanh-1(e-x)と同一の演算結果が得られる非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力するとともに、バリアブルノードに入力される入力データxに対して、前記逆関数φ-1(x)の演算結果を出力するLUT(Look Up Table)を有する
請求項５に記載の復号装置。
【請求項８】
前記メッセージ計算手段は、バリアブルノードから出力された出力データxに対して、逆関数φ-1(x)=2tanh-1(e-x)と同一の演算結果が得られる非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力するとともに、チェックノードから出力された出力データxに対して、前記逆関数φ-1(x)の演算結果を出力するLUT(Look Up Table)を有する
請求項５に記載の復号装置。
【請求項９】
前記記憶手段は、２以上のバンクを有する
請求項５に記載の復号装置。
【請求項１０】
LDPC(Low Density Parity Check)符号を復号する復号装置を制御する制御方法において、
前記復号装置は、
前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段と、
前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段と
を備え、
前記メッセージ計算手段は、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリを有し、
前記遅延メモリは、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する場合において、
前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から２回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行い、
前記バリアブルノードの演算において、前記バリアブルノードに対応する前記検査行列の列の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記列の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択し、
前記チェックノードの演算において、前記チェックノードに対応する前記検査行列の行の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記行の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択する
ように、前記遅延メモリで遅延されたメッセージと、前記記憶手段から２回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段を制御する
ステップを含む制御方法。
【請求項１１】
LDPC(Low Density Parity Check)符号を復号する復号装置を制御するコンピュータに実行させるプログラムにおいて、
前記復号装置は、
前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段と、
前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段と
を備え、
前記メッセージ計算手段は、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリを有し、
前記遅延メモリは、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する場合において、
前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から２回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行い、
前記バリアブルノードの演算において、前記バリアブルノードに対応する前記検査行列の列の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記列の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択し、
前記チェックノードの演算において、前記チェックノードに対応する前記検査行列の行の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記行の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択する
ように、前記遅延メモリで遅延されたメッセージと、前記記憶手段から２回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段を制御する
ステップを含む制御処理を、コンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、復号装置、制御方法、及びプログラムに関し、特に、例えば、LDPC(Low Density Parity Check)符号を復号する復号装置の規模を削減することができるようにする復号装置、制御方法、及びプログラムに関する。
【背景技術】
【０００２】
近年、例えば、移動体通信や深宇宙通信といった通信分野、及び地上波又は衛星ディジタル放送といった放送分野の研究が著しく進められているが、それに伴い、誤り訂正符号化及び復号の効率化を目的として符号理論に関する研究も盛んに行われている。
【０００３】
符号性能の理論的限界としては、いわゆるシャノン(C. E. Shannon)の通信路符号化定理によって与えられるシャノン限界が知られている。符号理論に関する研究は、このシャノン限界に近い性能を示す符号を開発することを目的として行われている。近年では、シャノン限界に近い性能を示す符号化方法として、例えば、並列連接畳み込み符号(PCCC(Parallel Concatenated Convolutional Codes))や、縦列連接畳み込み符号(SCCC(Serially Concatenated Convolutional Codes))といった、いわゆるターボ符号化(Turbo coding)と呼ばれる手法が開発されている。また、これらのターボ符号が開発される一方で、古くから知られる符号化方法である低密度パリティ検査符号(Low Density Parity Check codes)（以下、LDPC符号という）が脚光を浴びつつある。
【０００４】
LDPC符号は、R. G. Gallagerによる「R. G. Gallager, "Low Density Parity Check Codes", Cambridge, Massachusetts: M. I. T. Press, 1963」において最初に提案されたものであり、その後、「D. J. C. MacKay, "Good error correcting codes based on very sparse matrices", Submitted to IEEE Trans. Inf. Theory, IT-45, pp. 399-431, 1999」や、「M. G. Luby, M. Mitzenmacher, M. A. Shokrollahi and D. A. Spielman, "Analysis of low density codes and improved designs using irregular graphs", in Proceedings of ACM Symposium on Theory of Computing, pp. 249-258, 1998」等において再注目されるに至ったものである。
【０００５】
LDPC符号は、近年の研究により、ターボ符号等と同様に、符号長を長くしていくに従って、シャノン限界に近い性能が得られることがわかりつつある。また、LDPC符号は、最小距離が符号長に比例するという性質があることから、その特徴として、ブロック誤り確率特性がよく、さらに、ターボ符号等の復号特性において観測される、いわゆるエラーフロア現象が殆ど生じないことが利点として挙げられる。
【０００６】
以下、このようなLDPC符号について具体的に説明する。なお、LDPC符号は、線形符号であり、必ずしも２元である必要はないが、ここでは、２元であるものとして説明する。
【０００７】
LDPC符号は、そのLDPC符号を定義する検査行列(parity check matrix)が疎なものであることを最大の特徴とするものである。ここで、疎な行列とは、行列のコンポーネントの"1"の個数が非常に少なく構成されるものであり、疎な検査行列をHで表すものとすると、そのような検査行列Hとしては、例えば、図１に示すように、各列のハミング重み（"1"の数）(weight)が"3"であり、且つ、各行のハミング重みが"6"であるもの等がある。
【０００８】
このように、各行及び各列のハミング重みが一定である検査行列Hによって定義されるLDPC符号は、レギュラーLDPC符号と称される。一方、各行及び各列のハミング重みが一定でない検査行列Hによって定義されるLDPC符号は、イレギュラーLDPC符号と称される。
【０００９】
このようなLDPC符号による符号化は、検査行列Hに基づいて生成行列Gを生成し、この生成行列Gを２元の情報メッセージに対して乗算することによって符号語を生成することで実現される。具体的には、LDPC符号による符号化を行う符号化装置は、まず、検査行列Hの転置行列HTとの間に、式GHT=0が成立する生成行列Gを算出する。ここで、生成行列Gが、k×n行列である場合には、符号化装置は、生成行列Gに対してkビットからなる情報メッセージ（ベクトルu）を乗算し、nビットからなる符号語ｃ（＝uＧ）を生成する。この符号化装置によって生成された符号語は、値が"0"の符号ビットが"+1"に、値が"1"の符号ビットが"−1"にといったようにマッピングされて送信され、所定の通信路を介して受信側において受信されることになる。
【００１０】
一方、LDPC符号の復号は、Gallagerが確率復号(Probabilistic Decoding)と称して提案したアルゴリズムであって、バリアブルノード(variable node（メッセージノード(message node)とも呼ばれる。）)と、チェックノード(check node)とからなる、いわゆるタナーグラフ(Tanner graph)上での確率伝播(belief propagation)によるメッセージ・パッシング・アルゴリズムによって行うことが可能である。ここで、以下、適宜、バリアブルノードとチェックノードを、単に、ノードともいう。
【００１１】
しかしながら、確率復号においては、各ノード間で受け渡されるメッセージが実数値であることから、解析的に解くためには、連続した値をとるメッセージの確率分布そのもを追跡する必要があり、非常に困難を伴う解析を必要とすることになる。そこで、Gallagerは、LDPC符号の復号アルゴリズムとして、アルゴリズムＡ又はアルゴリズムＢを提案している。
【００１２】
LDPC符号の復号は、例えば、図２に示すような手順に従って行われる。なお、ここでは、符号長の長さのLDPC符号の受信データのi番目をU0(u0i)とし、チェックノードから出力されるj番目のメッセージ（チェックノードに接続しているj番目の枝から出力されるメッセージ）をujとし、バリアブルノードから出力されるi番目のメッセージ（バリアブルノードに接続しているi番目の枝から出力されるメッセージ）をviとする。また、ここでは、メッセージとは、値の"0"らしさを表す、いわゆる対数尤度比(log likelihood ratio)等を表現する実数値である。
【００１３】
まず、LDPC符号の復号においては、図２に示すように、ステップＳ１１において、受信データU0(u0i)が受信され、メッセージujが"0"に初期化されるとともに、繰り返し処理のカウンタとしての整数をとる変数kが"0"に初期化され、処理は、ステップＳ１２に進む。ステップＳ１２において、受信データU0(u0i)を用いて、式（１）に示すバリアブルノードの演算を行うことによってメッセージviが求められ、さらに、このメッセージviを用いて、式（２）に示すチェックノードの演算を行うことによってメッセージujが求められる。
【００１４】
【数１】
2008278187.tif 000003
・・・（１）
【００１５】
【数２】
2008278187.tif 000004
・・・（２）
【００１６】
ここで、式（１）と式（２）におけるdvとdcは、それぞれ、検査行列Hの縦方向（列）と横方向（行）の"1"の個数、つまり、列の重み（ハミング重み）と行の重みを示す任意に選択可能とされるパラメータであり、例えば、(3,6)符号の場合には、dv=3，dc=6となる。
【００１７】
なお、式（１）又は（２）の演算においては、それぞれ、メッセージを出力しようとする枝(edge)から入力されたメッセージを、和又は積演算の対象としては用いないことから、和又は積演算の範囲が、１ないしdv-1又は１ないしdc-1となっている。また、式（２）に示す演算は、２入力v1，v2に対して１が得られるる式（３）に示す関数R(v1,v2)のテーブルを予め作成しておき、これを式（４）に示すように連続的（再帰的）に用いることによって行うことができる。
【００１８】
【数３】
2008278187.tif 000005
・・・（３）
【００１９】
【数４】
2008278187.tif 000006
・・・（４）
【００２０】
ステップＳ１２では、さらに、変数kが"1"だけインクリメントされ、処理は、ステップＳ１３に進む。ステップＳ１３では、変数kが所定の繰り返し復号回数N以上であるか否かが判定される。ステップＳ１３において、変数kがN以上ではないと判定された場合、処理は、ステップＳ１２に戻り、以下、同様の処理が繰り返される。
【００２１】
また、ステップＳ１３において、変数kがN以上であると判定された場合、処理は、ステップＳ１４に進み、式（５）に示す演算を行うことによって最終的に出力する復号結果としてのメッセージvが求められて出力され、LDPC符号の復号処理が終了する。
【００２２】
【数５】
2008278187.tif 000007
・・・（５）
【００２３】
ここで、式（５）の演算は、式（１）の演算とは異なり、バリアブルノードに接続している全ての枝からのメッセージujを用いて行われる。
【００２４】
このようなLDPC符号の復号では、例えば(3,6)符号の場合には、図３に示すように、各ノード間でメッセージの授受が行われる。なお、図３において"="（イコール）で示すノードは、バリアブルノードを表し、式（１）に示したバリアブルノードの演算が行われる。また、図３において"+"（プラス）で示すノードは、チェックノードを表し、式（２）に示したチェックノードの演算が行われる。特に、アルゴリズムＡにおいては、メッセージを２元化し、"+"で示すチェックノードにて、dc-1個の入力メッセージ（チェックノードに入力されるメッセージvi）の排他的論理和演算を行い、"="で示すバリアブルノードにて、受信データRに対して、dv-1個の入力メッセージ（バリアブルノードに入力されるメッセージuj）が全て異なるビット値であった場合には、符号を反転して出力する。
【００２５】
また、近年、LDPC符号の復号の実装法に関する研究も行われている。実装方法について述べる前に、まず、LDPC符号の復号を摸式化して説明する。
【００２６】
図４は、(3,6)符号のLDPC符号（符号化率1/2、符号長12）の検査行列(parity check matrix)Hの例である。LDPC符号の検査行列Hは、図５のように、タナーグラフを用いて書き表すことができる。ここで、図５において、"+"で表されるのが、チェックノードであり、"="で表されるのが、バリアブルノードである。チェックノードとバリアブルノードは、それぞれ、検査行列の行と列に対応する。チェックノードとバリアブルノードとの間の結線は、枝(edge)であり、検査行列Hの"1"に相当する。すなわち、検査行列の第ｊ行第ｉ列のコンポーネントが１である場合には、図５において、上からｉ番目のバリアブルノード（"="のノード）と、上からｊ番目のチェックノード（"+"のノード）とが、枝により接続される。枝は、バリアブルノードに対応するLDPC符号（の受信データ）のビットが、チェックノードに対応する拘束条件を持つことを表す。なお、図５は、図４の検査行列Hのタナーグラフとなっている。
【００２７】
LDPC符号の復号方法であるサムプロダクトアルゴリズム(Sum Product Algorithm)は、バリアブルノードの演算とチェックノードの演算とを繰り返し行う。
【００２８】
バリアブルノードでは、図６のように、式（１）のバリアブルノードの演算を行う。すなわち、図６において、バリアブルノードに接続している枝のうちのi番目の枝に対応するメッセージviは、バリアブルノードに接続している残りの枝からのメッセージu1及びu2と、受信データu0iとを用いて計算される。他の枝に対応するメッセージも同様に計算される。
【００２９】
チェックノードの演算について説明する前に、式（２）を、式a×b=exp{ln(|a|)+ln(|b|)}×sign(a)×sign(b)の関係を用いて、式（６）のように書き直す。但し、sign(x)は、x≧0のとき1（論理０）であり、x＜0のとき-1（論理１）である。
【００３０】
【数６】
2008278187.tif 000008
・・・（６）
【００３１】
さらに、x≧0において、非線形関数φ(x)=-ln(tanh(x/2))を定義すると、その逆関数φ-1(x)は、式φ-1(x)=2tanh-1(e-x)で表されるから、式（６）は、式（７）のように書くことができる。
【００３２】
【数７】
2008278187.tif 000009
・・・（７）
【００３３】
チェックノードでは、図７のように、式（７）のチェックノードの演算を行う。すなわち、図７において、チェックノードに接続している枝のうちのj番目の枝に対応するメッセージujは、チェックノードに繋がっている残りの枝からのメッセージv1,v2,v3,v4,v5を用いて計算される。他の枝に対応するメッセージも同様に計算される。
【００３４】
なお、関数φ(x)は、φ(x)=ln((ex+1)/(ex-1))とも表すことができ、x＞0において、φ(x)=φ-1(x)、すなわち、非線形関数φ(x)の演算結果と、その逆関数φ-1(x)の演算結果とは同一である。関数φ(x)及びφ-1(x)をハードウェアに実装する際には、LUT(Look Up Table)を用いて実装される場合があるが、両者は同一のLUTとなる。
【００３５】
また、式（１）のバリアブルノードの演算は、式（５）と、次の式（８）とに分けることができる。
【００３６】
【数８】
2008278187.tif 000010
・・・（８）
【００３７】
したがって、式（５）及び式（８）と、式（７）の演算を繰り返し行うことにより、式（１）のバリアブルノードの演算と、式（７）のチェックノードの演算を繰り返し行うことができる。この場合、式（５）及び式（８）のバリアブルノードの演算のうちの、式（５）の演算の結果を、そのまま、最終的な復号結果とすることができる。
【００３８】
サムプロダクトアルゴリズムをハードウェアに実装して、復号装置とする場合、式（１）（、又は式（５）及び式（８））で表されるバリアブルノード演算（バリアブルノードの演算）及び式（７）で表されるチェックノード演算（チェックノードの演算）を、適度な回路規模と動作周波数で繰り返し行うことが必要である。
【００３９】
復号装置の実装の例として、単純に各ノードの演算を一つずつ順次行うことによって復号を行うフルシリアルの復号(full serial decoding)の実装法について説明する。
【００４０】
図８は、LDPC符号の復号を行う復号装置の構成例を示している。
【００４１】
図８の復号装置では、動作クロックの１クロック(clock)ごとに、１つの枝に対応するメッセージが計算される。
【００４２】
すなわち、図８の復号装置は、メッセージ計算部１０１、メッセージメモリ１０４、受信データメモリ１０５、制御部１０６からなる。また、メッセージ計算部１０１は、バリアブルノード計算器１０２とチェックノード計算器１０３とから構成されている。
【００４３】
図８の復号装置では、メッセージメモリ１０４からメッセージ計算部１０１に、メッセージが１つずつ読み出され、メッセージ計算部１０１において、そのメッセージを用いて、所望の枝に対応するメッセージが計算される。そして、その計算によって求められたメッセージが、メッセージメモリ１０４に格納されていく。図８の復号装置では、以上の処理が繰り返し行われ、いわゆる繰り返し復号が行われる。
【００４４】
すなわち、受信データメモリ１０５には、送信されてきたLDPC符号を受信することにより得られる、符号の0（又は1）らしさを表す対数尤度比である受信データ（LDPC符号）D100が供給され、受信データメモリ１０５は、その受信データD100を格納（記憶）する。
【００４５】
バリアブルノード演算時には、受信データメモリ１０５は、制御部１０６から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部１０１のバリアブルノード計算器１０２に供給する。
【００４６】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部１０６から供給される制御信号に従って、記憶しているメッセージ（チェックノードメッセージuj）D102を読み出し、バリアブルノード計算器１０２に供給する。バリアブルノード計算器１０２は、メッセージメモリ１０４から供給されるメッセージD102と受信データメモリ１０５から供給される受信データD101を用い、式（１）のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ（バリアブルノードメッセージ）viを、メッセージD103として、メッセージメモリ１０４に供給する。
【００４７】
そして、メッセージメモリ１０４は、以上のようにしてバリアブルノード計算器１０２から供給されるメッセージD103を記憶する。
【００４８】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部１０６から供給される制御信号に従って、記憶しているバリアブルノードメッセージviを、メッセージD104として読み出し、チェックノード計算器１０３に供給する。
【００４９】
チェックノード計算器１０３は、メッセージメモリ１０４から供給されるメッセージD104を用いて、式（７）のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ（チェックノードメッセージ）ujを、メッセージD105として、メッセージメモリ１０４に供給する。
【００５０】
そして、メッセージメモリ１０４は、以上のようにしてチェックノード計算器１０３から供給されるメッセージD105を記憶する。
【００５１】
メッセージメモリ１０４が記憶したチェックノード計算器１０３からのメッセージD105、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD102として読み出され、バリアブルノード計算器１０２に供給される。
【００５２】
図９は、バリアブルノード演算を１つずつ行う図８のバリアブルノード計算器１０２の構成例を示している。
【００５３】
バリアブルノード計算器１０２は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、２つの入力ポートP101とP102を有し、外部にメッセージを供給（出力）するポートとして、１の出力ポートP103を有している。そして、バリアブルノード計算器１０２は、入力ポートP101とP102それぞれから入力されるメッセージを用いて、式（１）のバリアブルノード演算を行い、その結果得られるメッセージを、出力ポートP103から出力する。
【００５４】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP102には、メッセージメモリ１０４から読み出されたメッセージD102（チェックノードメッセージuj）が供給される。
【００５５】
バリアブルノード計算器１０２では、検査行列の各行に対応するチェックノードからのメッセージD102（メッセージuj）が入力ポートP102から１つずつ読み込まれ、そのメッセージD102が、演算器１５１とFIFOメモリ１５５に供給される。また、バリアブルノード計算器１０２では、受信データメモリ１０５から受信データD101が入力ポートP101から1つずつ読み込まれ、演算器１５７に供給される。
【００５６】
演算器１５１は、メッセージD102（メッセージuj）とレジスタ１５２に格納されている値D151とを加算することにより、メッセージD102を積算し、その結果得られる積算値を、レジスタ１５２に再格納する。なお、検査行列の１列に亘る全ての枝からのメッセージD102が積算された場合、レジスタ１５２は０にリセットされる。
【００５７】
検査行列の１列に亘るメッセージD102が１つずつ読み込まれ、レジスタ１５２に１列分のメッセージD102が積算された値が格納された場合、すなわち、レジスタ１５２に、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ１５３は、レジスタ１５２に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値D151（ｊ＝１からdvまでのΣuj)を選択し、レジスタ１５４に出力して格納させる。
【００５８】
レジスタ１５４は、格納している値D151を、値D152として、セレクタ１５３と演算器１５６に供給する。レジスタ１５２に１列分のメッセージD102が積算された値が格納される直前までは、セレクタ１５３は、レジスタ１５４から供給された値D152を選択し、レジスタ１５４に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算されるまで、レジスタ１５４は、前回積算された値を、セレクタ１５３と演算器１５６に供給する。
【００５９】
一方、FIFOメモリ１５５は、レジスタ１５４から新たな値D152（ｊ＝１からdvまでのΣuj)が出力されるまでの間、チェックノードからのメッセージD102を遅延し、値D153として演算器１５６に供給する。演算器１５６は、レジスタ１５４から供給された値D152から、FIFOメモリ１５５から供給された値D153を減算する。すなわち、演算器１５６は、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）の積算値（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージujを減算して、その減算値（ｊ＝１からdv-1までのΣuj）を求め、演算器１５７に供給する。
【００６０】
演算器１５７は、入力ポートP101からの受信データD101と、演算器１５６からの減算値（ｊ＝１からdv-1までのΣuj）とを加算し、その結果得られる加算値をメッセージD103（メッセージvi）として、出力ポートP103から出力する。
【００６１】
以上のように、バリアブルノード計算器１０２では、式（１）のバリアブルノード演算（vi=uoi＋Σuj）が行われ、その結果得られるメッセージ（バリアブルノードメッセージ）viが、出力ポートP103から出力される。
【００６２】
図１０は、チェックノード演算を１つずつ行う図８のチェックノード計算器１０３の構成例を示している。
【００６３】
チェックノード計算器１０３は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、１つの入力ポートP111を有し、外部にメッセージを供給（出力）するポートとして、１の出力ポートP112を有している。そして、チェックノード計算器１０３は、入力ポートP111から入力されるメッセージを用いて、式（７）のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP112から出力する。
【００６４】
すなわち、入力ポートP111には、メッセージメモリ１０４から読み出されたメッセージD104（バリアブルノードメッセージvi）が供給される。
【００６５】
チェックノード計算器１０３では、検査行列の各列に対応するバリアブルノードからのメッセージD104（メッセージvi）が入力ポートP111から１つずつ読み込まれ、その最上位ビットを除く下位ビット、つまり、メッセージD104の絶対値D122(|vi|)が、LUT１２１に供給されるとともに、最上位ビット、つまりメッセージD104の符号ビット（正負を表すビット）D121が、EXOR回路１２９とFIFO(First In First Out)メモリ１３３にそれぞれ供給される。
【００６６】
LUT１２１は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の演算結果を出力するLUTであり、絶対値D122(|vi|)の供給に対して、非線形関数φ(|vi|)の演算を行った演算結果D123（φ(|vi|)）を読み出し、演算器１２２とFIFOメモリ１２７に供給する。
【００６７】
演算器１２２は、演算結果D123（φ(|vi|)）とレジスタ１２３に格納されている値D124とを加算することにより、演算結果D123を積算し、その結果得られる積算値をレジスタ１２３に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の絶対値D122(|vi|)に対する演算結果D123（φ(|vi|)）が積算された場合、レジスタ１２３は０にリセットされる。
【００６８】
検査行列の１行に亘るメッセージD104が１つずつ読み込まれ、レジスタ１２３に１行分の演算結果D123が積算された積算値が格納された場合、セレクタ１２４は、レジスタ１２３に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算された積算値D124（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）を選択し、値D125として、レジスタ１２５に出力して格納させる。レジスタ１２５は、格納している値D125を、値D126として、セレクタ１２４と演算器１２６に供給する。
【００６９】
レジスタ１２３に１行分の演算結果D123が積算された積算値が格納される直前までは、セレクタ１２４は、レジスタ１２５から供給された値D126を選択し、レジスタ１２５に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１２５は、前回積算されたφ(|vi|)の積算値を、セレクタ１２４と演算器１２６に供給する。
【００７０】
一方、FIFOメモリ１２７は、レジスタ１２５から新たな値D126（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が出力されるまでの間、LUT１２１が出力した演算結果D123（φ(|vi|)）を遅延し、値D127として演算器１２６に供給する。演算器１２６は、レジスタ１２５から供給された値D126から、FIFOメモリ１２７から供給された値D127を減算し、その減算結果を、減算値D128としてLUT１２８に供給する。すなわち、演算器１２６は、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)の積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）から、求めたい枝からのメッセージ（ｉ＝dcのメッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を減算値D128としてLUT１２８に供給する。
【００７１】
LUT１２８は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の逆関数φ-1(x)の演算結果を出力するLUTであり、演算器１２６からの減算値D128（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）の供給に対して、逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D129（φ-1(Σφ(|vi|)))を出力する。
【００７２】
なお、上述したように、同一の引数xに対する非線形関数φ(x)の演算結果と逆関数φ-1(x)の演算結果とは等しいので、LUT１２１と１２８とは、同一構成のLUTとなっている。
【００７３】
以上の処理と並行して、EXOR回路１２９は、レジスタ１３０に格納されている値D131と符号ビット（正負を表すビット）D121との排他的論理和を演算することにより、メッセージD104の符号ビットD121どうしの乗算を行い、乗算結果D130をレジスタ１３０に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された場合、レジスタ１３０はリセットされる。
【００７４】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納された場合、セレクタ１３１は、レジスタ１３０に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131（ｉ＝１からｉ＝dcまでのΠsign(vi)）を選択し、値D132としてレジスタ１３２に出力して格納させる。レジスタ１３２は、格納している値D132を、値D133としてセレクタ１３１とEXOR回路１３４に供給する。
【００７５】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納される直前までは、セレクタ１３１は、レジスタ１３２から供給された値D133を選択し、レジスタ１３２に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）の符号ビットD121が乗算されるまで、レジスタ１３２は、前回格納した値を、セレクタ１３１とEXOR回路１３４に供給する。
【００７６】
一方、FIFOメモリ１３３は、レジスタ１３２から新たな値D133（ｉ＝１からｉ＝dcまでのΠsign(vi)）がEXOR回路１３４に供給されるまでの間、符号ビットD121を遅延し、１ビットの値D134としてEXOR回路１３４に供給する。EXOR回路１３４は、レジスタ１３２から供給された値D133と、FIFOメモリ１３３から供給された値D134との排他的論理和を演算することにより、値D133を、値D134で除算し、除算結果を除算値D135として出力する。すなわち、EXOR回路１３４は、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121（sign(vi)）の乗算値を、求めたい枝からのメッセージD104の符号ビットD121（sign(vi)）で除算して、その除算値（ｉ＝１からｉ＝dc-1までのΠsign(vi)）を除算値D135として出力する。
【００７７】
そして、チェックノード計算器１０３では、LUT１２８から出力された演算結果D129を下位ビットとするとともに、EXOR回路１３４から出力された除算値D135を最上位ビット（符号ビット）とするビット列がメッセージD105（メッセージuj）として、出力ポートP112から出力される。
【００７８】
以上のように、チェックノード計算器１０３では、式（７）の演算が行われ、メッセージ（チェックノードメッセージ）ujが求められる。
【００７９】
なお、図示しないが、図８の復号装置では、復号の最終段（例えば、あらかじめ定められた繰り返し復号の回数Nだけ行われるバリアブルノード演算及びチェックノード演算のうちの最後に行われるバリアブルノード演算）において、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【００８０】
図８の復号装置によれば、メッセージメモリ１０４（図８）、バリアブルノード計算器１０２（図９）のFIFOメモリ１５５、チェックノード計算器１０３（図１０）のFIFOメモリ１２７及び１３３の容量さえ足りれば、様々な検査行列のLDPC符号を復号することができる。
【００８１】
次に、図１１は、図８の復号装置のメッセージメモリ１０４に対するメッセージの読み書きのタイミングを示すタイミングチャートである。
【００８２】
図８の復号装置において、バリアブルノード演算時には、メッセージメモリ１０４から、チェックノードからのメッセージ（チェックノードメッセージ）ujが読み出され、メッセージ計算部１０１のバリアブルノード計算器１０２が、メッセージメモリ１０４から読み出されたメッセージujを用いてバリアブルノード演算を行う一方で、そのバリアブルノード演算の結果得られるメッセージ（バリアブルノードメッセージ）viが、メッセージメモリ１０４に書き込まれる。
【００８３】
また、チェックノード演算時には、メッセージメモリ１０４から、バリアブルノードからのメッセージ（バリアブルノードメッセージ）viが読み出され、メッセージ計算部１０１のチェックノード計算器１０３が、メッセージメモリ１０４から読み出されたメッセージviを用いてチェックノード演算を行う一方で、そのチェックノード演算の結果得られるメッセージ（チェックノードメッセージ）ujが、メッセージメモリ１０４に書き込まれる。
【００８４】
したがって、図８の復号装置では、バリアブルノード演算時であっても、チェックノード演算時であっても、メッセージメモリ１０４からのメッセージの読み出しと、そのメッセージを用いたバリアブルノード演算又はチェックノード演算（以下、適宜、両方まとめて、単に、ノード演算ともいう）の結果得られるメッセージの書き込みとを同時に行う必要がある。
【００８５】
このため、メッセージメモリ１０４は、例えば、１つのバンク（メモリバンク）としての１つのRAM(Random Access Memory)#Aと、他の１つのバンクとしての他の１つのRAM#Bとから構成され、RAM#AとRAM#Bのそれぞれにアクセスすることにより、メッセージメモリ１０４に対しては、見かけ上、同時に、２つのアクセスを行うことが可能になっている。
【００８６】
図１１のタイミングチャートは、メッセージメモリ１０４を構成するRAM#AとRAM#Bのそれぞれに対する読み書きのタイミングを表している。
【００８７】
図１１においては、まず最初に、RAM#Aから、あるチェックノード又はバリアブルノード（以下、適宜、両方まとめて、単に、ノードともいう）node#1の枝に対応するメッセージを求めるのに必要なメッセージが読み出され(R(node#1))、そのメッセージを用いてノード演算が行われる。そして、そのノード演算の結果得られる、ノードnode#1の枝（ノードnode#1に接続している枝）に対応するメッセージがRAM#Aに書き込まれる(W(node#1))のと同時に、RAM#Bから、次のノードnode#2の枝に対応するメッセージを求めるのに必要なメッセージが読み出され(R(node#2))、ノード演算が行われる。
【００８８】
さらに、そのノード演算の結果得られる、ノードnode#2の枝に対応するメッセージがRAM#Bに書き込まれる(W(node#2))のと同時に、RAM#Aから、次のノードnode#3の枝に対応するメッセージを求めるのに必要なメッセージが読み出され(R(node#3))、ノード演算が行われる。以下、同様にして、メッセージメモリ１０４を構成するRAM#AとRAM#Bのそれぞれに対するメッセージの読み書きが行われていく。
【００８９】
なお、図８の復号装置において、チェックノード演算とバリアブルノード演算とを交互に行う繰り返し復号によって、LDPC符号を復号する場合には、１回の復号（１セットのチェックノード演算とバリアブルノード演算）に、メッセージの数の２倍のクロック数が必要となり、高速な動作が要求されることになる。
【００９０】
そこで、特定の検査行列のLDPC符号については、メッセージ計算部１０１を複数であるp個設けることによって、p個のノードについてメッセージを同時に求め、１回の復号を、図８の復号装置の場合の1/pのクロック数で行うことができる復号装置、すなわち、それほど高くない動作周波数での動作が可能な復号装置が提案されている（例えば、特許文献１参照）。
【００９１】
【特許文献１】特開2004-364233号公報
【発明の開示】
【発明が解決しようとする課題】
【００９２】
ところで、上述したように、メッセージ計算部１０１を構成するバリアブルノード計算器１０２（図９）には、演算器１５１及びレジスタ１５２でのメッセージの積算が終了するまで、メッセージを遅延するFIFOメモリ１５５が設けられている。同様に、チェックノード計算器１０３（図１０）にも、演算器１２２及びレジスタ１２３での積算が終了するまで、メッセージ（から求められた値）φ(|vi|)を遅延するFIFOメモリ１２７と、EXOR回路１２９及びレジスタ１３０での符号ビットの相乗積の算出が終了するまで、メッセージ（の符号ビット）を遅延するFIFOメモリ１３３が設けられている。このように、LDPC符号を復号する復号装置においては、バリアブルノード演算や、チェックノード演算に用いるメッセージを一時記憶することにより、メッセージ（データ）を遅延するためのメモリが必要となる。
【００９３】
ここで、バリアブルノード計算器１０２（図９）では、演算器１５１及びレジスタ１５２でのメッセージの積算として、バリアブルノードに接続している枝の数だけのメッセージの積算が行われるので、その積算が終了するまでメッセージを遅延するFIFOメモリ１５５は、少なくとも、その枝の数だけのメッセージ、つまり、検査行列の列の重みdvの最大値に等しい数のメッセージを記憶することができる容量を有する必要がある。
【００９４】
また、チェックノード計算器１０３（図１０）では、演算器１２２及びレジスタ１２３での積算として、チェックノードに接続している枝の数だけのメッセージ（から求められた値）φ(|vi|)の積算が行われるので、その積算が終了するまでメッセージ（から求められた値）φ(|vi|)を遅延するFIFOメモリ１２７は、少なくとも、その枝の数だけのメッセージ、つまり、検査行列の行の重みdcの最大値に等しい数のメッセージ（から求められた値）φ(|vi|)を記憶することができる容量を有する必要がある。
【００９５】
さらに、チェックノード計算器１０３（図１０）では、EXOR回路１２９及びレジスタ１３０での乗算として、チェックノードに接続している枝の数だけのメッセージ（の符号ビット）の乗算が行われるので、その乗算が終了するまでメッセージ（の符号ビット）を遅延するFIFOメモリ１３３は、少なくとも、その枝の数だけのメッセージ、つまり、検査行列の行の重みdcの最大値に等しい数のメッセージ（の符号ビット）を記憶することができる容量を有する必要がある。
【００９６】
以上のように、LDPC符号を復号する復号装置には、メッセージを遅延するためのメモリが必要である。さらに、特に、ノードの数(degree)が多いLDPC符号を復号する復号装置を、それほど高くない動作周波数で動作させるためには、復号装置を、複数のノードのメッセージを並列で求めるのに複数のメッセージ計算部１０１を設けて構成する必要があり、この場合、メッセージを遅延するためのメモリがさらに必要となって、復号装置が大規模化することになる。
【００９７】
本発明は、このような状況に鑑みてなされたものであり、LDPC符号を復号する復号装置の規模を削減することができるようにするものである。
【課題を解決するための手段】
【００９８】
本発明の一側面の復号装置は、LDPC(Low Density Parity Check)符号を復号する復号装置であり、前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段と、前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段とを備え、前記メッセージ計算手段が、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリを有し、前記遅延メモリが、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する。
【００９９】
かかる一側面の復号装置においては、メッセージを記憶する記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段が有する、メッセージを一時記憶することにより遅延する遅延メモリにおいて、前記検査行列の重みの最大値よりも少ない数のメッセージが記憶される。
【０１００】
本発明の一側面の制御方法、又は、プログラムは、LDPC(Low Density Parity Check)符号を復号する復号装置を制御する制御方法、又は、復号装置を制御するコンピュータに実行させるプログラムであり、前記復号装置が、前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段と、前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段とを備え、前記メッセージ計算手段が、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリを有し、前記遅延メモリが、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する場合において、前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から２回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行い、前記バリアブルノードの演算において、前記バリアブルノードに対応する前記検査行列の列の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記列の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択し、前記チェックノードの演算において、前記チェックノードに対応する前記検査行列の行の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記行の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択するように、前記遅延メモリで遅延されたメッセージと、前記記憶手段から２回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段を制御するステップを含む制御方法、又は、制御処理をコンピュータに実行させるプログラムである。
【０１０１】
かかる一側面の制御方法、又は、プログラムにおいては、前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から２回読み出し、前記メッセージ計算手段に供給する読み出し制御とが行われる。また、前記バリアブルノードの演算において、前記バリアブルノードに対応する前記検査行列の列の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記列の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択し、前記チェックノードの演算において、前記チェックノードに対応する前記検査行列の行の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記行の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択するように、選択手段が制御される。
【発明の効果】
【０１０２】
本発明の一側面によれば、LDPC符号を復号する復号装置の規模を削減することができる。
【発明を実施するための最良の形態】
【０１０３】
以下に本発明の実施の形態を説明するが、本発明の構成要件と、明細書又は図面に記載の実施の形態との対応関係を例示すると、次のようになる。この記載は、本発明をサポートする実施の形態が、明細書又は図面に記載されていることを確認するためのものである。したがって、明細書又は図面中には記載されているが、本発明の構成要件に対応する実施の形態として、ここには記載されていない実施の形態があったとしても、そのことは、その実施の形態が、その構成要件に対応するものではないことを意味するものではない。逆に、実施の形態が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その実施の形態が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
【０１０４】
本発明の一側面の復号装置は、
LDPC(Low Density Parity Check)符号を復号する復号装置（例えば、図２５の復号装置）であり、
前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段（例えば、図２５のメッセージメモリ１０４）と、
前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段（例えば、図２５のメッセージ計算部２０１）と
を備え、
前記メッセージ計算手段は、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリ（例えば、図２６の小FIFOメモリ３１７）を有し、
前記遅延メモリは、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する。
【０１０５】
一側面の復号装置には、
前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から２回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行う制御手段（例えば、図２５の制御部２０２）をさらに設けることができ、
前記メッセージ計算手段には、前記記憶手段から２回読み出される同一のメッセージのうちの１回目に読み出されるメッセージが供給されるポート（例えば、図２６の入力ポートP201）と、２回目に読み出されるメッセージが供給されるポート（例えば、図２６の入力ポートPD201）との２つのポートを設けることができる。
【０１０６】
一側面の復号装置には、
前記遅延メモリで遅延されたメッセージと、前記記憶手段から２回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段（例えば、図２６のセレクタ３１８）をさらに設けることができる。
【０１０７】
前記メッセージ計算手段には、
チェックノードに入力される入力データxに対して、非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力する１のLUT(Look Up Table)（例えば、図２６のLUT３００）と、
チェックノードから出力された出力データxに対して、前記非線形関数の逆関数φ-1(x)=2tanh-1(e-x)の演算結果を出力する他の１のLUT（例えば、図２６のLUT３１４）と
を設けることができ、
チェックノードの演算時には、データを、前記１のLUTと他の１のLUTを経由させ、
バリアブルノードの演算時には、データを、前記１のLUTと他の１のLUTをバイパスさせる
ことができる。
【０１０８】
前記メッセージ計算手段には、チェックノードに入力される入力データxに対して、逆関数φ-1(x)=2tanh-1(e-x)と同一の演算結果が得られる非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力するとともに、バリアブルノードに入力される入力データxに対して、前記逆関数φ-1(x)の演算結果を出力するLUT(Look Up Table)（例えば、図３１のLUT６００）を設けることができる。
【０１０９】
前記メッセージ計算手段には、バリアブルノードから出力された出力データxに対して、逆関数φ-1(x)=2tanh-1(e-x)と同一の演算結果が得られる非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力するとともに、チェックノードから出力された出力データxに対して、前記逆関数φ-1(x)の演算結果を出力するLUT(Look Up Table)（例えば、図３６のLUT７１３）を設けることができる。
【０１１０】
本発明の一側面の制御方法、又は、プログラムは、
LDPC(Low Density Parity Check)符号を復号する復号装置（例えば、図２５の復号装置）を制御する制御方法、又は、復号装置を制御するコンピュータに実行させるプログラムであり、
前記復号装置は、
前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段（例えば、図２５のメッセージメモリ１０４）と、
前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段（例えば、図２５のメッセージ計算部２０１）と
を備え、
前記メッセージ計算手段は、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリ（例えば、図２６の小FIFOメモリ３１７）を有し、
前記遅延メモリは、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する場合において、
前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から２回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行い（例えば、図１５のステップＳ１０１ないしＳ１０３）、
前記バリアブルノードの演算において、前記バリアブルノードに対応する前記検査行列の列の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記列の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択し、
前記チェックノードの演算において、前記チェックノードに対応する前記検査行列の行の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記行の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から２回目に読み出されたメッセージを選択する
ように、前記遅延メモリで遅延されたメッセージと、前記記憶手段から２回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段（例えば、図２６のセレクタ３１８）を制御する（例えば、図１５のステップＳ１２１ないしＳ１２３）
ステップを含む。
【０１１１】
以下、本発明の実施の形態について、図面を参照しながら説明する。
【０１１２】
前述したように、LDPC符号を復号する復号装置においては、バリアブルノードの演算や、チェックノード演算に用いるメッセージを一時記憶することにより、メッセージを遅延するためのメモリ（例えば、図９のFIFOメモリ１５５（図９）や、図１０のFIFOメモリ１２７及び１３３）が必要となるが、まず最初に、そのようなメモリが不要な復号装置について説明する。
【０１１３】
図１２は、メッセージを遅延するためのメモリが不要な復号装置の構成例を示すブロック図である。
【０１１４】
なお、図中、図８の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図１２の復号装置は、メッセージ計算部１０１に代えてメッセージ計算部１７１が設けられているとともに、制御部１０６に代えて制御部１７４が設けられている他は、図８の復号装置と同様に構成されている。
【０１１５】
図１２の復号装置は、図８の復号装置と同様に、フルシリアルの復号を繰り返し行う。
【０１１６】
すなわち、図１２の復号装置は、メッセージメモリ１０４、受信データメモリ１０５、メッセージ計算部１７１、制御部１７４からなる。また、メッセージ計算部１７１は、バリアブルノード計算器１７２とチェックノード計算器１７３とから構成されている。
【０１１７】
図１２の復号装置では、メッセージメモリ１０４から、メッセージが１つずつ読み出され、メッセージ計算部１７１において、そのメッセージを用いて、所望の枝に対応するメッセージが計算される。そして、その計算によって求められたメッセージが、メッセージメモリ１０４に格納されていく。図１２の復号装置では、以上の処理が繰り返し行われることで、繰り返し復号が行われる。
【０１１８】
すなわち、受信データメモリ１０５には、送信されてきたLDPC符号を受信することにより得られる、符号の0（又は1）らしさを表す対数尤度比である受信データ（LDPC符号）D100が供給され、受信データメモリ１０５は、その受信データD100を格納（記憶）する。
【０１１９】
バリアブルノード演算時には、受信データメモリ１０５は、制御部１７４から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部１７１のバリアブルノード計算器１７２に供給する。
【０１２０】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部１７４から供給される制御信号に従い、記憶している同一のメッセージを２回読み出して（注目しているバリアブルノードから出力されるバリアブルノードメッセージviを求めるのに必要なチェックノードメッセージ（注目しているバリアブルノードに接続されているチェックノードからのチェックノードメッセージ）ujを、２回繰り返し読み出して）、１回目に読み出したメッセージをメッセージD102として、バリアブルノード計算器１７２に供給し、２回目に読み出したメッセージをメッセージDD102として、バリアブルノード計算器１７２に供給する。バリアブルノード計算器１７２は、メッセージメモリ１０４から供給されるメッセージD102とDD102、及び受信データメモリ１０５から供給される受信データD101を用い、式（１）のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ（バリアブルノードメッセージ）viを、メッセージD103として、メッセージメモリ１０４に供給する。
【０１２１】
そして、メッセージメモリ１０４は、制御部１７４から供給される制御信号に従い、バリアブルノード計算器１７２から供給されるメッセージD103を記憶する（書き込む）。
【０１２２】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部１７４から供給される制御信号に従って、記憶している同一のメッセージ（バリアブルノードメッセージvi）を２回読み出して（注目しているチェックノードから出力されるチェックノードメッセージujを求めるのに必要なバリアブルノードメッセージ（注目しているチェックノードに接続されているバリアブルノードからのバリアブルノードメッセージ）viを、２回繰り返し読み出して）、１回目に読み出したメッセージをメッセージD104として、チェックノード計算器１７３に供給し、２回目に読み出したメッセージをメッセージDD104として、チェックノード計算器１７３に供給する。
【０１２３】
チェックノード計算器１７３は、メッセージメモリ１０４から供給されるメッセージD104とDD104を用いて、式（７）のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ（チェックノードメッセージ）ujを、メッセージD105として、メッセージメモリ１０４に供給する。
【０１２４】
そして、メッセージメモリ１０４は、制御部１７４から供給される制御信号に従い、チェックノード計算器１７３から供給されるメッセージD105を記憶する（書き込む）。
【０１２５】
メッセージメモリ１０４が記憶したチェックノード計算器１７３からのメッセージD105、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD102及びDD102として読み出され、バリアブルノード計算器１７２に供給される。
【０１２６】
図１３は、図１２のバリアブルノード計算器１７２の構成例を示している。
【０１２７】
なお、図中、図９のバリアブルノード計算器１０２と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０１２８】
バリアブルノード計算器１７２は、メッセージを遅延するためのメモリ（図９のバリアブルノード計算器１０２に設けられているFIFOメモリ１５５）を設けずに構成されている。
【０１２９】
但し、バリアブルノード計算器１７２は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、３つの入力ポートP101,P102,PD102を有している。
【０１３０】
入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給（入力）される。また、入力ポートP102には、メッセージメモリ１０４から２回読み出される同一のメッセージD102及びDD102のうちの１回目に読み出されるメッセージD102が供給（入力）され、入力ポートPD102には、２回目に読み出されるメッセージDD102が供給される。
【０１３１】
チェックノード計算器１７３は、入力ポートP101,P102,PD102それぞれから入力されるメッセージを用いて、復号しようとするLDPC符号を定義する検査行列に基づき、式（１）のバリアブルノード演算を行い、その結果得られるメッセージを、出力ポートP103から出力する。
【０１３２】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP102には、メッセージメモリ１０４から読み出されたメッセージD102（チェックノードメッセージuj）が供給される。
【０１３３】
そして、バリアブルノード計算器１７２では、検査行列の各行に対応するチェックノードからのメッセージD102、すなわち、メッセージメモリ１０４から１回目に読み出されたメッセージujが、入力ポートP102から１つずつ入力され、そのメッセージD102が、演算器１５１に供給される。
【０１３４】
また、バリアブルノード計算器１７２では、受信データメモリ１０５から受信データD101が入力ポートP101から1つずつ読み込まれ、演算器１５７に供給される。
【０１３５】
演算器１５１は、メッセージD102（メッセージuj）とレジスタ１５２に格納されている値D151とを加算することにより、メッセージD102を積算し、その結果得られる積算値を、レジスタ１５２に再格納する。なお、検査行列の１列に亘る全ての枝からのメッセージD102が積算された場合、レジスタ１５２はリセットされる。
【０１３６】
検査行列の１列に亘るメッセージD102が１つずつ読み込まれ、レジスタ１５２に１列分のメッセージD102が積算された値が格納された場合、すなわち、レジスタ１５２に、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ１５３は、レジスタ１５２に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値D151（ｊ＝１からdvまでのΣuj)を選択し、レジスタ１５４に出力して格納させる。
【０１３７】
レジスタ１５４は、格納している値D151を、値D152として、セレクタ１５３と演算器１５６に供給する。レジスタ１５２に１列分のメッセージD102が積算された値が格納される直前までは、セレクタ１５３は、レジスタ１５４から供給された値D152を選択し、レジスタ１５４に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算されるまで、レジスタ１５４は、前回積算された値を、セレクタ１５３と演算器１５６に供給する。
【０１３８】
一方、レジスタ１５４から新たな値D152（ｊ＝１からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ１５２に１列分のメッセージD102が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された直後、バリアブルノード計算器１７２においては、メッセージD102（メッセージuj）と同一のメッセージDD102、すなわち、メッセージメモリ１０４から２回目に読み出されたメッセージujが、入力ポートPD102から１つずつ入力され、そのメッセージDD102が、演算器１５６に供給される。
【０１３９】
演算器１５６は、レジスタ１５４から供給された積算値D152から、入力ポートPD102からのメッセージDD102を減算する。すなわち、演算器１５６では、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）の積算値D152（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージuj（ｊ＝dvのuj）としてのメッセージDD102を減算して、減算値（ｊ＝１からdv-1までのΣuj）を求め、演算器１５７に供給する。
【０１４０】
演算器１５７は、入力ポートP101からの受信データD101と、演算器１５６からの減算値（ｊ＝１からdv-1までのΣuj）とを加算し、その結果得られる加算値をメッセージD103（メッセージvi）として、出力ポートP103から出力する。
【０１４１】
以上のように、バリアブルノード計算器１７２では、式（１）のバリアブルノード演算が行われ、その結果得られるメッセージ（バリアブルノードメッセージ）viが、出力ポートP103から出力される。
【０１４２】
図１４は、図１２のチェックノード計算器１７３の構成例を示している。
【０１４３】
なお、図中、図１０のチェックノード計算器１０３と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０１４４】
チェックノード計算器１７３は、データを遅延するためのメモリ（図１０のチェックノード計算器１０３に設けられているFIFOメモリ１２７及び１３３）を設けずに構成されている。
【０１４５】
但し、チェックノード計算器１７３は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、２つの入力ポートP111とPD111を有している。
【０１４６】
入力ポートP111には、メッセージメモリ１０４から２回読み出される同一のメッセージD104及びDD104のうちの１回目に読み出されるメッセージD104が供給（入力）され、入力ポートPD111には、２回目に読み出されるメッセージDD104が供給される。
【０１４７】
チェックノード計算器１７３は、入力ポートP111とPD111それぞれから入力されるメッセージを用いて、復号しようとするLDPC符号を定義する検査行列に基づき、式（７）のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP112から出力する。
【０１４８】
すなわち、入力ポートP111には、メッセージメモリ１０４から読み出されたメッセージD104（バリアブルノードメッセージuj）が供給される。
【０１４９】
そして、チェックノード計算器１７３では、検査行列の各列に対応するバリアブルノードからのメッセージD104（メッセージvi）が入力ポートP111から１つずつ入力され、その最上位ビットを除く下位ビット、つまり、メッセージD104の絶対値D122(|vi|)が、LUT１２１に供給されるとともに、最上位ビット、つまりメッセージD104の符号ビットD121が、EXOR回路１２９に供給される。
【０１５０】
LUT１２１は、非線形関数φ(x)の演算結果を記憶しており、絶対値D122(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D123（φ(|vi|)）を読み出し、演算器１２２に供給する。
【０１５１】
演算器１２２は、演算結果D123（φ(|vi|)）とレジスタ１２３に格納されている値D124とを加算することにより、演算結果D123を積算し、その結果得られる積算値をレジスタ１２３に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の絶対値D122(|vi|)に対する演算結果D123（φ(|vi|)）が積算された場合、レジスタ１２３はリセットされる。
【０１５２】
検査行列の１行に亘るメッセージD104が１つずつ読み込まれ、レジスタ１２３に１行分の演算結果D123が積算された積算値が格納された場合、セレクタ１２４は、レジスタ１２３に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算された積算値D124（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）を選択し、積算値D125として、レジスタ１２５に出力して格納させる。レジスタ１２５は、格納している積算値D125を、値D126として、セレクタ１２４と演算器１２６に供給する。
【０１５３】
レジスタ１２３に１行分の演算結果D123が積算された積算値が格納される直前までは、セレクタ１２４は、レジスタ１２５から供給された値D126を選択し、レジスタ１２５に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１２５は、前回積算されたφ(|vi|)の積算値を、セレクタ１２４と演算器１２６に供給する。
【０１５４】
一方、レジスタ１２５から新たな値D126（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）の出力が開始されると、すなわち、レジスタ１２５に１行分の演算結果D123が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納された直後、チェックノード計算器１７３において、メッセージD104（メッセージvi）と同一のメッセージDD104、すなわち、メッセージメモリ１０４から２回目に読み出されたメッセージviが、入力ポートPD104から１つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT１３５に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、EXOR回路１３４に供給される。
【０１５５】
LUT１３５は、LUT１２１と同様のLUTで、メッセージDD104の絶対値(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果（φ(|vi|)）を読み出し、演算器１２６に供給する。
【０１５６】
演算器１２６は、レジスタ１２５から供給された値D126から、LUT１３５からの演算結果（φ(|vi|)）を減算し、減算結果を、減算値D128としてLUT１２８に供給する。すなわち、演算器１２６は、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)の積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）から、求めたい枝からのメッセージvi（ｉ＝dcのvi）としてのメッセージDD104から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を減算値D128としてLUT１２８に供給する。
【０１５７】
LUT１２８は、逆関数φ-1（x）の演算結果を記憶している、LUT１２１や１３５と同様のLUTであり、演算器１２６からの減算値D128（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を引数として、逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D129（φ-1(Σφ(|vi|)))を出力する。
【０１５８】
以上の処理と並行して、EXOR回路１２９は、レジスタ１３０に格納されている値D131と符号ビット（正負を表すビット）D121との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D130をレジスタ１３０に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された場合、レジスタ１３０はリセットされる。
【０１５９】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納された場合、セレクタ１３１は、レジスタ１３０に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131（ｉ＝１からｉ＝dcまでのΠsign(vi)）を選択し、値D132としてレジスタ１３２に出力して格納させる。レジスタ１３２は、格納している値D132を、値D133としてセレクタ１３１とEXOR回路１３４に供給する。
【０１６０】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納される直前までは、セレクタ１３１は、レジスタ１３２から供給された値D133を選択し、レジスタ１３２に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）の符号ビットD121が乗算されるまで、レジスタ１３２は、前回格納した値を、セレクタ１３１とEXOR回路１３４に供給する。
【０１６１】
一方、レジスタ１３２から新たな値D133（ｉ＝１からｉ＝dcまでのΠsign(vi)）がEXOR回路１３４に供給されたとき、すなわち、レジスタ１３０に１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131（ｉ＝１からｉ＝dcまでのΠsign(vi)）が格納されたとき、上述したように、レジスタ１２５には、１行分の演算結果D123が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納される。
【０１６２】
レジスタ１２５に１行分の演算結果D123が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納されると、上述したように、チェックノード計算器１７３において、メッセージD104（メッセージvi）と同一のメッセージDD104、すなわち、メッセージメモリ１０４から２回目に読み出されたメッセージviが、入力ポートPD104から１つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT１３５に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、EXOR回路１３４に供給される。
【０１６３】
EXOR回路１３４は、レジスタ１３２から供給された値D133と、入力ポートPD104からのメッセージDD104の符号ビットとの排他的論理和を演算することにより、値D133を、メッセージDD104の符号ビットで除算し、除算結果を除算値D135として出力する。すなわち、EXOR回路１３４は、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121の乗算値（ｉ＝１からｉ＝dcまでのΠsign(vi)）を、求めたい枝からのメッセージviとしてのメッセージDD104の符号ビット（ｉ＝dcのsign(vi)）で除算して、その除算値（ｉ＝１からｉ＝dc-1までのΠsign(vi)）を除算値D135として出力する。
【０１６４】
そして、チェックノード計算器１７３では、LUT１２８から出力された演算結果D129を下位ビットとするとともに、EXOR回路１３４から出力された除算値D135を最上位ビット（符号ビット）とするビット列がメッセージD105（メッセージuj）として、出力ポートP112から出力される。
【０１６５】
以上のように、チェックノード計算器１７３では、式（７）の演算が行われ、メッセージ（チェックノードメッセージ）ujが求められる。
【０１６６】
なお、図示しないが、図１２の復号装置では、復号の最終段において、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【０１６７】
次に、図１５のフローチャートを参照して、図１２の復号装置の制御部１７４によるメッセージメモリ１０４に対するメッセージ（データ）の読み書き制御の処理について説明する。
【０１６８】
なお、以下、適宜、ノードにおいてメッセージを求めるのに用いられる、そのノードに入力されるメッセージを、入力メッセージというとともに、ノードにおいて、入力メッセージを用いて求められて出力されるメッセージを、出力メッセージという。
【０１６９】
ステップＳ１０１において、制御部１７４は、ある注目しているノード（注目ノード）から出力される出力メッセージ（注目ノードに接続している枝から出力されるメッセージ）を求めるのに必要な入力メッセージ、すなわち、注目ノードに接続している枝から入力されるメッセージを読み出し、メッセージ計算部１７１に供給するように（入力メッセージの１回目の読み出しを行うように）、メッセージメモリ１０４を制御して、ステップＳ１０２に進む。
【０１７０】
ステップＳ１０２では、制御部１７４は、直前のステップＳ１０１でメッセージメモリ１０４から読み出したのと同一の入力メッセージを読み出し、メッセージ計算部１７１に供給するように（入力メッセージの２回目の読み出しを行うように）、メッセージメモリ１０４を制御して、ステップＳ１０３に進む。
【０１７１】
すなわち、ステップＳ１０１及びＳ１０２では、メッセージ計算部１７１での演算（チェックノード演算又はバリアブルノード演算）に用いられる同一の入力メッセージを、メッセージメモリ１０４から２回読み出し、メッセージ計算部１７１に供給する読み出し制御が行われる。
【０１７２】
ステップＳ１０３では、制御部１７４は、メッセージ計算部１７１がステップＳ１０１とＳ１０２でメッセージメモリ１０４から読み出された入力メッセージを用いて演算を行うことにより求めた出力メッセージを書き込むように、メッセージメモリ１０４を制御する。
【０１７３】
すなわち、ステップＳ１０３では、メッセージ計算部１７１が式（１）又は式（７）の演算を行うことによって出力する出力メッセージをメッセージメモリ１０４に書き込む書き込み制御が行われる。
【０１７４】
そして、ステップＳ１０３からステップＳ１０１に戻り、制御部１７４は、他のノードを新たな注目ノードとし、その新たな注目ノードから出力される出力メッセージを求めるのに必要な入力メッセージを読み出して、メッセージ計算部１７１に供給するように、メッセージメモリ１０４を制御し、以下、同様の処理を繰り返す。
【０１７５】
メッセージメモリ１０４は、前述したように、RAM#AとRAM#Bとの２バンク構成になっており、制御部１７４は、そのRAM#AとRAM#Bのそれぞれを対象に、図１５で説明した読み書き制御を行う。
【０１７６】
すなわち、図１６は、図１２の復号装置のメッセージメモリ１０４に対するメッセージの読み書きのタイミングを示すタイミングチャートである。
【０１７７】
図１６のタイミングチャートは、前述の図１１のタイミングチャートと同様に、メッセージメモリ１０４を構成するRAM#AとRAM#Bのそれぞれに対する読み書きのタイミングを表している。
【０１７８】
図１６においては、まず最初に、あるノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの１回目の読み出しが行われる(R1(node#1))。その読み出しの終了後、ノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの２回目の読み出しが行われる(R2(node#1))のと同時に、次のノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの１回目の読み出しが行われる(R1(node#2))。
【０１７９】
ノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの２回目の読み出しが終了し、メッセージ計算部１７１において、ノードnode#1からの出力メッセージが求められると、そのノードnode#1からの出力メッセージがRAM#Aに書き込まれる(W(node#1))のと同時に、ノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの２回目の読み出しが行われる(R2(node#2))。
【０１８０】
ノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの２回目の読み出しが終了し、メッセージ計算部１７１において、ノードnode#2からの出力メッセージが求められると、そのノードnode#2からの出力メッセージがRAM#Bに書き込まれる(W(node#2))のと同時に、次のノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの１回目の読み出しが行われる(R1(node#3))。
【０１８１】
ノードnode#2からの出力メッセージのRAM#Bへの書き込みと、ノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの１回目の読み出しとが終了すると、ノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの２回目の読み出しが行われる(R2(node#3))のと同時に、次のノードnode#4からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの１回目の読み出しが行われる(R1(node#4))。
【０１８２】
ノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの２回目の読み出しが終了し、メッセージ計算部１７１において、ノードnode#3からの出力メッセージが求められると、そのノードnode#3からの出力メッセージがRAM#Aに書き込まれる(W(node#3))のと同時に、ノードnode#4からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの２回目の読み出しが行われる(R2(node#4))。
【０１８３】
以下、同様にして、メッセージメモリ１０４を構成するRAM#AとRAM#Bのそれぞれに対するメッセージの読み書きが行われていく。
【０１８４】
図１２の復号装置によれば、メッセージ計算部１７１において出力メッセージを求めるのに必要な（同一の）入力メッセージを、メッセージメモリ１０４から２回読み出すことによって、メッセージ計算部１７１の内部において、入力メッセージを遅延せずに済むので、メッセージ計算部１７１を、データを遅延するためだけのメモリ（図９のバリアブルノード計算器１０２に設けられているFIFOメモリ１５５、並びに図１０のチェックノード計算器１０３に設けられているFIFOメモリ１２７及び１３３）を設けずに構成することができる。そして、その結果、復号装置の規模を削減することができる
【０１８５】
なお、データを遅延するためだけのメモリ（以下、適宜、遅延メモリという）を設けずに、メッセージメモリ１０４から同一の入力メッセージを２回読み出す図１２の復号装置におけるメッセージメモリ１０４に対するメッセージの読み書きのタイミング（図１６）と、遅延メモリを設けて、メッセージメモリ１０４から入力メッセージを１回だけ読み出す図８の復号装置におけるメッセージメモリ１０４に対するメッセージの読み書きのタイミング（図１１）とを比較して分かるように、図１２の復号装置は、あるノードからの出力メッセージを求めるためのメッセージメモリ１０４に対するメッセージの読み書きに、図８の復号装置の1.5倍程度の時間を要し、したがって、図８の復号装置と同一の回数の繰り返し復号を行うには、メッセージの読み書きに時間を要する分だけ高速に動作することが要求される（高速な動作クロックを必要とする）。
【０１８６】
しかしながら、特に、ノードすべてについて、出力メッセージを求める演算を同時（並列）に行うフルパラレルの復号(full parallel decoding)を行う復号装置や、１つでもなくすべてでもないp個のノードについて、出力メッセージを求める演算を同時に行う一部並列の復号（例えば、特許文献１に記載の復号）を行う復号装置を、遅延メモリを設けて構成した場合には、多数の遅延メモリが必要となり、装置全体の規模に大きく影響する。
【０１８７】
かかる復号装置において、図１２の復号装置のように、メッセージメモリ１０４から同一の入力メッセージを２回読み出して、出力メッセージを求めることによって、遅延メモリを不要とする構成を採用することにより、復号装置において多少の高速な動作が要求されることにはなるが、その代償として、極めて大きな装置規模の削減の効果を得ることができる。
【０１８８】
なお、本明細書では、説明を簡単にするために、フルシリアルの復号装置を説明するが、図１２の復号装置を含め、以下説明する復号装置の構成や処理の方法は、フルパラレルの復号を行う復号装置や、一部並列の復号を行う復号装置に適用することができ、そのような復号装置に適用した場合に、特に大きな装置規模の削減の効果を得ることができる。
【０１８９】
上述したように、図１２の復号装置によれば、メッセージ計算部１７１において出力メッセージを求めるのに必要な（同一の）入力メッセージを、メッセージメモリ１０４から２回読み出すことによって、メッセージ計算部１７１の内部において、入力メッセージを遅延せずに済むので、遅延メモリ（図９のバリアブルノード計算器１０２に設けられているFIFOメモリ１５５、並びに図１０のチェックノード計算器１０３に設けられているFIFOメモリ１２７及び１３３）が不要となるが、出力メッセージを求めるためのメッセージメモリ１０４に対するメッセージの読み書きに、図８の復号装置の1.5倍程度の時間を要することとなる。
【０１９０】
さらに、遅延メモリが不要な図１２の復号装置では、復号の対象のLDPC符号を定義する検査行列の重みが、メッセージ計算部１７１での演算に要する時間に対して小である場合には、メッセージメモリ１０４に対するメッセージの読み書きに、さらなる時間を要することとなる。
【０１９１】
すなわち、ノードに接続している、ある枝から出力されるメッセージ（出力メッセージ）は、そのノードに接続している枝すべてから入力されるメッセージ（入力メッセージ）の積算値から、出力メッセージを求めようとしている枝から入力される入力メッセージを減算すること等によって求められるため、検査行列の重みが、メッセージ計算部１７１での演算に要する時間に対して小である場合、つまり、メッセージメモリ１０４に対して読み書きされるメッセージの数が小である場合には、例えば、ノードに接続している枝すべてから入力される入力メッセージの積算値から減算すべき入力メッセージを、メッセージメモリ１０４から読み出すことができるのに、その積算値が求められるまで、入力メッセージの読み出しを待つ必要が生じることがある。また、メッセージメモリ１０４に出力メッセージの書き込みをすることができるのに、その出力メッセージが求められるまで、出力メッセージの書き込みを待つ必要が生じることがある。
【０１９２】
以上のように、メッセージメモリ１０４に対するメッセージの読み書きを待つ時間が生じる場合には、結果として、メッセージメモリ１０４に対するメッセージの読み書きに、さらなる時間を要することとなる。
【０１９３】
メッセージメモリ１０４に対するメッセージの読み書きに時間を要すると、１回の復号に要する時間も大になり、その分だけ、繰り返し復号を行うことができる回数が減って、復号性能が劣化する（復号結果の信頼性が低くなる）ことになる。
【０１９４】
そこで、規模を削減しつつ、復号性能の劣化を抑制することができる復号装置について説明する。
【０１９５】
すなわち、図１７は、本発明を適用した復号装置の第１実施の形態の構成例を示すブロック図である。
【０１９６】
なお、図中、図１２の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図１２の復号装置は、メッセージ計算部１７１に代えてメッセージ計算部１８１が設けられているとともに、制御部１７４に代えて制御部１８４が設けられている他は、図１２の復号装置と同様に構成されている。
【０１９７】
図１７の復号装置は、図１２の復号装置と同様に、フルシリアルの復号を繰り返し行う。
【０１９８】
すなわち、図１７の復号装置は、メッセージメモリ１０４、受信データメモリ１０５、メッセージ計算部１８１、制御部１８４からなる。また、メッセージ計算部１８１は、バリアブルノード計算器１８２とチェックノード計算器１８３とから構成されている。
【０１９９】
図１７の復号装置では、メッセージメモリ１０４から、メッセージが１つずつ読み出され、メッセージ計算部１８１において、そのメッセージを用いて、復号の対象のLDPC符号を定義する検査行列に基づき、所望の枝に対応するメッセージが計算される。そして、その計算によって求められたメッセージが、メッセージメモリ１０４に格納されていく。図１７の復号装置では、以上の処理が繰り返し行われることで、繰り返し復号が行われる。
【０２００】
すなわち、受信データメモリ１０５には、送信されてきたLDPC符号を受信することにより得られる、符号の0（又は1）らしさを表す対数尤度比である受信データ（LDPC符号）D100が供給され、受信データメモリ１０５は、その受信データD100を格納（記憶）する。
【０２０１】
バリアブルノード演算時には、受信データメモリ１０５は、制御部１８４から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部１８１のバリアブルノード計算器１８２に供給する。
【０２０２】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部１８４から供給される制御信号に従い、記憶している同一のメッセージを１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD102として、バリアブルノード計算器１８２に供給し、２回目に読み出したメッセージをメッセージDD102として、バリアブルノード計算器１８２に供給する。バリアブルノード計算器１８２は、メッセージメモリ１０４から１回目に読み出されたメッセージD102、及び受信データメモリ１０５から供給される受信データD101を用い、さらには、メッセージメモリ１０４から２回目に読み出されたメッセージDD102を、必要に応じて用いて、式（１）のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ（バリアブルノードメッセージ）viを、メッセージD103として、メッセージメモリ１０４に供給する。
【０２０３】
そして、メッセージメモリ１０４は、制御部１８４から供給される制御信号に従い、バリアブルノード計算器１８２から供給されるメッセージD103を記憶する（書き込む）。
【０２０４】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部１８４から供給される制御信号に従って、記憶している同一のメッセージ（バリアブルノードメッセージvi）を１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD104として、チェックノード計算器１８３に供給し、２回目に読み出したメッセージをメッセージDD104として、チェックノード計算器１８３に供給する。
【０２０５】
チェックノード計算器１８３は、メッセージメモリ１０４から１回目に読み出されたメッセージD104を用い、さらには、メッセージメモリ１０４から２回目に読み出されたメッセージDD104を、必要に応じて用いて、式（７）のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ（チェックノードメッセージ）ujを、メッセージD105として、メッセージメモリ１０４に供給する。
【０２０６】
そして、メッセージメモリ１０４は、制御部１８４から供給される制御信号に従い、チェックノード計算器１８３から供給されるメッセージD105を記憶する（書き込む）。
【０２０７】
メッセージメモリ１０４が記憶したチェックノード計算器１８３からのメッセージD105、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD102（さらには、メッセージDD102）として読み出され、バリアブルノード計算器１８２に供給される。
【０２０８】
なお、図１７の復号装置において、制御部１８４は、メッセージメモリ１０４に対するメッセージ（データ）の読み書き制御として、図１５のフローチャートで説明したように、図１２の復号装置の制御部１７４と同様の読み書き制御を必要に応じて行う。
【０２０９】
さらに、制御部１８４は、制御信号C104を、メッセージ計算部１８１に供給することにより、そのメッセージ計算部１８１を構成するバリアブルノード計算器１８２、及びチェックノード計算器１８３を制御する。
【０２１０】
ここで、バリアブルノード計算器１８２は、制御部１８４からの制御信号C104に従い、メッセージメモリ１０４から２回目に読み出されたメッセージDD102を選択的に用いて、式（１）のバリアブルノード演算を行う。チェックノード計算器１８３も、制御部１８４からの制御信号C104に従い、メッセージメモリ１０４から２回目に読み出されたメッセージDD104を選択的に用いて、式（７）のチェックノード演算を行う。
【０２１１】
図１８は、図１７のバリアブルノード計算器１８２の構成例を示している。
【０２１２】
なお、図中、図９のバリアブルノード計算器１０２、又は図１３のバリアブルノード計算器１７２と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０２１３】
バリアブルノード計算器１８２は、メッセージを遅延するための遅延メモリとしての小FIFOメモリ１６１と、セレクタ１６２とを有している。
【０２１４】
小FIFOメモリ１６１は、図９のFIFOメモリ１５５と同様に、チェックノードからのメッセージとしての、メッセージメモリ１０４から１回目に読み出されたメッセージD102を一時記憶することにより遅延する。
【０２１５】
但し、図９のFIFOメモリ１５５は、少なくとも、検査行列の列の重みdvの最大値に等しい数のメッセージを記憶することができる容量を有していたが、小FIFOメモリ１６１は、検査行列の列の重みdvの最大値よりも少ない数（であって１以上）のメッセージを記憶する容量しか有していない。
【０２１６】
したがって、小FIFOメモリ１６１は、FIFOメモリ１５５よりも容量が小さいので、規模も小さい。
【０２１７】
小FIFOメモリ１６１は、メッセージメモリ１０４から１回目に読み出されたメッセージD102を遅延し、セレクタ１６２のf端子に供給する。
【０２１８】
セレクタ１６２は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ１６１で遅延されたメッセージD102が供給される。また、セレクタ１６２のm端子には、メッセージメモリ１０４から２回目に読み出されたメッセージDD102が供給される。
【０２１９】
さらに、セレクタ１６２には、制御部１８４（図１７）から制御信号C104が供給されるようになっている。
【０２２０】
セレクタ１６２は、制御部１８４からの制御信号C104に従い、小FIFOメモリ１６１で遅延されたメッセージD102と、メッセージメモリ１０４から２回目に読み出されたメッセージとのうちの一方を、バリアブルノードの演算に用いるメッセージとして選択し、値D153として、演算器１５６に供給する。
【０２２１】
なお、バリアブルノード計算器１８２には、入力ポートP101,P102,PD102の他、入力ポートP104を有しており、制御部１８４からの制御信号C104は、入力ポートP104を介して、セレクタ１６２に供給される。
【０２２２】
また、制御部１８４は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ１６１が記憶可能なメッセージの数以下であるときには、小FIFOメモリ１６１で遅延されたメッセージD102を選択することをセレクタ１６２に指示する信号を、制御信号C104として、バリアブルノード計算器１８２に供給する。
【０２２３】
さらに、制御部１８４は、バリアブルノードに対応する列の重みが、小FIFOメモリ１６１が記憶可能なメッセージの数以下でないときには、メッセージメモリ１０４から２回目に読み出されたメッセージDD102を選択することをセレクタ１６２に指示する信号を、制御信号C104として、バリアブルノード計算器１８２に供給する。
【０２２４】
ここで、制御部１８４は、小FIFOメモリ１６１で遅延されたメッセージD102を選択することをセレクタ１６２に指示する制御信号C104を、バリアブルノード計算器１８２に供給する場合、つまり、制御信号C104が、メッセージメモリ１０４から２回目に読み出されたメッセージDD102を選択することをセレクタ１６２に指示する信号でない場合には、メッセージメモリ１０４からのメッセージの読み出しについては、メッセージメモリ１０４からメッセージを１回だけ読み出す読み出し制御を行う。
【０２２５】
したがって、制御部１８４では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ１６１が記憶可能なメッセージの数以下でない場合には、図１５で説明した、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ１６１が記憶可能なメッセージの数以下である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御は行われず、１回だけ読み出す読み出し制御、すなわち、図１５のステップＳ１０１及びＳ１０２のうちの、ステップＳ１０１だけが行われる。
【０２２６】
以上のように構成されるバリアブルノード計算器１８２は、入力ポートP101,P102,PD102それぞれから入力されるメッセージを必要に応じて用いて、式（１）のバリアブルノード演算を行い、その結果得られるメッセージを、出力ポートP103から出力する。
【０２２７】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP102には、メッセージメモリ１０４から読み出されたメッセージD102（チェックノードメッセージuj）が供給される。
【０２２８】
そして、バリアブルノード計算器１８２では、検査行列の各行に対応するチェックノードからのメッセージD102、すなわち、メッセージメモリ１０４から１回目に読み出されたメッセージujが、入力ポートP102から１つずつ入力され、そのメッセージD102が、演算器１５１と小FIFO１６１に供給される。
【０２２９】
また、バリアブルノード計算器１８２では、受信データメモリ１０５から受信データD101が入力ポートP101から1つずつ読み込まれ、演算器１５７に供給される。
【０２３０】
演算器１５１は、メッセージD102（メッセージuj）とレジスタ１５２に格納されている値D151とを加算することにより、メッセージD102を積算し、その結果得られる積算値を、レジスタ１５２に再格納する。なお、検査行列の１列に亘る全ての枝からのメッセージD102が積算された場合、レジスタ１５２はリセットされる。
【０２３１】
検査行列の１列に亘るメッセージD102が１つずつ読み込まれ、レジスタ１５２に１列分のメッセージD102が積算された値が格納された場合、すなわち、レジスタ１５２に、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ１５３は、レジスタ１５２に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値D151（ｊ＝１からdvまでのΣuj)を選択し、レジスタ１５４に出力して格納させる。
【０２３２】
レジスタ１５４は、格納している値D151を、値D152として、セレクタ１５３と演算器１５６に供給する。レジスタ１５２に１列分のメッセージD102が積算された値が格納される直前までは、セレクタ１５３は、レジスタ１５４から供給された値D152を選択し、レジスタ１５４に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算されるまで、レジスタ１５４は、前回積算された値を、セレクタ１５３と演算器１５６に供給する。
【０２３３】
一方、レジスタ１５４から新たな値D152（ｊ＝１からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ１５２に１列分のメッセージD102が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された直後、バリアブルノード計算器１８２においては、メッセージD102（メッセージuj）と同一のメッセージDD102、すなわち、メッセージメモリ１０４から２回目に読み出されたメッセージujが、入力ポートPD102から１つずつ入力され、そのメッセージDD102が、セレクタ１６２のm端子に供給される。
【０２３４】
また、小FIFOメモリ１６１は、レジスタ１５４から新たな値D152（ｊ＝１からdvまでのΣuj)が出力されるまでの間、メッセージメモリ１０４から１回目に読み出されたメッセージD102を遅延し、セレクタ１６２のf端子に供給する。
【０２３５】
ここで、小FIFOメモリ１６１が記憶することができるメッセージの数がd1個であるとすると、小FIFOメモリ１６１は、上述したように、検査行列の列の重みdvの最大値よりも少ない数のメッセージを記憶する容量しか有していないため、レジスタ１５４に、検査行列の、ある１列に対応するdv個のメッセージD102の積算値（ｊ＝１からdvまでのΣuj)が格納され、レジスタ１５４から出力されるまでの間、小FIFOメモリ１６１において、その１列に対応するdv個のメッセージD102を遅延することができないことがある。
【０２３６】
すなわち、小FIFOメモリ１６１が記憶することができるメッセージの数d1が、レジスタ１５２に積算値が格納されるdv個のメッセージD102が入力されるバリアブルノードに対応する検査行列の列の重みdvよりも小である場合には、小FIFOメモリ１６１では、その列に対応するdv個のメッセージD102のうちの、d1+1個目のメッセージが記憶されるときに、１個目のメッセージが出力されてしまうため、レジスタ１５４において、小FIFOメモリ１６１が記憶可能なメッセージの個数d1よりも多いdv個のメッセージD102の積算値が出力されるまでの間、そのdv個のメッセージD102すべてを、小FIFOメモリ１６１に記憶しておくことができない。
【０２３７】
そこで、制御部１８４（図１７）は、上述したように、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する列の重みdvが、小FIFOメモリ１６１が記憶可能なメッセージの数d1以下でないときには、メッセージメモリ１０４から２回目に読み出されたメッセージDD102を選択することをセレクタ１６２に指示する信号を、制御信号C104として、バリアブルノード計算器１８２に供給する。
【０２３８】
バリアブルノード計算器１８２において、制御部１８４からの制御信号C104は、入力ポートP104を介して、セレクタ１６２に供給される。
【０２３９】
セレクタ１６２は、制御信号C104に従い、端子mに供給される、メッセージメモリ１０４から２回目に読み出されたメッセージDD102を選択し、値D153として演算器１５６に供給する。
【０２４０】
演算器１５６は、レジスタ１５４から供給された積算値D152から、セレクタ１６２からの値D153（いまの場合、入力ポートPD102からのメッセージDD102）を減算する。すなわち、演算器１５６では、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）の積算値D152（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージuj（ｊ＝dvのuj）としてのメッセージD153を減算して、減算値（ｊ＝１からdv-1までのΣuj）を求め、演算器１５７に供給する。
【０２４１】
一方、制御部１８４（図１７）は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ１６１が記憶可能なメッセージの数d1以下であるときには、小FIFOメモリ１６１で遅延されたメッセージD102を選択することをセレクタ１６２に指示する信号を、制御信号C104として、バリアブルノード計算器１８２に供給する。
【０２４２】
バリアブルノード計算器１８２において、制御部１８４からの制御信号C104は、入力ポートP104を介して、セレクタ１６２に供給される。
【０２４３】
セレクタ１６２は、制御信号C104に従い、端子fに供給される、小FIFOメモリ１６１で遅延されたメッセージD102を選択し、値D153として演算器１５６に供給する。
【０２４４】
ここで、小FIFOメモリ１６１が記憶することができるメッセージの数d1が、レジスタ１５２に積算値が格納されるdv個のメッセージD102が入力されるバリアブルノードに対応する検査行列の列の重みdvよりも小でない場合には、レジスタ１５２において、小FIFOメモリ１６１が記憶可能なメッセージの個数d1よりも多くないdv個のメッセージD102が積算されるまでの間、そのdv個のメッセージD102すべてを、小FIFOメモリ１６１に記憶しておくこと、つまり、dv個のメッセージD102が積算されるまでの間、そのdv個のメッセージD102すべてを遅延することができ、その遅延後のメッセージD102を、dv個のメッセージD102の積算が終了した後に出力することができる。
【０２４５】
そこで、制御部１８４（図１７）は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ１６１が記憶可能なメッセージの数d1以下であるときには、小FIFOメモリ１６１で遅延されたメッセージD102を選択することをセレクタ１６２に指示する制御信号C104を、バリアブルノード計算器１８２のセレクタ１６２に供給し、これにより、セレクタ１６２では、小FIFOメモリ１６１で遅延されたメッセージD102が選択され、値D153として演算器１５６に供給される。
【０２４６】
演算器１５６は、レジスタ１５４から供給された積算値D152から、セレクタ１６２からの値D153（いまの場合、小FIFOメモリ１６１で遅延されたメッセージD102）を減算する。すなわち、演算器１５６では、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）の積算値D152（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージuj（ｊ＝dvのuj）としてのメッセージD153を減算して、減算値（ｊ＝１からdv-1までのΣuj）を求め、演算器１５７に供給する。
【０２４７】
演算器１５７は、入力ポートP101からの受信データD101と、演算器１５６からの減算値（ｊ＝１からdv-1までのΣuj）とを加算し、その結果得られる加算値をメッセージD103（メッセージvi）として、出力ポートP103から出力する。
【０２４８】
以上のように、バリアブルノード計算器１８２では、式（１）のバリアブルノード演算が行われ、その結果得られるメッセージ（バリアブルノードメッセージ）viが、出力ポートP103から出力される。
【０２４９】
図１９は、図１７のチェックノード計算器１８３の構成例を示している。
【０２５０】
なお、図中、図１０のチェックノード計算器１０３、及び図１４のチェックノード計算器１７３と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０２５１】
チェックノード計算器１８３は、データを遅延するための遅延メモリとしての、小FIFOメモリ１４１及び１４３と、セレクタ１４２及び１４４とを有している。
【０２５２】
小FIFOメモリ１４１は、図１０のFIFOメモリ１２７と同様に、メッセージメモリ１０４から１回目に読み出されたメッセージD104からLUT１２１で求められた非線形関数φ(|vi|)の演算結果D123（φ(|vi|)）を遅延する。
【０２５３】
但し、図１０のFIFOメモリ１２７は、少なくとも、検査行列の行の重みdcの最大値に等しい数のメッセージ（から求められる非線形関数φ(|vi|)の演算結果）を記憶することができる容量を有していたが、小FIFOメモリ１４１は、検査行列の行の重みdcの最大値よりも少ない数（であって１以上）のメッセージを記憶する容量しか有していない。
【０２５４】
したがって、小FIFOメモリ１４１は、FIFOメモリ１２７よりも容量が小さいので、規模も小さい。
【０２５５】
小FIFOメモリ１４１は、メッセージメモリ１０４から１回目に読み出されたメッセージD104から求められた非線形関数φ(|vi|)の演算結果D123を遅延し、セレクタ１４２のf端子に供給する。
【０２５６】
セレクタ１４２は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ１４１で遅延された非線形関数φ(|vi|)の演算結果が供給される。また、セレクタ１４２のm端子には、メッセージメモリ１０４から２回目に読み出されたメッセージDD104からLUT１３５で求められた非線形関数φ(|vi|)の演算結果が供給される。
【０２５７】
さらに、セレクタ１４２には、制御部１８４（図１７）から制御信号C104が供給されるようになっている。
【０２５８】
セレクタ１４２は、制御部１８４からの制御信号C104に従い、小FIFOメモリ１４１で遅延された、メッセージから求められた非線形関数φ(|vi|)の演算結果と、メッセージメモリ１０４から２回目に読み出されたメッセージから求められた非線形関数φ(|vi|)の演算結果とのうちの一方を、チェックノードの演算に用いるメッセージ（から求められた非線形関数φ(|vi|)の演算結果）として選択し、値D127として、演算器１２６に供給する。
【０２５９】
小FIFOメモリ１４３は、図１０のFIFOメモリ１３３と同様に、メッセージメモリ１０４から１回目に読み出されたメッセージD104の符号ビットD121を遅延する。
【０２６０】
但し、図１０のFIFOメモリ１３３は、少なくとも、検査行列の行の重みdcの最大値に等しい数のメッセージ（の符号ビット）を記憶することができる容量を有していたが、小FIFOメモリ１４３は、検査行列の行の重みdcの最大値よりも少ない数（であって１以上）のメッセージを記憶する容量しか有していない。
【０２６１】
したがって、小FIFOメモリ１４３は、FIFOメモリ１３３よりも容量が小さいので、規模も小さい。
【０２６２】
小FIFOメモリ１４３は、メッセージメモリ１０４から１回目に読み出されたメッセージD104の符号ビットD121を遅延し、セレクタ１４４のf端子に供給する。
【０２６３】
セレクタ１４４は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ１４３で遅延された、メッセージメモリ１０４から１回目に読み出されたメッセージD104の符号ビットが供給される。また、セレクタ１４２のm端子には、メッセージメモリ１０４から２回目に読み出されたメッセージDD104の符号ビットが供給される。
【０２６４】
さらに、セレクタ１４４には、制御部１８４（図１７）から制御信号C104が供給されるようになっている。
【０２６５】
セレクタ１４４は、制御部１８４からの制御信号C104に従い、小FIFOメモリ１４３で遅延された符号ビットと、メッセージメモリ１０４から２回目に読み出されたメッセージの符号ビットとのうちの一方を、チェックノードの演算に用いるメッセージ（の符号ビット）として選択し、値D134として、EXOR回路１３４に供給する。
【０２６６】
なお、チェックノード計算器１８３には、入力ポートP111とPD111の他、入力ポートP114を有しており、制御部１８４からの制御信号C104は、入力ポートP114を介して、セレクタ１４２及び１４４に供給される。
【０２６７】
また、制御部１８４は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みが、小FIFOメモリ１４３が記憶可能なメッセージ（から求められたφ(|vi|)）の数以下であるとき（このときは、検査行列の行の重みが、小FIFOメモリ１４３が記憶可能なメッセージ（の符号ビット）の数以下であるときでもある）には、小FIFOメモリ１４１で遅延されたメッセージD104（から求められたφ(|vi|)）を選択することをセレクタ１４２に指示するとともに、小FIFOメモリ１４３で遅延されたメッセージ（の符号ビット）を選択することをセレクタ１４４に指示する信号を、制御信号C104として、チェックノード計算器１８３に供給する。
【０２６８】
さらに、制御部１８４は、チェックノードに対応する行の重みが、小FIFOメモリ１４１が記憶可能なメッセージ（から求められたφ(|vi|)）の数以下でないとき（このときは、検査行列の行の重みが、小FIFOメモリ１４３が記憶可能なメッセージ（の符号ビット）の数以下でないときでもある）には、メッセージメモリ１０４から２回目に読み出されたメッセージDD104（から求められたφ(|vi|)）を選択することをセレクタ１４２に指示するとともに、メッセージメモリ１０４から２回目に読み出されたメッセージDD104（の符号ビット）を選択することをセレクタ１４４に指示する信号を、制御信号C104として、チェックノード計算器１８３に供給する。
【０２６９】
ここで、制御部１８４は、小FIFOメモリ１４１で遅延されたメッセージD104のφ(|vi|)を選択することをセレクタ１４２に指示する（とともに、小FIFOメモリ１４３で遅延されたメッセージD104の符号ビットを指示することをセレクタ１４４に指示する）制御信号C104を、チェックノード計算器１８３に供給する場合、つまり、制御信号C104が、メッセージメモリ１０４から２回目に読み出されたメッセージDD104のφ(|vi|)を選択することをセレクタ１４２に指示する信号でない場合には、メッセージメモリ１０４からのメッセージの読み出しについては、メッセージメモリ１０４からメッセージを１回だけ読み出す読み出し制御を行う。
【０２７０】
したがって、制御部１８４では、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みが、小FIFOメモリ１４１が記憶可能なメッセージの数以下でない場合には、図１５で説明した、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みが、小FIFOメモリ１４１が記憶可能なメッセージの数以下である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御は行われず、１回だけ読み出す読み出し制御、すなわち、図１５のステップＳ１０１及びＳ１０２のうちの、ステップＳ１０１だけが行われる。
【０２７１】
以上のように構成されるチェックノード計算器１８３は、入力ポートP111とPD111それぞれから入力されるメッセージを必要に応じて用いて、式（７）のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP112から出力する。
【０２７２】
すなわち、入力ポートP111には、メッセージメモリ１０４から読み出されたメッセージD104（バリアブルノードメッセージuj）が供給される。
【０２７３】
そして、チェックノード計算器１８３では、検査行列の各行に対応するバリアブルノードからのメッセージD104（メッセージvi）が入力ポートP111から１つずつ入力され、その最上位ビットを除く下位ビット、つまり、メッセージD104の絶対値D122(|vi|)が、LUT１２１に供給されるとともに、最上位ビット、つまりメッセージD104の符号ビットD121が、EXOR回路１２９と小FIFOメモリ１４３に供給される。
【０２７４】
LUT１２１は、絶対値D122(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D123（φ(|vi|)）を読み出し、演算器１２２と小FIFO１４１に供給する。
【０２７５】
演算器１２２は、演算結果D123（φ(|vi|)）とレジスタ１２３に格納されている値D124とを加算することにより、演算結果D123を積算し、その結果得られる積算値をレジスタ１２３に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の絶対値D122(|vi|)に対する演算結果D123（φ(|vi|)）が積算された場合、レジスタ１２３はリセットされる。
【０２７６】
検査行列の１行に亘るメッセージD104が１つずつ読み込まれ、レジスタ１２３に１行分の演算結果D123が積算された積算値が格納された場合、セレクタ１２４は、レジスタ１２３に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算された積算値D124（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）を選択し、積算値D125として、レジスタ１２５に出力して格納させる。レジスタ１２５は、格納している積算値D125を、値D126として、セレクタ１２４と演算器１２６に供給する。
【０２７７】
レジスタ１２３に１行分の演算結果D123が積算された積算値が格納される直前までは、セレクタ１２４は、レジスタ１２５から供給された値D126を選択し、レジスタ１２５に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１２５は、前回積算されたφ(|vi|)の積算値を、セレクタ１２４と演算器１２６に供給する。
【０２７８】
一方、レジスタ１２５から新たな値D126（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）の出力が開始されると、すなわち、レジスタ１２５に１行分の演算結果D123が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納された直後、チェックノード計算器１８３において、メッセージD104（メッセージvi）と同一のメッセージDD104、すなわち、メッセージメモリ１０４から２回目に読み出されたメッセージviが、入力ポートPD111から１つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT１３５に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、セレクタ１４４のm端子に供給される。
【０２７９】
LUT１３５は、メッセージDD104の絶対値(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果（φ(|vi|)）を読み出し、セレクタ１４２のm端子に供給する。
【０２８０】
また、小FIFOメモリ１４１は、レジスタ１２５から新たな値D126（ｉ＝１からdcまでのΣφ(|vi|))が出力されるまでの間、LUT１２１からのメッセージD104の演算結果D123（φ(|vi|)）を遅延し、セレクタ１４２のf端子に供給する。
【０２８１】
ここで、小FIFOメモリ１４１が記憶することができるメッセージ（のφ(|vi|)）の数がd2個であるとすると、小FIFOメモリ１４１は、上述したように、検査行列の行の重みdcの最大値よりも少ない数のメッセージ（のφ(|vi|)）を記憶する容量しか有していないため、レジスタ１２５に、検査行列の、ある１行に対応するdc個のメッセージD104のφ(|vi|)の積算値（ｉ＝１からdcまでのΣφ(|vi|))が格納され、レジスタ１２５から出力されるまでの間、小FIFOメモリ１４１において、その１行に対応するdc個のメッセージD104のφ(|vi|)を遅延することができないことがある。
【０２８２】
すなわち、小FIFOメモリ１４１が記憶することができるメッセージの数d2が、レジスタ１２５にφ(|vi|)の積算値が格納されるdc個のメッセージD102が入力されるチェックノードに対応する検査行列の行の重みdcよりも小である場合には、小FIFOメモリ１４１では、その行に対応するdc個のメッセージD104のうちの、d2+1個目のメッセージのφ(|vi|)が記憶されるときに、１個目のメッセージのφ(|vi|)が出力されてしまうため、レジスタ１２５において、小FIFOメモリ１４１が記憶可能なメッセージの個数d2よりも多いdc個のメッセージD104のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD104のφ(|vi|)すべてを、小FIFOメモリ１４１に記憶しておくことができない。
【０２８３】
そこで、制御部１８４（図１７）は、上述したように、メッセージを求めようとしている枝が接続しているチェックノードに対応する行の重みdcが、小FIFOメモリ１４１が記憶可能なメッセージの数d2以下でないときには、メッセージメモリ１０４から２回目に読み出されたメッセージDD104から求められたφ(|vi|)を選択することをセレクタ１４２に指示する信号を、制御信号C104として、チェックノード計算器１８３に供給する。
【０２８４】
チェックノード計算器１８３において、制御部１８４からの制御信号C104は、入力ポートP114を介して、セレクタ１４２に供給される。
【０２８５】
セレクタ１４２は、制御信号C104に従い、端子mに供給される、メッセージメモリ１０４から２回目に読み出されたメッセージDD102からLUT１３５で求められたφ(|vi|)を選択し、値D127として演算器１２６に供給する。
【０２８６】
一方、制御部１８４（図１７）は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ１４１が記憶可能なメッセージの数d2以下であるときには、小FIFOメモリ１４１で遅延されたメッセージD104のφ(|vi|)を選択することをセレクタ１４２に指示する信号を、制御信号C104として、チェックノード計算器１８３に供給する。
【０２８７】
チェックノード計算器１８３において、制御部１８４からの制御信号C104は、入力ポートP114を介して、セレクタ１４２に供給される。
【０２８８】
セレクタ１４２は、制御信号C104に従い、端子fに供給される、小FIFOメモリ１４１で遅延されたメッセージD104のφ(|vi|)を選択し、値D127として演算器１５６に供給する。
【０２８９】
ここで、小FIFOメモリ１４１が記憶することができるメッセージの数d2が、レジスタ１２５に積算値が格納されるdc個のメッセージD104が入力されるチェックノードに対応する検査行列の行の重みdcよりも小でない場合には、レジスタ１２５において、小FIFOメモリ１４１が記憶可能なメッセージの個数d2よりも多くないdc個のメッセージD104のφ(|vi|)の積算値（ｉ＝１からdcまでのΣφ(|vi|))が出力されるまでの間、そのdc個のメッセージD104のφ(|vi|)すべてを、小FIFOメモリ１４１に記憶しておくこと、つまり、dc個のメッセージD104のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD104のφ(|vi|)すべてを遅延することができ、その遅延後のメッセージD104のφ(|vi|)を、dc個のメッセージD104のφ(|vi|)の積算が終了した後に出力することができる。
【０２９０】
そこで、制御部１８４（図１７）は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ１４１が記憶可能なメッセージの数d2以下であるときには、小FIFOメモリ１４１で遅延されたメッセージD104のφ(|vi|)を選択することをセレクタ１６２に指示する制御信号C104を、チェックノード計算器１８３のセレクタ１４２に供給し、これにより、セレクタ１４２では、小FIFOメモリ１４１で遅延されたメッセージD104のφ(|vi|)が選択され、値D127として演算器１２６に供給される。
【０２９１】
演算器１２６は、レジスタ１２５から供給された値D126から、セレクタ１４２からの値D127（φ(|vi|)）を減算し、減算結果を、減算値D128としてLUT１２８に供給する。すなわち、演算器１２６は、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)の積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）から、求めたい枝からのメッセージvi（ｉ＝dcのvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を減算値D128としてLUT１２８に供給する。
【０２９２】
LUT１２８は、演算器１２６からの減算値D128（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を引数として、逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D129（φ-1(Σφ(|vi|)))を出力する。
【０２９３】
一方、EXOR回路１２９は、レジスタ１３０に格納されている値D131と符号ビットD121との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D130をレジスタ１３０に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された場合、レジスタ１３０はリセットされる。
【０２９４】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納された場合、セレクタ１３１は、レジスタ１３０に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131（ｉ＝１からｉ＝dcまでのΠsign(vi)）を選択し、値D132としてレジスタ１３２に出力して格納させる。レジスタ１３２は、格納している値D132を、値D133としてセレクタ１３１とEXOR回路１３４に供給する。
【０２９５】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納される直前までは、セレクタ１３１は、レジスタ１３２から供給された値D133を選択し、レジスタ１３２に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）の符号ビットD121が乗算されるまで、レジスタ１３２は、前回格納した値を、セレクタ１３１とEXOR回路１３４に供給する。
【０２９６】
レジスタ１３２から新たな値D133（ｉ＝１からｉ＝dcまでのΠsign(vi)）がEXOR回路１３４に供給されたとき、すなわち、レジスタ１３０に１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131（ｉ＝１からｉ＝dcまでのΠsign(vi)）が格納されたとき、上述したように、レジスタ１２５には、１行分の演算結果D123が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納される。
【０２９７】
レジスタ１２５に１行分の演算結果D123が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納されると、上述したように、チェックノード計算器１８３において、メッセージD104（メッセージvi）と同一のメッセージDD104、すなわち、メッセージメモリ１０４から２回目に読み出されたメッセージviが、入力ポートPD104から１つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT１３５に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、セレクタ１４４のm端子に供給される。
【０２９８】
また、小FIFOメモリ１４３は、レジスタ１３２から新たな値D133（ｉ＝１からｉ＝dcまでのΠsign(vi)）が出力されるまでの間、メッセージメモリ１０４から１回目に読み出されたメッセージD104の符号ビットD121を遅延し、セレクタ１４４のf端子に供給する。
【０２９９】
ここで、小FIFOメモリ１４３が記憶することができるメッセージ（の符号ビット）の数が、小FIFOメモリ１４１と同一のd2個であるとすると、小FIFOメモリ１４３は、上述したように、検査行列の行の重みdcの最大値よりも少ない数のメッセージ（の符号ビット）を記憶する容量しか有していないため、レジスタ１３２に、検査行列の、ある１行に対応するdc個のメッセージD104の符号ビットD121の乗算結果（ｉ＝１からdcまでのΠsign(vi)）が格納され、レジスタ１３２から出力されるまでの間、小FIFOメモリ１４３において、その１行に対応するdc個のメッセージD104の符号ビットD121を遅延することができないことがある。
【０３００】
すなわち、小FIFOメモリ１４３が記憶することができるメッセージの数d2が、レジスタ１３２に符号ビットD121の乗算結果が格納されるdc個のメッセージD102が入力されるチェックノードに対応する検査行列の行の重みdcよりも小である場合には、小FIFOメモリ１４３では、その行に対応するdc個のメッセージD104のうちの、d2+1個目のメッセージの符号ビットD121が記憶されるときに、１個目のメッセージの符号ビットD121が出力されてしまうため、レジスタ１３２において、小FIFOメモリ１４３が記憶可能なメッセージの個数d2よりも多いdc個のメッセージD104の符号ビットD121が格納されるまでの間、そのdc個のメッセージD104の符号ビットD121すべてを、小FIFOメモリ１４３に記憶しておくことができない。
【０３０１】
そこで、制御部１８４（図１７）は、上述したように、メッセージを求めようとしている枝が接続しているチェックノードに対応する行の重みdcが、小FIFOメモリ１４３が記憶可能なメッセージの数d2以下でないとき（このときは、行の重みdcが、小FIFOメモリ１４１が記憶可能なメッセージの数d2以下でないときでもある）には、メッセージメモリ１０４から２回目に読み出されたメッセージDD104の符号ビットを選択することをセレクタ１４４に指示する信号を、制御信号C104として、チェックノード計算器１８３に供給する。
【０３０２】
チェックノード計算器１８３において、制御部１８４からの制御信号C104は、入力ポートP114を介して、セレクタ１４４に供給される。
【０３０３】
セレクタ１４４は、制御信号C104に従い、端子mに供給される、メッセージメモリ１０４から２回目に読み出されたメッセージDD102の符号ビットを選択し、値D134としてEXOR回路１３４に供給する。
【０３０４】
一方、制御部１８４（図１７）は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ１４３が記憶可能なメッセージの数d2以下であるときには、小FIFOメモリ１４３で遅延されたメッセージD104の符号ビットを選択することをセレクタ１４２に指示する信号を、制御信号C104として、チェックノード計算器１８３に供給する。
【０３０５】
チェックノード計算器１８３において、制御部１８４からの制御信号C104は、入力ポートP114を介して、セレクタ１４４に供給される。
【０３０６】
セレクタ１４４は、制御信号C104に従い、端子fに供給される、小FIFOメモリ１４３で遅延されたメッセージD104の符号ビットを選択し、値D134としてEXOR回路１３４に供給する。
【０３０７】
EXOR回路１３４は、レジスタ１３２から供給された値D133と、セレクタ１４４からの符号ビットD134との排他的論理和を演算することにより、値D133を、符号ビットD134で除算し、除算結果を除算値D135として出力する。すなわち、EXOR回路１３４は、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121の乗算値D133（ｉ＝１からｉ＝dcまでのΠsign(vi)）を、求めたい枝からのメッセージviとしてのメッセージの符号ビットD134（ｉ＝dcのsign(vi)）で除算して、その除算値（ｉ＝１からｉ＝dc-1までのΠsign(vi)）を除算値D135として出力する。
【０３０８】
そして、チェックノード計算器１８３では、LUT１２８から出力された演算結果D129を下位ビットとするとともに、EXOR回路１３４から出力された除算値D135を最上位ビット（符号ビット）とするビット列がメッセージD105（メッセージuj）として、出力ポートP112から出力される。
【０３０９】
以上のように、チェックノード計算器１８３では、式（７）の演算が行われ、メッセージ（チェックノードメッセージ）ujが求められる。
【０３１０】
なお、図示しないが、図１７の復号装置では、復号の最終段において、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【０３１１】
次に、図２０のフローチャートを参照して、図１７の制御部１８４が制御信号C104により、セレクタ１４２及び１４４（図１９）、並びにセレクタ１６２（図１８）を制御するセレクタ制御の処理について説明する。
【０３１２】
なお、ここでは、説明を簡単にするために、小FIFOメモリ１４１及び１４３（図１９）、並びに小FIFOメモリ１６１（図１８）が記憶可能なメッセージの個数（以下、適宜、記憶可能個数という）は、すべて同一のd個であるとする。但し、小FIFOメモリ１４１及び１４３（図１９）と、小FIFOメモリ１６１（図１８）とが記憶可能なメッセージの個数は、異なっていても良い。
【０３１３】
ステップＳ１２１において、制御部１８４は、メッセージを求めようとして注目しているノード（注目ノード）に対応する検査行列の重み（注目ノードがバリアブルノードである場合には、そのバリアブルノードに対応する列の重みであり、注目ノードがチェックノードである場合には、そのチェックノードに対応する行の重み）が、記憶可能個数dよりも大であるかどうかを判定する。
【０３１４】
ステップＳ１２１において、注目ノードに対応する検査行列の重みが、記憶可能個数dより大でないと判定された場合、すなわち、注目ノードに接続している枝に対応する出力メッセージを求めるのに用いられる入力メッセージの個数が、記憶可能個数d以下である場合、処理は、ステップＳ１２２に進み、制御部１８４は、FIFOメモリの出力、すなわち、例えば、図１８のバリアブルノード計算器１８２については、小FIFOメモリ１６１が出力するメッセージを、図１９のチェックノード計算器１８３については、小FIFOメモリ１４１が出力するメッセージのφ(|vi|)と、小FIFOメモリ１４３が出力するメッセージの符号ビットとを、それぞれ選択することを指示する制御信号C104を出力し、処理は、ステップＳ１２１に戻る。
【０３１５】
この場合、図１８のバリアブルノード計算器１８２では、セレクタ１６２において、制御信号C104に従い、小FIFOメモリ１６１が出力するメッセージが選択され、演算器１５６に供給される。
【０３１６】
また、図１９のチェックノード計算器１８３では、セレクタ１４２において、制御信号C104に従い、小FIFOメモリ１４１が出力するメッセージのφ(|vi|)が選択され、演算器１２６に供給されるとともに、セレクタ１４４において、制御信号C104に従い、小FIFOメモリ１４３が出力するメッセージの符号ビットが選択され、EXOR回路１３４に供給される。
【０３１７】
なお、入力メッセージの個数が、記憶可能個数d以下である場合、制御部１８４では、上述したように、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御（図１５のステップＳ１０１及びＳ１０２の両方）は行われず、１回だけ読み出す読み出し制御（図１５のステップＳ１０１）が行われる。
【０３１８】
一方、ステップＳ１２１において、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であると判定された場合、すなわち、注目ノードに接続している枝に対応する出力メッセージを求めるのに用いられる入力メッセージの個数が、記憶可能個数dを越えている場合、処理は、ステップＳ１２３に進み、制御部１８４は、メッセージメモリ１０４（図１７）から２回目に読み出されたメッセージ（データ）、すなわち、例えば、図１８のバリアブルノード計算器１８２については、メッセージメモリ１０４から２回目に読み出されたメッセージDD102を、図１９のチェックノード計算器１８３については、メッセージメモリ１０４から２回目に読み出されたメッセージDD102からLUT１３５で求められたφ(|vi|)と、メッセージメモリ１０４から２回目に読み出されたメッセージDD102の符号ビットとを、それぞれ選択することを指示する制御信号C104を出力し、処理は、ステップＳ１２１に戻る。
【０３１９】
すなわち、この場合、制御部１８４では、上述したように、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御（図１５のステップＳ１０１及びＳ１０２の両方）が行われ、これにより、メッセージメモリ１０４からは、同一のメッセージが２回読み出される。
【０３２０】
この場合、図１８のバリアブルノード計算器１８２では、セレクタ１６２において、制御信号C104に従い、メッセージメモリ１０４から２回目に読み出されたメッセージDD102が選択され、演算器１５６に供給される。
【０３２１】
また、図１９のチェックノード計算器１８３では、セレクタ１４２において、制御信号C104に従い、メッセージメモリ１０４から２回目に読み出されたメッセージDD102からLUT１３５で求められたφ(|vi|)が選択され、演算器１２６に供給されるとともに、セレクタ１４４において、制御信号C104に従い、メッセージメモリ１０４から２回目に読み出されたメッセージDD102の符号ビットが選択され、EXOR回路１３４に供給される。
【０３２２】
以上のように、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ１４１及び１４３（図１９）、並びに小FIFOメモリ１６１（図１８）を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ１２７及び１３３（図１０）、並びにFIFOメモリ１５５（図９）を設ける場合に比較して、復号装置の規模を削減することができる。
【０３２３】
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合（記憶可能個数dより大でない場合）には、FIFOメモリの出力を選択して、ノード（バリアブルノード、チェックノード）の演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ１２７及び１３３（図１０）、並びにFIFOメモリ１５５（図９）を有する図８の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図８の復号装置と同様の回数だけ繰り返し復号を行うことができるので（１回の復号に要する時間が図８の復号装置と同様となるので）、復号性能が劣化することを防止（抑制）することができる。
【０３２４】
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出し、２回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
【０３２５】
以上から、図１７の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
【０３２６】
ところで、図１７の復号装置では、出力メッセージを求める手段としてのメッセージ計算部１８１を、バリアブルノード演算を行うバリアブルノード計算器１８２と、チェックノード演算を行うチェックノード計算器１８３とで構成するようにしたが、出力メッセージを求める手段は、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有化して構成し、バリアブルノード演算とチェックノード演算とを、選択的に行うようにすることで、復号装置の規模の、さらなる削減をすることができる。
【０３２７】
そこで、次に、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有化し、かつ、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを設けた復号装置について説明するが、その前段階の準備として、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部が共有化され、かつ、少なくとも、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリが設けられた復号装置について説明する。
【０３２８】
すなわち、図２１は、そのような復号装置の構成例を示すブロック図である。
【０３２９】
なお、図中、図８の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図２１の復号装置は、メッセージ計算部１０１に代えてメッセージ計算部１９１が設けられているとともに、制御部１０６に代えて制御部１９２が設けられている他は、図８の復号装置と同様に構成されている。
【０３３０】
図２１の復号装置は、図８の復号装置と同様に、フルシリアルの復号を繰り返し行う。
【０３３１】
図２１の復号装置では、メッセージメモリ１０４からメッセージ計算部１９１に、入力メッセージが１つずつ読み出され、メッセージ計算部１９１において、その入力メッセージを用いて、所望の枝に対応する出力メッセージが計算される。そして、その計算によって求められた出力メッセージが、メッセージメモリ１０４に格納されていく。図２１の復号装置では、以上の処理が繰り返し行われ、いわゆる繰り返し復号が行われる。
【０３３２】
すなわち、受信データメモリ１０５には、送信されてきたLDPC符号を受信することにより得られる、符号の0（又は1）らしさを表す対数尤度比である受信データ（LDPC符号）D100が供給され、受信データメモリ１０５は、その受信データD100を記憶する。
【０３３３】
バリアブルノード演算時には、受信データメモリ１０５は、制御部１９２から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部１９１に供給する。
【０３３４】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部１９２から供給される制御信号に従って、記憶しているメッセージD201を読み出し、メッセージ計算部１９１に供給する。さらに、バリアブルノード演算時には、制御部１９２は、制御信号C203として、バリアブルノード演算を指示する制御信号を、メッセージ計算部１９１に供給する。
【０３３５】
メッセージ計算部１９１は、メッセージメモリ１０４から供給される入力メッセージD201と受信データメモリ１０５から供給される受信データD101を用い、制御部１９２からの制御信号C203に従って、式（１）のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られた出力メッセージ（バリアブルノードメッセージ）viを、メッセージD202として、メッセージメモリ１０４に供給する。
【０３３６】
そして、メッセージメモリ１０４は、以上のようにしてメッセージ計算部１９１から供給されるメッセージD202を記憶する。
【０３３７】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部１９２から供給される制御信号に従って、記憶しているバリアブルノードメッセージviを、入力メッセージD201として読み出し、メッセージ計算部１９１に供給する。
【０３３８】
さらに、チェックノード演算時には、制御部１９２は、制御信号C203として、チェックノード演算を指示する制御信号を、メッセージ計算部１９１に供給する。
【０３３９】
メッセージ計算部１９１は、メッセージメモリ１０４から供給される入力メッセージD201を用い、制御部１９２からの制御信号C203に従って、式（７）のチェックノード演算を行い、そのチェックノード演算にって求められた出力メッセージ（チェックノードメッセージ）ujを、メッセージD202として、メッセージメモリ１０４に供給する。
【０３４０】
そして、メッセージメモリ１０４は、以上のようにしてメッセージ計算部１９１から供給されるメッセージD202を記憶する。
【０３４１】
メッセージメモリ１０４が記憶したメッセージ計算部１９１からのチェックノードメッセージujとしてのメッセージD202は、次のバリアブルノード演算時に、メッセージD201として読み出され、メッセージ計算部１９１に供給される。
【０３４２】
次に、図２２は、図２１のメッセージ計算部１９１の構成例を示している。
【０３４３】
メッセージ計算部１９１は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、２つの入力ポートP101とP201を有し、外部にメッセージを供給（出力）するポートとして、１の出力ポートP202を有している。さらに、メッセージ計算部１９１は、外部から制御信号が供給（入力）される入力ポートとして、１つの入力ポートP203を有している。
【０３４４】
メッセージ計算部１９１は、入力ポートP201から入力されるメッセージ、さらには、必要に応じて、入力ポートP101から入力されるメッセージ（受信データ）を用い、入力ポートP203から入力される制御信号C203に従って、復号の対象のLDPC符号を定義する検査行列に基づき、式（１）のバリアブルノード演算又は式（７）のチェックノード演算を選択的に行い、その結果得られるメッセージを、出力ポートP202から出力する。
【０３４５】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP201には、メッセージメモリ１０４から読み出されたメッセージD201（チェックノードメッセージuj又はバリアブルノードメッセージvi）が供給される。さらに、入力ポートP203には、制御部１９２からの制御信号C203が供給される。
【０３４６】
そして、入力ポートP101に供給された受信データD101は、演算器３１３に供給され、入力ポートP201に供給されたメッセージD201は、セレクタ３０１のv端子に供給される。さらに、入力ポートP201に供給されたメッセージD201のうちの最上位ビットを除く下位ビット、すなわち、メッセージD201の絶対値は、値D303として、LUT３００に供給され、メッセージD201のうちの最上位ビット、すなわち、メッセージD201の符号ビットは、値D304として、EXOR回路３０６とFIFOメモリ３２０に供給される。
【０３４７】
また、入力ポートP203に供給された制御信号C203は、セレクタ３０１及び３１６に供給される。
【０３４８】
セレクタ３０１及び３１６は、v端子とc端子とを有し、制御信号C203に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ３０１及び３１６は、制御信号C203がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C203がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
【０３４９】
その結果、メッセージ計算部１９１は、バリアブルノード演算時には、実質的に、図２３に示す構成となって、バリアブルノード演算を行い、チェックノード演算時には、実質的に、図２４に示す構成となって、チェックノード演算を行う。
【０３５０】
すなわち、図２３は、バリアブルノード演算時のメッセージ計算部１９１の実質的な構成例を示している。
【０３５１】
なお、上述したように、バリアブルノード演算時には、セレクタ３０１及び３１６はv端子を選択するが、図２３では、図２２に図示した構成のうちの、セレクタ３０１及び３１６がv端子を選択することによってバリアブルノード演算時に（実質的に）機能しない部分（バリアブルノード演算に関係がない部分）の図示を省略してある。
【０３５２】
バリアブルノード演算時においては、入力ポートP101には、受信データメモリ１０５から１つずつ読み出された受信データD101が供給される。また、入力ポートP201には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各行に対応するチェックノード（出力メッセージviを求めようとしているバリアブルノードに対応する列の、各行に対応するチェックノード）からのチェックノードメッセージujが、順次、メッセージD201として供給される。
【０３５３】
入力ポートP101に供給された受信データD101は、演算器３１３に供給される。
【０３５４】
また、入力ポートP201に供給されたメッセージD201（メッセージuj）は、セレクタ３０１のv端子に供給され、バリアブルノード演算時にはv端子を選択しているセレクタ３０１から、メッセージD306として、演算器３０２とFIFOメモリ３２０に供給される。
【０３５５】
演算器３０２は、セレクタ３０１からのメッセージD306（メッセージuj）とレジスタ３０３に格納されている値D307とを加算することにより、メッセージD306を積算し、その結果得られる積算値を、レジスタ３０３に再格納する。なお、検査行列の１列に亘る全ての枝からのメッセージD306が積算された場合、レジスタ３０３はリセットされる。
【０３５６】
検査行列の１列に亘るメッセージD201が１つずつ読み込まれ、レジスタ３０３に１列分のメッセージD306が積算された値が格納された場合、すなわち、レジスタ３０３に、検査行列の１列に亘る全ての枝からのメッセージD306（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ３０４は、レジスタ３０３に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD306（メッセージuj）が積算された積算値D307（ｊ＝１からdvまでのΣuj)を選択し、レジスタ３０５に出力して格納させる。
【０３５７】
レジスタ３０５は、格納している値D307を、値D308として、セレクタ３０４と演算器３１２に供給する。レジスタ３０３に１列分のメッセージD306が積算された値が格納される直前までは、セレクタ３０４は、レジスタ３０５から供給された値D308を選択し、レジスタ３０５に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD306（メッセージuj）が積算されるまで、レジスタ３０５は、前回積算された値を、セレクタ３０４と演算器３１２に供給する。
【０３５８】
一方、FIFOメモリ３２０は、少なくとも、検査行列の重みの最大値と同一の数のメッセージを記憶することができる容量を有し、レジスタ３０５から新たな値D308（ｊ＝１からdvまでのΣuj）が出力されるまでの間、セレクタ３０１が出力したチェックノードからのメッセージD306を遅延し、値D315として演算器３１２に供給する。演算器３１２は、レジスタ３０５から供給された値D308から、FIFOメモリ３２０から供給された値D315を減算する。すなわち、演算器３１２は、検査行列の１列に亘る全ての枝からのメッセージD306（メッセージuj）の積算値D308（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージD315（uj）を減算して、減算値D316（ｊ＝１からdv-1までのΣuj）を求め、演算器３１３に供給する。
【０３５９】
演算器３１３は、入力ポートP101からの受信データD101と、演算器３１２からの減算値D316（ｊ＝１からdv-1までのΣuj）とを加算し、その結果得られる加算値D317（バリアブルノードメッセージvi）を、セレクタ３１６のv端子に供給する。
【０３６０】
セレクタ３１６は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器３１３からの加算値D317を、メッセージD202（メッセージvi）として、出力ポートP202から出力する。
【０３６１】
以上のように、セレクタ３０１及び３０４がv端子を選択しているメッセージ計算部１９１では、式（１）のバリアブルノード演算が行われ、その結果得られるメッセージ（バリアブルノードメッセージ）viが、出力ポートP202から出力される。
【０３６２】
図２４は、チェックノード演算時の図２２のメッセージ計算部１９１の実質的な構成例を示している。
【０３６３】
なお、上述したように、チェックノード演算時には、セレクタ３０１及び３１６はc端子を選択するが、図２４では、図２２に図示した構成のうちの、セレクタ３０１及び３１６がc端子を選択することによってチェックノード演算時に（実質的に）機能しない部分（チェックノード演算に関係がない部分）の図示を省略してある。
【０３６４】
チェックノード演算時においては、入力ポートP201には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各列に対応するバリアブルノード（出力メッセージujを求めようとしているチェックノードに対応する行の、各列に対応するバリアブルノード）からのバリアブルノードメッセージviが、順次、メッセージD201として供給される。
【０３６５】
入力ポートP201に供給されたメッセージD201（メッセージuj）のうちの最上位ビットを除く下位ビット、つまり、メッセージD201の絶対値D303(|vi|)は、LUT３００に供給され、最上位ビット、つまりメッセージD201の符号ビットD304は、EXOR回路３０６とFIFOメモリ３２０にそれぞれ供給される。
【０３６６】
LUT３００は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の演算結果を出力するLUT（φ(x)の演算結果を記憶しているLUT）であり、絶対値D303(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D305（φ(|vi|)）を読み出し、セレクタ３０１のc端子に供給する。
【０３６７】
セレクタ３０１は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT３００からの演算結果D305（φ(|vi|)）を、演算結果D306（φ(|vi|)）として、演算器３０２とFIFOメモリ３２０に供給する。
【０３６８】
演算器３０２は、演算結果D306（φ(|vi|)）とレジスタ３０３に格納されている値D307とを加算することにより、演算結果D306を積算し、その結果得られる積算値をレジスタ３０３に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD201の絶対値D303(|vi|)に対する演算結果D306（φ(|vi|)）が積算された場合、レジスタ３０３はリセットされる。
【０３６９】
検査行列の１行に亘るメッセージD201が１つずつ読み込まれ、レジスタ３０３に１行分の演算結果D306が積算された積算値が格納された場合、セレクタ３０４は、レジスタ３０３に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）から求められたφ(|vi|)が積算された積算値D307（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）を選択し、レジスタ３０５に出力して格納させる。レジスタ３０５は、格納している積算値D307を、値D308として、セレクタ３０４と演算器３１２に供給する。
【０３７０】
レジスタ３０３に１行分の演算結果D306が積算された積算値が格納される直前までは、セレクタ３０４は、レジスタ３０５から供給された値D308を選択し、レジスタ３０５に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ３０５は、前回積算されたφ(|vi|)の積算値を、セレクタ３０４と演算器３１２に供給する。
【０３７１】
一方、FIFOメモリ３２０は、レジスタ３０５から新たな値D308（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が出力されるまでの間、LUT３００が出力した演算結果D306（φ(|vi|)）を遅延し、値D315として演算器３１２に供給する。演算器３１２は、レジスタ３０５から供給された値D308から、FIFOメモリ３２０から供給された値D315を減算し、その減算結果を、減算値D316としてLUT３１４に供給する。すなわち、演算器３１２は、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）から求められたφ(|vi|)の積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）から、求めたい枝からのメッセージD201（メッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を減算値D316としてLUT３１４に供給する。
【０３７２】
LUT３１４は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の逆関数φ-1(x)の演算結果を出力するLUT（φ-1(x)の演算結果を記憶しているLUT）であり、演算器３１２からの減算値D316（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を引数として、逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D318（φ-1(Σφ(|vi|)))を出力する。
【０３７３】
なお、上述したように、非線形関数φ(x)の演算結果と逆関数φ-1(x)の演算結果とは等しいので、LUT３００と３１４とは、同一構成のLUTとなっている。
【０３７４】
以上の処理と並行して、EXOR回路３０６は、レジスタ３０７に格納されている値D310と符号ビット（正負を表すビット）D304との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D309を、レジスタ３０７に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された場合、レジスタ３０７はリセットされる。
【０３７５】
検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309（ｉ＝１からdcまでのΠsign(vi)）がレジスタ３０７に格納された場合、セレクタ３０８は、レジスタ３０７に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された値D310（ｉ＝１からｉ＝dcまでのΠsign(vi)）を選択し、レジスタ３０９に出力して格納させる。レジスタ３０９は、格納している値D311を、セレクタ３０８とEXOR回路３１５に供給する。
【０３７６】
検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309（ｉ＝１からdcまでのΠsign(vi)）がレジスタ３０７に格納される直前までは、セレクタ３０８は、レジスタ３０９から供給された値D311を選択し、レジスタ３０９に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）の符号ビットD304が乗算されるまで、レジスタ３０９は、前回格納した値を、セレクタ３０８とEXOR回路３１５に供給する。
【０３７７】
一方、FIFOメモリ３２０は、レジスタ３０９から新たな値D311（ｉ＝１からｉ＝dcまでのΠsign(vi)）がEXOR回路３１５に供給されるまでの間、セレクタ３０１からの演算結果D306（φ(|vi|)）とともに、符号ビットD304を遅延し、１ビットの値D313としてEXOR回路３１５に供給する。EXOR回路３１５は、レジスタ３０９から供給された値D311と、FIFOメモリ３２０から供給された値D313との排他的論理和を演算することにより、値D311を、値D313で除算し、除算結果を除算値D319として出力する。すなわち、EXOR回路３１５は、検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304（sign(vi)）の乗算値（ｉ＝１からｉ＝dcまでのΠsign(vi)）を、求めたい枝からのメッセージD201の符号ビットD304（sign(vi)）で除算して、その除算値（ｉ＝１からｉ＝dc-1までのΠsign(vi)）を除算値D319として出力する。
【０３７８】
そして、メッセージ計算部１９１では、LUT３１４から出力された演算結果D318を下位ビットとするとともに、EXOR回路３１５から出力された除算値D319を最上位ビット（符号ビット）とするビット列D320（チェックノードメッセージuj）が、セレクタ３１６のc端子に供給される。
【０３７９】
セレクタ３１６は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D320（メッセージuj）を、メッセージD202（メッセージvi）として、出力ポートP202から出力する。
【０３８０】
以上のように、セレクタ３０１及び３０４がc端子を選択しているメッセージ計算部１９１では、式（７）のチェックノード演算が行われ、その結果得られるメッセージ（チェックノードメッセージ）ujが、出力ポートP202から出力される。
【０３８１】
なお、図示しないが、図２１の復号装置では、復号の最終段において、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【０３８２】
図２１の復号装置によれば、メッセージメモリ１０４と、メッセージ計算部１９１のFIFOメモリ３２０の容量さえ足りれば、様々な検査行列のLDPC符号を復号することができる。
【０３８３】
また、図２１の復号装置のメッセージ計算部１９１（図２２）では、図２３と図２４とを比較して分かるように、値の積算を行って積算値を出力する演算器３０２及びレジスタ３０３、積算値から、ある値を減算して減算値を出力するセレクタ３０４、レジスタ３０５、及び演算器３１２、並びに値を遅延する遅延メモリとしてのFIFOメモリ３２０が、バリアブルノード演算とチェックノード演算とで共有されているので、例えば、図８の復号装置のように、独立のバリアブルノード計算器１０２とチェックノード計算器１０３とを有するメッセージ計算部１０１よりも回路規模を小さくすることができる。
【０３８４】
次に、図２５は、本発明を適用した復号装置の第２実施の形態の構成例を示すブロック図である。
【０３８５】
なお、図中、図２１の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図２５の復号装置は、メッセージ計算部１９１に代えて、メッセージ計算部２０１が設けられているとともに、制御部１９２に代えて、制御部２０２が設けられている他は、図２１の復号装置と同様に構成されている。
【０３８６】
図２５の復号装置では、メッセージ計算部２０１が、図２１の復号装置のメッセージ計算部１９１と同様に、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図２５の復号装置では、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部２０１が、図２２のメッセージ計算部１９１のFIFOメモリ３２０のように、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを有している。
【０３８７】
また、図２５の復号装置では、制御部２０２が、メッセージメモリ１０４に対するメッセージ（データ）の読み書き制御として、図１５のフローチャートで説明したように、図１２の復号装置の制御部１７４と同様の読み書き制御を行う。
【０３８８】
さらに、制御部２０２は、図２１の制御部１９２と同様に、制御信号C203を、メッセージ計算部２０１に供給し、その制御信号C203によって、式（１）のバリアブルノード演算、又は式（７）のチェックノード演算を行うことを、メッセージ計算部２０１に指示する。
【０３８９】
また、制御部２０２は、図２０のフローチャートで説明したように、セレクタ制御の処理を行い、制御信号C104に相当する制御信号C204を、メッセージ計算部２０１に供給する。メッセージ計算部２０１は、制御部２０２からの制御信号C204に従い、メッセージメモリ１０４から２回目に読み出されるメッセージを選択的に用いて、式（１）のバリアブルノード演算や、式（７）のチェックノード演算を行う。
【０３９０】
以上のように構成される復号装置では、制御部２０２の制御に従い、メッセージメモリ１０４から、入力メッセージが１つずつ読み出され、メッセージ計算部２０１において、その入力メッセージを用いて、所望の枝に対応する出力メッセージが計算される。そして、その計算によって求められた出力メッセージが、メッセージメモリ１０４に格納されていく。図２５の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
【０３９１】
すなわち、受信データメモリ１０５には、受信データ（LDPC符号）D100が供給され、受信データメモリ１０５は、その受信データD100を格納（記憶）する。
【０３９２】
バリアブルノード演算時には、受信データメモリ１０５は、制御部２０２から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部２０１に供給する。
【０３９３】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部２０２から供給される制御信号に従い、記憶している同一のメッセージを１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD201として、メッセージ計算部２０１に供給し、２回目に読み出したメッセージをメッセージDD201として、メッセージ計算部２０１に供給する。
【０３９４】
メッセージ計算部２０１は、メッセージメモリ１０４から１回目に読み出されたメッセージD201、及び受信データメモリ１０５から供給される受信データD101、さらには、必要に応じて、メッセージメモリ１０４から２回目に読み出されたメッセージDD201を用い、制御部２０２から供給される制御信号C203が表すバリアブルノード演算の指示、及び制御部２０２から供給される制御信号C204に従って、復号の対象のLDPC符号を定義する検査行列に基づき、式（１）のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ（バリアブルノードメッセージ）viを、メッセージD202として、メッセージメモリ１０４に供給する。
【０３９５】
そして、メッセージメモリ１０４は、制御部２０２から供給される制御信号に従い、メッセージ計算部２０１から供給されるメッセージD202（バリアブルノードメッセージvi）を記憶する。
【０３９６】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部２０２から供給される制御信号に従って、記憶している同一のメッセージ（バリアブルノードメッセージvi）を１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD201として、メッセージ計算部２０１に供給し、２回目に読み出したメッセージをメッセージDD201として、メッセージ計算部２０１に供給する。
【０３９７】
メッセージ計算部２０１は、メッセージメモリ１０４から１回目に読み出されたメッセージD201、さらには、必要に応じて、メッセージメモリ１０４から２回目に読み出されたメッセージDD201を用い、制御部２０２からの制御信号C203が表すチェックノード演算の指示、及び制御部２０２から供給される制御信号C204に従って、復号の対象のLDPC符号を定義する検査行列に基づき、式（７）のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ（チェックノードメッセージ）ujを、メッセージD202として、メッセージメモリ１０４に供給する。
【０３９８】
そして、メッセージメモリ１０４は、制御部２０２から供給される制御信号に従い、メッセージ計算部２０１から供給されるメッセージD202（チェックノードメッセージuj）を記憶する。
【０３９９】
メッセージメモリ１０４が記憶したメッセージ計算部２０１からのメッセージD202、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD201、さらには、必要に応じてメッセージDD201として、１回、又は２回読み出され、メッセージ計算部２０１に供給される。
【０４００】
図２６は、図２５のメッセージ計算部２０１の構成例を示している。
【０４０１】
なお、図中、図２２のメッセージ計算部１９１と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０４０２】
メッセージ計算部２０１には、図２２の入力ポートP101，P201、及びP203の他に、入力ポートPD201及びP204が新たに設けられているとともに、LUT３１０及びセレクタ３１１が新たに設けられている。
【０４０３】
さらに、メッセージ計算部２０１には、図２２のFIFOメモリ３２０に代えて、小FIFOメモリ３１７が設けられ、さらに、セレクタ３１８が新たに設けられている。
【０４０４】
入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給（入力）される。入力ポートP201には、メッセージメモリ１０４から２回読み出される同一のメッセージD201及びDD201のうちの１回目に読み出されるメッセージ（以下、適宜、１回目のメッセージともいう）D201が供給（入力）され、入力ポートPD201には、２回目に読み出されるメッセージ（以下、適宜、２回目のメッセージともいう）DD201が供給される。
【０４０５】
入力ポートP203には、制御部２０２（図２５）から制御信号C203が供給され、入力ポートP204には、制御部２０２から制御信号C204が供給される。
【０４０６】
メッセージ計算部２０１は、入力ポートP201から入力される１回目のメッセージD201や、入力ポートPD201から入力される２回目のメッセージDD201、入力ポートP101から入力されるメッセージ（受信データ）を用い、入力ポートP203から入力される制御信号C203に従って、式（１）のバリアブルノード演算又は式（７）のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP202から出力する。
【０４０７】
すなわち、入力ポートP101に供給された受信データD101は、演算器３１３に供給され、入力ポートP201に供給された１回目のメッセージD201は、セレクタ３０１のv端子と、小FIFOメモリ３１７に供給される。
【０４０８】
さらに、入力ポートP201に供給された１回目のメッセージD201のうちの最上位ビットを除く下位ビット、すなわち、メッセージD201の絶対値は、値D303として、LUT３００に供給され、１回目のメッセージD201のうちの最上位ビット、すなわち、メッセージD201の符号ビットは、値D304として、EXOR回路３０６に供給される。
【０４０９】
また、入力ポートPD201に供給された２回目のメッセージDD201は、セレクタ３１８のm端子に供給される。
【０４１０】
さらに、入力ポートP203に供給された制御信号C203は、セレクタ３０１，３１１、及び３１６に供給される。
【０４１１】
セレクタ３０１，３１１、及び３１６は、v端子とc端子とを有し、制御信号C203に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ３０１，３１１、及び３１６は、制御信号C203がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C203がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
【０４１２】
その結果、図２６のメッセージ計算部２０１では、制御信号C203がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号C203がチェックノード演算を指示しているときには、チェックノード演算が行われる。
【０４１３】
なお、小FIFOメモリ３１７は、メッセージを遅延するための遅延メモリであり、メッセージメモリ１０４からの１回目のメッセージD201を、図２２のFIFOメモリ３２０と同様に一時記憶して遅延する。
【０４１４】
但し、図２２のFIFOメモリ３２０は、少なくとも、検査行列の重み（列の重みdv及び行の重みdc）の最大値に等しい数のメッセージを記憶することができる容量を有していたが、小FIFOメモリ３１７は、検査行列の重みの最大値よりも少ない数（であって１以上）のメッセージを記憶する容量しか有していない。
【０４１５】
したがって、小FIFOメモリ３１７は、FIFOメモリ３２０よりも容量が小さいので、規模も小さい。
【０４１６】
小FIFOメモリ３１７は、上述したように、メッセージメモリ１０４からの１回目のメッセージD201を遅延し、セレクタ３１８のf端子に供給する。
【０４１７】
セレクタ３１８は、入力端子として、f端子とm端子とを有しており、上述したように、f端子には、小FIFOメモリ３１７で遅延されたメッセージD201が供給され、m端子には、メッセージメモリ１０４からの２回目のメッセージDD201が供給される。
【０４１８】
さらに、セレクタ３１８には、制御部２０２（図２５）から入力ポートP204に供給される制御信号C204が供給される。
【０４１９】
セレクタ３１８は、制御部２０２からの制御信号C204に従い、小FIFOメモリ３１７で遅延された１回目のメッセージD201と、メッセージメモリ１０４からの２回目のメッセージDD201とのうちの一方を、バリアブルノード又はチェックノードの演算に用いるメッセージとして選択して出力する。
【０４２０】
セレクタ３１８が出力するメッセージ、すなわち、小FIFOメモリ３１７で遅延された１回目のメッセージD201、又は、メッセージメモリ１０４からの２回目のメッセージDD201は、セレクタのv端子に供給されるとともに、そのうちの最上位ビットを除く下位ビット、つまり、絶対値は、値D312として、LUT３１０に供給され、最上位ビット、つまり、符号ビットは、値D313として、EXOR回路３０６に供給される。
【０４２１】
ここで、図２５の復号装置において、制御部２０２は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ３１７が記憶可能なメッセージの数以下であるときには、小FIFOメモリ３１７で遅延された１回目のメッセージD201を選択することをセレクタ３１８に指示する信号を、制御信号C204として、メッセージ計算部２０１の入力ポートP204に供給する。
【０４２２】
また、制御部２０２は、バリアブルノードに対応する列の重みが、小FIFOメモリ３１７が記憶可能なメッセージの数以下でないときには、メッセージメモリ１０４からの２回目のメッセージDD201を選択することをセレクタ３１８に指示する信号を、制御信号C204として、メッセージ計算部２０１の入力ポートP204に供給する。
【０４２３】
なお、制御部２０２は、小FIFOメモリ３１７で遅延されたメッセージD201を選択することをセレクタ３１８に指示する制御信号C204を、メッセージ計算部２０１に供給する場合、つまり、制御信号C204が、メッセージメモリ１０４から２回目に読み出されたメッセージDD201を選択することをセレクタ３１８に指示する信号でない場合には、メッセージメモリ１０４からのメッセージの読み出しについては、メッセージメモリ１０４からメッセージを１回だけ読み出す読み出し制御を行う。
【０４２４】
したがって、制御部２０２では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ３１７が記憶可能なメッセージの数以下でない場合には、図１５で説明した、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ３１７が記憶可能なメッセージの数以下である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御は行われず、１回だけ読み出す読み出し制御、すなわち、図１５のステップＳ１０１及びＳ１０２のうちの、ステップＳ１０１だけが行われる。
【０４２５】
次に、図２７を参照して、図２６のメッセージ計算部２０１で行われるバリアブルノード演算とチェックノード演算について説明する。
【０４２６】
図２７左側は、式（１）のバリアブルノード演算を行うバリアブルノードと、式（７）のチェックノード演算を行うチェックノードとを模式的に示している。
【０４２７】
バリアブルノードでは、計算しようとしている枝（バリアブルノードに接続している枝のうちのi番目の枝）に対応するメッセージviが、バリアブルノードに繋がっている残りの枝からのメッセージu1,u2,・・・を、式（１）に示したように加算することによって求められる。
【０４２８】
また、チェックノードでは、計算しようとしている枝（チェックノードに接続している枝のうちのj番目の枝）に対応するメッセージujが、式（７）に示したように、チェックノードに繋がっている残りの枝からのメッセージv1,v2,・・・を引数xとする非線形関数φ(x)の演算結果を積算し、その結果得られる積算値を引数xとする逆関数φ-1(x)を演算することによって求められる。
【０４２９】
いま、ノードに入力されるデータ（入力前のデータ）を入力データというとともに、ノードから出力されるデータ（出力前のデータ）を出力データということとすると、図２７左側のバリアブルノード及びチェックノードでの演算は、図２７右側に示す演算と等価である。
【０４３０】
すなわち、図２７右側では、バリアブルノードにおいて、図２７左側のバリアブルノードと同一の演算によって、メッセージviが求められている。また、図２７右側では、チェックノードにおいて非線形関数φ(x)の演算を行うのではなく、チェックノードに入力される入力データ（入力前のメッセージv1,v2,・・・）に、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、図２７右側では、チェックノードにおいて逆関数φ-1(x)の演算を行うのではなく、チェックノードから出力された出力データ（逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値）に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
【０４３１】
図２６のメッセージ計算部２０１では、図２７右側に示したようにメッセージviとujを求めるバリアブルノード演算とチェックノード演算が行われる。
【０４３２】
ここで、図２７右側のバリアブルノードについては、バリアブルノードに入力される入力データと、バリアブルノードから出力された出力データのいずれに対しても、非線形関数φ(x)及び逆関数φ-1(x)の演算は施されない。一方、チェックノードについては、入力データに、非線形関数φ(x)の演算が施され、出力データに、逆関数φ-1(x)の演算が施される。
【０４３３】
このため、バリアブルノード演算とチェックノード演算の両方を行う図２６のメッセージ計算部２０１には、非線形関数φ(x)の演算を行う（演算結果を出力する）LUT３００及び３１０と、逆関数φ-1(x)の演算を行う（演算結果を出力する）LUT３１４とが設けられている。
【０４３４】
そして、メッセージ計算部２０１は、バリアブルノード演算時には、実質的に、バリアブルノードに対する入力データ及び出力データを、LUT３００，３１０、及び３１４をバイパスさせる構成（後述する図２８の構成）となって、図２７右側でバリアブルノードについて説明した演算を行う。
【０４３５】
また、メッセージ計算部２０１は、チェックノード演算時には、チェックノードに入力される入力データを、LUT３００又は３１０を経由させるとともに、チェックノードから出力された出力データを、LUT３１４を経由させる構成（後述する図２９の構成）となって、図２７右側でチェックノードについて説明した演算を行う。
【０４３６】
図２８は、図２７右側に示したバリアブルノード演算時の図２６のメッセージ計算部２０１の実質的な構成例を示している。
【０４３７】
なお、上述したように、バリアブルノード演算時には、セレクタ３０１，３１１、及び３１６はv端子を選択するが、図２８では、図２６に図示した構成のうちの、セレクタ３０１，３１１、及び３１６がv端子を選択することによってバリアブルノード演算時に機能しない部分（バリアブルノード演算に関係がない部分）の図示を省略してある。
【０４３８】
メッセージ計算部２０１は、入力ポートP101及びP201それぞれから入力されるメッセージ、さらには、入力ポートPD201から入力されるメッセージを、必要に応じて用いて、式（１）のバリアブルノード演算を行い、その結果得られるメッセージD202を、出力ポートP202から出力する。
【０４３９】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP201には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各行に対応するチェックノードからの１回目のメッセージD201（チェックノードメッセージuj）が供給される。
【０４４０】
入力ポートP101に供給された受信データD101は、演算器３１３に供給される。
【０４４１】
また、入力ポートP201に供給されたメッセージD201（メッセージuj）は、セレクタ３０１のv端子に供給され、バリアブルノード演算時にはv端子を選択しているセレクタ３０１から、メッセージD306として、演算器３０２に供給される。
【０４４２】
そして、演算器３０２、レジスタ３０３、セレクタ３０４、及びレジスタ３０５では、図２３で説明したメッセージ計算部１９１と同様の処理が行われる。
【０４４３】
すなわち、演算器３０２は、セレクタ３０１からのメッセージD306（メッセージuj）とレジスタ３０３に格納されている値D307とを加算することにより、メッセージD306を積算し、その結果得られる積算値を、レジスタ３０３に再格納する。
【０４４４】
そして、検査行列の１列に亘るメッセージD306が１つずつ読み込まれ、レジスタ３０３に、検査行列の１列に亘る全ての枝からのメッセージD306（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ３０４は、レジスタ３０３に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD306（メッセージuj）が積算された積算値D307（ｊ＝１からdvまでのΣuj)を選択し、レジスタ３０５に出力して格納させる。
【０４４５】
レジスタ３０５は、格納している値D307を、値D308として、セレクタ３０４と演算器３１２に供給する。レジスタ３０３に１列分のメッセージD306が積算された値が格納される直前までは、セレクタ３０４は、レジスタ３０５から供給された値D308を選択し、レジスタ３０５に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD306（メッセージuj）が積算されるまで、レジスタ３０５は、前回積算された値を、セレクタ３０４と演算器３１２に供給する。
【０４４６】
一方、レジスタ３０５から新たな値D308（ｊ＝１からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ３０３に１列分のメッセージD201が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された直後、メッセージ計算部２０１においては、メッセージD201（メッセージuj）と同一のメッセージDD201、すなわち、メッセージメモリ１０４からの２回目のメッセージujが、入力ポートPD201から１つずつ入力され、そのメッセージDD201が、セレクタ３１８のm端子に供給される。
【０４４７】
また、小FIFOメモリ３１７は、レジスタ３０５から新たな値D308（ｊ＝１からdvまでのΣuj)が出力されるまでの間、１回目のメッセージD201を遅延し、セレクタ３１８のf端子に供給する。
【０４４８】
ここで、小FIFOメモリ３１７が記憶することができるメッセージの数（記憶可能個数）がd個であるとすると、小FIFOメモリ３１７は、上述したように、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していないため、レジスタ３０５から、検査行列の、ある１列に対応するdv個のメッセージD201が積算された新たな値（積算値）D308（ｊ＝１からdvまでのΣuj)が出力されるまでの間、小FIFOメモリ３１７において、その１列に対応するdv個のメッセージD201を遅延することができないことがある。
【０４４９】
すなわち、小FIFOメモリ３１７が記憶することができるメッセージの数dが、レジスタ３０５に積算値が格納されるdv個のメッセージD201が入力されるバリアブルノードに対応する検査行列の列の重みdvよりも小である場合には、小FIFOメモリ３１７では、そのdv個のメッセージD201のうちの、d+1個目のメッセージが記憶されるときに、１個目のメッセージが出力されてしまうため、レジスタ３０５から、小FIFOメモリ３１７が記憶可能なメッセージの個数dよりも多いdv個のメッセージD201が積算された新たな値D308（積算値）が出力されるまでの間、そのdv個のメッセージD201すべてを、小FIFOメモリ３１７に記憶しておくことができない。
【０４５０】
そこで、制御部２０２（図２５）は、上述したように、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する列の重みdvが、小FIFOメモリ３１７が記憶可能なメッセージの数d以下でないときには、メッセージメモリ１０４からの２回目のメッセージDD201を選択することをセレクタ３１８に指示する制御信号C204を、メッセージ計算部２０１に供給する。
【０４５１】
メッセージ計算部２０１において、制御部２０２からの制御信号C204は、入力ポートP204を介して、セレクタ３１８に供給される。
【０４５２】
セレクタ３１８は、制御信号C204に従い、端子mに供給される、メッセージメモリ１０４からの２回目のメッセージDD201を選択して出力する。
【０４５３】
一方、制御部２０２（図２５）は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ３１７が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ３１７で遅延された１回目のメッセージD201を選択することをセレクタ３１８に指示する制御信号C204を、メッセージ計算部２０１に供給する。
【０４５４】
メッセージ計算部２０１において、制御部２０２からの制御信号C204は、入力ポートP204を介して、セレクタ３１８に供給される。
【０４５５】
セレクタ３１８は、制御信号C204に従い、端子fに供給される、小FIFOメモリ３１７で遅延された１回目のメッセージD201を選択して出力する。
【０４５６】
ここで、小FIFOメモリ３１７が記憶することができるメッセージの数dが、レジスタ３０５に積算値が格納されるdv個のメッセージD201に対応する検査行列の列の重みdvよりも小でない場合には、レジスタ３０５から、小FIFOメモリ３１７が記憶可能なメッセージの個数dよりも多くないdv個のメッセージD201が積算された新たな値（積算値）D308が出力されるまでの間、そのdv個のメッセージD201すべてを、小FIFOメモリ３１７に記憶しておくこと、つまり、dv個のメッセージD201が積算されるまでの間、そのdv個のメッセージD201すべてを遅延することができ、その遅延後のメッセージD201を、dv個のメッセージD201の積算が終了した後に出力することができる。
【０４５７】
そこで、制御部２０２（図２５）は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ３１７が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ３１７で遅延されたメッセージD201を選択することをセレクタ３１８に指示する制御信号C204を、メッセージ計算部２０１のセレクタ３１８に供給し、これにより、セレクタ３１８では、小FIFOメモリ３１７で遅延されたメッセージD201が選択され、セレクタ３１１に供給される。
【０４５８】
セレクタ３１１は、バリアブルノード演算時には、v端子を選択しており、そのv端子に供給される、セレクタ３１８からのメッセージ（２回目のメッセージDD201、又は、小FIFOメモリ３１７で遅延された１回目のメッセージD201）を、メッセージD315として、演算器３１２に供給する。
【０４５９】
演算器３１２は、レジスタ３０５から供給された積算値D308から、セレクタ３１１からのメッセージD315を減算する。すなわち、演算器３１２では、検査行列の１列に亘る全ての枝からのメッセージD201（メッセージuj）の積算値D308（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージuj（ｊ＝dvのuj）としてのメッセージD315を減算して、減算値D316（ｊ＝１からdv-1までのΣuj）を求め、演算器３１３に供給する。
【０４６０】
演算器３１３は、入力ポートP101からの受信データD101と、演算器３１２からの減算値D316（ｊ＝１からdv-1までのΣuj）とを加算し、その結果得られる加算値D317（バリアブルノードメッセージvi）を、セレクタ３１６のv端子に供給する。
【０４６１】
セレクタ３１６は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器３１３からの加算値D317を、メッセージD202（メッセージvi）として、出力ポートP202から出力する。
【０４６２】
以上のように、セレクタ３０１及び３０４がv端子を選択しているメッセージ計算部２０１では、式（１）のバリアブルノード演算が行われ、その結果得られるメッセージ（バリアブルノードメッセージ）viが、出力ポートP202から出力される。
【０４６３】
図２９は、図２７右側に示したチェックノード演算時の図２６のメッセージ計算部２０１の実質的な構成例を示している。
【０４６４】
なお、上述したように、チェックノード演算時には、セレクタ３０１，３１１、及び３１６はc端子を選択するが、図２９では、図２６に図示した構成のうちの、セレクタ３０１，３１１、及び３１６がc端子を選択することによってチェックノード演算時に機能しない部分（チェックノード演算に関係がない部分）の図示を省略してある。
【０４６５】
チェックノード演算時においては、入力ポートP201には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviが、順次、メッセージD201として供給される。
【０４６６】
入力ポートP201に供給されたメッセージD201（メッセージvi）は、小FIFOメモリ３１７に供給される。さらに、メッセージD201のうちの最上位ビットを除く下位ビット、つまり、メッセージD201の絶対値D303(|vi|)が、LUT３００に供給され、最上位ビット、つまりメッセージD201の符号ビットD304が、EXOR回路３０６に供給される。
【０４６７】
そして、LUT３００、セレクタ３０１、演算器３０２、レジスタ３０３、セレクタ３０４、レジスタ３０５、EXOR回路３０６、レジスタ３０７、セレクタ３０８、レジスタ３０９、演算器３１２、LUT３１４、EXOR回路３１５、及びセレクタ３１６において、図２４で説明したメッセージ計算部１９１と同様の処理が行われる。
【０４６８】
すなわち、LUT３００は、絶対値D303(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D305（φ(|vi|)）を読み出し、セレクタ３０１のc端子に供給する。
【０４６９】
セレクタ３０１は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT３００からの演算結果D305（φ(|vi|)）を、演算結果D306（φ(|vi|)）として、演算器３０２に供給する。
【０４７０】
演算器３０２は、演算結果D306（φ(|vi|)）とレジスタ３０３に格納されている値D307とを加算することにより、演算結果D306を積算し、その結果得られる積算値をレジスタ３０３に再格納する。
【０４７１】
検査行列の１行に亘るメッセージD201が１つずつ読み込まれ、レジスタ３０３に１行分の演算結果D306が積算された積算値が格納された場合、セレクタ３０４は、レジスタ３０３に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）から求められたφ(|vi|)が積算された積算値D307（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）を選択し、レジスタ３０５に出力して格納させる。レジスタ３０５は、格納している積算値D307を、値D308として、セレクタ３０４と演算器３１２に供給する。
【０４７２】
レジスタ３０３に１行分の演算結果D306が積算された積算値が格納される直前までは、セレクタ３０４は、レジスタ３０５から供給された値D308を選択し、レジスタ３０５に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ３０５は、前回積算されたφ(|vi|)の積算値を、セレクタ３０４と演算器３１２に供給する。
【０４７３】
レジスタ３０５から新たな値D308（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）の出力が開始されると、すなわち、レジスタ３０５に１行分の演算結果D306が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納された直後、メッセージ計算部２０１において、メッセージD201（メッセージvi）と同一のメッセージDD201、すなわち、メッセージメモリ１０４からの２回目のメッセージviが、入力ポートPD201から１つずつ入力され、セレクタ３１８のm端子に供給される。
【０４７４】
一方、小FIFOメモリ３１７は、レジスタ３０５から新たな値D308（ｉ＝１からdcまでのΣφ(|vi|))が出力されるまでの間、メッセージメモリ１０４からの１回目のメッセージD201を遅延し、セレクタ３１８のf端子に供給する。
【０４７５】
ここで、小FIFOメモリ３１７が記憶することができるメッセージの数がd個であるとすると、小FIFOメモリ３１７は、上述したように、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していないため、レジスタ３０５から、検査行列の、ある１行に対応するdc個のメッセージD201のφ(|vi|)の新たな積算値（ｉ＝１からdcまでのΣφ(|vi|))が出力されるまでの間、小FIFOメモリ３１７において、その１行に対応するdc個のメッセージD201を遅延することができないことがある。
【０４７６】
すなわち、小FIFOメモリ３１７が記憶することができるメッセージの数dが、レジスタ３０５にφ(|vi|)の積算値が格納されるdc個のメッセージD201が入力されるチェックノードに対応する検査行列の行の重みdcよりも小である場合には、小FIFOメモリ３１７では、そのdc個のメッセージD201のうちの、d+1個目のメッセージが記憶されるときに、１個目のメッセージが出力されてしまうため、レジスタ３０５において、小FIFOメモリ３１７が記憶可能なメッセージの個数dよりも多いdc個のメッセージD201のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD201すべてを、小FIFOメモリ３１７に記憶しておくことができない。
【０４７７】
そこで、制御部２０２（図２５）は、上述したように、メッセージを求めようとしている枝が接続しているチェックノードに対応する行の重みdcが、小FIFOメモリ３１７が記憶可能なメッセージの数d以下でないときには、メッセージメモリ１０４からの２回目のメッセージDD201を選択することをセレクタ３１８に指示する制御信号C204を、メッセージ計算部２０１に供給する。
【０４７８】
メッセージ計算部２０１において、制御部２０２からの制御信号C204は、入力ポートP204を介して、セレクタ３１８に供給される。
【０４７９】
セレクタ３１８は、制御信号C204に従い、端子mに供給される、メッセージメモリ１０４からの２回目のメッセージDD201を選択して出力する。
【０４８０】
一方、制御部２０２（図２５）は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ３１７が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ３１７で遅延された１回目のメッセージD201を選択することをセレクタ３１８に指示する制御信号C204を、メッセージ計算部２０１に供給する。
【０４８１】
メッセージ計算部２０１において、制御部２０２からの制御信号C204は、入力ポートP204を介して、セレクタ３１８に供給される。
【０４８２】
セレクタ３１８は、制御信号C204に従い、端子fに供給される、小FIFOメモリ３１７で遅延された１回目のメッセージD201のφ(|vi|)を選択して出力する。
【０４８３】
ここで、小FIFOメモリ３１７が記憶することができるメッセージの数dが、レジスタ３０５に積算値が格納されるdc個のメッセージD201が入力されるチェックノードに対応する検査行列の行の重みdcよりも小でない場合には、レジスタ３０５から、小FIFOメモリ３１７が記憶可能なメッセージの個数dよりも多くないdc個のメッセージD201のφ(|vi|)の新たな積算値（ｉ＝１からdcまでのΣφ(|vi|))が出力されるまでの間、そのdc個のメッセージD201すべてを、小FIFOメモリ３１７に記憶しておくこと、つまり、dc個のメッセージD201のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD201すべてを遅延することができ、その遅延後のメッセージD201を、dc個のメッセージD201のφ(|vi|)の積算が終了した後に出力することができる。
【０４８４】
そこで、制御部２０２（図２５）は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ３１７が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ３１７で遅延されたメッセージD201のφ(|vi|)を選択することをセレクタ３１８に指示する制御信号C204を、メッセージ計算部２０１のセレクタ３１８に供給し、これにより、セレクタ３１８では、小FIFOメモリ３１７で遅延された１回目のメッセージD201が選択されて出力される。
【０４８５】
セレクタ３１８が出力するメッセージ（小FIFOメモリ３１７で遅延された１回目のメッセージD201、又は、２回目のメッセージDD201）のうちの最上位ビットを除く下位ビット、つまり、絶対値D312(|vi|)は、LUT３１０に供給され、最上位ビット、つまり、符号ビットD313は、EXOR回路３１５に供給される。
【０４８６】
LUT３１０は、LUT３００と同様のLUTで、メッセージの絶対値D312(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D314（φ(|vi|)）を読み出し、セレクタ３１１のc端子に供給する。
【０４８７】
セレクタ３１１は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT３１０からの演算結果D314（φ(|vi|)）を、演算結果D315（φ(|vi|)）として、演算器３１２に供給する。
【０４８８】
演算器３１２は、レジスタ３０５から供給された値D308から、セレクタ３１１から供給された値D315を減算し、その減算結果を、減算値D316としてLUT３１４に供給する。すなわち、演算器３１２は、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）から求められたφ(|vi|)の積算値D308（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）から、求めたい枝からのメッセージ（メッセージvi）から求められたφ(|vi|)の値D315を減算して、その減算値（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を減算値D316としてLUT３１４に供給する。
【０４８９】
LUT３１４は、演算器３１２からの減算値D316（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を引数として、逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D318（φ-1(Σφ(|vi|)))を出力する。
【０４９０】
以上の処理と並行して、EXOR回路３０６は、レジスタ３０７に格納されている値D310と符号ビットD304との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D309を、レジスタ３０７に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された場合、レジスタ３０７はリセットされる。
【０４９１】
検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309（ｉ＝１からdcまでのΠsign(vi)）がレジスタ３０７に格納された場合、セレクタ３０８は、レジスタ３０７に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された値D310（ｉ＝１からｉ＝dcまでのΠsign(vi)）を選択し、レジスタ３０９に出力して格納させる。レジスタ３０９は、格納している値D311を、セレクタ３０８とEXOR回路３１５に供給する。
【０４９２】
検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309（ｉ＝１からdcまでのΠsign(vi)）がレジスタ３０７に格納される直前までは、セレクタ３０８は、レジスタ３０９から供給された値D311を選択し、レジスタ３０９に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD201（メッセージvi）の符号ビットD304が乗算されるまで、レジスタ３０９は、前回格納した値を、セレクタ３０８とEXOR回路３１５に供給する。
【０４９３】
一方、レジスタ３０７に１行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された値D310（ｉ＝１からｉ＝dcまでのΠsign(vi)）が格納されたとき、その値D301がセレクタ３０８で選択されて、レジスタ３０９に格納されるとともに、レジスタ３０５に、上述したように、１行分のメッセージD201のφ(|vi|)を積算した新たな積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納される。
【０４９４】
レジスタ３０５に新たな積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納されると、上述したように、セレクタ３１８が、小FIFOメモリ３１７で遅延されたメッセージD201、又は２回目のメッセージDD201を選択して出力し、セレクタ３１８が出力するメッセージのうちの、最上位ビットを除く下位ビット、つまり、絶対値(|vi|)が、LUT３１０に供給され、最上位ビット、つまり、符号ビットD313が、EXOR回路３１５に供給される。
【０４９５】
EXOR回路３１５は、レジスタ３０９に格納されて出力される新たな値D311と、セレクタ３１８からのメッセージの符号ビットとの排他的論理和を演算することにより、値D311を、セレクタ３１８からのメッセージの符号ビットD313で除算し、除算結果を除算値D319として出力する。すなわち、EXOR回路３１５は、検査行列の１行に亘る全ての枝からのメッセージD201の符号ビットD304の乗算値（ｉ＝１からｉ＝dcまでのΠsign(vi)）を、求めたい枝からのメッセージviの符号ビットD313（ｉ＝dcのsign(vi)）で除算して、その除算値（ｉ＝１からｉ＝dc-1までのΠsign(vi)）を除算値D319として出力する。
【０４９６】
そして、メッセージ計算部２０１では、LUT３１４から出力された演算結果D318を下位ビットとするとともに、EXOR回路３１５から出力された除算値D319を最上位ビット（符号ビット）とするビット列D320（メッセージuj）が、セレクタ３１６のc端子に供給される。
【０４９７】
セレクタ３１６は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D320（メッセージuj）を、メッセージD202として、出力ポートP202から出力する。
【０４９８】
以上のように、セレクタ３０１，３１１、及び３１６がc端子を選択しているメッセージ計算部２０１では、式（７）のチェックノード演算が行われ、その結果得られるメッセージ（チェックノードメッセージ）ujが、出力ポートP202から出力される。
【０４９９】
なお、図示しないが、図２５の復号装置では、復号の最終段において、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【０５００】
以上のように、図２５の復号装置では、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ３１７（図２６）を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ３２０（図２２）を設ける場合に比較して、復号装置の規模を削減することができる。
【０５０１】
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合（記憶可能個数dより大でない場合）には、小FIFOメモリ３１７の出力を選択して、ノード（バリアブルノード、チェックノード）の演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ３２０（図２２）を有する図２１の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図２１（及び図８）の復号装置と同様の回数だけ繰り返し復号を行うことができるので（１回の復号に要する時間が図２１（及び図８）の復号装置と同様となるので）、復号性能が劣化することを抑制することができる。
【０５０２】
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出し、２回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
【０５０３】
以上から、図２５の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
【０５０４】
ここで、小FIFOメモリ３１７の記憶可能個数dが、例えば、３であり、復号の対象のLDPC符号を定義する検査行列が、例えば、図１に示した、各列の重みdvが３で、且つ、各行の重みが６の行列である場合には、記憶可能個数dである３が、検査行列の列の重みdvである３よりも小でなく、したがって、バリアブルノード演算時には、３個のメッセージD201が積算されるまでの間、小FIFOメモリ３１７において、その３個のメッセージD201すべてを遅延することができるから、セレクタ３１８では、端子fに供給される、小FIFOメモリ３１７で遅延された１回目のメッセージD201が選択される。
【０５０５】
また、この場合、記憶可能個数dである３が、検査行列の行の重みdcである６よりも小であり、したがって、チェックノード演算時には、記憶可能個数dである３よりも多い６個のメッセージD201のφ(|vi|)が積算されるまでの間、小FIFOメモリ３１７において、その６個のメッセージD201すべてを遅延することができないため、セレクタ３１８では、端子mに供給される、メッセージメモリ１０４からの２回目のメッセージDD201が選択される。
【０５０６】
なお、図２５の復号装置では、メッセージ計算部２０１において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部（演算器３０２、レジスタ３０３、セレクタ３０４、レジスタ３０５、及び演算器３１２）が共有化されているので、その共有化の分だけ、復号装置の規模を、より削減することができる。
【０５０７】
次に、図３０は、本発明を適用した復号装置の第３実施の形態の構成例を示すブロック図である。
【０５０８】
なお、図中、図２５の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図３０の復号装置は、メッセージ計算部２０１に代えて、メッセージ計算部２１１が設けられているとともに、制御部２０２に代えて、制御部２１２が設けられている他は、図２５の復号装置と同様に構成されている。
【０５０９】
図３０の復号装置では、メッセージ計算部２１１が、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図３０の復号装置では、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部２１１が、図２２のメッセージ計算部１９１のFIFOメモリ３２０のように、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを有している。
【０５１０】
また、図３０の復号装置では、制御部２１２が、メッセージメモリ１０４に対するメッセージ（データ）の読み書き制御として、図１５のフローチャートで説明したように、図１２の復号装置の制御部１７４と同様の読み書き制御を行う。
【０５１１】
さらに、制御部２１２は、制御信号C603を、メッセージ計算部２１１に供給し、その制御信号C603によって、バリアブルノード演算、又はチェックノード演算を行うことを、メッセージ計算部２１１に指示する。
【０５１２】
また、制御部２１２は、図２０のフローチャートで説明したように、セレクタ制御の処理を行い、制御信号C104に相当する制御信号C604を、メッセージ計算部２１１に供給する。メッセージ計算部２１１は、制御部２１２からの制御信号C604に従い、メッセージメモリ１０４から２回目に読み出されたメッセージを選択的に用いて、バリアブルノード演算やチェックノード演算を行う。
【０５１３】
図３０の復号装置では、メッセージメモリ１０４に記憶されているメッセージが１つずつ読み出され、メッセージ計算部２１１に供給される。メッセージ計算部２１１は、メッセージメモリ１０４からのメッセージを用いて演算が行われ、その演算によって求められたメッセージが、メッセージメモリ１０４に格納される。図３０の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
【０５１４】
すなわち、受信データメモリ１０５には、送信されてきたLDPC符号を受信することにより得られる受信データ（対数尤度比）D100が供給され、受信データメモリ１０５は、その受信データD100を記憶する。
【０５１５】
バリアブルノード演算時には、受信データメモリ１０５は、制御部２１２から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部２１１に供給する。
【０５１６】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部２１２から供給される制御信号に従い、記憶している同一のメッセージを１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD601として、メッセージ計算部２１１に供給し、２回目に読み出したメッセージをメッセージDD601として、メッセージ計算部２１１に供給する。
【０５１７】
メッセージ計算部２１１は、メッセージメモリ１０４から供給される１回目のメッセージD601、及び受信データメモリ１０５から供給される受信データD101、さらには、必要に応じて、メッセージメモリ１０４からの供給される２回目のメッセージDD601を用い、制御部２１２から供給される制御信号C603及びC604に従って、検査行列に基づき、バリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージを、メッセージD622として、メッセージメモリ１０４に供給する。
【０５１８】
そして、メッセージメモリ１０４は、制御部２１２から供給される制御信号に従い、メッセージ計算部２１１から供給されるメッセージD622を記憶する。
【０５１９】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部２１２から供給される制御信号に従って、記憶している同一のメッセージを１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD601として、メッセージ計算部２１１に供給し、２回目に読み出したメッセージをメッセージDD601として、メッセージ計算部２１１に供給する。
【０５２０】
メッセージ計算部２１１は、メッセージメモリ１０４から供給される１回目のメッセージD601、さらには、必要に応じて、メッセージメモリ１０４から供給される２回目のメッセージDD601を用い、制御部２１２からの制御信号C603及びC604に従って、チェックノード演算を行い、そのチェックノード演算によって求められたメッセージを、メッセージD622として、メッセージメモリ１０４に供給する。
【０５２１】
そして、メッセージメモリ１０４は、制御部２１２から供給される制御信号に従い、メッセージ計算部２１１から供給されるメッセージD622を記憶する。
【０５２２】
ここで、図３０のメッセージ計算部２１１で行われる演算について説明する。
【０５２３】
いま、チェックノードに接続している枝のうちのj番目の枝から出力されるメッセージ（データ）として、式u'j=φ(|uj|)×sign(uj)で表されるメッセージu'jを導入すると、式（１）と式（７）は、それぞれ、式（９）と式（１０）に書き直すことができる。
【０５２４】
【数９】
2008278187.tif 000011
・・・（９）
【０５２５】
【数１０】
2008278187.tif 000012
・・・（１０）
【０５２６】
ここで、式u'j=φ(|uj|)×sign(uj)を、メッセージujについて書き直すと、式uj=φ-1(|u'j|)×sign(u'j)となる。この式uj=φ-1(|u'j|)×sign(u'j)を、バリアブルノード演算の式（１）に代入することにより、新たなバリアブルノード演算の式としての式（９）を得ることができる。
【０５２７】
また、式u'j=φ(|uj|)×sign(uj)に、チェックノード演算の式（７）を代入することにより、新たなチェックノード演算の式としての式（１０）を得ることができる。
【０５２８】
式（９）のバリアブルノード演算では、入力データ（メッセージ）u'jの絶対値|u'j|を引数とする逆関数φ-1(|u'j|)の演算が行われ、式（１０）のチェックノード演算では、入力データviの絶対値|vi|を引数とする非線形関数φ(|vi|)の演算が行われる。ここで、非線形関数φ(x)とその逆関数φ-1(x)とは、x＞0において等しい。したがって、式（９）及び式（１０）のいずれでも、入力データxの絶対値|x|を引数として、関数φ(x)の演算が行われる。
【０５２９】
そして、式（９）では、関数φ(x)の演算結果（φ-1(|u'j|)の演算結果）に入力データu'jの符号（sign(u'j)）を考慮した値（φ-1(|u'j|)×sign(u'j)）を積算し、その積算値に、受信データu0iを加算して、メッセージviが求められる。
【０５３０】
また、式（１０）では、関数φ(x)の演算結果（φ(|uj|)の演算結果）を積算し、それとは別に、入力データviの符号ビットの相乗積（Πsign(vi)）を求め、関数φ(x)の演算結果の積算値と、符号ビットの相乗積とを乗算して、メッセージu'jが求められる。
【０５３１】
図３０のメッセージ計算部２１１では、式（９）のバリアブルノード演算と、式（１０）のチェックノード演算とが行われる。
【０５３２】
図３１は、図３０のメッセージ計算部２１１の構成例を示している。
【０５３３】
メッセージ計算部２１１には、入力ポートP101,P601,PD601,P603,P604と、出力ポートP622が設けられている。
【０５３４】
入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給（入力）される。入力ポートP601には、メッセージメモリ１０４から２回読み出される同一のメッセージD601及びDD601のうちの１回目に読み出されるメッセージ（１回目のメッセージ）D601が供給（入力）され、入力ポートPD601には、２回目に読み出されるメッセージ（２回目のメッセージ）DD601が供給される。また、入力ポートP603には、制御部２１２（図３０）からの制御信号C603が供給され、入力ポートP604には、制御部２１２からの制御信号C604が供給される。
【０５３５】
メッセージ計算部２１１は、入力ポートP601から入力される１回目のメッセージD601、さらには、入力ポートPD601から入力される２回目のメッセージDD601や、入力ポートP101から入力されるメッセージ（受信データ）を、必要に応じて用い、入力ポートP603から入力される制御信号C603及びC604に従って、検査行列に基づき、式（９）のバリアブルノード演算又は式（１０）のチェックノード演算を行い、その結果得られるメッセージD622を、出力ポートP622から出力する。
【０５３６】
ここで、図３２を参照して、図３１のメッセージ計算部２１１で行われるバリアブルノード演算とチェックノード演算について説明する。
【０５３７】
図３２左側は、式（１）のバリアブルノード演算を行うバリアブルノードと、式（７）のチェックノード演算を行うチェックノードとを模式的に示しており、図２７右側と同一の図である。
【０５３８】
図３２左側では、図２７右側で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、チェックノードから出力された出力データ（逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値）に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
【０５３９】
このメッセージujは、入力データとして、バリアブルノードに入力され、バリアブルノード演算に用いられる。
【０５４０】
したがって、図３２左側に示したように、チェックノードから出力された出力データxに、逆関数φ-1(x)の演算を施す代わりに、図３２右側に示すように、バリアブルノードに入力される入力データxに、逆関数φ-1(x)の演算を施しても、バリアブルノード演算とチェックノード演算を行うことができる。
【０５４１】
すなわち、図３２右側では、式（９）で説明したように、バリアブルノードに入力される入力データに、逆関数φ-1(x)の演算が施され、バリアブルノードにおいて、その逆関数φ-1(x)の演算結果を積算することにより、メッセージviが求められている。また、図３２右側では、式（１０）で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算が施され、チェックノードにおいて、その非線形関数φ(x)の演算結果が積算されている。さらに、図３２右側では、チェックノードにおいて、非線形関数φ(x)の演算結果を積算して得られる積算値が、（逆関数φ-1(x)の演算が施されずに）そのまま出力データu'jとして出力されている。
【０５４２】
図３１のメッセージ計算部２１１では、図３２右側に示したようにメッセージviとu'jを求める式（９）のバリアブルノード演算と式（１０）のチェックノード演算が行われる。
【０５４３】
このように、図３１のメッセージ計算部２１１は、図３２右側に示したメッセージviとu'jを求める式（９）のバリアブルノード演算と式（１０）のチェックノード演算の両方を行うため、メッセージ計算部２１１（図３１）には、チェックノードに入力される入力データxに対して、逆関数φ-1(x)と同一の演算結果が得られる非線形関数φ(x)の演算結果を出力するとともに、バリアブルノードに入力される入力データxに対して、逆関数φ-1(x)の演算結果を出力するLUT６００（及びLUT６１０）が設けられている。
【０５４４】
そして、図３１のメッセージ計算部２１１は、入力ポートP603に供給された制御信号C603に従って、その実質的な構成を変えて、式（９）のバリアブルノード演算と式（１０）のチェックノード演算を選択的に行う。
【０５４５】
すなわち、メッセージ計算部２１１（図３１）は、セレクタ６０１，６１１、及び６１５を有しており、入力ポートP603に供給された制御信号C603は、セレクタ６０１，６１１、及び６１５に供給される。
【０５４６】
セレクタ６０１，６１１、及び６１５は、v端子とc端子とを有し、制御信号C603に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ６０１，６１１、及び６１５は、制御信号C603がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C603がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
【０５４７】
その結果、図３１のメッセージ計算部２１１では、制御信号C603がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号C603がチェックノード演算を指示しているときには、チェックノード演算が行われる。
【０５４８】
すなわち、図３３は、図３２右側に示したバリアブルノード演算時の図３１のメッセージ計算部２１１の実質的な構成例を示している。
【０５４９】
なお、上述したように、バリアブルノード演算時には、セレクタ６０１，６１１、及び６１５はv端子を選択するが、図３３では、図３１に図示した構成のうちの、セレクタ６０１，６１１、及び６１５がv端子を選択することによってバリアブルノード演算時に機能しない部分（バリアブルノード演算に関係がない部分）の図示を省略してある。
【０５５０】
メッセージ計算部２１１は、入力ポートP101,P601,PD601それぞれから入力されるメッセージを用いて、式（９）のバリアブルノード演算を行い、その結果得られるメッセージD622を、出力ポートP622から出力する。
【０５５１】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP601には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各行に対応するチェックノードからの１回目のメッセージD601（メッセージu'j）が供給される。
【０５５２】
入力ポートP101に供給された受信データD101は、演算器６１３に供給される。
【０５５３】
また、入力ポートP601に供給されたメッセージD601（メッセージu'j）のうちの最上位ビットを除く下位ビット、つまり、メッセージD601の絶対値D603(|u'j|)は、LUT６００に供給される。
【０５５４】
LUT６００は、非線形関数φ(x)（及び逆関数φ-1(x)）の演算結果を記憶しており、絶対値D603(|u'j|)を引数として、逆関数φ-1(|u'j|)の演算を行った演算結果D605（φ-1(|u'j|)）を読み出して出力する。LUT６００が出力する演算結果D605（φ-1(|u'j|)）は、その最上位ビットに、入力ポートP601に供給されたメッセージD601（メッセージu'j）のうちの最上位ビット、つまりメッセージD601の符号ビットD604(sign(u'j))が付加されることにより、メッセージD606（チェックノードメッセージuj）とされ、セレクタ６０１のv端子に供給される。
【０５５５】
セレクタ６０１は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージD606（チェックノードメッセージuj）は、メッセージD607として、演算器６０２に供給される。
【０５５６】
演算器６０２は、セレクタ６０１からのメッセージD607（メッセージuj）とレジスタ６０３に格納されている値D608とを加算することにより、メッセージD607を積算し、その結果得られる積算値を、レジスタ６０３に再格納する。なお、検査行列の１列に亘る全ての枝からの（メッセージu'jから得られた）メッセージD607が積算された場合、レジスタ６０３はリセットされる。
【０５５７】
検査行列の１列に亘るメッセージD601が１つずつ読み込まれ、レジスタ６０３に１列分のメッセージD607が積算された値が格納された場合、すなわち、レジスタ６０３に、検査行列の１列に亘る全ての枝からのメッセージD607（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ６０４は、レジスタ６０３に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD607（メッセージuj）が積算された積算値D608（ｊ＝１からdvまでのΣuj)を選択し、レジスタ６０５に出力して格納させる。
【０５５８】
レジスタ６０５は、格納している値D608を、値D609として、セレクタ６０４と演算器６１２に供給する。レジスタ６０３に１列分のメッセージD607が積算された値が格納される直前までは、セレクタ６０４は、レジスタ６０５から供給された値D609を選択し、レジスタ６０５に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD607（メッセージuj）が積算されるまで、レジスタ６０５は、前回積算された値を、セレクタ６０４と演算器６１２に供給する。
【０５５９】
一方、入力ポートP601に供給されたメッセージD601（メッセージu'j）は、小FIFOメモリ６１６にも供給される。
【０５６０】
小FIFOメモリ６１６は、メッセージを遅延するための遅延メモリであるが、検査行列の重み（列の重みdv及び行の重みdc）の最大値よりも少ない数（であって１以上）のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリである。
【０５６１】
小FIFOメモリ６１６は、メッセージメモリ１０４からの１回目のメッセージD601を遅延し、セレクタ６１７のf端子に供給する。
【０５６２】
セレクタ６１７は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ６１６で遅延されたメッセージD601が供給される。また、セレクタ617のm端子には、メッセージメモリ１０４から端子DD601に供給される２回目のメッセージPD601が供給される。
【０５６３】
さらに、セレクタ６１７には、制御部２１２（図３０）から入力ポートP604に供給された制御信号C604が供給される。
【０５６４】
セレクタ６１７は、制御部２１２からの制御信号C604に従い、小FIFOメモリ６１６で遅延された１回目のメッセージD601と、メッセージメモリ１０４からの２回目のメッセージDD601とのうちの一方を、バリアブルノード演算に用いるメッセージとして選択して出力する。
【０５６５】
セレクタ６１７が出力するメッセージ、すなわち、小FIFOメモリ６１６で遅延された１回目のメッセージD601、又は、メッセージメモリ１０４からの２回目のメッセージDD601のうちの最上位ビットを除く下位ビット、つまり、絶対値は、値D613として、LUT６１０に供給され、最上位ビット、つまり、符号ビットD614は、LUT６１０の出力D615の符号ビットとされる。
【０５６６】
ここで、図３０の復号装置において、制御部２１２は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ６１６が記憶可能なメッセージの数（記憶可能個数）d以下であるときには、小FIFOメモリ６１６で遅延された１回目のメッセージD601を選択することをセレクタ６１７に指示する制御信号C604をメッセージ計算部２１１の入力ポートP604に供給する。
【０５６７】
さらに、制御部２１２は、バリアブルノードに対応する列の重みdvが、小FIFOメモリ６１６の記憶可能個数d以下でないときには、メッセージメモリ１０４からの２回目のメッセージDD601を選択することをセレクタ６１７に指示する制御信号C604を、メッセージ計算部２１１の入力ポートP604に供給する。
【０５６８】
なお、制御部２１２は、小FIFOメモリ６１６で遅延されたメッセージD601を選択することをセレクタ６１７に指示する制御信号C604を、メッセージ計算部２１１に供給する場合、つまり、制御信号C604が、メッセージメモリ１０４から２回目に読み出されたメッセージDD601を選択することをセレクタ６１７に指示する信号でない場合には、メッセージメモリ１０４からのメッセージの読み出しについては、メッセージメモリ１０４からメッセージを１回だけ読み出す読み出し制御を行う。
【０５６９】
したがって、制御部２１２では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ６１６の記憶可能個数d以下でない場合には、図１５で説明した、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ６１６の記憶可能個数d以下である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御は行われず、１回だけ読み出す読み出し制御、すなわち、図１５のステップＳ１０１及びＳ１０２のうちの、ステップＳ１０１だけが行われる。
【０５７０】
レジスタ６０５において、検査行列の１列に亘る全ての枝からのメッセージD607（メッセージuj）が積算された新たな値（積算値）D609（ｊ＝１からdvまでのΣuj)が格納され、その出力が開始されると、すなわち、レジスタ６０３に１列分のメッセージD607が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された直後、LUT６００と同一と同一の構成のLUT６１０が、セレクタ６１７から出力されるメッセージ（小FIFOメモリ６１６で遅延された１回目のメッセージD601、又は２回目のメッセージDD601）の絶対値D613(|u'j|)を引数として、逆関数φ(|u'j|)の演算を行った演算結果D615（φ-1(|u'j|)）を読み出して出力する。
【０５７１】
LUT６１０が出力する演算結果D615（φ-1(|u'j|)）は、その最上位ビットに、セレクタ６１７から出力されるメッセージ（小FIFOメモリ６１６で遅延された１回目のメッセージD601、又は２回目のメッセージDD601）（メッセージu'j）のうちの最上位ビット、つまり、符号ビットD614(sign(u'j))が付加されることにより、メッセージD616（チェックノードメッセージuj）とされ、セレクタ６１１のv端子に供給される。
【０５７２】
セレクタ６１１は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージD616（チェックノードメッセージuj）は、メッセージD617として、演算器６１２に供給される。
【０５７３】
演算器６１２は、レジスタ６０５から供給された積算値D609（ｊ＝１からdvまでのΣuj)から、セレクタ６１１からのメッセージD617（ｊ＝dvのメッセージuj）を減算する。すなわち、演算器６１２では、検査行列の１列に亘る全ての枝からのメッセージD607（メッセージuj）の積算値D609（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージuj（ｊ＝dvのuj）としてのメッセージD617を減算して、減算値D618（ｊ＝１からdv-1までのΣuj）を求め、演算器６１３に供給する。
【０５７４】
演算器６１３は、入力ポートP101からの受信データD101と、演算器６１２からの減算値D618（ｊ＝１からdv-1までのΣuj）とを加算することにより、メッセージD619（バリアブルノードメッセージvi）を求め、セレクタ６１５のv端子に供給する。
【０５７５】
セレクタ６１５は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器６１３からのメッセージD619（バリアブルノードメッセージvi）を、メッセージD622として、出力ポートP622から出力する。
【０５７６】
以上のように、セレクタ６０１，６１１、及び６１５がv端子を選択しているメッセージ計算部２１１では、式（９）のバリアブルノード演算が行われ、その結果得られるメッセージ（バリアブルノードメッセージ）viが、出力ポートP622から出力される。
【０５７７】
次に、図３４は、図３２右側に示したチェックノード演算時の図３１のメッセージ計算部２１１の実質的な構成例を示している。
【０５７８】
なお、上述したように、チェックノード演算時には、セレクタ６０１，６１１、及び６１５はc端子を選択するが、図３４では、図３１に図示した構成のうちの、セレクタ６０１，６１１、及び６１５がc端子を選択することによってチェックノード演算時に機能しない部分（チェックノード演算に関係がない部分）の図示を省略してある。
【０５７９】
チェックノード演算時においては、入力ポートP601には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviが、順次、メッセージD601として供給される。
【０５８０】
入力ポートP601に供給されたメッセージD601（メッセージvi）のうちの最上位ビットを除く下位ビット、つまり、メッセージD601の絶対値D603(|vi|)は、LUT６００に供給され、最上位ビット、つまりメッセージD601の符号ビットD604は、EXOR回路６０６に供給される。
【０５８１】
LUT６００は、絶対値D603(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D605（φ(|vi|)）を読み出し、セレクタ６０１のc端子に供給する。
【０５８２】
セレクタ６０１は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT６００からの演算結果D605（φ(|vi|)）を、演算結果D607（φ(|vi|)）として、演算器６０２に供給する。
【０５８３】
演算器６０２は、演算結果D607（φ(|vi|)）とレジスタ６０３に格納されている値D608とを加算することにより、演算結果D607を積算し、その結果得られる積算値をレジスタ６０３に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD601の絶対値D603(|vi|)に対する演算結果D607（φ(|vi|)）が積算された場合、レジスタ６０３はリセットされる。
【０５８４】
検査行列の１行に亘るメッセージD601が１つずつ読み込まれ、レジスタ６０３に１行分の演算結果D607が積算された積算値が格納された場合、セレクタ６０４は、レジスタ６０３に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD601（メッセージvi）から求められたφ(|vi|)が積算された積算値D608（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）を選択し、レジスタ６０５に出力して格納させる。レジスタ６０５は、格納している積算値D608を、値D609として、セレクタ６０４と演算器６１２に供給する。
【０５８５】
レジスタ６０３に１行分の演算結果D607が積算された積算値が格納される直前までは、セレクタ６０４は、レジスタ６０５から供給された値D609を選択し、レジスタ６０５に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD601（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ６０５は、前回積算されたφ(|vi|)の積算値を、セレクタ６０４と演算器６１２に供給する。
【０５８６】
一方、入力ポートP601に供給されたメッセージD601（メッセージvi）は、小FIFOメモリ６１６にも供給される。
【０５８７】
小FIFOメモリ６１６は、上述したように、メッセージを遅延するための遅延メモリであるが、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリであり、メッセージメモリ１０４からの１回目のメッセージD601を遅延し、セレクタ６１７のf端子に供給する。
【０５８８】
上述したように、図３０の復号装置において、制御部２１２は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ６１６が記憶可能なメッセージの数（記憶可能個数）d以下であるときには、小FIFOメモリ６１６で遅延された１回目のメッセージD601を選択することをセレクタ６１７に指示する制御信号C604を、メッセージ計算部２１１の入力ポートP604を介して、セレクタ６１７に供給する。
【０５８９】
セレクタ６１７は、制御部２１２からの制御信号C604に従い、小FIFOメモリ６１６で遅延された１回目のメッセージD601を選択して出力する。
【０５９０】
また、制御部２１２は、チェックノードに対応する列の重みdcが、小FIFOメモリ６１６の記憶可能個数d以下でないときには、メッセージメモリ１０４からの２回目のメッセージDD601を選択することをセレクタ６１７に指示する制御信号C604を、メッセージ計算部２１１の入力ポートP604に供給する。
【０５９１】
さらに、制御部２１２では、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の列の重みdvが、小FIFOメモリ６１６の記憶可能個数d以下でない場合には、図１５で説明した、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御が行われ、これにより、メッセージメモリ１０４から２回目に読み出されたメッセージDD601が、入力ポートPD601を介して、セレクタ６１７のm端子に供給される。
【０５９２】
セレクタ６１７は、制御部２１２からの制御信号C604に従い、メッセージメモリ１０４から入力ポートPD601を介して供給される２回目のメッセージDD601を選択して出力する。
【０５９３】
セレクタ６１７が出力するメッセージ（メッセージvi）、すなわち、小FIFOメモリ６１６で遅延された１回目のメッセージD601、又は、メッセージメモリ１０４からの２回目のメッセージDD601のうちの最上位ビットを除く下位ビット、つまり、絶対値は、値D613として、LUT６１０に供給され、最上位ビット、つまり、符号ビットD614は、EXOR回路６１４に供給される。
【０５９４】
レジスタ６０５において、新たな値D609（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）の出力が開始されると、すなわち、レジスタ６０５に１行分の演算結果D607が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納された直後、LUT６１０は、セレクタ６１７から出力されるメッセージ（小FIFOメモリ６１６で遅延された１回目のメッセージD601、又は２回目のメッセージDD601）の絶対値D613(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D615（φ(|vi|)）を読み出し、セレクタ６１１のc端子に供給する。
【０５９５】
セレクタ６１１は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT６１０からの演算結果D615（φ(|vi|)）を、演算結果D617（φ(|vi|)）として、演算器６１２に供給する。
【０５９６】
演算器６１２は、レジスタ６０５から供給された値D609から、セレクタ６１１から供給された値D617を減算し、その減算結果を、減算値D618として出力する。すなわち、演算器６１２は、検査行列の１行に亘る全ての枝からのメッセージD601（メッセージvi）から求められたφ(|vi|)の積算値D609（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）から、求めたい枝からのメッセージDD601（メッセージvi）から求められたφ(|vi|)の値D617を減算して、その減算値（ｉ＝１からｉ＝dc-1までのΣφ(|vi|)）を減算値D618として出力する。
【０５９７】
以上の処理と並行して、EXOR回路６０６は、レジスタ６０７に格納されている値D611と、１回目のメッセージD601（メッセージvi）の最上位ビットである符号ビットD604との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D610を、レジスタ６０７に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された場合、レジスタ６０７はリセットされる。
【０５９８】
検査行列の１行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された乗算結果D610（ｉ＝１からdcまでのΠsign(vi)）がレジスタ６０７に格納された場合、セレクタ６０８は、レジスタ６０７に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された値D611（ｉ＝１からｉ＝dcまでのΠsign(vi)）を選択し、レジスタ６０９に出力して格納させる。レジスタ６０９は、格納している値D612を、セレクタ６０８とEXOR回路６１４に供給する。
【０５９９】
検査行列の１行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された乗算結果D610（ｉ＝１からdcまでのΠsign(vi)）がレジスタ６０７に格納される直前までは、セレクタ６０８は、レジスタ６０９から供給される値D612を選択し、レジスタ６０９に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD601（メッセージvi）の符号ビットD604が乗算されるまで、レジスタ６０９は、前回格納した値を、セレクタ６０８とEXOR回路６１４に供給する。
【０６００】
一方、レジスタ６０９から新たな値D612（ｉ＝１からｉ＝dcまでのΠsign(vi)）がEXOR回路６１４に供給されたとき、すなわち、レジスタ６０７に１行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された新たな値D611（ｉ＝１からｉ＝dcまでのΠsign(vi)）が格納されたとき、セレクタ６０８が、その値D611を選択して、レジスタ６０９に格納させるとともに、レジスタ６０５には、上述したように、１行分の演算結果D607が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納される。
【０６０１】
レジスタ６０５に１行分の演算結果D607が積算された積算値（ｉ＝１からｉ＝dcまでのΣφ(|vi|)）が格納されると、上述したようにして、セレクタ６１７が出力するメッセージ（メッセージvi）、すなわち、小FIFOメモリ６１６で遅延された１回目のメッセージD601、又は、メッセージメモリ１０４からの２回目のメッセージDD601のうちの最上位ビットである符号ビットD614が、EXOR回路６１４に供給される。
【０６０２】
EXOR回路６１４は、レジスタ６０９に格納されて出力される新たな値D612と、セレクタ６１７からのメッセージの符号ビットD614との排他的論理和を演算することにより、値D612を、メッセージu'jを求めようとする枝からのメッセージviの符号ビットD614で除算し、除算結果を除算値D620として出力する。すなわち、EXOR回路６１４は、検査行列の１行に亘る全ての枝からのメッセージD601の符号ビットD604の乗算値（ｉ＝１からｉ＝dcまでのΠsign(vi)）を、求めたい枝からのメッセージviの符号ビットD614（ｉ＝dcのsign(vi)）で除算して、その除算値（ｉ＝１からｉ＝dc-1までのΠsign(vi)）を除算値D620として出力する。
【０６０３】
そして、メッセージ計算部２１１では、演算器６１２から出力された減算値D618を下位ビットとするとともに、EXOR回路６１４から出力された除算値D620を最上位ビット（符号ビット）とするビット列D621（メッセージu'j）が、セレクタ６１５のc端子に供給される。
【０６０４】
セレクタ６１５は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D621（メッセージu'j）を、メッセージD622として、出力ポートP622から出力する。
【０６０５】
以上のように、セレクタ６０１，６１１、及び６１５がc端子を選択しているメッセージ計算部２１１では、式（１０）のチェックノード演算が行われ、その結果得られるメッセージ（メッセージ）u'jが、出力ポートP622から出力される。
【０６０６】
なお、図３０の復号装置では、復号の最終段において、式（９）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【０６０７】
以上のように、図３０の復号装置では、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ６１６（図３１）を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ３２０（図２２）を設ける場合に比較して、復号装置の規模を削減することができる。
【０６０８】
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合（記憶可能個数dより大でない場合）には、小FIFOメモリ６１６の出力を選択して、ノード（バリアブルノード、チェックノード）の演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ３２０（図２２）を有する図２１の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図２１の復号装置と同様の回数だけ繰り返し復号を行うことができるので（１回の復号に要する時間が図２１の復号装置と同様となるので）、復号性能が劣化することを抑制することができる。
【０６０９】
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出し、２回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
【０６１０】
以上から、図３０の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
【０６１１】
ここで、小FIFOメモリ６１６の記憶可能個数dが、例えば、３であり、復号の対象のLDPC符号を定義する検査行列が、例えば、図１に示した、各列の重みdvが３で、且つ、各行の重みが６の行列である場合には、記憶可能個数dである３が、検査行列の列の重みdvである３よりも小でなく、したがって、バリアブルノード演算時には、３個のメッセージD601が積算されるまでの間、小FIFOメモリ６１６において、その３個のメッセージD601すべてを遅延することができるから、セレクタ６１７では、端子fに供給される、小FIFOメモリ６１６で遅延された１回目のメッセージD601が選択される。
【０６１２】
また、この場合、記憶可能個数dである３が、検査行列の行の重みdcである６よりも小であり、したがって、チェックノード演算時には、記憶可能個数dである３よりも多い６個のメッセージD601のφ(|vi|)が積算されるまでの間、小FIFOメモリ６１６において、その６個のメッセージD601すべてを遅延することができないため、セレクタ６１７では、端子mに供給される、メッセージメモリ１０４からの２回目のメッセージDD601が選択される。
【０６１３】
なお、図３０の復号装置では、メッセージ計算部２１１において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部（LUT６００、演算器６０２、レジスタ６０３、セレクタ６０４、レジスタ６０５、LUT６１０、及び演算器６１２）が共有化されているので、その共有化の分だけ、復号装置の規模を、より削減することができる。
【０６１４】
また、図３０の復号装置のメッセージ計算部２１１では、ノードに入力される入力データxの絶対値|x|を引数として、同一の演算結果が得られる逆関数φ-1(x)と非線形関数φ(x)の演算をそれぞれ含む式（９）と式（１０）にそれぞれ従って、バリアブルノード演算とチェックノード演算が行われる。
【０６１５】
したがって、メッセージ計算部２１１には、図３１に示したように、入力ポートP601から供給される１回目のメッセージに対して、逆関数φ-1(x)及び非線形関数φ(x)の演算を行うLUT６００と、セレクタ６１７が出力するメッセージに対して、逆関数φ-1(x)及び非線形関数φ(x)の演算を行うLUT６１０との２つのLUTがあれば済み、図２６に示したように、１回目のメッセージに対して非線形関数φ(x)の演算を行うLUT３００、セレクタ３１８が出力するメッセージに対して非線形関数φ(x)の演算を行うLUT３１０、及び逆関数φ-1(x)の演算を行うLUT３１４の３つのLUTを必要とするメッセージ計算部２０１よりも、規模を削減することができる。
【０６１６】
次に、図３５は、本発明を適用した復号装置の第４実施の形態の構成例を示すブロック図である。
【０６１７】
なお、図中、図２５の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図３５の復号装置は、メッセージ計算部２０１に代えて、メッセージ計算部２２１が設けられているとともに、制御部２０２に代えて、制御部２２２が設けられている他は、図２５の復号装置と同様に構成されている。
【０６１８】
図３５の復号装置では、メッセージ計算部２２１が、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図３５の復号装置では、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部２２１が、図２２のメッセージ計算部１９１のFIFOメモリ３２０のように、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを有している。
【０６１９】
また、図３５の復号装置では、制御部２２２が、メッセージメモリ１０４に対するメッセージ（データ）の読み書き制御として、図１５のフローチャートで説明したように、図１２の復号装置の制御部１７４と同様の読み書き制御を行う。
【０６２０】
さらに、制御部２３２は、制御信号C703を、メッセージ計算部２１１に供給し、その制御信号C703によって、バリアブルノード演算、又はチェックノード演算を行うことを、メッセージ計算部２２１に指示する。
【０６２１】
また、制御部２２２は、図２０のフローチャートで説明したように、セレクタ制御の処理を行い、制御信号C104に相当する制御信号C704を、メッセージ計算部２２１に供給する。メッセージ計算部２２１は、制御部２２２からの制御信号C704に従い、メッセージメモリ１０４から２回目に読み出されたメッセージDD602を選択的に用いて、バリアブルノード演算やチェックノード演算を行う。
【０６２２】
図３５の復号装置では、メッセージメモリ１０４に記憶されているメッセージが１つずつ読み出され、メッセージ計算部２２１に供給される。メッセージ計算部２２１は、メッセージメモリ１０４からのメッセージを用いて演算が行われ、その演算によって求められたメッセージが、メッセージメモリ１０４に格納される。図３５の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
【０６２３】
すなわち、受信データメモリ１０５には、送信されてきたLDPC符号を受信することにより得られる受信データ（対数尤度比）D100が供給され、受信データメモリ１０５は、その受信データD100を記憶する。
【０６２４】
バリアブルノード演算時には、受信データメモリ１０５は、制御部２２２から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部２２１に供給する。
【０６２５】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部２２２から供給される制御信号に従い、記憶している同一のメッセージを１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD701として、メッセージ計算部２２１に供給し、２回目に読み出したメッセージをメッセージDD701として、メッセージ計算部２２１に供給する。メッセージ計算部２２１は、メッセージメモリ１０４から供給される１回目のメッセージD701、及び受信データメモリ１０５から供給される受信データD101、さらには、メッセージメモリ１０４から供給される２回目のメッセージDD701を、必要に応じて用い、制御部２２２から供給される制御信号C703及びC704に従って、検査行列に基づき、バリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージを、メッセージD722として、メッセージメモリ１０４に供給する。
【０６２６】
そして、メッセージメモリ１０４は、制御部２２２から供給される制御信号に従い、メッセージ計算部２２１から供給されるメッセージD722を記憶する。
【０６２７】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部２２２から供給される制御信号に従って、記憶している同一のメッセージを１回、又は２回読み出して、１回目に読み出したメッセージをメッセージD701として、メッセージ計算部２２１に供給し、２回目に読み出したメッセージをメッセージDD701として、メッセージ計算部２２１に供給する。
【０６２８】
メッセージ計算部２２１は、メッセージメモリ１０４から供給される１回目のメッセージD701、さらには、メッセージメモリ１０４から供給される２回目のメッセージDD701を、必要に応じて用い、制御部２２２からの制御信号C703及びC704に従って、検査行列に基づき、チェックノード演算を行い、そのチェックノード演算によって求められたメッセージを、メッセージD722として、メッセージメモリ１０４に供給する。
【０６２９】
そして、メッセージメモリ１０４は、制御部２２２から供給される制御信号に従い、メッセージ計算部２２１から供給されるメッセージD722を記憶する。
【０６３０】
ここで、図３５のメッセージ計算部２２１で行われる演算について説明する。
【０６３１】
いま、バリアブルノードに接続している枝のうちのi番目の枝から出力されるメッセージ（データ）として、式v'i=φ(|vi|)×sign(vi)で表されるメッセージv'iを導入すると、式（１）及び式（７）は、式（１１）ないし式（１３）に書き直すことができる。
【０６３２】
【数１１】
2008278187.tif 000013
・・・（１１）
【０６３３】
【数１２】
2008278187.tif 000014
・・・（１２）
【０６３４】
【数１３】
2008278187.tif 000015
・・・（１３）
【０６３５】
ここで、式（１）のバリアブルノード演算は、式（１１）及び式（１２）の演算に対応し、式（７）のチェックノード演算は、式（１３）の演算に対応する。
【０６３６】
式（１１）及び式（１２）のバリアブルノード演算では、バリアブルノードに入力される入力データ（メッセージ）ujを、符号sign(uj)を含めて積算し（Σuj）、さらに、受信データu0iを加算して、その結果得られる加算値vi（=u0i+Σuj）の絶対値|vi|を引数とする非線形関数φ(|vi|)の演算を行うことにより、メッセージv'iが求められる。
【０６３７】
また、式（１３）のチェックノード演算では、チェックノードに入力される入力データ（メッセージ）v'iの絶対値|v'i|を積算し（Σ|v'i|）、その積算値Σ|v'i|を引数とする逆関数φ-1(Σ|v'i|)の演算を行う一方で、それとは別に、入力データv'iの符号ビットの相乗積（Πsign(v'i)）を求め、逆関数φ-1(Σ|v'i|)の演算結果と、入力データv'iの符号ビットの相乗積Πsign(v'i)とを乗算して、メッセージujが求められる。
【０６３８】
ここで、上述したように、非線形関数φ(x)とその逆関数φ-1(x)とは、x＞0において等しい。したがって、式（１１）及び式（１２）のバリアブルノード演算と、式（１３）のチェックノード演算のいずれでも、出力データxの絶対値|x|を引数として、関数φ(x)（φ-1(x)）の演算が行われることになる。
【０６３９】
図３５のメッセージ計算部２２１では、以上のような式（１１）及び式（１２）のバリアブルノード演算と、式（１３）のチェックノード演算とが行われる。
【０６４０】
図３６は、図３５のメッセージ計算部２２１の構成例を示している。
【０６４１】
メッセージ計算部２２１には、入力ポートP101,P701,PD701,P703,P704と、出力ポートP722が設けられている。
【０６４２】
入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給（入力）される。入力ポートP701には、メッセージメモリ１０４から２回読み出される同一のメッセージD701及びDD701のうちの１回目に読み出されるメッセージ（１回目のメッセージ）D701が供給（入力）され、入力ポートPD701には、２回目に読み出されるメッセージ（２回目のメッセージ）DD701が供給される。また、入力ポートP703とP704には、制御部２２２（図３５）からの制御信号C703とC704が、それぞれ供給される。
【０６４３】
メッセージ計算部２２１は、入力ポートP701から入力される１回目のメッセージD701、入力ポートPD701から入力される２回目のメッセージDD701、入力ポートP101から入力されるメッセージ（受信データ）D101を、必要に応じて用い、入力ポートP703から入力される制御信号C703及びC704に従って、検査行列に基づき、式（１１）及び式（１２）のバリアブルノード演算、又は式（１３）のチェックノード演算を行い、その結果得られるメッセージD722を、出力ポートP722から出力する。
【０６４４】
ここで、図３７を参照して、図３６のメッセージ計算部２２１で行われるバリアブルノード演算とチェックノード演算について説明する。
【０６４５】
図３７左側は、式（１）のバリアブルノード演算を行うバリアブルノードと、式（７）のチェックノード演算を行うチェックノードとを模式的に示しており、図２７右側と同一の図である。
【０６４６】
図３７左側では、図２７右側で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、チェックノードから出力された出力データ（逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値）に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
【０６４７】
図３７左側において、バリアブルノードから出力された出力データとしてのメッセージviは、チェックノードに入力される入力データxとして、上述したように、非線形関数φ(x)の演算が施されてから、チェックノードに入力される。
【０６４８】
したがって、図３７左側に示したように、チェックノードに入力される入力データxに、非線形関数φ(x)の演算を施す代わりに、図３７右側に示すように、バリアブルノードから出力された出力データx（バリアブルノードメッセージvi）に、非線形関数φ(x)の演算を施しても、バリアブルノード演算とチェックノード演算を行うことができる。
【０６４９】
すなわち、図３７右側では、式（１１）及び式（１２）で説明したように、バリアブルノードにおいて、そのバリアブルノードに入力される入力データujが積算されることにより、メッセージviが求められ、出力データとして出力されている。そして、バリアブルノードから出力された（メッセージvi）に、非線形関数φ(x)の演算が施され、メッセージv'iが求められている。このメッセージv'i（メッセージviに、非線形関数φ(x)の演算を施した演算結果）は、チェックノードに入力され、式（１３）で説明したように積算されて、出力データとして出力される。そして、その出力データ（メッセージviに、非線形関数φ(x)の演算を施した演算結果の積算値）に、逆関数φ-1(x)の演算が施されることにより、メッセージujが求められる。
【０６５０】
図３６のメッセージ計算部２２１では、図３７右側に示したようにメッセージv'iとujを求める式（１１）及び式（１２）のバリアブルノード演算と式（１３）のチェックノード演算が行われる。
【０６５１】
このように、図３６のメッセージ計算部２２１は、図３７右側に示したメッセージv'iとujを求める式（１１）及び式（１２）のバリアブルノード演算と式（１３）のチェックノード演算の両方を行うため、メッセージ計算部２２１には、バリアブルノードから出力された出力データxに対して、逆関数φ-1(x)と同一の演算結果が得られる非線形関数φ(x)の演算結果を出力するとともに、チェックノードから出力された出力データxに対して、逆関数φ-1(x)の演算結果を出力するLUT７１３が設けられている。
【０６５２】
そして、図３６のメッセージ計算部２２１は、入力ポートP703に供給される制御信号C703に従って、その実質的な構成を変えて、式（１１）及び式（１２）のバリアブルノード演算と式（１３）のチェックノード演算を選択的に行う。
【０６５３】
すなわち、メッセージ計算部２２１は、セレクタ７００，７０５，７１２、及び７１５を有しており、入力ポートP703に供給された制御信号C703は、セレクタ７００，７０５，７１２、及び７１５に供給される。
【０６５４】
セレクタ７００，７０５，７１２、及び７１５は、v端子とc端子とを有し、制御信号C703に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ７００，７０５，７１２、及び７１５は、制御信号C703がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C703がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
【０６５５】
その結果、図３６のメッセージ計算部２２１では、制御信号C703がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号C703がチェックノード演算を指示しているときには、チェックノード演算が行われる。
【０６５６】
すなわち、図３８は、図３７右側に示したバリアブルノード演算時の図３６のメッセージ計算部２２１の実質的な構成例を示している。
【０６５７】
なお、上述したように、バリアブルノード演算時には、セレクタ７００，７０５，７１２、及び７１５はv端子を選択するが、図３８では、図３６に図示した構成のうちの、セレクタ７００，７０５，７１２、及び７１５がv端子を選択することによってバリアブルノード演算時に機能しない部分（バリアブルノード演算に関係がない部分）の図示を省略してある。
【０６５８】
メッセージ計算部２２１は、入力ポートP101,P701,PD701それぞれから入力されるメッセージを、必要に応じて用いて、式（１１）及び式（１２）のバリアブルノード演算を行い、その結果得られるメッセージD722を、出力ポートP722から出力する。
【０６５９】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP701には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各行に対応するチェックノードからの１回目のメッセージD701（メッセージuj）が供給される。
【０６６０】
入力ポートP101に供給された受信データD101は、演算器７１１に供給される。
【０６６１】
また、入力ポートP701に供給されたメッセージD701（メッセージuj）は、セレクタ７００のv端子と、小FIFOメモリ７１６に供給される。
【０６６２】
セレクタ７００は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージD701（チェックノードメッセージuj）は、メッセージD705として、演算器７０１に供給される。
【０６６３】
演算器７０１は、セレクタ７００からのメッセージD705（メッセージuj）とレジスタ７０２に格納されている値D706とを加算することにより、メッセージD705を積算し、その結果得られる積算値を、レジスタ７０２に再格納する。なお、検査行列の１列に亘る全ての枝からのメッセージD705（メッセージuj）が積算された場合、レジスタ７０２はリセットされる。
【０６６４】
検査行列の１列に亘るメッセージD701（メッセージuj）が１つずつ読み込まれ、これにより、レジスタ７０２に１列分のメッセージD705（メッセージuj）が積算された値が格納された場合、すなわち、レジスタ７０２に、検査行列の１列に亘る全ての枝からのメッセージD705（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ７０３は、レジスタ７０２に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD705（メッセージuj）が積算された積算値D706（ｊ＝１からdvまでのΣuj)を選択し、レジスタ７０４に出力して格納させる。
【０６６５】
レジスタ７０４は、格納している値D706を、値D707として、セレクタ７０３と演算器７１０に供給する。レジスタ７０２に１列分のメッセージD705（メッセージuj）が積算された値が格納される直前までは、セレクタ７０３は、レジスタ７０４から供給された値D707を選択し、レジスタ７０４に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD705（メッセージuj）が積算されるまで、レジスタ７０４は、前回積算された値を、セレクタ７０３と演算器７１０に供給する。
【０６６６】
一方、入力ポートP701に供給されたメッセージD701（メッセージuj）は、上述したように、小FIFOメモリ７１６にも供給される。
【０６６７】
小FIFOメモリ７１６は、メッセージを遅延するための遅延メモリであるが、検査行列の重み（列の重みdv及び行の重みdc）の最大値よりも少ない数（であって１以上）のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリである。
【０６６８】
小FIFOメモリ７１６は、メッセージメモリ１０４からの１回目のメッセージD701を遅延し、セレクタ７１７のf端子に供給する。
【０６６９】
セレクタ７１７は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、Ｋ小FIFOメモリ７１６で遅延されたメッセージD701が供給される。また、セレクタ７１７のm端子には、メッセージメモリ１０４から端子PD701に供給される２回目のメッセージDD701が供給される。
【０６７０】
さらに、セレクタ７１７には、制御部２２２（図３５）から入力ポートP704に供給される制御信号C704が供給される。
【０６７１】
セレクタ７１７は、制御部２２２からの制御信号C704に従い、小FIFOメモリ７１６で遅延された１回目のメッセージD701と、メッセージメモリ１０４からの２回目のメッセージDD701とのうちの一方を、バリアブルノード演算に用いるメッセージとして選択して出力する。
【０６７２】
セレクタ７１７が出力するメッセージ、すなわち、小FIFOメモリ７１６で遅延された１回目のメッセージD701、又は、メッセージメモリ１０４からの２回目のメッセージDD701は、セレクタ７０５のv端子に供給される。
【０６７３】
ここで、図３５の復号装置において、制御部２２２は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ７１６が記憶可能なメッセージの数（記憶可能個数）d以下であるときには、小FIFOメモリ７１６で遅延された１回目のメッセージD701を選択することをセレクタ７１７に指示する制御信号C704を、メッセージ計算部２１１の入力ポートP704に供給する。
【０６７４】
さらに、制御部２２２は、バリアブルノードに対応する列の重みdvが、小FIFOメモリ７１６の記憶可能個数d以下でないときには、メッセージメモリ１０４からの２回目のメッセージDD701を選択することをセレクタ７１７に指示する制御信号C704を、メッセージ計算部２１１の入力ポートP704に供給する。
【０６７５】
なお、制御部２２２は、小FIFOメモリ７１６で遅延されたメッセージD701を選択することをセレクタ７１７に指示する制御信号C704を、メッセージ計算部２１１に供給する場合、つまり、制御信号C704が、メッセージメモリ１０４から２回目に読み出されたメッセージDD701を選択することをセレクタ７１７に指示する信号でない場合には、メッセージメモリ１０４からのメッセージの読み出しについては、メッセージメモリ１０４からメッセージを１回だけ読み出す読み出し制御を行う。
【０６７６】
したがって、制御部２２２では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ７１６の記憶可能個数d以下でない場合には、図１５で説明した、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ７１６の記憶可能個数d以下である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御は行われず（行う必要がなく）、１回だけ読み出す読み出し制御、すなわち、図１５のステップＳ１０１及びＳ１０２のうちの、ステップＳ１０１だけが行われる。
【０６７７】
一方、レジスタ７０４から新たな値D707（ｊ＝１からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ７０２に１列分のメッセージD705（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納され、その積算値がセレクタ７０３で選択されて、レジスタ７０４に格納された直後、上述したようにして、セレクタ７１７が出力するメッセージ、すなわち、小FIFOメモリ７１６で遅延された１回目のメッセージメッセージD701（メッセージuj）、又は、２回目のメッセージDD701が、セレクタ７０５のv端子に供給される。
【０６７８】
セレクタ７０５は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージ（メッセージuj）は、メッセージD713として、演算器７１０に供給される。
【０６７９】
演算器７１０は、レジスタ７０４から供給された積算値D707（ｊ＝１からdvまでのΣuj)から、セレクタ７０５からのメッセージD713（メッセージuj）を減算する。すなわち、演算器７１０では、検査行列の１列に亘る全ての枝からのメッセージD705（メッセージuj）の積算値D707（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージuj（ｊ＝dvのuj）としてのメッセージD713を減算して、減算値D714（ｊ＝１からdv-1までのΣuj）を求め、演算器７１１に供給する。
【０６８０】
演算器７１１は、入力ポートP101からの受信データD101と、演算器７１０からの減算値D714（ｊ＝１からdv-1までのΣuj）とを加算することにより、メッセージD715（バリアブルノードメッセージvi）を求めて出力する。
【０６８１】
すなわち、以上により、式（１１）の演算が行われ、演算器７１１からバリアブルノードメッセージviが出力される。
【０６８２】
演算器７１１が出力するメッセージD715（メッセージvi）のうちの最上位ビットを除く下位ビット、つまり、メッセージD715の絶対値D716(|vi|)は、セレクタ７１２のv端子に供給され、最上位ビット、つまりメッセージD715（メッセージvi）の符号ビットD717(sign(vi))は、セレクタ７１５のv端子に供給される。
【０６８３】
セレクタ７１２は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器７１１が出力するメッセージD715（メッセージvi）の絶対値D716(|vi|)を、絶対値D718として、LUT７１３に供給する。
【０６８４】
LUT７１３は、セレクタ７１２からの絶対値D718(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D719（φ(|vi|)）を読み出して出力する。
【０６８５】
セレクタ７１５も、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器７１１が出力するメッセージD715（メッセージvi）の符号ビットD717(sign(vi))を、符号ビットD721(sign(vi))として出力する。
【０６８６】
メッセージ計算部２１１は、セレクタ７１５が出力する符号ビットD721(sign(vi))を、LUT７１３が出力する演算結果D719（φ(|vi|)）の符号ビットとして最上位ビットに付加することにより、メッセージD722（メッセージv'i）を得て、出力ポートP722から出力する。
【０６８７】
以上により、式（１２）の演算が行われ、メッセージv'iが求められる。
【０６８８】
以上のように、セレクタ７００，７０５，７１２、及び７１５がv端子を選択しているメッセージ計算部２２１では、式（１１）及び式（１２）のバリアブルノード演算が行われ、その結果得られるメッセージv'iが、出力ポートP722から出力される。
【０６８９】
次に、図３９は、図３７右側に示したチェックノード演算時の図３６のメッセージ計算部２２１の実質的な構成例を示している。
【０６９０】
なお、上述したように、チェックノード演算時には、セレクタ７００，７０５，７１２、及び７１５はc端子を選択するが、図３９では、図３６に図示した構成のうちの、セレクタ７００，７０５，７１２、及び７１５がc端子を選択することによってチェックノード演算時に機能しない部分（チェックノード演算に関係がない部分）の図示を省略してある。
【０６９１】
チェックノード演算時においては、入力ポートP701には、メッセージメモリ１０４から１つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviから得られたメッセージ（式（１１）及び式（１２）のバリアブルノード演算によって求められたメッセージ）v'iが、順次、メッセージD701として供給される。
【０６９２】
入力ポートP701に供給されたメッセージD701（メッセージv'i）のうちの最上位ビットを除く下位ビット、つまり、メッセージD701の絶対値D703(|v'i|)は、セレクタ７００のc端子に供給され、最上位ビット、つまりメッセージD701の符号ビットD704は、EXOR回路７０６に供給される。
【０６９３】
セレクタ７００は、チェックノード演算時にはc端子を選択しており、そのc端子に供給される、メッセージD701の絶対値D703(|v'i|)を、絶対値D705（|v'i|）として、演算器７０１に供給する。
【０６９４】
演算器７０１は、絶対値D705（|v'i|）とレジスタ７０２に格納されている値D706とを加算することにより、絶対値D705を積算し、その結果得られる積算値をレジスタ７０２に再格納する。なお、検査行列の１行に亘る全ての枝からの（メッセージviから得られた）メッセージD701（v'i）の絶対値D705(D703)(|v'i|)が積算された場合、レジスタ７０２はリセットされる。
【０６９５】
検査行列の１行に亘る（メッセージviから得られた）メッセージD701が１つずつ読み込まれ、レジスタ７０２に１行分の絶対値D705が積算された積算値が格納された場合、セレクタ７０３は、レジスタ７０２に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD701（メッセージv'i）が積算された積算値D706（ｉ＝１からｉ＝dcまでのΣ|v'i|）を選択し、レジスタ７０４に出力して格納させる。レジスタ７０４は、格納している積算値D706を、値D707として、セレクタ７０３と演算器７１０に供給する。
【０６９６】
レジスタ７０２に１行分の絶対値D705が積算された積算値が格納される直前までは、セレクタ７０３は、レジスタ７０４から供給された値D707を選択し、レジスタ７０４に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD701（メッセージv'i）の絶対値|v'i|が積算されるまで、レジスタ７０４は、前回積算された絶対値|v'i|の積算値を、セレクタ７０３と演算器７１０に供給する。
【０６９７】
一方、入力ポートP701に供給されたメッセージD701（メッセージv'i）は、小FIFOメモリ７１６にも供給される。
【０６９８】
小FIFOメモリ７１６は、上述したように、メッセージを遅延するための遅延メモリであるが、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリであり、メッセージメモリ１０４からの１回目のメッセージD701を遅延し、セレクタ７１７のf端子に供給する。
【０６９９】
ここで、図３５の復号装置において、制御部２２２は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ７１６が記憶可能なメッセージの数（記憶可能個数）d以下であるときには、小FIFOメモリ７１６で遅延された１回目のメッセージD701を選択することをセレクタ７１７に指示する制御信号C704を、メッセージ計算部２２１の入力ポートP704を介して、セレクタ７１７に供給する。
【０７００】
セレクタ７１７は、制御部２２２からの制御信号C704に従い、小FIFOメモリ７１６で遅延された１回目のメッセージD701を選択して出力する。
【０７０１】
また、制御部２２２は、チェックノードに対応する行の重みdcが、小FIFOメモリ７１６の記憶可能個数d以下でないときには、メッセージメモリ１０４からの２回目のメッセージDD701を選択することをセレクタ７１７に指示する制御信号C704を、メッセージ計算部２２１の入力ポートP704に供給する。
【０７０２】
さらに、制御部２２２では、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ７１６の記憶可能個数d以下でないときには、図１５で説明した、メッセージメモリ１０４から同一のメッセージを２回読み出す読み出し制御が行われ、これにより、メッセージメモリ１０４から２回目に読み出されたメッセージDD701が、入力ポートPD701を介して、セレクタ７１７のm端子に供給される。
【０７０３】
セレクタ７１７は、制御部２２２からの制御信号C704に従い、メッセージメモリ１０４から入力ポートPD701を介して供給される２回目のメッセージDD701を選択して出力する。
【０７０４】
セレクタ７１７が出力するメッセージ（メッセージv'i）、すなわち、小FIFOメモリ７１６で遅延された１回目のメッセージD701、又は、メッセージメモリ１０４からの２回目のメッセージDD701のうちの最上位ビットを除く下位ビット、つまり、絶対値D711(|v'i|)は、セレクタ７０５のc端子に供給され、最上位ビット、つまり、符号ビットD712(sign(v'i))は、EXOR回路７１４に供給される。
【０７０５】
セレクタ７０５は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるメッセージ(v'i)の絶対値D711(|v'i|)を、絶対値D713（|v'i|）として、演算器７１０に供給する。
【０７０６】
すなわち、レジスタ７０４において、新たな値D707（ｉ＝１からｉ＝dcまでのΣφ(|v'i|)）の出力が開始されると、つまり、レジスタ７０２に１行分の絶対値D705が積算された新たな積算値（ｉ＝１からｉ＝dcまでのΣφ(|v'i|)）が格納され、セレクタ７０３で選択されて、レジスタ７０４に格納された直後、セレクタ７０５からは、セレクタ７１７が出力するメッセージ（メッセージv'i）の絶対値D711(|v'i|)が、絶対値D713（|v'i|）として、演算器７１０に供給される。
【０７０７】
演算器７１０は、レジスタ７０４から供給された値D707（Σ|v'i|）から、セレクタ７０５から供給された値D713(|v'i|)を減算し、その減算結果を、減算値D714として出力する。すなわち、演算器７１０は、検査行列の１行に亘る全ての枝からのメッセージD701（メッセージv'i）の絶対値|v'i|の積算値D707（ｉ＝１からｉ＝dcまでのΣ|v'i|）から、求めたい枝からのメッセージ（i＝dcのv'i）の絶対値D713（|v'i|）を減算して、その減算値（ｉ＝１からｉ＝dc-1までのΣ|v'i|）を値D714として、セレクタ７１２のc端子に供給する。
【０７０８】
セレクタ７１２は、チェックノード演算時には、c端子を選択しており、そのc端子に供給される値D714（ｉ＝１からｉ＝dc-1までのΣ|v'i|）を、値D718として、LUT７１３に供給する。
【０７０９】
LUT７１３は、セレクタ７１２からの値D718(Σ|v'i|)を引数として、逆関数φ-1(Σ|v'i|)の演算を行った演算結果D719（φ-1(Σ|v'i|)）を読み出して出力する。
【０７１０】
以上の処理と並行して、EXOR回路７０６は、レジスタ７０７に格納されている値D709と、１回目のメッセージD701（メッセージv'i）の最上位ビットである符号ビットD704(sign(v'i))との排他的論理和を演算することにより、符号ビットD704どうしの乗算を行い、乗算結果D708を、レジスタ７０７に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された場合、レジスタ７０７はリセットされる。
【０７１１】
検査行列の１行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された乗算結果D708（ｉ＝１からdcまでのΠsign(v'i)）がレジスタ７０７に格納された場合、セレクタ７０８は、レジスタ７０７に格納されている値D709、すなわち、検査行列の１行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された値D709（ｉ＝１からｉ＝dcまでのΠsign(v'i)）を選択し、レジスタ７０９に出力して格納させる。レジスタ７０９は、格納している値D710を、セレクタ７０８とEXOR回路７１４に供給する。
【０７１２】
検査行列の１行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された乗算結果D708（ｉ＝１からdcまでのΠsign(v'i)）がレジスタ７０７に格納される直前までは、セレクタ７０８は、レジスタ７０９から供給された値D710を選択し、レジスタ７０９に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD701（メッセージv'i）の符号ビットD704が乗算されるまで、レジスタ７０９は、前回格納した値を、セレクタ７０８とEXOR回路７１４に供給する。
【０７１３】
一方、レジスタ７０９から新たな値D710（ｉ＝１からｉ＝dcまでのΠsign(v'i)）がEXOR回路７１４に供給されたとき、すなわち、レジスタ７０７に１行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された新たな値D709（ｉ＝１からｉ＝dcまでのΠsign(v'i)）が格納され、その新たな値D709がセレクタ７０８で選択されてレジスタ７０９に格納されたとき、レジスタ７０４には、上述したように、１行分の絶対値D705（|v'i|）が積算された積算値（ｉ＝１からｉ＝dcまでのΣ|v'i|）が格納される。
【０７１４】
レジスタ７０４に１行分の絶対値D705が積算された積算値（ｉ＝１からｉ＝dcまでのΣ|v'i|）が格納されると、上述したようにして、セレクタ７１７が出力するメッセージ（メッセージv'i）、すなわち、小FIFOメモリ７１６で遅延された１回目のメッセージD701、又は、メッセージメモリ１０４からの２回目のメッセージDD701の最上位ビットである符号ビットD712(sign(v'i))が、EXOR回路７１４に供給される。
【０７１５】
EXOR回路７１４は、レジスタ７０９から供給された新たな値D710と、セレクタ７１７が出力するメッセージ（v'i）の符号ビットD712との排他的論理和を演算することにより、値D710を、符号ビットD712で除算し、除算結果を除算値D720として、セレクタ７１５のc端子に供給する。すなわち、EXOR回路７１４は、検査行列の１行に亘る全ての枝からのメッセージD701の符号ビットD704の乗算値（ｉ＝１からｉ＝dcまでのΠsign(v'i)）を、求めたい枝からのメッセージv'iの符号ビットD712（ｉ＝dcのsign(v'i)）で除算して、その除算値（ｉ＝１からｉ＝dc-1までのΠsign(v'i)）を除算値D720として、セレクタ７１５のc端子に供給する。
【０７１６】
セレクタ７１５は、チェックノード演算時にはc端子を選択しており、そのc端子に供給される除算値D720（ｉ＝１からｉ＝dc-1までのΠsign(v'i)）を、符号ビットD721として出力する。
【０７１７】
そして、メッセージ計算部２２１では、以上のようにしてセレクタ７１５から出力された符号ビットD721（Πsign(v'i)）を、LUT７１３が出力する演算結果D719（φ-1(Σ|v'i|)）に符号ビットとして付加（乗算）することにより、式（１３）で表されるメッセージ（チェックノードメッセージ）ujを得て、メッセージD722として、出力ポートP722から出力する。
【０７１８】
以上のように、セレクタ７００，７０５，７１２、及び７１５がc端子を選択しているメッセージ計算部２２１では、式（１３）のチェックノード演算が行われ、その結果得られるメッセージujが、出力ポートP722から出力される。
【０７１９】
なお、図３５の復号装置では、復号の最終段において、式（１１）及び式（１２）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【０７２０】
以上のように、図３５の復号装置では、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ７１６（図３２）を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ３２０（図２２）を設ける場合に比較して、復号装置の規模を削減することができる。
【０７２１】
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合（記憶可能個数dより大でない場合）には、小FIFOメモリ７１６の出力を選択して、ノードの演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ３２０（図２２）を有する図２１の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図２１の復号装置と同様の回数だけ繰り返し復号を行うことができるので（１回の復号に要する時間が図２１の復号装置と同様となるので）、復号性能が劣化することを抑制することができる。
【０７２２】
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ１０４から同一のメッセージを２回読み出し、２回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
【０７２３】
以上から、図３５の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
【０７２４】
ここで、小FIFOメモリ７１６の記憶可能個数dが、例えば、３であり、復号の対象のLDPC符号を定義する検査行列が、例えば、図１に示した、各列の重みdvが３で、且つ、各行の重みが６の行列である場合には、記憶可能個数dである３が、検査行列の列の重みdvである３よりも小でなく、したがって、バリアブルノード演算時には、３個のメッセージD701が積算されるまでの間、小FIFOメモリ７１６において、その３個のメッセージD701すべてを遅延することができるから、セレクタ７１７では、端子fに供給される、小FIFOメモリ７１６で遅延された１回目のメッセージD701が選択される。
【０７２５】
また、この場合、記憶可能個数dである３が、検査行列の行の重みdcである６よりも小であり、したがって、チェックノード演算時には、記憶可能個数dである３よりも多い６個のメッセージD701（メッセージv'i）の絶対値|v'i|が積算されるまでの間、小FIFOメモリ７１６において、その６個のメッセージD701すべてを遅延することができないため、セレクタ７１７では、端子mに供給される、メッセージメモリ１０４からの２回目のメッセージDD701が選択される。
【０７２６】
なお、図３５の復号装置では、メッセージ計算部２２１において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部（演算器７０１、レジスタ７０２、セレクタ７０３、レジスタ７０４、演算器７１０、及びLUT７１３）が共有化されているので、その共有化の分だけ、復号装置の規模を、より削減することができる。
【０７２７】
また、図３５の復号装置のメッセージ計算部２２１では、ノードから出力された出力データxの絶対値|x|を引数として、同一の演算結果が得られる逆関数φ-1(x)と非線形関数φ(x)の演算をそれぞれ含む式（１２）と式（１３）をそれぞれ用いたバリアブルノード演算とチェックノード演算が行われる。
【０７２８】
したがって、メッセージ計算部２２１には、図３６に示したように、出力データxの絶対値|x|に対して、逆関数φ-1(x)と非線形関数φ(x)の演算を行うLUT７１３の１つだけあれば済み、図２６に示したLUT３００，３１０、及び３１４の３つのLUTを必要とするメッセージ計算部２０１、さらには、図３１に示したLUT６００及び６１０の２つのLUTを必要とするメッセージ計算部２１１よりも、規模を削減することができる。
【０７２９】
以上のように、図１７、図２５、図３０、及び図３５の復号装置では、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリ（図１８の小FIFOメモリ１６１、並びに図１９の小FIFOメモリ１４１及び１４３、図２６の小FIFOメモリ３１７、図３１の小FIFOメモリ６１６、図３６の小FIFOメモリ７１６）を設けるようにしたので、少なくとも、検査行列の重みの最大値と同一の数のメッセージを記憶する遅延メモリ（例えば、図９のFIFOメモリ１５５、並びに図１０のFIFOメモリ１２７及び１３３、図２２のFIFOメモリ３２０）を有する復号装置（図８、図２１）に比較して、復号装置の規模を削減することができる。
【０７３０】
また、遅延メモリを有しない復号装置（図１２）に比較して、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリ等の、少ない規模の増加によって、演算の効率を向上させること、つまり、少なくとも、検査行列の重みの最大値と同一の数のメッセージを記憶する遅延メモリを有する復号装置と同様の回数だけ繰り返し復号を行うことが可能となる。
【０７３１】
ここで、以上のように、復号装置に、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを設けることは、LDPC符号の符号長が長く、検査行列の行の重みに対して、列の重みが小である場合において、列の重みの最大値と同一の数（但し、行の重みの最大値より小の数）だけの遅延を行う遅延メモリを採用したときに、特に効果を発揮する。
【０７３２】
すなわち、この場合、バリアブルノード演算は、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリで遅延されたメッセージを用いて行われることになるので、検査行列の重みの最大値と同一の数のメッセージを記憶する遅延メモリを有する復号装置と同様の回数だけ繰り返し復号を行うことができ、復号性能が劣化することを、より抑制しつつ、復号装置の規模を、より削減することができる。
【０７３３】
また、複数のノードのメッセージを並列で求めるために、複数のメッセージ計算部を設けて、復号装置を構成する場合には、メッセージ計算部の数だけ、遅延メモリが必要となるから、そのような場合も、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを設けることによる、復号装置の規模の削減の効果は、大となる。
【０７３４】
なお、本実施の形態では、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリとして、３個のメッセージを記憶する遅延メモリ（例えば、図２６の小FIFOメモリ３１７等）を採用したが、遅延メモリは、３個のメッセージを記憶するメモリに限定されるものではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶するメモリであれば良い。
【０７３５】
また、メッセージメモリ１０４は、RAM#AとRAM#Bとの２バンクで構成することとしたが、メッセージメモリ１０４は、３以上のRAMで３バンク以上に構成することが可能である。
【０７３６】
次に、制御部２０２（図２５）等が行う図１５に示したメッセージメモリ１０４に対する読み書き制御の処理、及び図２０に示したセレクタ制御の処理は、専用のハードウェアにより行うこともできるし、ソフトウェアにより行うこともできる。一連の処理をソフトウェアによって行う場合には、そのソフトウェアを構成するプログラムが、マイクロコンピュータ（いわゆるマイコン）等のコンピュータにインストールされる。
【０７３７】
そこで、図４０は、上述した一連の処理を実行するプログラムがインストールされるコンピュータの一実施の形態の構成例を示している。
【０７３８】
プログラムは、コンピュータに内蔵されている記録媒体としての不揮発性メモリ９０５やROM９０３に予め記録しておくことができる。
【０７３９】
あるいはまた、プログラムは、フレキシブルディスク、CD-ROM(Compact Disc Read Only Memory)，MO(Magneto Optical)ディスク，DVD(Digital Versatile Disc)、磁気ディスク、半導体メモリなどのリムーバブル記録媒体に、一時的あるいは永続的に格納（記録）しておくことができる。
【０７４０】
なお、プログラムは、上述したようなリムーバブル記録媒体から、あるいはネットワークを経由してコンピュータにインストールすることができる。
【０７４１】
コンピュータは、CPU(Central Processing Unit)９０２を内蔵している。CPU９０２には、バス９０１を介して、入出力インタフェース９０６が接続されており、CPU９０２は、ROM(Read Only Memory)９０３や不揮発性メモリ９０５にインストールされたプログラムを、RAM(Random Access Memory)９０４にロードして実行する。これにより、CPU９０２は、入出力インタフェース９０６を介して、メッセージメモリ１０４に対する読み書き制御（図１５）や、セレクタ制御（図２０）を行う。
【０７４２】
ここで、本明細書において、コンピュータに各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいは個別に実行される処理（例えば、並列処理あるいはオブジェクトによる処理）も含むものである。
【０７４３】
また、プログラムは、１のコンピュータにより処理されるものであっても良いし、複数のコンピュータによって分散処理されるものであっても良い。
【０７４４】
なお、本発明の実施の形態は、上述した実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲において種々の変更が可能である。
【図面の簡単な説明】
【０７４５】
【図１】LDPC符号の検査行列Hを説明する図である。
【図２】LDPC符号の復号手順を説明するフローチャートである。
【図３】メッセージの流れを説明する図である。
【図４】LDPC符号の検査行列の例を示す図である。
【図５】検査行列のタナーグラフを示す図である。
【図６】バリアブルノードを示す図である。
【図７】チェックノードを示す図である。
【図８】従来の復号装置の一例の構成を示すブロック図である。
【図９】メッセージを１つずつ計算するバリアブルノード計算器１０２の構成例を示すブロック図である。
【図１０】メッセージを１つずつ計算するチェックノード計算器１０３の構成例を示すブロック図である。
【図１１】メッセージメモリ１０４に対するメッセージの読み書きの従来のタイミングを示すタイミングチャートである。
【図１２】メッセージを遅延するための遅延メモリを有しない復号装置の構成例を示すブロック図である。
【図１３】バリアブルノード計算器１７２の構成例を示すブロック図である。
【図１４】チェックノード計算器１７３の構成例を示すブロック図である。
【図１５】メッセージメモリ１０４に対する読み書き制御の処理を説明するフローチャートである。
【図１６】メッセージメモリ１０４に対するメッセージの読み書きのタイミングを示すタイミングチャートである。
【図１７】本発明を適用した復号装置の第１実施の形態の構成例を示すブロック図である。
【図１８】バリアブルノード計算器１８２の構成例を示すブロック図である。
【図１９】チェックノード計算器１８３の構成例を示すブロック図である。
【図２０】セレクタ制御の処理を説明するフローチャートである。
【図２１】バリアブルノード演算を行う回路とチェックノード演算を行う回路との一部が共有化された復号装置の構成例を示すブロック図である。
【図２２】メッセージ計算部１９１の構成例を示すブロック図である。
【図２３】バリアブルノード演算時のメッセージ計算部１９１の実質的な構成を示すブロック図である。
【図２４】チェックノード演算時のメッセージ計算部１９１の実質的な構成を示すブロック図である。
【図２５】本発明を適用した復号装置の第２実施の形態の構成例を示すブロック図である。
【図２６】メッセージ計算部２０１の構成例を示すブロック図である。
【図２７】メッセージ計算部２０１が行うバリアブルノード演算とチェックノード演算を説明する図である。
【図２８】バリアブルノード演算時のメッセージ計算部２０１の実質的な構成を示すブロック図である。
【図２９】チェックノード演算時のメッセージ計算部２０１の実質的な構成を示すブロック図である。
【図３０】本発明を適用した復号装置の第３実施の形態の構成例を示すブロック図である。
【図３１】メッセージ計算部２１１の構成例を示すブロック図である。
【図３２】メッセージ計算部２１１が行うバリアブルノード演算とチェックノード演算を説明する図である。
【図３３】バリアブルノード演算時のメッセージ計算部２１１の実質的な構成を示すブロック図である。
【図３４】チェックノード演算時のメッセージ計算部２１１の実質的な構成を示すブロック図である。
【図３５】本発明を適用した復号装置の第４実施の形態の構成例を示すブロック図である。
【図３６】メッセージ計算部２２１の構成例を示すブロック図である。
【図３７】メッセージ計算部２２１が行うバリアブルノード演算とチェックノード演算を説明する図である。
【図３８】バリアブルノード演算時のメッセージ計算部２２１の実質的な構成を示すブロック図である。
【図３９】チェックノード演算時のメッセージ計算部２２１の実質的な構成を示すブロック図である。
【図４０】本発明を適用したコンピュータの一実施の形態の構成例を示すブロック図である。
【符号の説明】
【０７４６】
１０４  メッセージメモリ，  １０５  受信データメモリ，  １２１  LUT，  １２２
演算器，  １２３  レジスタ，  １２４  セレクタ，  １２５  レジスタ，  １２６  演算器，  １２８  LUT，  １２９  EXOR回路，  １３０  レジスタ，  １３１  セレクタ，  １３２  レジスタ，  １３４  EXOR回路，  １３５  LUT，  １４１  小FIFOメモリ，  １４２  セレクタ，  １４３  小FIFOメモリ，  １４４  セレクタ，  １５１  演算器，  １５２  レジスタ，  １５３  セレクタ，  １５４  レジスタ，  １５６，１５７  演算器，  １６１  小FIFOメモリ，  １６２  セレクタ，  １７１  メッセージ計算部，  １７２  バリアブルノード計算器，  １７３  チェックノード計算器，  １７４  制御部，  １８１  メッセージ計算部１８１，  １８２  バリアブルノード計算器，  １８３  チェックノード計算器，  １８４  制御部，  １９１  メッセージ計算部，  １９２  制御部，  ２０１  メッセージ計算部，  ２０２  制御部，  ２１１  メッセージ計算部，  ２１２  制御部，  ２２１  メッセージ計算部，  ２２２  制御部，  ２３１  メッセージ計算部，  ２３２  制御部，  ３００  LUT，  ３０１  セレクタ，  ３０２  演算器，  ３０３  レジスタ，  ３０４  セレクタ，  ３０５  レジスタ，  ３０６  EXOR回路，  ３０７  レジスタ，  ３０８  セレクタ，  ３０９  レジスタ，  ３１０  LUT，  ３１１  セレクタ，  ３１２，３１３  演算器，  ３１４  LUT，  ３１５  EXOR回路，  ３１６  セレクタ，  ３１７  小FIFOメモリ，  ３１８  セレクタ，  ３２０  FIFOメモリ，  ６００  LUT，  ６０１  セレクタ，  ６０２  演算器，  ６０３  レジスタ，  ６０４  セレクタ，  ６０５  レジスタ，  ６０６  EXOR回路，  ６０７  レジスタ，  ６０８  セレクタ，  ６０９  レジスタ，  ６１０  LUT，  ６１１  セレクタ，  ６１２，６１３  演算器，  ６１４  EXOR回路，  ６１５  セレクタ，  ６１６  小FIFOメモリ，  ６１７，７００  セレクタ，  ７０１  演算器，  ７０２  レジスタ，  ７０３  セレクタ，  ７０４  レジスタ，  ７０５  セレクタ，  ７０６  EXOR回路，  ７０７  レジスタ，  ７０８  セレクタ，  ７０９  レジスタ，  ７１０，７１１  演算器，  ７１２  セレクタ，  ７１３  LUT，  ７１４  EXOR回路，  ７１５  セレクタ，  ７１６  小FIFOメモリ，  ７１７  セレクタ，  ９０１  バス，  ９０２  CPU，  ９０３  ROM，  ９０４  RAM，  ９０５  不揮発性メモリ，  ９０６  入出力インタフェース
【図１】
2008278187.tif 000016
【図２】
2008278187.tif 000017
【図３】
2008278187.tif 000018
【図４】
2008278187.tif 000019
【図５】
2008278187.tif 000020
【図６】
2008278187.tif 000021
【図７】
2008278187.tif 000022
【図８】
2008278187.tif 000023
【図９】
2008278187.tif 000024
【図１０】
2008278187.tif 000025
【図１１】
2008278187.tif 000026
【図１２】
2008278187.tif 000027
【図１３】
2008278187.tif 000028
【図１４】
2008278187.tif 000029
【図１５】
2008278187.tif 000030
【図１６】
2008278187.tif 000031
【図１７】
2008278187.tif 000032
【図１８】
2008278187.tif 000033
【図１９】
2008278187.tif 000034
【図２０】
2008278187.tif 000035
【図２１】
2008278187.tif 000036
【図２２】
2008278187.tif 000037
【図２３】
2008278187.tif 000038
【図２４】
2008278187.tif 000039
【図２５】
2008278187.tif 000040
【図２６】
2008278187.tif 000041
【図２７】
2008278187.tif 000042
【図２８】
2008278187.tif 000043
【図２９】
2008278187.tif 000044
【図３０】
2008278187.tif 000045
【図３１】
2008278187.tif 000046
【図３２】
2008278187.tif 000047
【図３３】
2008278187.tif 000048
【図３４】
2008278187.tif 000049
【図３５】
2008278187.tif 000050
【図３６】
2008278187.tif 000051
【図３７】
2008278187.tif 000052
【図３８】
2008278187.tif 000053
【図３９】
2008278187.tif 000054
【図４０】
2008278187.tif 000055