(57)【要約】【課題】  復号装置の回路規模を小さくする。【解決手段】  制御部３５５は、LDPC符号の復号のためのチェックノードの演算、またはLDPC符号の復号のためのバリアブルノードの演算のうちの一方を選択し、その選択を表す選択信号D361を、ノード計算器３５４に供給する。ノード計算器３５４は、制御部３５５により選択されたチェックノード演算またはバリアブルノード演算を行い、その演算結果を枝用メモリ３５１または枝用メモリ３５２に格納する。本発明は、LDPC符号を復号する復号装置に適用することができる。【選択図】図１７
2005065066.tif 000002
【特許請求の範囲】
【請求項１】
LDPC(Low Density Parity Check)符号を復号する復号装置であって、
前記LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択手段と、
前記選択手段により選択された前記チェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算手段と、
前記ノード計算手段により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替え手段と
を備えることを特徴とする復号装置。
【請求項２】
請求項１に記載の復号装置であって、
前記LDPC符号の検査行列は、P×Pの単位行列、その単位行列のコンポーネントである１のうちの１個以上が０になった行列である準単位行列、前記単位行列もしくは前記準単位行列をサイクリックシフトした行列であるシフト行列、前記単位行列、前記準単位行列もしくは前記シフト行列のうちの複数の和である和行列、またはP×Pの０行列を構成行列として、複数の前記構成行列の組み合わせで表される
ことを特徴とする復号装置。
【請求項３】
請求項１に記載の復号装置であって、
前記ノード計算手段による前記チェックノードの演算、または前記バリアブルノードの演算の結果得られるメッセージを記憶する記憶手段をさらに備え、
前記ノード計算手段は、前記記憶手段に記憶されるメッセージを用いて、前記チェックノード演算、または前記バリアブルノード演算を行う
ことを特徴とする復号装置。
【請求項４】
請求項１に記載の復号装置であって、
前記並べ替え手段は、サイクリックシフト回路である
ことを特徴とする復号装置。
【請求項５】
請求項４に記載の復号装置であって、
前記並べ替え手段は、バレルシフタである
ことを特徴とする復号装置。
【請求項６】
請求項１に記載の復号装置であって、
前記ノード計算手段は、前記チェックノードの演算を行うチェックノード計算手段と、前記バリアブルノードの演算を行うバリアブルノード計算手段における加算を行う回路が共有化されて構成される
ことを特徴とする復号装置。
【請求項７】
LDPC(Low Density Parity Check)符号を復号する復号装置の復号方法であって、
前記LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択ステップと、
前記選択ステップの処理により選択された前記チェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算ステップと、
前記ノード計算ステップの処理により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替えステップと
を含むことを特徴とする復号方法。
【請求項８】
LDPC(Low Density Parity Check)符号の復号をコンピュータに行わせるプログラムであって、
前記LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択ステップと、
前記選択ステップの処理により選択された前記チェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算ステップと、
前記ノード計算ステップの処理により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替えステップと
を備えることを特徴とするプログラム。
【請求項９】
LDPC(Low Density Parity Check)符号を復号する復号装置であって、
所定の値に対して、逆関数と一致する所定の関数を用いて前記所定の値を変換した値を記憶する記憶手段と、
前記LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値を求めるとともに、前記検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値を求める復号途中結果積算手段と、
前記復号途中結果積算手段により求められた前記第１の積算値と前記LDPC符号とを加算して加算値を求める加算手段と、
前記加算手段により求められた前記加算値から、前記検査行列の各行の１のうちの所定の１に対応する前記第１の復号途中結果を減算して、第１の減算値を求めるともに、前記復号途中結果積算手段により積算された第２の積算値から、前記検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の絶対値を減算して、第２の減算値を求める減算手段と、
前記記憶手段から、前記減算手段により求められた前記第１の減算値の絶対値に対して、前記所定の関数を用いて前記第１の減算値の絶対値を変換した値を読み出し、第１の変換値として出力するとともに、前記第２の減算値に対して、前記所定の関数の逆関数を用いて前記第２の減算値を変換した値を読み出し、前記第２の変換値として出力する出力手段と、
前記検査行列の各列の１に対応する前記第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の符号ビット以外のすべての前記第２の復号途中結果の符号ビットを乗算して、符号乗算値を求める乗算手段と
を備え、
前記乗算手段により求められた前記符号乗算値と、前記出力手段により出力された前記第２の変換値とを乗算した第１の乗算値が、前記第１の復号途中結果として出力されるとともに、前記減算手段により求められた前記第１の減算値の符号ビットと、前記出力手段により出力された前記第１の変換値とを乗算した第２の乗算値が、前記第２の復号途中結果として出力される
ことを特徴とする復号装置。
【請求項１０】
LDPC(Low Density Parity Check)符号を復号する復号装置の復号方法であって、
前記LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値を求めるとともに、前記検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値を求める復号途中結果積算ステップと、
前記復号途中結果積算ステップの処理により求められた前記第１の積算値と前記LDPC符号とを加算して加算値を求める加算ステップと、
前記加算ステップの処理により求められた前記加算値から、前記検査行列の各行の１のうちの所定の１に対応する前記第１の復号途中結果を減算して、第１の減算値を求めるともに、前記復号途中結果積算ステップの処理により積算された第２の積算値から、前記検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の絶対値を減算して、第２の減算値を求める減算ステップと、
所定の値に対して、逆関数と一致する所定の関数を用いて前記所定の値を変換した値を記憶する記憶手段から、前記減算ステップの処理により求められた前記第１の減算値の絶対値に対して、前記所定の関数を用いて前記第１の減算値の絶対値を変換した値を読み出し、第１の変換値として出力するとともに、前記第２の減算値に対して、前記所定の関数の逆関数を用いて前記第２の減算値を変換した値を読み出し、前記第２の変換値として出力する出力ステップと、
前記検査行列の各列の１に対応する前記第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の符号ビット以外のすべての前記第２の復号途中結果の符号ビットを乗算して、符号乗算値を求める乗算ステップと
を含み、
前記乗算ステップの処理により求められた前記符号乗算値と、前記出力ステップの処理により出力された前記第２の変換値とを乗算した第１の乗算値が、前記第１の復号途中結果として出力されるとともに、前記減算ステップの処理により求められた前記第１の減算値の符号ビットと、前記出力ステップの処理により出力された前記第１の変換値とを乗算した第２の乗算値が、前記第２の復号途中結果として出力される
ことを特徴とする復号方法。
【請求項１１】
LDPC(Low Density Parity Check)符号の復号をコンピュータに行わせるプログラムであって、
前記LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値を求めるとともに、前記検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値を求める復号途中結果積算ステップと、
前記復号途中結果積算ステップの処理により求められた前記第１の積算値と前記LDPC符号とを加算して加算値を求める加算ステップと、
前記加算ステップの処理により求められた前記加算値から、前記検査行列の各行の１のうちの所定の１に対応する前記第１の復号途中結果を減算して、第１の減算値を求めるともに、前記復号途中結果積算ステップの処理により積算された第２の積算値から、前記検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の絶対値を減算して、第２の減算値を求める減算ステップと、
所定の値に対して、逆関数と一致する所定の関数を用いて前記所定の値を変換した値を記憶する記憶手段から、前記減算ステップの処理により求められた前記第１の減算値の絶対値に対して、前記所定の関数を用いて前記第１の減算値の絶対値を変換した値を読み出し、第１の変換値として出力するとともに、前記第２の減算値に対して、前記所定の関数の逆関数を用いて前記第２の減算値を変換した値を読み出し、前記第２の変換値として出力する出力ステップと、
前記検査行列の各列の１に対応する前記第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の符号ビット以外のすべての前記第２の復号途中結果の符号ビットを乗算して、符号乗算値を求める乗算ステップと
を含み、
前記乗算ステップの処理により求められた前記符号乗算値と、前記出力ステップの処理により出力された前記第２の変換値とを乗算した第１の乗算値が、前記第１の復号途中結果として出力されるとともに、前記減算ステップの処理により求められた前記第１の減算値の符号ビットと、前記出力ステップの処理により出力された前記第１の変換値とを乗算した第２の乗算値が、前記第２の復号途中結果として出力される
ことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、復号装置および復号方法、並びにプログラムに関し、特に、低密度パリティ検査符号による符号化が施された符号の復号を行う復号装置および復号方法、並びにプログラムに関する。
【背景技術】
【０００２】
近年、例えば、移動体通信や深宇宙通信といった通信分野、及び地上波又は衛星ディジタル放送といった放送分野の研究が著しく進められているが、それに伴い、誤り訂正符号化及び復号の効率化を目的として符号理論に関する研究も盛んに行われている。
【０００３】
符号性能の理論的限界としては、いわゆるシャノン(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で表すものとすると、そのような検査行列としては、例えば、図１に示すように、各列のハミング重み（"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符号の復号は、一般的には、図２に示すような手順にしたがって行われる。なお、ここでは、受信値をU0(u0i)とし、チェックノードから出力されるメッセージをujとし、バリアブルノードから出力されるメッセージをviとする。また、ここでは、メッセージとは、値の"0"らしさを、いわゆる対数尤度比(log likelihood ratio)で表現した実数値である。
【００１３】
まず、LDPC符号の復号においては、図２に示すように、ステップＳ１１において、受信値U0(u0i)が受信され、メッセージujが"0"に初期化されるとともに、繰り返し処理のカウンタとしての整数をとる変数kが"0"に初期化され、ステップＳ１２に進む。ステップＳ１２において、受信値U0(u0i)に基づいて、式（１）に示す演算を行うことによってメッセージviが求められ、さらに、このメッセージviに基づいて、式（２）に示す演算を行うことによってメッセージujが求められる。
【００１４】
【数１】
2005065066.tif 000003
・・・（１）
【００１５】
【数２】
2005065066.tif 000004
・・・（２）
【００１６】
ここで、式（１）と式（２）におけるdvとdcは、それぞれ、検査行列Hの縦方向（列）と横方向（行）の"1"の個数を示す任意に選択可能とされるパラメータであり、例えば、(3,6)符号の場合には、dv=3，dc=6となる。
【００１７】
なお、式（１）または（２）の演算においては、それぞれ、メッセージを出力しようとする枝(edge)から入力されたメッセージを、和または積演算のパラメータとしては用いないことから、和または積演算の範囲が、１乃至dv-1または１乃至dc-1となっている。また、式（２）に示す演算は、実際には、２入力v1，v2に対する１出力で定義される式（３）に示す関数R(v1,v2)のテーブルを予め作成しておき、これを式（４）に示すように連続的（再帰的）に用いることによって行われる。
【００１８】
【数３】
2005065066.tif 000005
・・・（３）
【００１９】
【数４】
2005065066.tif 000006
・・・（４）
【００２０】
ステップＳ１２では、さらに、変数kが"1"だけインクリメントされ、ステップＳ１３に進む。ステップＳ１３では、変数kが所定の繰り返し復号回数N以上であるか否かが判定される。ステップＳ１３において、変数kがN以上ではないと判定された場合、ステップＳ１２に戻り、以下、同様の処理が繰り返される。
【００２１】
また、ステップＳ１３において、変数kがN以上であると判定された場合、ステップＳ１４に進み、式（５）に示す演算を行うことによって最終的に出力する復号結果としてのメッセージvが求められて出力され、LDPC符号の復号処理が終了する。
【００２２】
【数５】
2005065066.tif 000007
・・・（５）
【００２３】
ここで、式（５）の演算は、式（１）の演算とは異なり、バリアブルノードに接続している全ての枝からの入力メッセージを用いて行われる。
【００２４】
このようなLDPC符号の復号は、例えば(3,6)符号の場合には、図３に示すように、各ノード間でメッセージの授受が行われる。なお、図３における"="で示すノード（バリアブルノード）では、式（１）に示した演算が行われ、"+"で示すノード（チェックノード）では、式（２）に示した演算が行われる。特に、アルゴリズムＡにおいては、メッセージを２元化し、"+"で示すノードにて、dc-1個の入力メッセージの排他的論理和演算を行い、"="で示すノードにて、受信値Rに対して、dv-1個の入力メッセージが全て異なるビット値であった場合には、符号を反転して出力する。
【００２５】
また、一方で、近年、LDPC符号の復号の実装法に関する研究も行われている。実装方法について述べる前に、まず、LDPC符号の復号を摸式化して説明する。
【００２６】
図４は、(3,6)LDPC符号（符号化率1/2、符号長12）の検査行列(parity check matrix)の例である。LDPC符号の検査行列は、図５のように、タナーグラフを用いて書き表すことができる。ここで、図５において、"+"で表わされるのが、チェックノードであり、"="で表わされるのが、バリアブルノードである。チェックノードとバリアブルノードは、それぞれ、検査行列の行と列に対応する。チェックノードとバリアブルノードとの間の結線は、枝(edge)であり、検査行列の"1"に相当する。即ち、検査行列の第ｊ行第ｉ列のコンポーネントが１である場合には、図５において、上からｉ番目のバリアブルノード（"="のノード）と、上からｊ番目のチェックノード（"+"のノード）とが、枝により接続される。枝は、バリアブルノードに対応する符号ビットが、チェックノードに対応する拘束条件を持つことを表わす。なお、図５は、図４の検査行列のタナーグラフとなっている。
【００２７】
LDPC符号の復号方法であるサムプロダクトアルゴリズム(Sum Product Algorithm)は、バリアブルノードの演算とチェックノードの演算とを繰り返し行う。
【００２８】
バリアブルノードでは、図６のように、式（１）の演算を行う。すなわち、図６において、計算しようとしている枝に対応するメッセージviは、バリアブルノードに繋がっている残りの枝からのメッセージu1およびu2と、受信情報u0iを用いて計算される。他の枝に対応するメッセージも同様に計算される。
【００２９】
チェックノードの演算について説明する前に、式（２）を、式a×b=exp{ln(|a|)+ln(|b|)}×sign(a)×sign(b)の関係を用いて、式（６）のように書き直す。但し、sign(x)は、x≧0のとき1であり、x＜0のとき-1である。
【００３０】
【数６】
2005065066.tif 000008
・・・（６）
【００３１】
更に、x≧0において、φ(x)=ln(tanh(x/2))と定義すると、φ-1(x)=2tanh-1(e-x)であるから、式（６）は、式（７）のように書くことができる。
【００３２】
【数７】
2005065066.tif 000009
・・・（７）
【００３３】
チェックノードでは、図７のように、式（７）の演算を行う。すなわち、図７において、計算しようとしている枝に対応するメッセージujは、チェックノードに繋がっている残りの枝からのメッセージv1,v2,v3,v4,v5を用いて計算される。他の枝に対応するメッセージも同様に計算される。
【００３４】
なお、関数φ(x)は、φ(x)=ln((ex+1)/(ex-1))とも表すことができ、x＞0において、φ(x)=φ-1(x)である。関数φ(x)およびφ-1(x)をハードウェアに実装する際には、LUT(Look Up Table)を用いて実装される場合があるが、両者共に同一のLUTとなる。
【００３５】
サムプロダクトアルゴリズムをハードウェアに実装する場合、式（１）で表わされるバリアブルノード演算および式（７）で表わされるチェックノード演算とを、適度な回路規模と動作周波数で繰り返し行うことが必要である。
【００３６】
復号装置の実装の例として、まず、単純に各ノードの演算を一つずつ順次行うことによって復号を行う場合(full serial decoding)の実装法について説明する。
【００３７】
なお、ここでは、例えば、図８の、３０（行）×９０（列）の検査行列で表現される符号（符号化率2/3、符号長90）を復号することとする。図８の検査行列の１の数は２６９であり、従って、そのタナーグラフでは、枝の数は２６９個となる。ここで、図８の検査行列では、０を、"."で表現している。
【００３８】
図９は、LDPC符号の１回復号を行う復号装置の構成例を示している。
【００３９】
図９の復号装置では、その動作する１クロック(clock)ごとに、１つの枝に対応するメッセージが計算される。
【００４０】
即ち、図９の復号装置は、２つの枝用メモリ１００および１０２、１つのチェックノード計算器１０１、１つのバリアブルノード計算器１０３、１つの受信用メモリ１０４、１つの制御部１０５からなる。
【００４１】
図９の復号装置では、枝用メモリ１００または１０２からメッセージデータが１つずつ読み出され、そのメッセージデータを用いて、所望の枝に対応するメッセージデータが計算される。そして、その計算によって求められたメッセージデータが１つずつ後段の枝用メモリ１０２または１００に格納されていく。繰り返し復号を行う際には、この１回復号を行う図９の復号装置を複数個縦列に連接するか、もしくは図９の復号装置を繰り返し用いることによって、繰り返し復号を実現する。なお、ここでは、例えば、図９の復号装置が複数個接続されているものとする。
【００４２】
枝用メモリ１００は、前段の復号装置（図示せず）のバリアブルノード計算器１０３から供給されるメッセージD100を、後段のチェックノード計算器１０１が読み出す順番に格納していく。そして、枝用メモリ１００は、チェックノード計算のフェーズでは、メッセージD100を、格納してある順番通りに、メッセージD101として、チェックノード計算器１０１に供給する。
【００４３】
チェックノード計算器１０１は、制御部１０５から供給される制御信号D106に基づき、枝用メモリ１００から供給されるメッセージD101を用いて、式（７）に従って演算を行い、その演算によって求められたメッセージD102を、後段の枝用メモリ１０２に供給する。
【００４４】
枝用メモリ１０２は、前段のチェックノード計算器１０１から供給されるメッセージD102を、後段のバリアブルノード計算器１０３が読み出す順番に格納していく。そして、枝用メモリ１０２は、バリアブルノード計算のフェーズでは、メッセージD102を、格納してある順番通りに、メッセージD103として、バリアブルノード計算器１０３に供給する。
【００４５】
さらに、バリアブルノード計算器１０３には、制御部１０５から制御信号D107が供給されるとともに、受信用メモリ１０４から受信データD104が供給される。バリアブルノード計算器１０３は、制御信号D107に基づき、枝用メモリ１００から供給されるメッセージD103と受信用メモリ１００から供給される受信データD104を用い、式（１）に従って演算を行い、その演算の結果得られるメッセージD105を、図示せぬ後段の復号装置の枝用メモリ１００に供給する。
【００４６】
受信用メモリ１０４には、LDPC符号化された受信データ（LDPC符号）が格納される。制御部１０５は、バリアブルノード演算を制御する制御信号D106と、チェックノード演算を制御する制御信号D107を、それぞれチェックノード計算器１０１とバリアブルノード計算器１０３に供給する。制御部１０５は、枝用メモリ１００に全ての枝のメッセージが格納されたとき、チェックノード計算器１０１に制御信号D106を供給し、枝用メモリ１０２に全ての枝のメッセーが格納されたとき、バリアブルノード計算器１０３に制御信号D107を供給する。
【００４７】
図１０は、チェックノード演算を１つずつ行う図９のチェックノード計算器１０１の構成例を示している。
【００４８】
なお、図１０では、各メッセージが符号ビットを合わせて合計６ビット(bit)に量子化されているものとして、チェックノード計算器１０１を表している。また、図１０では、図８の検査行列で表わされるLDPC符号のチェックノード演算が行われる。さらに、図１０のチェックノード演算器１０１には、クロックｃｋが供給され、このクロックｃｋは、必要なブロックに供給されるようになっている。そして、各ブロックは、クロックｃｋに同期して処理を行う。
【００４９】
図１０のチェックノード計算器１０１は、制御部１０５から供給される、例えば、1ビットの制御信号D106に基づき、枝用メモリ１００から１つずつ読み込まれるメッセージD101を用いて、式（７）にしたがって演算を行う。
【００５０】
即ち、チェックノード計算器１０１では、検査行列の各列に対応するバリアブルノードからの６ビットのメッセージD101（メッセージvi）が１つずつ読み込まれ、その下位ビットである絶対値D122(|vi|)がLUT１２１に、その最上位ビットである符号ビットD121がEXOR回路１２９とFIFO(First In First Out)メモリ１３３にそれぞれ供給される。また、チェックノード計算器１０１には、制御部１０５から制御信号D106が供給され、その制御信号D106は、セレクタ１２４とセレクタ１３１に供給される。
【００５１】
LUT１２１は、絶対値D122(|vi|)に対して、式（７）におけるφ(|vi|)の演算を行った５ビットの演算結果D123（φ(|vi|)）を読み出し、加算器１２２とFIFOメモリ１２７に供給する。
【００５２】
加算器１２２は、演算結果D123（φ(|vi|)）とレジスタ１２３に格納されている９ビットの値D124とを加算することにより、演算結果D123を積算し、その結果得られる９ビットの積算値をレジスタ１２３に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD101の絶対値D122(|vi|)に対する演算結果が積算された場合、レジスタ１２３はリセットされる。
【００５３】
検査行列の1行に亘るメッセージD101が１つずつ読み込まれ、レジスタ１２３に1行分の演算結果D123が積算された積算値が格納された場合、制御部１０５から供給される制御信号D106は、０から１に変化する。例えば、行の重み（row weight）が「９」である場合、制御信号D106は、１から８クロック目までは、「０」となり、９クロック目では「１」となる。
【００５４】
制御信号D106が「１」の場合、セレクタ１２４は、レジスタ１２３に格納されている値、即ち、検査行列の１行に亘る全ての枝からのメッセージD101（メッセージvi）から求められたφ(|vi|)が積算された９ビットの値D124（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）を選択し、値D125として、レジスタ１２５に出力して格納させる。レジスタ１２５は、格納している値D125を、９ビットの値D126として、セレクタ１２４と加算器１２６に供給する。制御信号D106が「０」の場合、セレクタ１２４は、レジスタ１２５から供給された値D126を選択し、レジスタ１２５に出力して再格納させる。即ち、検査行列の１行に亘る全ての枝からのメッセージD101（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１２５は、前回積算されたφ(|vi|)を、セレクタ１２４と加算器１２６に供給する。
【００５５】
一方、FIFOメモリ１２７は、レジスタ１２５から新たな値D126（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）が出力されるまでの間、LUT１２１が出力した演算結果D123（φ(|vi|)）を遅延し、５ビットの値D127として減算器１２６に供給する。減算器１２６は、レジスタ１２５から供給された値D126から、FIFOメモリ１２７から供給された値D127を減算し、その減算結果を、５ビットの減算値D128としてLUT１２８に供給する。即ち、減算器１２６は、検査行列の1行に亘る全ての枝からのメッセージD101（メッセージvi）から求められたφ(|vi|)の積算値から、求めたい枝からのメッセージD101（メッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を減算値D128としてLUT１２８に供給する。
【００５６】
LUT１２８は、減算値D128（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）に対して、式（７）におけるφ-1（Σφ(|vi|)）の演算を行った５ビットの演算結果D129（φ-1(Σφ(|vi|)))を出力する。
【００５７】
以上の処理と並行して、EXOR回路１２９は、レジスタ１３０に格納されている１ビットの値D131と符号ビットD121との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、１ビットの乗算結果D130をレジスタ１３０に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD101の符号ビットD121が乗算された場合、レジスタ１３０はリセットされる。
【００５８】
検査行列の1行に亘る全ての枝からのメッセージD101の符号ビットD121が乗算された乗算結果D130（ｉ＝１からｄcまでのΠsign(vi)）がレジスタ１３０に格納された場合、制御部１０５から供給される制御信号D106は、「０」から「１」に変化する。
【００５９】
制御信号D106が「１」の場合、セレクタ１３１は、レジスタ１３０に格納されている値、即ち、検査行列の１行に亘る全ての枝からのメッセージD101の符号ビットD121が乗算された値D131（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）を選択し、１ビットの値D132としてレジスタ１３２に出力して格納させる。レジスタ１３２は、格納している値D132を、１ビットの値D133としてセレクタ１３１とEXOR回路１３４に供給する。制御信号D106が「０」の場合、セレクタ１３１は、レジスタ１３２から供給された値D133を選択し、レジスタ１３２に出力して再格納させる。即ち、検査行列の１行に亘る全ての枝からのメッセージD101（メッセージvi）の符号ビットD121が乗算されるまで、レジスタ１３２は、前回格納した値を、セレクタ１３１とEXOR回路１３４に供給する。
【００６０】
一方、FIFOメモリ１３３は、レジスタ１３２から新たな値D133（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）がEXOR回路１３４に供給されるまでの間、符号ビットD121を遅延し、１ビットの値D134としてEXOR回路１３４に供給する。EXOR回路１３４は、レジスタ１３２から供給された値D133と、FIFOメモリ１３３から供給された値D134との排他的論理和を演算することにより、値D133を、値D134で除算し、１ビットの除算結果を除算値D135として出力する。即ち、EXOR回路１３４は、検査行列の１行に亘る全ての枝からのメッセージD101の符号ビットD121（sign(|vi|)）の乗算値を、求めたい枝からのメッセージD101の符号ビットD121（sign(|vi|)）で除算して、その除算値（ｉ＝１からｉ＝ｄc−１までのΠsign(|vi|)）を除算値D135として出力する。
【００６１】
チェックノード計算器１０１では、LUT１２８から出力された５ビットの演算結果D129を下位５ビットとするとともに、EXOR回路１３４から出力された１ビットの除算値D135を最上位ビットとする合計６ビットがメッセージD102（メッセージuj）として出力される。
【００６２】
以上のように、チェックノード計算器１０１では、式（７）の演算が行われ、メッセージujが求められる。
【００６３】
なお、図８の検査行列の行の重みの最大は９であるため、即ち、チェックノードに供給されるメッセージの最大数は９であるため、チェックノード計算器１０１は、９個のメッセージ（φ(|vi|)）を遅延させるFIFOメモリ１２７とFIFOメモリ１３３を有している。行の重みが９未満の行のメッセージを計算するときには、FIFOメモリ１２７とFIFOメモリ１３３における遅延量が、その行の重みの値に減らされる。
【００６４】
図１１は、バリアブルノード演算を１つずつ行う図９のバリアブルノード計算器１０３の構成例を示している。
【００６５】
なお、図１１では、各メッセージが符号ビットを合わせて合計６ビット(bit)に量子化されているものとして、バリアブルノード計算器１０３を表している。また、図１１では、図８の検査行列で表わされるLDPC符号のバリアブルノード演算が行われる。さらに、図１１のバリアブルノード計算機１０３には、クロックｃｋが供給され、クロックｃｋは、必要なブロックに供給されるようになっている。そして、各ブロックは、クロックｃｋに同期して処理を行う。
【００６６】
図１１のバリアブルノード計算器１０３は、制御部１０５から供給される、例えば、１ビットの制御信号D107に基づき、枝用メモリ１０２から１つずつ読み込まれるメッセージD103と、受信用メモリ１０４から読み込まれる受信データD104を用いて、式（１）にしたがって演算を行う。
【００６７】
即ち、バリアブルノード計算器１０３では、検査行列の各行に対応するチェックノードからの６ビットのメッセージD103（メッセージuj）が１つずつ読み込まれ、そのメッセージD103が、加算器１５１とFIFOメモリ１５５に供給される。また、バリアブルノード計算器１０３では、受信用メモリ１０４から６ビットの受信データD104が1つずつ読み込まれ、加算器１５６に供給される。さらに、バリアブルノード計算器１０３には、制御部１０５から制御信号D107が供給され、その制御信号D107は、セレクタ１５３に供給される。
【００６８】
加算器１５１は、メッセージD103（メッセージuj）とレジスタ１５２に格納されている９ビットの値D151とを加算することにより、メッセージD103を積算し、その結果得られる９ビットの積算値を、レジスタ１５２に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD103が積算された場合、レジスタ１５２はリセットされる。
【００６９】
検査行列の1列に亘るメッセージD103が１つずつ読み込まれ、レジスタ１５２に1列分のメッセージD103が積算された値が格納された場合、制御部１０５から供給される制御信号D107は、「０」から「１」に変化する。例えば、列の重みが「５」である場合、制御信号D107は、１から４クロック目までは「０」となり、５クロック目では「１」となる。
【００７０】
制御信号D107が「１」の場合、セレクタ１５３は、レジスタ１５２に格納されている値、即ち、検査行列の１列に亘る全ての枝からのメッセージD103（メッセージuj）が積算された９ビットの値D151（ｊ＝１からｄVまでのΣuj)を選択し、レジスタ１５４に出力して格納させる。レジスタ１５４は、格納している値D151を、９ビットの値D152として、セレクタ１５３と加減算器１５６に供給する。制御信号D107が「０」の場合、セレクタ１５３は、レジスタ１５４から供給された値D152を選択し、レジスタ１５４に出力し再格納させる。即ち、検査行列の１列に亘る全ての枝からのメッセージD103（メッセージuj）が積算されるまで、レジスタ１５４は、前回積算された値を、セレクタ１５３と加減算器１５６に供給する。
【００７１】
一方、FIFOメモリ１５５は、レジスタ１５４から新たな値D152（ｊ＝１からｄVまでのΣuj)が出力されるまでの間、チェックノードからのメッセージD103を遅延し、６ビットの値D153として加減算器１５６に供給する。加減算器１５６は、レジスタ１５４から供給された値D152から、FIFOメモリ１５５から供給された値D153を減算する。即ち、加減算器１５６は、検査行列の1列に亘る全ての枝からのメッセージD103（メッセージuj）の積算値から、求めたい枝からのメッセージujを減算して、その減算値（ｊ＝１からｄv−１までのΣuj）を求める。さらに、加減算器１５６には、その減算値（ｊ＝１からｄv−１までのΣuj）に、受信用メモリ１０４から供給された受信データD104を加算して、その結果得られる６ビットの値をメッセージD105（メッセージvi）として出力する。
【００７２】
以上のように、バリアブルノード計算器１０３では、式（１）の演算が行われ、メッセージviが求められる。
【００７３】
なお、図８の検査行列の列の重みの最大は５であるため、即ち、バリアブルノードに供給されるメッセージの最大数は５であるため、バリアブルノード計算器１０３は、５個のメッセージ（uj）を遅延させるFIFOメモリ１５５を有している。列の重みが５未満の列のメッセージを計算するときには、FIFOメモリ１５５における遅延量が、その列の重みの値に減らされる。
【００７４】
図９の復号装置では、検査行列の重みにしたがって、制御部１０５から制御信号が与えられる。そして、図９の復号装置によれば、枝用メモリ１００および１０２、並びにチェックノード計算器１０１およびバリアブルノード計算器１０３のFIFOメモリ１２７，１３３，１５５の容量さえ足りれば、制御信号のみを変えることで様々な検査行列のLDPC符号を復号することができる。
【００７５】
なお、図示しないが、図９の復号装置において、復号の最終段においては、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【００７６】
図９の復号装置を繰り返し用いて、LDPC符号を復号する場合には、チェックノード演算とバリアブルノード演算とが交互に行われる。即ち、図９の復号装置では、チェックノード計算器１０１によるチェックノード演算の結果を用いて、バリアブルノード計算器１０３によりバリアブルノード演算が行われ、バリアブルノード計算器１０３によるバリアブルノード演算の結果を用いて、チェックノード計算器１０１によりチェックノード演算が行われる。
【００７７】
従って、２６９の枝を有する図８の検査行列を用いた１回の復号に、269×2=538クロック(clock)を必要とする。例えば、５０回の繰り返し復号を行うためには、符号長である９０個の符号（受信データ）を1フレームとして、その1フレームを受信する間に、538×50=26900クロック動作することが必要であり、受信周波数の約３００（≒26900/90）倍の高速動作が必要になる。受信周波数が数十MHzであるとすると、GHz以上の速度での動作を要求されることになる。
【００７８】
また、図９の復号装置を、例えば、５０台連接して、LDPC符号を復号する場合には、１フレーム(frame)目のバリアブルノード演算を行っている間に、２フレーム目のチェックノード演算を行い、３フレーム目のバリアブルノード演算を行う、というように、複数のバリアブルノード演算とチェックノード演算とを同時に行うことができる。この場合、９０個の符号を受信する間に、２６９個の枝を計算すればよいので、復号装置は、受信周波数の約３（≒269/90）倍の周波数で動作すればよいことになり、十分に実現可能である。しかしながら、この場合、回路規模が、単純には、図９の復号装置の５０倍になる。
【００７９】
次に、全ノードの演算を同時に行うことによって復号を行う場合(full parallel decoding)の復号装置の実装法について説明する。
【００８０】
この実装法については、例えば、非特許文献１に記載されている。
【００８１】
図１２は、図８の検査行列で表現される符号（符号化率2/3、符号長90）を復号する復号装置の一例の構成を示している。
【００８２】
図１２の復号装置では、枝用メモリ２０２または２０６から、２６９個ある枝に対応するメッセージデータを全て同時に読み出し、そのメッセージデータを用いて、２６９個の枝に対応する新たなメッセージデータを演算する。さらに、その演算の結果求められた新たなメッセージデータが全て同時に後段の枝用メモリ２０６または２０２に格納されていく。そして、図１２の復号装置を繰り返し用いることで繰り返し復号が実現される。
【００８３】
図１２において、復号装置は、１つの受信用メモリ２０５、２つの枝入れ替え装置２００および２０３、２つの枝用メモリ２０２および２０６、３０個のチェックノード計算器２０１1乃至２０１30、９０個のバリアブルノード計算器２０４1乃至２０４90からなる。以下、各部について詳細に説明する。
【００８４】
枝用メモリ２０６は、前段のバリアブルノード計算器２０４1乃至２０４90からのメッセージD2061乃至D20690を全て同時に格納し、次の時刻（次のクロックのタイミング）に、メッセージD2061乃至D20690を、メッセージD2071乃至D20790として読み出し、次段の枝入れ替え装置２００に、メッセージD200(D2001乃至D20090)として供給する。枝入れ替え装置２００は、枝用メモリ２０６から供給されたメッセージD2001乃至D20090の順番を、図８の検査行列にしたがって並び替え（入れ替え）、チェックノード計算器２０１1乃至２０１30に、メッセージD2011乃至D20130として供給する。
【００８５】
チェックノード計算器２０１1乃至２０１30は、枝入れ替え装置２００から供給されるメッセージD2011乃至D20130を用いて式（７）にしたがって演算を行い、その演算の結果得られるメッセージD2021乃至D20230を、枝用メモリ２０２に供給する。
【００８６】
枝用メモリ２０２は、前段のチェックノード計算器２０１1乃至２０１30から供給されるメッセージD2021乃至D20230を全て同時に格納し、次の時刻に、そのすべてのメッセージD2021乃至D20230を、メッセージD2031乃至D20330として、次段の枝入れ替え装置２０３に供給する。
【００８７】
枝入れ替え装置２０３は、枝用メモリ２０２から供給されたメッセージD2031乃至D20330の順番を図８の検査行列にしたがって並び替え、バリアブルノード計算器２０４1乃至２０４90に、メッセージD2041乃至D20490として供給する。
【００８８】
バリアブルノード計算器２０４1乃至２０４90は、枝入れ替え装置２０３から供給されるメッセージD2041乃至D20490と、受信用メモリ２０５から供給される受信データD2051乃至D20590を用いて式（１）にしたがって演算を行い、その演算の結果得られるメッセージD2061乃至D20690を、次段の枝用メモリ２０６に供給する。
【００８９】
図１３は、チェックノード演算を同時に行う図１２のチェックノード計算器２０１m（ｍ＝１，２，・・・，３０）の構成例を示している。
【００９０】
図１３のチェックノード計算器２０１mでは、図１０のチェックノード計算器１０１と同様にして、式（７）のチェックノード演算が行われるが、そのチェックノード演算が、すべての枝について同時に行われる。
【００９１】
即ち、図１３のチェックノード計算器２０１mでは、枝入れ替え装置２００から供給される図８の検査行列の各列に対応するバリアブルノードからのメッセージD2211乃至D2219（vi）が全て同時に読み込まれ、それぞれの下位５ビットである絶対値D2221乃至D2229（|vi|）がLUT２２１1乃至２２１9にそれぞれ供給される。また、メッセージD2211乃至D2219（vi）の最上位ビットである１ビットの符号ビットD2231乃至D2239が、EXOR回路２２６1乃至２２６9にそれぞれ供給されるとともに、EXOR回路２２５に供給される。
【００９２】
LUT２２１1乃至２２１9は、絶対値D2221乃至D2229（|vi|）に対して、式（７）におけるφ(|vi|)の演算を行った５ビットの演算結果D2241乃至D2249（φ（|vi|））をそれぞれ読み出し、それぞれを減算器２２３1乃至２２３9に供給する。また、LUT２２１1乃至２２１9は、演算結果D2241乃至D2249（φ（|vi|））を加算器２２２に供給する。
【００９３】
加算器２２２は、演算結果D2241乃至D2249（φ（|vi|））の値の総和（１行分の演算結果の総和）を演算し、９ビットの演算結果D225（ｉ＝１から９のΣφ（|vi|））を、減算器２２３1乃至２２３9に供給する。減算器２２３1乃至２２３9は、演算結果D225から、演算結果D2241乃至D2249（φ（|vi|））をそれぞれ減算し、５ビットの減算値D2271乃至D2279を、LUT２２４1乃至２２４9に供給する。即ち、減算器２２３1乃至２２３9は、全ての枝からのメッセージviから求められたφ(|vi|)の積算値から、求めたい枝からのメッセージviから求められたφ(|vi|)を減算して、その減算値D2271乃至D2279（ｉ＝１から８までのΣφ(|vi|)）をLUT２２４1乃至２２４9にそれぞれ供給する。LUT２２４1乃至２２４9は、減算値D2271乃至D2279に対して、式（７）におけるφ-1(Σφ(|vi|))の演算を行った５ビットの演算結果D2281乃至D2289を読み出して出力する。
【００９４】
一方、EXOR回路２２５は、全ての符号ビットD2231乃至D2239の排他的論理和を演算することにより、符号ビットD2231乃至D2239の乗算を行い、１ビットの乗算値D226（１行分の符号ビットの乗算値（ｉ＝１から９までのΠsign（vi）））をEXOR回路２２６1乃至２２６9にそれぞれ供給する。EXOR回路２２６1乃至２２６9は、乗算値D226と符号ビットD2231乃至D2239それぞれとの排他的論理を演算することにより、乗算値D226を、符号ビットD2231乃至D2239それぞれで除算した１ビットの除算値D2291乃至D2299（ｉ＝１から８までのΠsign（vi））を求めて出力する。
【００９５】
チェックノード計算器２０１mでは、LUT２２４1乃至２２４9から出力された５ビットの演算結果D2281乃至D2289それぞれを下位５ビットとするとともに、EXOR回路２２６1乃至２２６9から出力された除算値D2291乃至D2299それぞれを最上位ビットとする合計６ビットが、チェックノード演算の結果得られるメッセージD2301乃至D2309として出力される。
【００９６】
以上のように、チェックノード計算器２０１mでは、式（７）の演算が行われ、メッセージujが求められる。
【００９７】
なお、図１３では、各メッセージが符号ビットを合わせて合計６ビットに量子化されているものとして、チェックノード計算器２０１mを表している。また、図１３の回路は１つのチェックノードに相当する。ここで処理の対象としている図８の検査行列については、その行数である３０行のチェックノードが存在するため、図１２の復号装置は、図１３に示したようなチェックノード計算器２０１mを３０個有している。
【００９８】
ここで、図１３のチェックノード計算器２０１mでは、９個のメッセージを同時に計算することができる。そして、ここで処理の対象としている図８の検査行列の行の重みは、第１行が８で、第２乃至第３０行が９であるため、即ち、チェックノードに供給されるメッセージの数が、８のケースが１つと、９のケースが２９あるため、チェックノード計算器２０１1は、図１３の回路と同様の８つのメッセージを同時に計算することができる回路構成となっており、残りのチェックノード計算器２０１2乃至２０１30は、図１３の回路と同一構成となっている。
【００９９】
図１４は、バリアブルノード演算を同時に行う図１２のバリアブルノード計算器２０４p（ｐ＝１，２，・・・，９０）の構成例を示している。
【０１００】
図１４のバリアブルノード計算器２０４pでは、図１１のバリアブルノード計算器１０３と同様にして、式（１）のバリアブルノード演算が行われるが、そのバリアブルノード演算が、すべての枝について同時に行われる。
【０１０１】
即ち、図１４のバリアブルノード計算器２０４pでは、枝入れ替え装置２０３から供給される、検査行列の各行に対応するチェックノードからの６ビットのメッセージD2511乃至D2515（メッセージuj）が全て同時に読み込まれ、それぞれ加算器２５２1乃至２５２5に供給されるとともに、加算器２５１に供給される。また、バリアブルノード計算器２０４pには、受信用メモリ２０５から受信データD271が供給され、その受信データD271は、加減算器２５２1乃至２５２5に供給される。
【０１０２】
加算器２５１は、全てのメッセージD2511乃至D2515（メッセージuj）を積算し、９ビットの積算値D252（1列分のメッセージの総和値（ｊ＝１から５までのΣuj））を加減算器２５２1乃至２５２5に供給する。加減算器２５２1乃至２５２5は、加算値D252から、メッセージD2511乃至D2515（メッセージuj）をそれぞれ減算する。即ち、加減算器２５２1乃至２５２5は、全ての枝からのメッセージujの積算値D252から、求めたい枝からのメッセージD2511乃至D2515（メッセージuj）をそれぞれ減算して、その減算値（ｊ＝１から４までのΣuj）を求める。
【０１０３】
さらに、加減算器２５２1乃至２５２5は、減算値（ｊ＝１から４までのΣuj）に、受信データD271（u0i）を加算して、６ビットの加算値D2531乃至D2535を、バリアブルノード演算の結果として出力する。
【０１０４】
以上のように、バリアブルノード計算器２０４pでは、式（１）の演算が行われ、メッセージviが求められる。
【０１０５】
なお、図１４では、各メッセージが符号ビットを合わせて合計６ビットに量子化されているものとして、バリアブルノード計算器２０４pを表している。また、図１４の回路は１つのバリアブルノードに相当する。ここで処理の対象としている図８の検査行列については、その列数である９０列のバリアブルノードが存在するから、図１２の復号装置は、図１４に示したような回路を９０個有している。
【０１０６】
ここで、図１４のバリアブルノード計算器２０４pでは、５個のメッセージを同時に計算することができる。そして、ここで処理の対象としている図８の検査行列は、重みが５，３，２，１の列が、それぞれ、１５列、４５列、２９列、１列あるので、バリアブルノード計算器２０４1乃至２０４90のうちの１５個は、図１４の回路と同一構成となっており、残りの４５個、２９個、１個は、図１４の回路と同様の３，２，１つのメッセージをそれぞれ同時に計算することができる回路構成となっている。
【０１０７】
なお、図示しないが、図１２の復号装置においても、図９における場合と同様に、復号の最終段においては、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が最終的な復号結果として出力される。
【０１０８】
図１２の復号装置によれば、２６９個ある枝に対応するメッセージすべてを１クロックで同時に計算することができる。
【０１０９】
図１２の復号装置を繰り返し用いて復号する場合には、チェックノード演算とバリアブルノード演算とを交互に行い、１回の復号を２クロックで行うことができる。従って、例えば、５０回の復号を行うためには、符号長が９０個の符号を1フレームとする受信データを受信する間に2×50=100クロック動作すれば良いことになり、ほぼ受信周波数と同一の動作周波数でよいことになる。一般的に、LDPC符号は、符号長が数千から数万と大きいことから、図１２の復号装置を用いれば、復号回数を極めて多くすることができ、誤り訂正性能の向上を期待することができる。
【０１１０】
しかしながら、図１２の復号装置は、タナーグラフのすべての枝に対応するメッセージの演算を、並列で行うため、回路規模が、符号長に比例して大きくなる。また、図１２の復号装置を、ある符号長の、ある符号化率の、ある検査行列を持つLDPC符号の復号を行う装置として構成した場合、その復号装置において、他の符号長や、他の符号化率、他の検査行列を持つLDPC符号の復号を行うことは困難となる。即ち、図１２の復号装置は、図９の復号装置のように、制御信号を変えるだけでは、様々な符号を復号することに対処することが困難であり、符号依存性が高い。
【０１１１】
また、サムプロダクトアルゴリズムを近似して実装する方法なども提案されているが、この方法では、性能の劣化を招いてしまう。
【非特許文献１】C. Howland and A. Blanksby, "Parallel Decoding Architectures for Low Density Parity Check Codes", Symposium on Circuits and Systems, 2001
【発明の開示】
【発明が解決しようとする課題】
【０１１２】
図９の復号装置では、バリアブルノードの演算結果を格納する枝用メモリ１００およびチェックノードの演算結果を格納する枝用メモリ１０２の２つのメモリが設けられ、枝用メモリ１００および枝用メモリ１０２は、全枝数に対応するメッセージを格納しているため、大容量のメモリを必要とし、復号装置の回路規模が大きくなるという問題があった。
【０１１３】
また、図９の復号装置では、チェックノード計算器１０１およびバリアブルノード計算器１０３の２つの計算器が設けられているため、復号装置の回路規模が大きくなってしまう。
【０１１４】
このように、図９の復号装置では、回路規模が大きくなってしまうため、コストが高くなったり、装置の消費電力が大きくなるといった問題があった。
【０１１５】
本発明は、このような状況に鑑みてなされたものであり、復号装置の回路規模を小さくすることができるようにするものである。
【課題を解決するための手段】
【０１１６】
本発明の第１の復号装置は、LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択手段と、選択手段により選択されたチェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算手段と、ノード計算手段により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替え手段と、を備えることを特徴とする。
【０１１７】
LDPC符号の検査行列は、P×Pの単位行列、その単位行列のコンポーネントである１のうちの１個以上が０になった行列である準単位行列、単位行列もしくは準単位行列をサイクリックシフトした行列であるシフト行列、単位行列、準単位行列もしくはシフト行列のうちの複数の和である和行列、またはP×Pの０行列を構成行列として、複数の構成行列の組み合わせで表されるようにすることができる。
【０１１８】
ノード計算手段によるチェックノードの演算、またはバリアブルノードの演算の結果得られるメッセージを記憶する記憶手段をさらに備え、ノード計算手段は、記憶手段に記憶されるメッセージを用いて、チェックノード演算、またはバリアブルノード演算を行うようにすることができる。
【０１１９】
並べ替え手段は、サイクリックシフト回路であるようにすることができる。
【０１２０】
並べ替え手段は、バレルシフタであるようにすることができる。
【０１２１】
ノード計算手段は、チェックノードの演算を行うチェックノード計算手段と、バリアブルノードの演算を行うバリアブルノード計算手段における加算を行う回路が共有化されて構成されるようにすることができる。
【０１２２】
本発明の第１の復号方法は、LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択ステップと、選択ステップの処理により選択されたチェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算ステップと、ノード計算ステップの処理により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替えステップとを含むことを特徴とする。
【０１２３】
本発明の第１のプログラムは、LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択ステップと、選択ステップの処理により選択されたチェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算ステップと、ノード計算ステップの処理により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替えステップとを備えることを特徴とする。
【０１２４】
本発明の第２の復号装置は、所定の値に対して、逆関数と一致する所定の関数を用いて所定の値を変換した値を記憶する記憶手段と、LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値を求めるとともに、検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値を求める復号途中結果積算手段と、復号途中結果積算手段により求められた第１の積算値とLDPC符号とを加算して加算値を求める加算手段と、加算手段により求められた加算値から、検査行列の各行の１のうちの所定の１に対応する第１の復号途中結果を減算して、第１の減算値を求めるともに、復号途中結果積算手段により積算された第２の積算値から、検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の絶対値を減算して、第２の減算値を求める減算手段と、記憶手段から、減算手段により求められた第１の減算値の絶対値に対して、所定の関数を用いて第１の減算値の絶対値を変換した値を読み出し、第１の変換値として出力するとともに、第２の減算値に対して、所定の関数の逆関数を用いて第２の減算値を変換した値を読み出し、第２の変換値として出力する出力手段と、検査行列の各列の１に対応する第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の符号ビット以外のすべての第２の復号途中結果の符号ビットを乗算して、符号乗算値を求める乗算手段とを備え、乗算手段により求められた符号乗算値と、出力手段により出力された第２の変換値とを乗算した第１の乗算値が、第１の復号途中結果として出力されるとともに、減算手段により求められた第１の減算値の符号ビットと、出力手段により出力された第１の変換値とを乗算した第２の乗算値が、第２の復号途中結果として出力されることを特徴とする。
【０１２５】
本発明の第２の復号方法は、所定の値に対して、逆関数と一致する所定の関数を用いて所定の値を変換した値を記憶手段に記憶させる記憶ステップと、LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値を求めるとともに、検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値を求める復号途中結果積算ステップと、復号途中結果積算ステップの処理により求められた第１の積算値とLDPC符号とを加算して加算値を求める加算ステップと、加算ステップの処理により求められた加算値から、検査行列の各行の１のうちの所定の１に対応する第１の復号途中結果を減算して、第１の減算値を求めるともに、復号途中結果積算ステップの処理により積算された第２の積算値から、検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の絶対値を減算して、第２の減算値を求める減算ステップと、記憶手段から、減算ステップの処理により求められた第１の減算値の絶対値に対して、所定の関数を用いて第１の減算値の絶対値を変換した値を読み出し、第１の変換値として出力するとともに、第２の減算値に対して、所定の関数の逆関数を用いて第２の減算値を変換した値を読み出し、第２の変換値として出力する出力ステップと、検査行列の各列の１に対応する第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の符号ビット以外のすべての第２の復号途中結果の符号ビットを乗算して、符号乗算値を求める乗算ステップとを含み、乗算ステップの処理により求められた符号乗算値と、出力ステップの処理により出力された第２の変換値とを乗算した第１の乗算値が、第１の復号途中結果として出力されるとともに、減算ステップの処理により求められた第１の減算値の符号ビットと、出力ステップの処理により出力された第１の変換値とを乗算した第２の乗算値が、第２の復号途中結果として出力されることを特徴とする。
【０１２６】
本発明の第２のプログラムは、所定の値に対して、逆関数と一致する所定の関数を用いて所定の値を変換した値を記憶手段に記憶させる記憶ステップと、LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値を求めるとともに、検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値を求める復号途中結果積算ステップと、復号途中結果積算ステップの処理により求められた第１の積算値とLDPC符号とを加算して加算値を求める加算ステップと、加算ステップの処理により求められた加算値から、検査行列の各行の１のうちの所定の１に対応する第１の復号途中結果を減算して、第１の減算値を求めるともに、復号途中結果積算ステップの処理により積算された第２の積算値から、検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の絶対値を減算して、第２の減算値を求める減算ステップと、記憶手段から、減算ステップの処理により求められた第１の減算値の絶対値に対して、所定の関数を用いて第１の減算値の絶対値を変換した値を読み出し、第１の変換値として出力するとともに、第２の減算値に対して、所定の関数の逆関数を用いて第２の減算値を変換した値を読み出し、第２の変換値として出力する出力ステップと、検査行列の各列の１に対応する第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の符号ビット以外のすべての第２の復号途中結果の符号ビットを乗算して、符号乗算値を求める乗算ステップとを含み、乗算ステップの処理により求められた符号乗算値と、出力ステップの処理により出力された第２の変換値とを乗算した第１の乗算値が、第１の復号途中結果として出力されるとともに、減算ステップの処理により求められた第１の減算値の符号ビットと、出力ステップの処理により出力された第１の変換値とを乗算した第２の乗算値が、第２の復号途中結果として出力されることを特徴とする。
【０１２７】
第１の本発明においては、LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方が選択され、選択されたチェックノードの演算、またはバリアブルノードの演算が、ノード計算手段により行われ、P個の枝に対応するメッセージを同時に求められる。そして、ノード計算手段により演算された結果得られるＰ個の枝に対応するメッセージが並べ替えられる。
【０１２８】
第２の本発明においては、所定の値に対して、逆関数と一致する所定の関数を用いて所定の値を変換した値が記憶手段に記憶され、LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値が求められるとともに、検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値が求められる。また、第１の積算値とLDPC符号とを加算して加算値が求められ、加算値から、検査行列の各行の１のうちの所定の１に対応する第１の復号途中結果を減算して、第１の減算値が求められるともに、復号途中結果積算手段により積算された第２の積算値から、検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の絶対値を減算して、第２の減算値が求められる。さらに、記憶手段から、減算手段により求められた第１の減算値の絶対値に対して、所定の関数を用いて第１の減算値の絶対値を変換した値が読み出され、第１の変換値として出力されるとともに、第２の減算値に対して、所定の関数の逆関数を用いて第２の減算値を変換した値が読み出され、第２の変換値として出力される。また、検査行列の各列の１に対応する第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する第２の復号途中結果の符号ビット以外のすべての第２の復号途中結果の符号ビットが乗算され、符号乗算値が求められる。そして、符号乗算値と、第２の変換値とを乗算した第１の乗算値が、第１の復号途中結果として出力されるとともに、第１の減算値の符号ビットと、第１の変換値とを乗算した第２の乗算値が、第２の復号途中結果として出力される。
【発明の効果】
【０１２９】
本発明によれば、LDPC符号の復号装置の回路規模を小さくすることができるので、コストを削減し、装置の消費電力を削減することができる。
【発明を実施するための最良の形態】
【０１３０】
以下に本発明の実施の形態を説明するが、請求項に記載の構成要件と、発明の実施の形態における具体例との対応関係を例示すると、次のようになる。この記載は、請求項に記載されている発明をサポートする具体例が、発明の実施の形態に記載されていることを確認するためのものである。従って、発明の実施の形態中には記載されているが、構成要件に対応するものとして、ここには記載されていない具体例があったとしても、そのことは、その具体例が、その構成要件に対応するものではないことを意味するものではない。逆に、具体例が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その具体例が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
【０１３１】
さらに、この記載は、発明の実施の形態に記載されている具体例に対応する発明が、請求項に全て記載されていることを意味するものではない。換言すれば、この記載は、発明の実施の形態に記載されている具体例に対応する発明であって、この出願の請求項には記載されていない発明の存在、すなわち、将来、分割出願されたり、補正により追加される発明の存在を否定するものではない。
【０１３２】
請求項１に記載の復号装置は、LDPC(Low Density Parity Check)符号を復号する復号装置であって、前記LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択手段（例えば、図２６の制御部５８２）と、前記選択手段により選択された前記チェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算手段（例えば、図２６のノード計算部５８１）と、前記ノード計算手段により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替え手段（例えば、図２６のサイクリックシフト回路５５１）とを備えることを特徴とする。
【０１３３】
請求項３に記載の復号装置は、請求項１に記載の復号装置であって、前記ノード計算手段による前記チェックノードの演算、または前記バリアブルノードの演算の結果得られるメッセージを記憶する記憶手段（例えば、図２６の枝データ格納メモリ５４２または５４７）をさらに備え、前記ノード計算手段（例えば、図２６のノード計算部５８１）は、前記記憶手段に記憶されるメッセージを用いて、前記チェックノード演算、または前記バリアブルノード演算を行うことを特徴とする。
【０１３４】
請求項７に記載の復号方法は、LDPC(Low Density Parity Check)符号を復号する復号装置の復号方法であって、前記LDPC符号の復号のためのチェックノードの演算、またはバリアブルノードの演算のうちの一方を選択する選択ステップ（例えば、図２７のステップＳ１０１またはステップＳ１０８）と、前記選択ステップの処理により選択された前記チェックノードの演算、またはバリアブルノードの演算を行い、P個の枝に対応するメッセージを同時に求めるノード計算ステップ（例えば、図２７のステップＳ１０３またはステップＳ１１０）と、前記ノード計算ステップの処理により演算された結果得られるＰ個の枝に対応するメッセージを並べ替える並べ替えステップ（例えば、図２７のステップＳ１０５またはステップＳ１１２）とを含むことを特徴とする。
【０１３５】
請求項９に記載の復号装置は、LDPC(Low Density Parity Check)符号を復号する復号装置であって、所定の値に対して、逆関数と一致する所定の関数（例えば、φ）を用いて前記所定の値を変換した値を記憶する記憶手段（例えば、図３１のLUT６７２）と、前記LDPC符号の検査行列の各行の１に対応する第１の復号途中結果（例えば、uj）のすべてを積算して第１の積算値（例えば、Σuj）を求めるとともに、前記検査行列の各列の１に対応する第２の復号途中結果の絶対値（例えば、|vi’|）のすべてを積算して第２の積算値（例えば、Σ|vi’|）を求める復号途中結果積算手段（例えば、図３１の積算部７０１）と、前記復号途中結果積算手段により求められた前記第１の積算値と前記LDPC符号（例えば、u0i）とを加算して加算値（例えば、u0i＋Σuj）を求める加算手段（例えば、図３１の加算器６６６）と、前記加算手段により求められた前記加算値から、前記検査行列の各行の１のうちの所定の１に対応する前記第１の復号途中結果を減算して、第１の減算値（例えば、vi）を求めるともに、前記復号途中結果積算手段により積算された第２の積算値から、前記検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の絶対値を減算して、第２の減算値（例えば、ｉ＝１からdc-1までのΣ|vi’|）を求める減算手段（例えば、図３１の減算器６７１）と、前記記憶手段から、前記減算手段により求められた前記第１の減算値の絶対値に対して、前記所定の関数を用いて前記第１の減算値の絶対値を変換した値を読み出し、第１の変換値（例えば、φ|vi|）として出力するとともに、前記第２の減算値に対して、前記所定の関数の逆関数を用いて前記第２の減算値を変換した値を読み出し、前記第２の変換値（例えば、φ-1Σ|vi’|）として出力する出力手段（例えば、図３１のLUT６７２）と、前記検査行列の各列の１に対応する前記第２の復号途中結果の符号ビット（例えば、sign（vi’））のうち、前期検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の符号ビット以外のすべての前記第２の復号途中結果の符号ビットを乗算して、符号乗算値（例えば、ｉ＝１からdc-1までのΠsign（vi’））を求める乗算手段（例えば、図３１の乗算部７０２）とを備え、前記乗算手段により求められた前記符号乗算値と、前記出力手段により出力された前記第２の変換値とを乗算した第１の乗算値が、前記第１の復号途中結果（例えば、uj）として出力されるとともに、前記減算手段により求められた前記第１の減算値の符号ビットと、前記出力手段により出力された前記第１の変換値とを乗算した第２の乗算値が、前記第２の復号途中結果（例えば、vi’）として出力されることを特徴とする。
【０１３６】
請求項１０に記載の復号方法は、LDPC(Low Density Parity Check)符号を復号する復号装置の復号方法であって、前記LDPC符号の検査行列の各行の１に対応する第１の復号途中結果のすべてを積算して第１の積算値を求めるとともに、前記検査行列の各列の１に対応する第２の復号途中結果の絶対値のすべてを積算して第２の積算値を求める復号途中結果積算ステップ（例えば、図３３のステップＳ１６１または図３４のステップＳ１８１）と、前記復号途中結果積算ステップの処理により求められた前記第１の積算値と前記LDPC符号とを加算して加算値を求める加算ステップ（例えば、図３３のステップＳ１６２）と、前記加算ステップの処理により求められた前記加算値から、前記検査行列の各行の１のうちの所定の１に対応する前記第１の復号途中結果を減算して、第１の減算値を求めるともに、前記復号途中結果積算ステップの処理により積算された第２の積算値から、前記検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の絶対値を減算して、第２の減算値を求める減算ステップ(例えば、図３３のステップＳ１６３または図３４のステップＳ１８２)と、所定の値に対して、逆関数と一致する所定の関数を用いて前記所定の値を変換した値を記憶する記憶手段から、前記減算ステップの処理により求められた前記第１の減算値の絶対値に対して、前記所定の関数を用いて前記第１の減算値の絶対値を変換した値を読み出し、第１の変換値として出力するとともに、前記第２の減算値に対して、前記所定の関数の逆関数を用いて前記第２の減算値を変換した値を読み出し、前記第２の変換値として出力する出力ステップ（例えば、図３３のステップＳ１６４または図３４のステップＳ１８３）と、前記検査行列の各列の１に対応する前記第２の復号途中結果の符号ビットのうち、前期検査行列の各列の１のうちの所定の１に対応する前記第２の復号途中結果の符号ビット以外のすべての前記第２の復号途中結果の符号ビットを乗算して、符号乗算値を求める乗算ステップ（例えば、図３４のステップＳ１８４とＳ１８５）とを含み、前記乗算ステップの処理により求められた前記符号乗算値と、前記出力ステップの処理により出力された前記第２の変換値とを乗算した第１の乗算値が、前記第１の復号途中結果として出力されるとともに、前記減算ステップの処理により求められた前記第１の減算値の符号ビットと、前記出力ステップの処理により出力された前記第１の変換値とを乗算した第２の乗算値が、前記第２の復号途中結果として出力されることを特徴とする。
【０１３７】
請求項８に記載のプログラムの各ステップの具体例も、請求項７に記載の復号方法の各ステップの発明の実施の形態における具体例と、請求項１１に記載のプログラムの各ステップの具体例も、請求項１０に記載の復号方法の各ステップの発明の実施の形態における具体例と同様である。
【０１３８】
以下、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。
【０１３９】
図１５は、本発明を適用した復号装置の一実施の形態の構成例を示すブロック図である。
【０１４０】
なお、図１５では、LDPC符号の１回の復号を行う復号装置３００の例を示している。繰り返し復号は、復号装置３００を複数個縦列に接続して用いるか、あるいは、復号装置３００を繰り返し用いることにより行うことができる。
【０１４１】
復号装置３００は、枝用メモリ３１０、スイッチ３１１、バリアブルノード計算器３１２、チェックノード計算器３１３、セレクタ３１４、受信用メモリ３１５、および制御部３１６から構成される。
【０１４２】
復号装置３００では、バリアブルノード計算器３１２によるバリアブルノードの演算の結果得られる枝に対応するメッセージ（メッセージvi）、またはチェックノード計算器３１３によるチェックノードの演算の結果得られる枝に対応するメッセージ（メッセージuj）が、１つの枝用メモリ３１０に格納される。
【０１４３】
枝用メモリ３１０には、バリアブルノード計算器３１２によるバリアブルノード演算の結果得られる枝に対応するメッセージ（データ）D314、またはチェックノード計算器３１３によるチェックノード演算の結果得られる枝に対応するメッセージ（データ）D315のうちの一方が、メッセージD310として、セレクタ３１４から供給される。枝用メモリ３１０は、セレクタ３１４から供給されたメッセージD310を格納（記憶）し、既に格納してあるメッセージD311をスイッチ３１１に供給する。なお、枝用モリ３１０は、チェックノード計算器３１３による最後のチェックノード演算の結果得られる枝に対応するメッセージD315を格納する場合には、そのメッセージD315を、上述した式（５）の演算を行う不図示のブロックに供給する。
【０１４４】
即ち、枝用メモリ３１０は、セレクタ３１４から供給され、バリアブルノード計算器３１２、またはチェックノード計算器３１３が演算する順番に格納してあるメッセージD310を１つずつ読み出し、メッセージD311として、スイッチ３１１に供給すると同時に、セレクタ３１４が出力するメッセージD310を受信し、枝用メモリ３１０の既に読み出されたメッセージ（メッセージD311）が記憶されていたアドレスに書き込む。即ち、枝用メモリ３１０は、スイッチ３１１に供給するメッセージ（データ）D311の読み出しと、セレクタ３１４から供給されるメッセージ（データ）D310の書き込みとを、同時に行う。
【０１４５】
なお、枝用メモリ３１０には、バリアブルノード計算器３１２のバリアブルノード演算、またはチェックノード計算器３１３のチェックノード演算により演算された枝に対応するメッセージが格納されるので、枝用メモリ３１０に格納されるデータ量、即ち、枝用メモリ３１０に必要とされる記憶容量は、メッセージの量子化ビット数と、全枝数との乗算値となる。このことは、前述の図９の枝用メモリ１００および枝用メモリ１０２についても同様である。
【０１４６】
また、枝用メモリ３１０は、読み出しと書き込みが同時に可能な、例えば、デュアルポートRAMで構成することができる。
【０１４７】
スイッチ３１１には、枝用メモリ３１０からメッセージD311が供給されるとともに、制御部３１６からバリアブルノード計算器３１２、またはチェックノード計算器３１３のうちの一方の選択を表す選択信号D323が供給される。スイッチ３１１は、選択信号D323に基づいて、メッセージD311を、バリアブルノード計算器３１２、またはチェックノード計算器３１３のうちの一方に供給する。即ち、スイッチ３１１は、メッセージD311を、メッセージD312としてバリアブルノード計算器３１２に供給するか、またはメッセージD313としてチェックノード計算器３１３に供給する。
【０１４８】
バリアブルノード計算器３１２には、スイッチ３１１から、バリアブルノード演算に必要なメッセージD312が供給される。また、バリアブルノード計算器３１２には、制御部３１６から制御信号D321が供給されるとともに、受信用メモリ３１５からLDPC符号の受信データD316が供給される。バリアブルノード計算器３１２は、制御信号D321に基づき、前述の図９のバリアブルノード計算器１０３と同様に、スイッチ３１１から供給されるメッセージD312と受信用メモリ３１５から供給される受信データD316を用い、式（１）にしたがって、LDPC符号の復号のためのバリアブルノード演算を行い、その演算の結果得られる枝に対応するメッセージD314（メッセージvi）を、セレクタ３１４に供給する。バリアブルノード計算器３１２の詳細構成は、図１１に示したバリアブルノード計算器１０３と同様である。
【０１４９】
チェックノード計算器３１３には、スイッチ３１１から、チェックノード演算に必要なメッセージD313が供給されるとともに、制御部３１６から制御信号D322が供給される。チェックノード計算器３１３は、制御部３１６から供給される制御信号D322に基づき、前述の図９のチェックノード計算器１０１と同様に、スイッチ３１１から供給されるメッセージD313を用い、式（７）にしたがって、LDPC符号の復号のためのチェックノードの演算を行い、その演算によって求められたメッセージD315（メッセージuj）を、セレクタ３１４に供給する。チェックノード計算器３１３の詳細構成は、図１０に示したチェックノード計算器１０１と同様である。
【０１５０】
セレクタ３１４には、制御部３１６からバリアブルノード計算器３１２、またはチェックノード計算器３１３のうちの一方の選択を表す選択信号D323が供給される。また、セレクタ３１４には、バリアブルノード計算器３１２からメッセージD314が供給されるとともに、チェックノード計算器３１３からメッセージD315が供給される。セレクタ３１４は、選択信号D323に基づいて、メッセージD314、またはメッセージD315のうちの一方を選択し、メッセージD310として、枝用メモリ３１０に供給する。
【０１５１】
受信用メモリ３１５は、LDPC符号化された受信データ（LDPC符号）D316を格納（記憶）する。受信用メモリ３１５は、格納されている受信データD316を読み出し、バリアブルノード計算器３１２と、式（５）の演算を行う不図示のブロックに供給する。
【０１５２】
なお、受信データは、図示せぬ受信部から受信用メモリ３１５に供給されて記憶される。また、受信用メモリ３１５に格納されるデータ量、即ち、受信用メモリ３１５に必要とされる記憶容量は、LDPC符号の符号長と、受信データの量子化ビット数との乗算値である。
【０１５３】
制御部３１６は、制御信号D321をバリアブルノード計算器３１２に供給することにより、バリアブルノード計算器３１２を制御し、制御信号D322をチェックノード計算器３１３に供給することにより、チェックノード計算器３１３を制御する。また、制御部３１６は、バリアブルノード計算器３１２とチェックノード計算器３１３のうちの一方の選択を表す選択信号D323を、スイッチ３１１とセレクタ３１４に供給することにより、スイッチ３１１とセレクタ３１４を制御する。
【０１５４】
図１６は、図１５の復号装置３００の復号処理を説明するフローチャートである。この処理は、例えば、受信用メモリ３１５に復号すべき受信データが格納されたとき、開始される。
【０１５５】
ステップＳ２１において、制御部３１６は、バリアブルノード計算器３１２とチェックノード計算器３１３のうち、バリアブルノード計算器３１２を選択し、その選択を表す選択信号D323を生成して、スイッチ３１１とセレクタ３１４に供給する。
【０１５６】
ステップＳ２１の処理後は、ステップＳ２２に進み、スイッチ３１１は、ステップＳ２１で供給された制御信号D323に基づいて、バリアブルノード計算器３１２とチェックノード計算器３１３のうち一方を選択し、その選択した一方の計算器に、枝用メモリ３１０から、メッセージD311として１つずつ読み出された、後述するステップＳ３１で格納されたメッセージD310（メッセージuj）を供給する。即ち、ここでは、ステップＳ２１で供給された制御信号D323は、バリアブルノード計算器３１２の選択を表しているので、スイッチ３１１は、バリアブルノード計算器３１２を選択し、その選択したバリアブルノード計算器３１２に、バリアブルノード演算に必要なメッセージD311を、メッセージD312として供給する。
【０１５７】
なお、受信用メモリ３１５から供給された受信データD316に対して、まだチェックノード演算が行われておらず、枝用メモリ３１０にメッセージD311が格納されていない場合、バリアブルノード計算器３１２は、バリアブルノード演算に用いるメッセージを初期値に設定する。
【０１５８】
ステップＳ２２の処理後は、ステップＳ２３に進み、バリアブルノード計算器３１２は、バリアブルノード演算を行う。即ち、バリアブルノード計算器３１２には、受信用メモリ３１５から受信データD316が供給されるとともに、制御部３１６から制御信号D321が供給される。バリアブルノード計算器３１２は、制御信号D321に基づいて、受信データD316とステップＳ２２でスイッチ３１１から供給されたメッセージD312とを用いて、上述した式（１）にしたがってバリアブルノードの演算を行う。
【０１５９】
即ち、制御部３１６がバリアブルノード計算器３１２に供給する制御信号D321は、前述の図１１で説明した制御信号D107に対応するものであり、バリアブルノード計算器３１２は、制御信号D321にしたがい、スイッチ３１１を介して、枝用メモリ３１０から必要なメッセージD311（D312）を読み出すとともに、受信用メモリ３１５から供給された受信データD316を用いて、バリアブルノード演算を行う。
【０１６０】
ステップＳ２３の処理後は、ステップＳ２４に進み、バリアブルノード計算器３１２は、バリアブルノード演算の結果得られるメッセージD314（メッセージvi）をセレクタ３１４に出力し、ステップＳ２５に進む。
【０１６１】
ステップＳ２５において、セレクタ３１４は、ステップＳ２１で供給された選択信号D323に基づいて、バリアブルノード計算器３１２とチェックノード計算器３１３のうちの一方を選択し、その選択した一方から出力されるメッセージを、メッセージD310として、枝用メモリ３１０に格納する。ここでは、選択信号D323は、バリアブルノード計算器３１２の選択を表しているので、セレクタ３１４は、ステップＳ２４で出力されたバリアブルノード演算の結果得られるメッセージD314を、メッセージD310として枝用メモリ３１０に格納する。即ち、セレクタ３１４は、バリアブルノード計算器３１２とチェックノード計算器３１３のうち、いま、演算が行われている計算器から出力されるメッセージを枝用メモリ３１０に供給し、格納させる。
【０１６２】
ステップＳ２５の処理後は、ステップＳ２６に進み、制御部３１６は、バリアブルノード計算器３１２により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ２２に戻り、上述した処理を繰り返す。
【０１６３】
一方、ステップＳ２６において、制御部３１６は、バリアブルノード計算器３１２により、全枝数のメッセージが演算されたと判定した場合、ステップＳ２７に進み、制御部３１６は、チェックノード計算器３１３を選択し、ステップＳ２１で生成したバリアブルノード計算器３１２の選択を表す制御信号D323を、チェックノード計算器３１３の選択を表す制御信号D323に変更する。
【０１６４】
ステップＳ２７の処理後は、ステップＳ２８に進み、スイッチ３１１は、ステップＳ２７で変更された制御信号D323に基づいて、バリアブルノード計算器３１２とチェックノード計算器３１３のうち一方を選択し、その選択した一方に、枝用メモリ３１０から、メッセージD311として１つずつ読み出された、ステップＳ２５で格納されたメッセージD310（メッセージvi）を供給する。ここでは、ステップＳ２７で変更された制御信号D323は、チェックノード計算器３１２の選択を表しているので、スイッチ３１１は、チェックノード計算器３１３を選択し、その選択したチェックノード計算器３１３に、チェックノード演算に必要なメッセージD311を、メッセージD313として供給する。
【０１６５】
ステップＳ２８の処理後は、ステップＳ２９に進み、チェックノード計算器３１３は、チェックノード演算を行う。即ち、チェックノード計算器３１３には、制御部３１６から制御信号D322が供給される。チェックノード計算器３１３は、制御信号D322に基づき、メッセージD313を用いて、上述した式（７）にしたがって、チェックノード演算を行う。
【０１６６】
即ち、制御部３１６がチェックノード計算器３１３に供給する制御信号D322は、前述の図１０で説明した制御信号D106に対応するものであり、チェックノード計算器３１３は、制御信号D322にしたがい、スイッチ３１１を介して、枝用メモリ３１０から必要なメッセージD313を読み出しながらチェックノードの演算を行う。
【０１６７】
ステップＳ２９の処理後は、ステップＳ３０に進み、チェックノード計算器３１３は、チェックノードの演算の結果得られるメッセージD315（メッセージuj）をセレクタ３１４に出力して、ステップＳ３１に進む。
【０１６８】
ステップＳ３１において、セレクタ３１４は、ステップＳ２７で変更された選択信号D323に基づいて、バリアブルノード計算器３１２とチェックノード計算器３１３のうち一方を選択し、その選択した一方から出力されるメッセージを、メッセージD310として枝用メモリ３１０に供給し、格納させる。ここでは、選択信号D323は、チェックノード計算器３１３の選択を表しているので、セレクタ３１４は、ステップＳ３０で出力されたチェックノード演算の結果得られるメッセージD315を、メッセージD310として枝用メモリ３１０に格納する。即ち、セレクタ３１４は、バリアブルノード計算器３１２とチェックノード計算器３１３のうち、いま、演算が行われている計算器から出力されるメッセージを枝用メモリ３１０に供給し、格納させる。
【０１６９】
ステップＳ３１の処理後は、ステップＳ３２に進み、制御部３１６は、チェックノード計算器３１３により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ２８に戻り、上述した処理を繰り返す。
【０１７０】
一方、ステップＳ３２において、制御部３１６は、チェックノード計算器３１２により、全枝数のメッセージが演算されたと判定した場合、処理を終了する。
【０１７１】
なお、復号装置３００は、復号回数だけ図１６の復号処理を繰り返し行ない、枝用メモリ３１０に、最後のチェックノード演算の結果得られるメッセージD315（メッセージuj）が格納された場合、枝用メモリ３１０は、そのメッセージD315を上述した式（５）の演算を行う不図示のブロックに供給する。不図示のブロックには、さらに、受信用メモリ３１５から受信データD316が供給され、不図示のブロックは、メッセージD315と受信データD316を用いて、式（５）の演算を行い、その演算結果を最終的な復号結果として出力する。
【０１７２】
上述したように、枝用メモリ３１０には、バリアブルノード計算器３１２とチェックノード計算器３１３のうち、いま、演算が行われている計算器から出力されるメッセージが格納される。即ち、バリアブルノード演算は、チェックノード演算の結果であるメッセージujを用いて行われ、チェックノード演算は、バリアブルノード演算の結果であるメッセージviを用いて行われるため、復号装置３００では、バリアブルノード演算とチェックノード演算が交互に行われる。従って、バリアブルノード計算器３１２とチェックノード計算器３１３のうち、いま、演算が行われている計算器から出力されるメッセージを格納することにより、バリアブルノード演算の結果を格納する枝用メモリとチェックノード演算の結果を格納する枝用メモリを共有化して１つのメモリにすることができ、バリアブルノード演算の結果得られるメッセージを格納する枝用メモリ１００とチェックノード演算の結果得られるメッセージを格納する枝用メモリ１０２とを別々に有する図９の復号装置に比べて、復号装置３００の回路規模を小さくすることができる。
【０１７３】
なお、枝用メモリ３１０は、デュアルポートRAMではなく、複数個のシングルポートRAMから構成されるようにしてもよい。この場合、１つのシングルポートRAMへの読み出しと書き込みが同時に重ならないように制御を行う必要がある。複数個のシングルポートRAMを用いた場合、デュアルポートRAMを用いる場合に比べて、復号装置３００の回路規模を小さくすることができる。
【０１７４】
図１７は、本発明を適用した復号装置の他の一実施の形態の構成例を示すブロック図である。
【０１７５】
なお、図１７では、LDPC符号の１回の復号を行う復号装置３４０の例を示している。繰り返し復号は、復号装置３４０を複数個縦列に接続して用いるか、あるいは、復号装置３４０を繰り返し用いることにより行うことができる。
【０１７６】
復号装置３４０は、スイッチ３５０、枝用メモリ３５１、枝用メモリ３５２、セレクタ３５３、ノード計算器３５４、受信用メモリ３５５、および制御部３５６から構成される。
【０１７７】
復号装置３４０では、ノード計算器３５４がバリアブルノード演算とチェックノード演算を交互に行い、バリアブルノード演算の結果得られるメッセージ（メッセージvi）とチェックノード演算の結果得られるメッセージ（メッセージuj）が、枝用メモリ３５１または枝用メモリ３５２に格納される。即ち、バリアブルノード計算器とチェックノード計算器が共有化され、１つのノード計算器３５４で、バリアブルノード演算とチェックノード演算の両方が行われる。
【０１７８】
スイッチ３５０には、ノード計算器３５４からメッセージD350が供給されるとともに、制御部３５６から、メッセージD350を格納する（書き込む）メモリとして、枝用メモリ３５１または枝用メモリ３５２のうち一方の選択を表す選択信号D363が供給される。スイッチ３５０は、選択信号D363に基づいて、ノード計算器３５４から供給されるメッセージD350を、枝用メモリ３５１にメッセージD351として供給するか、あるいは枝用メモリ３５２にメッセージD352として供給する。
【０１７９】
枝用メモリ３５１には、例えば、ノード計算器３１２によるバリアブルノード演算の結果得られる枝に対応するメッセージD350が、メッセージD351として、スイッチ３５０から供給される。枝用メモリ３５１は、メッセージD351を、チェックノード演算を行う順番に格納していく。そして、枝用メモリ３５１は、格納してある順番どおりに、メッセージD351を、メッセージD353として、セレクタ３５３に供給する。
【０１８０】
枝用メモリ３５２には、例えば、ノード計算器３５４によるチェックノード演算の結果得られる枝に対応するメッセージD350が、メッセージD352として、スイッチ３５０から供給される。枝用メモリ３５２は、メッセージD352を、バリアブルノード演算を行う順番に格納していく。そして、枝用メモリ３５２は、格納してある順番どおりに、メッセージD352を、メッセージD354としてセレクタ３５３に供給する。なお、枝用メモリ３５２は、ノード計算器３５４による最後のチェックノード演算の結果得られるメッセージD350を格納する場合には、そのメッセージD350を、上述した式（５）の演算を行う不図示のブロックに供給する。
【０１８１】
なお、枝用メモリ３５１には、ノード計算器３５４のバリアブルノード演算の結果得られた枝に対応するメッセージが格納され、枝用メモリ３５２には、ノード計算器３５４のチェックノード演算の結果得られた枝に対応するメッセージが格納されるので、枝用メモリ３５１および枝用メモリ３５２に格納されるデータ量、即ち、枝用メモリ３５１および枝用メモリ３５２に必要とされる記憶容量は、メッセージの量子化ビット数と、全枝数との乗算値となる。
【０１８２】
セレクタ３５３には、枝用メモリ３５１からメッセージD353が供給されるとともに、枝用メモリ３５２からメッセージD354が供給される。また、セレクタ３５３には、制御部３５６から、ノード計算器３５４に供給するメッセージを読み出すメモリとして、枝用メモリ３５１または枝用メモリ３５２のうち一方の選択を表す選択信号D364が供給される。セレクタ３５３は、選択信号D364に基づいて、枝用メモリ３５１と枝用メモリ３５２のうち一方を選択し、その選択した枝用メモリから格納されるメッセージ（メッセージD353またはメッセージD354）を、メッセージD355として、ノード計算器３５４に供給する。
【０１８３】
ノード計算器３５４には、セレクタ３５３からメッセージD355が供給されるとともに、受信用メモリ３５５から受信データD356が供給される。また、ノード計算器３５４には、制御部３５６から、いま、ノード計算器３５４で行う演算として、バリアブルノード演算とチェックノード演算のうち一方の選択を表す選択信号D361と、ノード演算を制御する制御信号D362が供給される。ノード計算器３５４は、選択信号D361に基づき、バリアブルノード演算とチェックノード演算のうち、制御部３５６により選択された方の演算を行う。即ち、ノード計算器３５４は、制御信号D362に基づき、セレクタ３５３から供給されるメッセージD355と受信用メモリ３５５から供給される受信データD356を用い、式（１）にしたがって、LDPC符号の復号のためのバリアブルノード演算を行うか、あるいは、セレクタ３５３から供給されるメッセージD355を用い、式（７）にしたがって、LDPC符号の復号のためのチェックノードの演算を行う。
【０１８４】
そして、ノード計算器３５４は、バリアブルノード演算またはチェックノード演算の結果得られる枝に対応するメッセージ（メッセージviまたはメッセージuj）を、メッセージD350として、スイッチ３５０に供給する。
【０１８５】
受信用メモリ３５５は、LDPC符号化された受信データ（LDPC符号）D356を格納（記憶）する。受信用メモリ３５５は、格納されている受信データD356を読み出し、ノード計算器３５４と式（５）の演算を行う不図示のブロックに供給する。
【０１８６】
なお、受信データは、図示せぬ受信部から受信用メモリ３５５に供給されて記憶される。また、受信用メモリ３５５に格納されるデータ量、即ち、受信用メモリ３５５に必要とされる記憶容量は、LDPC符号の符号長と、受信データの量子化ビット数との乗算値である。
【０１８７】
制御部３５６は、いま、ノード計算器３５４で行う演算として、バリアブルノード演算とチェックノード演算のうち一方を選択し、その選択を表す選択信号D361と、制御信号D362をノード計算器３５４に供給することにより、ノード計算器３５４を制御する。また、制御部３５６は、枝用メモリ３５１と枝用メモリ３５２のうち一方を読み出すメモリとして選択し、他方を書き込むメモリとして選択する。そして、制御部３５６は、メッセージD350を格納する（書き込む）メモリとして、枝用メモリ３５１と枝用メモリ３５２のうちの一方の選択を表す選択信号D363をスイッチ３５０に供給することにより、スイッチ３５０を制御するとともに、ノード計算器３５４に供給するメッセージD355を読み出すメモリとして、他方の選択を表す選択信号D364をセレクタ３５３に供給することにより、セレクタ３５３を制御する。
【０１８８】
図１８は、図１７のノード計算器３５４の構成例を示すブロック図である。
【０１８９】
図１８のノード計算器３５４は、チェックノード演算またはバリアブルノード演算を行う。
【０１９０】
なお、図１８では、各メッセージが符号ビットを合わせて合計６ビット(bit)に量子化されているものとして、ノード計算器３５４を表している。さらに、図１８のノード演算器３５４には、クロックｃｋが供給され、このクロックｃｋは、必要なブロックに供給されるようになっている。そして、各ブロックは、クロックｃｋに同期して処理を行う。
【０１９１】
図１８のノード計算器３５４は、制御部３５６から供給される、例えば、1ビットの制御信号D362と1ビットの選択信号D361に基づき、枝用メモリ３５１または枝用メモリ３５２から１つずつ読み出され、セレクタ３５３を介して供給されるチェックノード演算に必要なメッセージD355を用いて、式（７）にしたがってチェックノード演算を行うか、あるいはバリアブルノード演算に必要なメッセージD355と受信用メモリ３５５から供給される受信データD356を用いて、式（１）にしたがってバリアブルノード演算を行う。
【０１９２】
即ち、ノード計算器３５４では、検査行列の各列に対応するバリアブルノードからの６ビットのメッセージ、または検査行列の各行に対応するチェックノードからの６ビットのメッセージがメッセージD355として１つずつ読み込まれると、その下位5ビットである絶対値D402がLUT４０１に、その最上位ビットである符号ビットD401がEXOR回路４１１とFIFOメモリ４１５にそれぞれ供給される。また、ノード計算器３５４では、１つずつ読み込まれた６ビットのメッセージD355がセレクタ４０２に供給される。
【０１９３】
さらに、ノード計算器３５４には、制御部３５６から制御信号D362が供給され、その制御信号D362は、セレクタ４０５とセレクタ４１３に供給される。また、ノード計算器３５４には、制御部３５６から、チェックノード演算またはバリアブルノード演算のうち、いま、ノード計算器３５４で行う演算として一方の選択を表す選択信号D361が供給され、その選択信号D361がセレクタ４０２とセレクタ４１９に供給される。さらに、ノード計算器３５４には、受信用メモリ３５５から受信データD356が供給され、その受信データD356が加算器４１７に供給される。
【０１９４】
まず最初に、検査行列の各行に対応するチェックノードからの６ビットのメッセージ（メッセージuj）が、メッセージD355として１つずつ読み込まれた場合のノード計算器３５４の処理について説明する。このとき、制御部３５６は、チェックノード演算またはバリアブルノード演算のうちの、バリアブルノード演算を、いま、ノード計算器３５４で行う演算として選択し、枝用メモリ３５１または枝用メモリ３５２のうち、チェックノードからの枝に対応するメッセージが格納された枝用メモリ３５２を、メッセージを読み出すメモリとして選択する制御信号D364をセレクタ３５３に供給する。また、制御部３５６は、いま、ノード計算器３５４で行う演算として、バリアブルノード演算を選択しているので、ノード演算を制御するための制御信号D362の値を、ノード計算器３５４が１列に亘るメッセージを読み込む毎に、“０”から“１”に変更する。さらに、制御部３５６は、バリアブルノード演算の選択を表す制御信号D361を、ノード計算器３５４に供給する。
【０１９５】
このように、制御部３５６により、いま、ノード計算器３５４で行う演算として、バリアブルノード演算が選択された場合、ノード計算器３５４は、制御部３５６から供給される、例えば、1ビットの制御信号D362に基づき、枝用メモリ３５１または枝用メモリ３５２から１つずつ読み込まれるメッセージD355を用いて、式（１）にしたがって演算を行う。
【０１９６】
なお、ノード計算器３５４がバリアブルノード演算を行う場合、制御部３５６から供給される制御信号D361に基づいて、セレクタ４０２が、メッセージD355と値D404のうち、値D355を選択し、セレクタ４１９が、値D421と値D419のうち、値D421を選択する。従って、以下の説明では、セレクタ４０２とセレクタ４１９により選択される値の演算についてのみ説明する。
【０１９７】
ノード計算器３５４では、検査行列の各行に対応するチェックノードからの６ビットのメッセージD355（メッセージuj）が１つずつ読み込まれ、6ビットのメッセージD355は、セレクタ４０２を介して、値D405として加算器４０３とFIFOメモリ４０８に供給される。
【０１９８】
加算器４０３は、値D405（uj）とレジスタ４０４に格納されている９ビットの値D406とを加算することにより、値D405を積算し、その結果得られる９ビットの積算値をレジスタ４０４に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD355が積算された場合、レジスタ４０４はリセットされる。
【０１９９】
検査行列の1列に亘るメッセージD355が１つずつ読み込まれ、レジスタ４０４に1列分の値D405が積算された積算値が格納された場合、制御部３５６から供給される制御信号D362は、０から１に変化する。例えば、列の重み（row weight）が「５」である場合、制御信号D362は、１から４クロック目までは、「０」となり、５クロック目では「１」となる。
【０２００】
制御信号D362が「１」の場合、セレクタ４０５は、レジスタ４０４に格納されている値、即ち、検査行列の１列に亘る全ての枝からのメッセージD355（メッセージuj）が積算された９ビットの値D406（ｊ＝１からｊ＝ｄvまでのΣuj）を選択し、値D407として、レジスタ４０６に出力して格納させる。レジスタ４０６は、格納している値D407を、９ビットの値D408として、セレクタ４０５と加算器４０７に供給する。
【０２０１】
制御信号D362が「０」の場合、セレクタ４０５は、レジスタ４０６から供給された値D408を選択し、レジスタ４０６に出力して再格納させる。即ち、検査行列の１列に亘る全ての枝からのメッセージD355（メッセージuj）が積算されるまで、レジスタ４０６は、前回積算されたujを、セレクタ４０５と加算器４０７に供給する。
【０２０２】
一方、FIFOメモリ４０８は、レジスタ４０６から新たな値D408（ｊ＝１からｊ＝ｄvまでのΣuj）が出力されるまでの間、セレクタ４０２が出力した６ビットの値D405（uj）を遅延し、６ビットの値D409として減算器４０７に供給する。減算器４０７は、レジスタ４０６から供給された値D408から、FIFOメモリ４０８から供給された値D409を減算し、その減算結果を、９ビットの減算値D410として、クリップ回路４０９と加算器４１７に供給する。即ち、減算器４０７は、検査行列の1列に亘る全ての枝からのメッセージD355（メッセージuj）の積算値から、求めたい枝からのメッセージD355（メッセージuj）を減算して、その減算値（ｊ＝１からｊ＝ｄv−１までのΣuj）を減算値D410として、加算器４１７に供給する。
【０２０３】
加算器４１７では、減算器４０７から９ビットの減算値D410が供給されるとともに、受信用メモリ３５５から６０ビットの受信値D356が供給される。加算器４１７は、減算値D410（ｊ＝１からｊ＝ｄv−１までのΣuj）に、受信用メモリ３５５から供給された受信データD356（受信値u0i）を加算して、その結果得られる９０ビットの値D420をクリップ回路４１８に供給する。
【０２０４】
クリップ回路４１８は、９ビットの値D420をクリップし、その下位６ビットの値D421（メッセージvi）をセレクタ４１９を介して、メッセージD350として出力する。
【０２０５】
以上のように、制御部３５６により、ノード計算器３５４で行う演算として、バリアブルノード演算が選択された場合、ノード計算器３５４では、式（１）の演算が行われ、メッセージviが求められる。
【０２０６】
次に、検査行列の各列に対応するバリアブルノードからの６ビットのメッセージ（メッセージvi）が、メッセージD355として１つずつ読み込まれた場合のノード計算器３５４の処理について説明する。このとき、制御部３５６は、チェックノード演算またはバリアブルノード演算のうちの、チェックノード演算を、いま、ノード計算器３５４で行う演算として選択し、枝用メモリ３５１または枝用メモリ３５２のうち、バリアブルノードからの枝に対応するメッセージが格納された枝用メモリ３５１を、メッセージを読み出すメモリとして選択する制御信号D364をセレクタ３５３に供給する。また、制御部３５６は、いま、ノード計算器３５４で行う演算として、チェックノード演算を選択しているので、ノード演算を制御するための制御信号D362の値を、ノード計算器３５４が1行に亘るメッセージを読み込む毎に、“０”から“１”に変更する。さらに、制御部３５６は、チェックノード演算の選択を表す制御信号D361を、ノード計算器３５４に供給する。
【０２０７】
このように、制御部３５６により、いま、ノード計算器３５４で行う演算として、チェックノード演算が選択された場合、ノード計算器３５４は、制御部３５６から供給される、例えば、1ビットの制御信号D362に基づき、枝用メモリ３５１または枝用メモリ３５２から１つずつ読み込まれるメッセージD355を用いて、式（７）にしたがって演算を行う。
【０２０８】
なお、ノード計算器３５４がチェックノード演算を行う場合、制御部３５６から供給される制御信号D361に基づいて、セレクタ４０２が、メッセージD355と値D404のうち、値D404を選択し、セレクタ４１９が、値D421と値D419のうち、値D419を選択する。従って、以下の説明では、セレクタ４０２とセレクタ４１９により選択される値の演算についてのみ説明する。
【０２０９】
ノード計算器３５４では、検査行列の各列に対応するバリアブルノードからの６ビットのメッセージD355（メッセージvi）が１つずつ読み込まれ、その下位５ビットである絶対値D402(|vi|)がLUT４０１に、その最上位ビットである符号ビットD401（sign（vi））がEXOR回路４１１とFIFOメモリ４１５にそれぞれ供給される。
【０２１０】
LUT４０１は、絶対値D402(|vi|)に対して、式（７）におけるφ(|vi|)の演算を行った５ビットの演算結果D403（φ(|vi|)）を読み出し、出力する。そして、読み出された演算結果D403において、1ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D404（φ(|vi|)）が、セレクタ４０２を介して、６ビットの値D405として加算器４０３とFIFOメモリ４０８に供給される。
【０２１１】
加算器４０３は、値D405（φ(|vi|)）とレジスタ４０４に格納されている９ビットの値D406とを加算することにより、値D405を積算し、その結果得られる９ビットの積算値をレジスタ４０４に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD355の絶対値D402(|vi|)に対する値D405が積算された場合、レジスタ４０４はリセットされる。
【０２１２】
検査行列の1行に亘るメッセージD355が１つずつ読み込まれ、レジスタ４０４に1行分の値D405が積算された積算値が格納された場合、制御部３５６から供給される制御信号D362は、０から１に変化する。例えば、行の重み（row weight）が「９」である場合、制御信号D362は、１から８クロック目までは、「０」となり、９クロック目では「１」となる。
【０２１３】
制御信号D362が「１」の場合、セレクタ４０５は、レジスタ４０４に格納されている値、即ち、検査行列の１行に亘る全ての枝からのメッセージD355（メッセージvi）から求められたφ(|vi|)が積算された９ビットの値D406（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）を選択し、値D407として、レジスタ４０６に出力して格納させる。レジスタ４０６は、格納している値D407を、９ビットの値D408として、セレクタ４０５と加算器４０７に供給する。
【０２１４】
制御信号D362が「０」の場合、セレクタ４０５は、レジスタ４０６から供給された値D408を選択し、レジスタ４０６に出力して再格納させる。即ち、検査行列の１行に亘る全ての枝からのメッセージD355（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ４０６は、前回積算されたφ(|vi|)を、セレクタ４０５と加算器４０７に供給する。
【０２１５】
一方、FIFOメモリ４０８は、レジスタ４０６から新たな値D408（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）が出力されるまでの間、セレクタ４０２が出力した値D405（φ(|vi|)）を遅延し、６ビットの値D409として減算器４０７に供給する。減算器４０７は、レジスタ４０６から供給された値D408から、FIFOメモリ４０８から供給された値D409を減算し、その減算結果を、９ビットの減算値D410として、クリップ回路４０９と加算器４１７に供給する。即ち、減算器４０７は、検査行列の1行に亘る全ての枝からのメッセージD355（メッセージvi）から求められたφ(|vi|)の積算値から、求めたい枝からのメッセージD355（メッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を減算値D410として、クリップ回路４０９に供給する。
【０２１６】
クリップ回路４０９は、加算器４０７から供給される９ビットの減算値D410をクリップし、その下位５ビットの値D411（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）をLUT４１０に供給する。
【０２１７】
LUT４１０は、値D411（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）に対して、式（７）におけるφ-1（Σφ(|vi|)）の演算を行った５ビットの演算結果D412（φ-1(Σφ(|vi|)))を出力する。
【０２１８】
以上の処理と並行して、EXOR回路４１１は、レジスタ４１２に格納されている１ビットの値D414と符号ビットD401との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、１ビットの乗算結果D413をレジスタ４１２に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD355の符号ビットD401が乗算された場合、レジスタ４１２はリセットされる。
【０２１９】
検査行列の1行に亘る全ての枝からのメッセージD355の符号ビットD401（sign（vi））が乗算された乗算結果D413（ｉ＝１からｄcまでのΠsign(vi)）がレジスタ４１２に格納された場合、制御部３５６から供給される制御信号D362は、「０」から「１」に変化する。
【０２２０】
制御信号D362が「１」の場合、セレクタ４１３は、レジスタ４１２に格納されている値、即ち、検査行列の１行に亘る全ての枝からのメッセージD355の符号ビットD401が乗算された値D414（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）を選択し、１ビットの値D415としてレジスタ４１４に出力して格納させる。レジスタ４１４は、格納している値D415を、１ビットの値D416として、セレクタ４１３とEXOR回路４１６に供給する。
【０２２１】
制御信号D362が「０」の場合、セレクタ４１３は、レジスタ４１４から供給された値D416を選択し、レジスタ４１４に出力して再格納させる。即ち、検査行列の１行に亘る全ての枝からのメッセージD355（メッセージvi）の符号ビットD401が乗算されるまで、レジスタ４１４は、前回格納した値を、セレクタ４１３とEXOR回路４１６に供給する。
【０２２２】
一方、FIFOメモリ４１５は、レジスタ４１４から新たな値D416（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）がEXOR回路４１６に供給されるまでの間、符号ビットD401を遅延し、１ビットの値D417としてEXOR回路４１６に供給する。EXOR回路４１６は、レジスタ４１４から供給された値D416と、FIFOメモリ４１５から供給された値D417との排他的論理和を演算することにより、値D416を、値D417で除算し、１ビットの除算結果を除算値D418として出力する。即ち、EXOR回路４１６は、検査行列の１行に亘る全ての枝からのメッセージD355の符号ビットD401（sign(|vi|)）の乗算値を、求めたい枝からのメッセージD355の符号ビットD401（sign(|vi|)）で除算して、その除算値（ｉ＝１からｉ＝ｄc−１までのΠsign(|vi|)）を除算値D418として出力する。
【０２２３】
LUT４１０から出力された５ビットの演算結果D412を下位５ビットとするとともに、EXOR回路４１６から出力された１ビットの除算値D418を最上位ビットとする合計６ビットの値D419（メッセージuj）がセレクタ４１９を介して、メッセージD350として出力される。
【０２２４】
以上のように、制御部３５６により、ノード計算器３５４で行う演算として、チェックノード演算が選択された場合、ノード計算器３５４では、式（７）の演算が行われ、メッセージujが求められる。
【０２２５】
上述したように、ノード計算器３５４では、バリアブルノード演算とチェックノード演算に必要な共通のブロックを、共有化することにより、バリアブルノード演算とチェックノード演算に必要なブロックを別々に有する場合に比べて、ノード計算器３５４の回路規模を小さくすることができる。
【０２２６】
ここで、図１８のノード計算器３５４では、図１０のチェックノード計算器と図１１のバリアブルノード計算器１０３において、加算器１２２と加算器１５１が、加算器４０３で、レジスタ１２３とレジスタ１５２が、レジスタ４０４０で、セレクタ１２４とセレクタ１５３が、セレクタ４０５で、レジスタ１２５とレジスタ１５４が、レジスタ４０６で、加算器１２６と加減算器１５６の加算部分が、加算器４０７で、FIFOメモリ１２７とFIFOメモリ１５５が、FIFOメモリ４０８で、それぞれ共有化されている。
【０２２７】
なお、ノード計算器３５４では、チェックノード演算が行われるときには、検査行列の各行の行の重みに基づいて、FIFOメモリ４０８とFIFOメモリ４１５における遅延量が、その行の重みの値に減らされ、バリアブルノード演算が行われるときには、検査行列の各列の列の重みに基づいて、FIFOメモリ４０８における遅延量が、その列の重みの値に減らされる。
【０２２８】
図１９は、図１７の復号装置３４０の復号処理を説明するフローチャートである。この処理は、例えば、受信用メモリ３５５に復号すべき受信データが格納されたとき、開始される。なお、図１９において、例えば、バリアブルノード演算の結果得られるメッセージ（メッセージvi）が枝用メモリ３５１に、チェックノード演算の結果得られるメッセージ（メッセージuj）が枝用メモリ３５２に、それぞれ格納されるものとする。但し、メッセージviを枝用メモリ３５２に、メッセージujを枝用メモリ３５１に、それぞれ格納してもよい。
【０２２９】
ステップＳ４１において、制御部３５６は、いま、ノード計算器３５４で行う演算として、バリアブルノード演算とチェックノード演算のうち、バリアブルノード演算を選択し、その選択を表す選択信号D361をノード計算器３５４に供給する。また、制御部３５６は、後述するステップＳ５１で、チェックノード演算の結果得られるメッセージD350（メッセージuj）が格納される枝用メモリ３５２を、ノード計算器３５４に供給するメッセージを読み出すメモリとして選択し、その選択を表す選択信号D364をセレクタ３５３に供給するとともに、枝用メモリ３５１を、後述するステップＳ４５で、バリアブルノードの演算の結果得られるメッセージD350（メッセージvi）を格納する（書き込む）メモリとして選択し、その選択を表す選択信号D363をスイッチ３５０に供給する。
【０２３０】
ステップＳ４１の処理後は、ステップＳ４２に進み、セレクタ３５３は、ステップＳ４１で供給される選択信号D364に基づいて、ノード計算器３５４に、枝用メモリ３５１または枝用メモリ３５２から供給されるメッセージを、メッセージD355として供給する。即ち、ここでは、ステップＳ４１で供給された選択信号D364は、チェックノードからの枝に対応するメッセージが格納された枝用メモリ３５２の選択を表しているので、セレクタ３５３は、枝用メモリ３５２から１つずつ読み出されたメッセージD354(メッセージuj)を、メッセージD355としてノード計算器３５４に供給する。
【０２３１】
なお、受信用メモリ３５５から供給された受信データD356に対して、まだチェックノード演算が行われておらず、枝用メモリ３５２にメッセージD352が格納されていない場合、ノード計算器３５４は、メッセージujを初期値に設定する。
【０２３２】
ステップＳ４２の処理後は、ステップＳ４３に進み、ノード計算器３５４は、バリアブルノード演算を行う。即ち、ノード計算器３５４には、受信用メモリ３５５から受信データD356が供給されるとともに、制御部３５６から制御信号D362が供給される。ノード計算器３５４は、制御信号D362に基づいて、受信データD356とステップＳ４２でセレクタ３５３から供給されたメッセージD355とを用いて、上述した式（１）にしたがってバリアブルノードの演算を行う。
【０２３３】
即ち、ノード計算器３５４は、制御信号D362にしたがい、セレクタ３５３を介して、枝用メモリ３５２から必要なメッセージD354（D355）を読み出すとともに、受信用メモリ３５５から供給された受信データD356を用いて、バリアブルノード演算を行う。
【０２３４】
ステップＳ４３の処理後は、ステップＳ４４に進み、ノード計算器３５４は、バリアブルノード演算の結果得られるメッセージD350（メッセージvi）をスイッチ３５０に出力し、ステップＳ４５に進む。
【０２３５】
ステップＳ４５において、スイッチ３５０は、ステップＳ４１で供給された、メッセージD350を格納するメモリとして、枝用メモリ３５１と枝用メモリ３５２のうち一方の選択を表す選択信号D363に基づいて、ノード計算器３５４から出力されるメッセージD350を、枝用メモリ３５１または枝用メモリ３５２に格納する。ここでは、選択信号D363は、メッセージD350を格納するメモリとして、枝用メモリ３５１の選択を表しているので、スイッチ３５０は、ステップＳ４４で出力されたバリアブルノード演算の結果得られるメッセージD350を、メッセージD351として枝用メモリ３５１に格納する。即ち、スイッチ３５０は、枝用メモリ３５１と枝用メモリ３５２のうち、ノード計算器３５４に供給するメッセージを読み出すメモリとして選択された枝用メモリではない方のメモリに、メッセージD350を書き込む。
【０２３６】
ステップＳ４５の処理後は、ステップＳ４６に進み、制御部３５６は、ノード計算器３５４により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ４２に戻り、上述した処理を繰り返す。
【０２３７】
一方、ステップＳ４６において、制御部３５６は、ノード計算器３５４により、全枝数のメッセージが演算されたと判定した場合、ステップＳ４７に進み、制御部３５６は、いま、ノード計算器３５４で行う演算として、チェックノード演算を選択し、ステップＳ４１で生成したバリアブルノード演算の選択を表す制御信号D361を、チェックノード演算の選択を表す制御信号D361に変更する。また、制御部３５６は、ステップＳ４５で、バリアブルノード演算の結果得られるメッセージ（メッセージvi）が格納された枝用メモリ３５１を、ノード計算器３５４に供給するメッセージを読み出すメモリとして選択し、その選択を表す選択信号D364をセレクタ３５３に供給するとともに、枝用メモリ３５２を、後述するステップＳ５１で、チェックノードの演算の結果得られるメッセージD350（メッセージuj）を格納する（書き込む）メモリとして選択し、その選択を表す選択信号D363をスイッチ３５０に供給する。
【０２３８】
ステップＳ４７の処理後は、ステップＳ４８に進み、セレクタ３５３は、ステップＳ４７で供給される選択信号D364に基づいて、ノード計算器３５４に、枝用メモリ３５１または枝用メモリ３５２から供給されるメッセージを、メッセージD355として供給する。即ち、ここでは、ステップＳ４７で供給された選択信号D364は、バリアブルノードからの枝に対応するメッセージが格納された枝用メモリ３５１の選択を表しているので、セレクタ３５３は、枝用メモリ３５１から１つずつ読み出されたメッセージD353(メッセージvi)を、メッセージD355としてノード計算器３５４に供給する。
【０２３９】
ステップＳ４８の処理後は、ステップＳ４９に進み、ノード計算器３５４は、チェックノード演算を行う。即ち、ノード計算器３５４には、制御信号D362が供給される。ノード計算器３５４は、制御信号D362に基づいて、ステップＳ４８でセレクタ３５３から供給されたメッセージD355を用いて、上述した式（７）にしたがってチェックノードの演算を行う。
【０２４０】
即ち、制御部３５６により、いま、ノード計算器３５４で行う演算として、チェックノード演算が選択された場合、制御部３５６がノード計算器３５４に供給する制御信号D362は、前述の図１０で説明した制御信号D106に対応するものであり、ノード計算器３５４は、制御信号D362にしたがい、セレクタ３５３を介して、枝用メモリ３５１から必要なメッセージD353（D355）を読み出しながらチェックノードの演算を行う。
【０２４１】
ステップＳ４９の処理後は、ステップＳ５０に進み、ノード計算器３５４は、チェックノード演算の結果得られるメッセージD350（メッセージuj）をスイッチ３５０に出力し、ステップＳ５１に進む。
【０２４２】
ステップＳ５１において、スイッチ３５０は、ステップＳ４７で供給された、メッセージD350を格納するメモリとして、枝用メモリ３５１と枝用メモリ３５２のうち一方の選択を表す選択信号D363に基づいて、ノード計算器３５４から出力されるメッセージD350を、枝用メモリ３５１または枝用メモリ３５２に格納する。ここでは、選択信号D363は、メッセージD350を格納するメモリとして、枝用メモリ３５２の選択を表しているので、スイッチ３５０は、ステップＳ５０で出力されたチェックノード演算の結果得られるメッセージD350を、メッセージD352として枝用メモリ３５２に格納する。即ち、スイッチ３５０は、枝用メモリ３５１と枝用メモリ３５２のうち、ノード計算器３５４に供給するメッセージを読み出すメモリとして選択された枝用メモリではない方のメモリに、メッセージD350を書き込む。
【０２４３】
ステップＳ５１の処理後は、ステップＳ５２に進み、制御部３５６は、ノード計算器３５４により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ４８に戻り、上述した処理を繰り返す。
【０２４４】
一方、ステップＳ５２において、制御部３５６は、ノード計算器３５４により、全枝数のメッセージが演算されたと判定した場合、処理を終了する。
【０２４５】
なお、復号装置３４０は、復号回数だけ図１９の復号処理を繰り返し行ない、枝用メモリ３５２に、最後のチェックノード演算の結果得られるメッセージD350（メッセージuj）が格納された場合、枝用メモリ３５２は、そのメッセージD350を上述した式（５）の演算を行う不図示のブロックに供給する。不図示のブロックには、さらに、受信用メモリ３５５から受信データD356が供給され、不図示のブロックは、メッセージD350と受信データD356を用いて、式（５）の演算を行い、その演算結果を最終的な復号結果として出力する。
【０２４６】
上述したように、ノード計算器３５４では、バリアブルノード演算とチェックノード演算の両方の演算が行われる。即ち、バリアブルノード演算は、チェックノード演算の結果であるメッセージujを用いて行われ、チェックノード演算は、バリアブルノード演算の結果であるメッセージviを用いて行われるため、復号装置３４０では、バリアブルノード演算とチェックノード演算が交互に行われる。ノード計算器３５４では、バリアブルノード演算とチェックノード演算に必要な共通のブロックを共有化し、バリアブルノード演算とチェックノード演算を交互に行うことにより、バリアブルノード計算器とチェックノード計算器を共有化して１つのノード計算器にすることができ、バリアブルノード演算を行うバリアブルノード計算器１０１とチェックノード計算器１０３とを別々に有する図９の復号装置に比べて、復号装置３４０の回路規模を小さくすることができる。
【０２４７】
図２０は、本発明を適用した復号装置の、さらに他の一実施の形態の構成例を示すブロック図である。
【０２４８】
なお、図２０では、LDPC符号の１回の復号を行う復号装置４３０の例を示している。繰り返し復号は、復号装置４３０を複数個縦列に接続して用いるか、あるいは、復号装置４３０を繰り返し用いることにより行うことができる。
【０２４９】
復号装置４３０では、図１７の枝用メモリ３５１と枝用メモリ３５２が１つの枝用メモリ４４０で共有化され、ノード計算器３５４のバリアブルノード演算またはチェックノード演算の結果得られるメッセージが、１つの枝用メモリ４４０に格納される。
【０２５０】
復号装置４３０は、ノード計算器３５４、受信用メモリ３５５、枝用メモリ４４０、および制御部４４１から構成される。即ち、復号装置４３０は、図１７の復号装置３４０の枝用メモリ３５１と枝用メモリ３５２を共有化して枝用メモリ４４０にし、スイッチ３５０とセレクタ３５３を削除したものである。
【０２５１】
なお、図１７と同一の符号を付したもの、即ち、図２０の復号装置４３０のノード計算器３５４と受信用メモリ３５５は、図１７のそれらと同一のものであり、説明は繰り返しになるので省略する。
【０２５２】
枝用メモリ４４０には、ノード計算器３５４から、ノード計算器３５４によるチェックノード演算、またはバリアブルノード演算の結果得られる枝に対応するメッセージD440が供給され、枝用メモリ４４０は、ノード計算器３５４から供給されたメッセージD440を格納（記憶）し、既に格納してあるメッセージD441をノード計算器３５４に供給する。
【０２５３】
即ち、枝用メモリ４４０は、ノード計算器３５４から供給され、ノード計算器３５４がバリアブルノード演算、またはチェックノード演算を行う順番に格納してあるメッセージD440を１つずつ読み出し、メッセージD441として、ノード計算器３５４に供給すると同時に、ノード計算器３５４が出力するメッセージD440を受信し、枝用メモリ４４０の既に読み出されたメッセージ（メッセージD441）が記憶されていたアドレスに書き込む。即ち、枝用メモリ４４０は、ノード計算器３５４に供給するメッセージD441の読み出しと、ノード計算器３５４から供給されるメッセージD440の書き込みとを、同時に行う。
【０２５４】
なお、枝用メモリ４４０には、ノード計算器３５４のバリアブルノード演算、またはチェックノード演算により演算された枝に対応するメッセージが格納されるので、枝用メモリ４４０に格納されるデータ量、即ち、枝用メモリ４４０に必要とされる記憶容量は、メッセージの量子化ビット数と、全枝数との乗算値となる。
【０２５５】
また、枝用メモリ４４０は、読み出しと書き込みが同時に可能な、例えば、デュアルポートRAMで構成することができる。
【０２５６】
制御部４４１は、図１７で説明したノード計算器３５６と同様に、いま、ノード計算器３５４で行う演算として、バリアブルノード演算とチェックノード演算のうち一方を選択する選択信号D361と、制御信号D362をノード計算器３５４に供給することにより、ノード計算器３５４を制御する。
【０２５７】
図２１は、図２０の復号装置４３０の復号処理を説明するフローチャートである。この処理は、例えば、受信用メモリ３５５に復号すべき受信データが格納されたとき、開始される。
【０２５８】
ステップＳ６１において、制御部４４１は、いま、ノード計算器３５４で行う演算として、バリアブルノード演算とチェックノード演算のうち、バリアブルノード演算を選択し、その選択を表す選択信号D361をノード計算器３５４に供給する。
【０２５９】
ステップＳ６１の処理後は、ステップＳ６２に進み、ノード計算器３５４は、バリアブルノード演算を行う。即ち、ノード計算器３５４には、受信用メモリ３５５から受信データD356が供給されるとともに、枝用メモリ４４０から、後述するステップＳ６７で格納されたメッセージD440（メッセージuj）が、メッセージD441として供給される。また、ノード計算器３５４には、制御部４４１から制御信号D362が供給される。そして、ノード計算器３５４は、前述した図１９のステップＳ４３と同様に、制御信号D362に基づいて、受信データD356とメッセージD355とを用いて、上述した式（１）にしたがってバリアブルノードの演算を行う。
【０２６０】
なお、受信用メモリ３５５から供給された受信データD356に対して、まだチェックノード演算が行われておらず、枝用メモリ４４０にメッセージD440が格納されていない場合、ノード計算器３５４は、バリアブルノード演算に用いるメッセージを初期値に設定する。
【０２６１】
ステップＳ６２の処理後は、ステップＳ６３に進み、ノード計算器３５４は、バリアブルノード演算の結果得られるメッセージ（メッセージvi）D440を枝用メモリ４４０に格納し、ステップＳ６４に進む。
【０２６２】
ステップＳ６４において、制御部４４１は、ノード計算器３５４により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ６２に戻り、上述した処理を繰り返す。
【０２６３】
一方、ステップＳ６４において、制御部４４１は、ノード計算器４４２により、全枝数のメッセージが演算されたと判定した場合、ステップＳ６５に進み、制御部４４１は、いま、ノード計算器３５４で行う演算として、チェックノード演算を選択し、ステップＳ６１で生成したバリアブルノード演算の選択を表す制御信号D361を、チェックノードの選択を表す制御信号D361に変更する。
【０２６４】
ステップＳ６５の処理後は、ステップＳ６６に進み、ノード計算器３５４は、チェックノード演算を行う。即ち、ノード計算器３５４には、枝用メモリ４４０からステップＳ６３で格納されたメッセージD440（メッセージvi）がメッセージD441として供給されるとともに、制御部４４１から制御信号D362が供給される。ノード計算器３５４は、前述した図１９のステップＳ４９と同様に、制御信号D362に基づいて、枝用メモリ４４０から供給されたメッセージD441を用いて、上述した式（７）にしたがってチェックノードの演算を行う。
【０２６５】
ステップＳ６６の処理後は、ステップＳ６７に進み、ノード計算器３５４は、チェックノード演算の結果得られるメッセージ（メッセージuj）D440を枝用メモリ４４０に格納し、ステップＳ６８に進む。
【０２６６】
ステップＳ６８において、制御部４４１は、ノード計算器３５４により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ６６に戻り、上述した処理を繰り返す。
【０２６７】
一方、ステップＳ６８において、制御部４４１は、ノード計算器３５４により、全枝数のメッセージが演算されたと判定した場合、処理を終了する。
【０２６８】
なお、復号装置４３０は、復号回数だけ図２１の復号処理を繰り返し行ない、枝用メモリ４４０に、最後のチェックノード演算の結果得られるメッセージD440（メッセージuj）が格納された場合、枝用メモリ４４０は、そのメッセージD440を上述した式（５）の演算を行う不図示のブロックに供給する。不図示のブロックには、さらに、受信用メモリ３５５から受信データD356が供給され、不図示のブロックは、メッセージD440と受信データD356を用いて、式（５）の演算を行い、その演算結果を最終的な復号結果として出力する。
【０２６９】
このように、復号装置４３０では、計算器を共有化し、さらに枝用メモリを共有化するので、枝用メモリを共有化した図１５に示す復号装置３００や計算器を共有化した図１７の復号装置３４０よりも、さらに回路規模を小さくすることができる。
【０２７０】
なお、枝用メモリ４４０は、デュアルポートRAMではなく、複数個のシングルポートRAMから構成されるようにしてもよい。この場合、１つのシングルポートRAMへの読み出しと書き込みが同時に重ならないように制御を行う必要がある。複数個のシングルポートRAMを用いた場合、デュアルポートRAMを用いる場合に比べて、復号装置４３０の回路規模を小さくすることができる。
【０２７１】
ところで、図１５乃至図２１では、メッセージを１つずつ復号する復号装置の例を示したが、計算器の共有化、メモリの共有化は、メッセージをＰ個（複数個）ずつ同時に復号する復号装置にも適用することができる。以下、メッセージをＰ個ずつ同時に復号する復号装置について説明する。
【０２７２】
図２２は、５×５の行列の単位に間隔を空けた３０×９０の検査行列の例を示している。なお、図２２の検査行列自体は、図８に示した検査行列と同一である。
【０２７３】
図２２においては、検査行列は、５×５の単位行列、その単位行列のコンポーネントである１のうち１個以上が０になった行列（以下、適宜、準単位行列という）、単位行列または準単位行列をサイクリックシフト(cyclic shift)した行列（以下、適宜、シフト行列という）、単位行列、準単位行列、またはシフト行列のうちの２以上（複数）の和（以下、適宜、和行列という）、５×５の０行列の組み合わせで表わされている。なお、図２２の検査行列で表現されるLDPC符号は、符号化率2/3、符号長90である。
【０２７４】
図２２の検査行列は、５×５の単位行列、準単位行列、シフト行列、和行列、０行列で構成されているということができる。そこで、検査行列を構成する、これらの５×５の行列を、以下、適宜、構成行列という。
【０２７５】
図２３は、図２２の検査行列で表現されるLDPC符号を復号する復号装置の構成例を示している。
【０２７６】
図２３の復号装置５００は、スイッチ５１０および５１５、６つのFIFO５１１1乃至５１１6からなる枝データ格納メモリ５１１、セレクタ５１２、５つのチェックノード計算器５１３1乃至５１３5からなるチェックノード計算部５１３、２つのサイクリックシフト回路５１４および５２０、１８個のFIFO５１６1乃至５１６18からなる枝データ格納メモリ５１６、セレクタ５１７、受信情報を格納する受信データ用メモリ５１８、バリアブルノード計算部５１９、制御部５２１から構成される。
【０２７７】
この復号装置５００の各部について詳細に説明する前に、まず、枝データ格納メモリ５１１と５１６へのデータの格納方法について説明する。
【０２７８】
枝データ格納メモリ５１１は、検査行列の行数３０を構成行列の行数５で除算した数である６つのFIFO５１１1乃至５１１6から構成されている。FIFO５１１y（ｙ＝１，２，・・・，６）は、構成行列の行数および列数である５つの枝に対応するメッセージを同時に読み出しもしくは書き込むことができるようになっており、その長さ（段数）は、検査行列の行方向の１の数（ハミング重み）の最大数である９になっている。
【０２７９】
FIFO５１１1には、図２２の検査行列の第１行目から第５行目までの１の位置に対応するデータが、各行共に横方向に詰めた形に（０を無視した形で）格納される。すなわち、第ｊ行第ｉ列を、(j,i)と表すこととすると、FIFO５１１1の第１の要素（第１段）には、検査行列の(1,1)から(5,5)の５×５の単位行列の１の位置に対応するデータが格納される。第２の要素には、検査行列の(1,21)から(5,25)のシフト行列（５×５の単位行列を右方向に３つだけサイクリックシフトしたシフト行列）の１の位置に対応するデータが格納される。第３から第８の要素も同様に検査行列と対応づけてデータが格納される。そして、第９の要素には、検査行列の(1,86)から(5,90)のシフト行列（５×５の単位行列のうちの１行目の１を０に置き換えて１つだけ左にサイクリックシフトしたシフト行列）の１の位
置に対応するデータが格納される。ここで、検査行列の(1,86)から(5,90)のシフト行列においては、１行目に１がないため、FIFO５１１1の１行目のみ要素数は８、残りの行は要素数が９となる。
【０２８０】
FIFO５１１2には、図２２の検査行列の第６行目から第１０行目までの１の位置に対応するデータが格納される。すなわち、FIFO５１１2の第１の要素には、検査行列の(6,1)から(10,5)の和行列（５×５の単位行列を右に１つだけサイクリックシフトした第１のシフト行列と、右に２つだけサイクリックシフトした第２のシフト行列の和である和行列）を構成する第１のシフト行列の１の位置に対応するデータが格納される。また、第２の要素には、検査行列の(6,1)から(10,5)の和行列を構成する第２のシフト行列の１の位置に対応するデータが格納される。
【０２８１】
即ち、重みが２以上の構成行列については、その構成行列を、重みが１であるP×Pの単位行列、そのコンポーネントである１のうち１個以上が０になった準単位行列、または単位行列もしくは準単位行列をサイクリックシフトしたシフト行列のうちの複数の和の形で表現したときの、その重みが１の単位行列、準単位行列、またはシフト行列の１の位置に対応するデータ（単位行列、準単位行列、またはシフト行列に属する枝に対応するメッセージ）は、同一アドレス（FIFO５１１1乃至５１１6のうちの同一のFIFO）に格納される。
【０２８２】
以下、第３から第９の要素についても、検査行列に対応づけてデータが格納される。FIFO５１１2は全行共に要素数は９となる。
【０２８３】
FIFO５１１3乃至５１１6も同様に検査行列に対応づけてデータを格納し、各FIFO５１１3乃至５１１6それぞれの長さは９である。
【０２８４】
枝データ格納メモリ５１６は、検査行列の列数９０を、構成行列の列数である５で割った１８個のFIFO５１６1乃至５１６18から構成されている。FIFO５１６x（ｘ＝１，２，・・・，１８）は、構成行列の行数および列数である５つの枝に対応するメッセージを同時に読み出しもしくは書き込むことができるようになっている。
【０２８５】
FIFO５１６1には、図２２の検査行列の第１列目から第５列目までの１の位置に対応するデータが、各列共に縦方向に詰めた形に（０を無視した形で）格納される。すなわち、FIFO５１６1の第１の要素（第１段）には、検査行列の(1,1)から(5,5)の５×５の単位行列の１の位置に対応するデータが格納される。第２の要素には、検査行列の(6,1)から(10,5)の和行列（５×５の単位行列を右に１つだけサイクリックシフトした第１のシフト行列と、右に２つだけサイクリックシフトした第２のシフト行列との和である和行列）を構成する第１のシフト行列の１の位置に対応するデータが格納される。また、第３の要素には、検査行列の(6,1)から(10,5)の和行列を構成する第２のシフト行列の１の位置に対応するデータが格納される。
【０２８６】
即ち、重みが２以上の構成行列については、その構成行列を、重みが１であるP×Pの単位行列、そのコンポーネントである１のうち１個以上が０になった準単位行列、または単位行列もしくは準単位行列をサイクリックシフトしたシフト行列のうちの複数の和の形で表現したときの、その重みが１の単位行列、準単位行列、またはシフト行列の１の位置に対応するデータ（単位行列、準単位行列、またはシフト行列に属する枝に対応するメッセージ）は、同一アドレス（FIFO５１６1乃至５１６18のうちの同一のFIFO）に格納される。
【０２８７】
以下、第４および第５の要素についても、検査行列に対応づけて、データが格納される。このFIFO５１６1の要素数（段数）は、検査行列の第１列から第５列における行方向の１の数（ハミング重み）の最大数である５になっている。
【０２８８】
FIFO５１６2と５１６3も同様に検査行列に対応づけてデータを格納し、それぞれの長さ（段数）は、５である。FIFO５１６4乃至５１６12も同様に検査行列に対応づけてデータを格納し、それぞれの長さは３である。FIFO５１６13乃至５１６18も同様に検査行列に対応づけてデータを格納し、それぞれの長さは２である。但し、FIFO５１６18の第１の要素は、検査行列の(1,86)から(5,90)に相当し、第５列目（検査行列の(1,90)から(5,90)）に１がないため、データは格納されない。
【０２８９】
以下、図２３の復号装置５００の各部の動作について詳細に説明する。
【０２９０】
スイッチ５１０には、サイクリックシフト回路５２０から５つのメッセージ（データ）D519が供給されるとともに、制御部５２１から検査行列のどの行に属するかの情報（Matrixデータ）を表す制御信号D520が供給される。制御信号D520にしたがって、５つのメッセージ（データ）D519を格納するFIFOを、FIFO５１１1乃至５１１6の中から選択し、選択したFIFOに５つのメッセージデータD519をまとめて順番に供給していく。
【０２９１】
枝データ格納メモリ５１１は、６つのFIFO５１１1乃至５１１6からなる。枝データ格納メモリ５１１のFIFO５１１1乃至５１１6には、スイッチ５１０から、５つのメッセージD519がまとめて順番に供給され、FIFO５１１1乃至５１１6は、５つのメッセージD519をまとめて順番に格納していく。また、枝データ格納メモリ５１１は、データを読み出す際には、FIFO５１１1から５つのメッセージ（データ）D5111を順番に読み出し、次段のセレクタ５１２に供給する。枝データ格納メモリ５１１は、FIFO５１１1からのメッセージD5111の読み出しの終了後、FIFO５１１2乃至５１１6からも、順番に、メッセージD5111乃至D5116をそれぞれ読み出し、セレクタ５１２に供給する。
【０２９２】
セレクタ５１２には、制御部５２１から、FIFO５１１1乃至５１１6のうち、メッセージデータを読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D521が供給されるとともに、枝データ格納メモリ５１１から５つのメッセージ（データ）D5111乃至D5116が供給される。セレクタ５１２は、選択信号D521にしたがって、FIFO５１１1乃至５１１6のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給された５つのメッセージデータを、メッセージD512として、チェックノード計算部５１３に供給する。
【０２９３】
チェックノード計算部５１３は、５つのチェックノード計算器５１３1乃至５１３5からなる。チェックノード計算部５１３には、セレクタ５１２を介して５つのメッセージD512が供給され、そのメッセージD512が、チェックノード計算器５１３1乃至５１３5のそれぞれに１つずつ供給される。また、チェックノード計算部５１３には、制御部５２１から制御信号D522が供給され、その制御信号D522が、チェックノード計算器５１３1乃至５１３5に供給される。チェックノード計算器５１３1乃至５１３5は、それぞれメッセージD512を用いて、式（７）にしたがって演算を行い、その演算の結果メッセージD513を得る。チェックノード計算部５１３は、チェックノード計算器５１３1乃至５１３5による演算の結果得られる５つのメッセージD513をサイクリックシフト回路５１４に供給する。
【０２９４】
ここで、制御部５２１からチェックノード計算部５１３に供給される制御信号D522は、図１０の制御信号D106に対応するものであり、チェックノード計算部５１３1乃至５１３5それぞれは、図１０に示したチェックノード計算器１０１と同様に構成される。
【０２９５】
サイクリックシフト回路５１４には、チェックノード計算部５１３で計算された５つのメッセージD513が供給されるとともに、制御部５２１から、そのメッセージD513に対応する枝が検査行列において元となる単位行列を幾つサイクリックシフトしたものであるかの情報（Matrixデータ）を表す制御信号D523が供給される。サイクリックシフト回路５１４は、制御信号D523を元に、５つのメッセージD513を並べ替えるサイクリックシフトを行い、その結果をメッセージD514として、スイッチ５１５に供給する。
【０２９６】
スイッチ５１５には、サイクリックシフト回路５１４から供給される５つのメッセージ（データ）D514が検査行列のどの列に属するかの情報を表す制御信号D524が供給されるとともに、サイクリックシフト回路５１４から、メッセージD514が供給される。スイッチ５１５は、制御信号D524にしたがって、メッセージD514を格納するFIFOを、FIFO５１６1乃至５１６18の中から選択し、選択したFIFOに５つのメッセージD514をまとめて順番に供給していく。
【０２９７】
枝データ格納メモリ５１６は、１８個のFIFO５１６1乃至５１６18からなる。枝データ格納メモリ５１６のFIFO５１６1乃至５１６18には、スイッチ５１５から５つのメッセージD514がまとめて順番に供給され、FIFO５１６1乃至５１６18は、その５つのメッセージD514をまとめて順番に格納していく。また、枝データ格納メモリ５１６は、データを読み出す際には、FIFO５１６1から５つのメッセージD5151を順番に読み出し、次段のセレクタ５１７に供給する。枝データ格納メモリ５１６は、FIFO５１６1からのデータの読み出しの終了後、FIFO５１６2乃至５１６18からも、順番に、メッセージD5152乃至D51518を読み出し、セレクタ５１７に供給する。
【０２９８】
セレクタ５１７には、制御部５２１からFIFO５１６1乃至５１６18のうち、メッセージデータを読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D525が供給されるとともに、枝データ格納メモリ５１６からメッセージデータD5151乃至D51518が供給される。セレクタ５１７は、選択信号D525にしたがって、FIFO５１６1乃至５１６18のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給される５つのメッセージデータを、メッセージD516として、バリアブルノード計算部５１９に供給する。
【０２９９】
一方、受信データ用メモリ５１８は、通信路を通して受信した受信信号から、受信LLR（対数尤度比）を計算しており、その計算した受信LLRを５つまとめて受信データD517としてバリアブルノード計算部５１９に供給する。
【０３００】
バリアブルノード計算部５１９は、５つのバリアブルノード計算器５１９1乃至５１９5からなる。バリアブルノード計算部５１９には、セレクタ５１７を介して５つのメッセージD516が供給され、そのメッセージD516が、バリアブルノード計算器５１９1乃至５１９5のそれぞれに１つずつ供給される。また、バリアブルノード計算部５１９には、受信データ用メモリ５１８から５つの受信データD517が供給され、その受信データD517が、バリアブルノード計算器５１９1乃至５１９5のそれぞれに１つずつ供給される。さらに、バリアブルノード計算部５１９には、制御部５２１から制御信号D526が供給され、その制御信号D526がバリアブルノード計算器５１９1乃至５１９5に供給される。
【０３０１】
バリアブルノード計算器５１９1乃至５１９5は、メッセージD516と受信データD517とを用いて、式（１）にしたがって、それぞれ演算を行い、その演算の結果メッセージD518を得る。バリアブルノード計算部５１９は、バリアブルノード計算器５１９1乃至５１９5の結果得られる５つのメッセージD518を、サイクリックシフト回路５２０に供給する。
【０３０２】
ここで、制御部５２１からバリアブルノード計算部５１９に供給される制御信号D526は、図１１の制御信号D107に対応するものであり、バリアブルノード計算器５１９1乃至５１９5それぞれは、図１１のバリアブルノード計算器１０３と同様に構成される。
【０３０３】
サイクリックシフト回路５２０には、バリアブルノード計算部５１９から５つのメッセージD518が供給されるとともに、制御部５２１から、そのメッセージD518に対応する枝が検査行列において元となる単位行列を幾つサイクリックシフトしたものであるかの情報を表す制御信号D527が供給される。サイクリックシフト回路５２０は、制御信号D527を元に、メッセージD527を並べ替えるサイクリックシフトを行い、その結果をメッセージD519として、スイッチ５１０に供給する。
【０３０４】
なお、制御部５２１は、制御信号D520、選択信号D521、制御信号D522乃至D524、選択信号D525、制御信号D526とD527を、スイッチ５１０、セレクタ５１２、チェックノード計算部５１３、サイクリックシフト回路５１４、スイッチ５１５、セレクタ５１７、バリアブルノード計算部５１９、サイクリックシフト回路５２０にそれぞれ供給することにより、それぞれを制御する。
【０３０５】
以上の動作を一巡することで、LDPC符号の１回の復号を行うことができる。図２３の復号装置５００は、所定の回数だけLDPC符号を復号した後、図示しないが、式（５）にしたがって最終的な復号結果を求めて出力する。
【０３０６】
なお、枝データ（枝に対応するメッセージ）が欠けている箇所に関しては、メモリ格納時（枝データ格納メモリ５１１と５１６へのデータ格納時）には、何のメッセージも格納せず、また、ノード演算時（チェックノード計算部５１３でのチェックノード演算時とバリアブルノード計算部５１９でのバリアブルノード演算時）にも何の演算も行わない。
【０３０７】
図２４は、本発明を適用した図２２の検査行列Hで表現されるLDPC符号を復号する復号装置の一実施の形態の構成例を示している。
【０３０８】
図２４の復号装置５３０では、図２３のサイクリックシフト回路５１４および５２０が共有化され、１つのサイクリックシフト回路５５１となっている。
【０３０９】
復号装置５３０は、３つのスイッチ５４０、５４１、および５４６、１８個のFIFO５４２1乃至５４２18からなる枝データ格納メモリ５４２、セレクタ５４３、受信情報を格納する受信データ用メモリ５４４、５つのバリアブルノード計算器５４５1乃至５４５5からなるチェックノード計算部５４５、６つのFIFO５４７1乃至５４７6からなる枝データ格納メモリ５４７、セレクタ５４８、５つのチェックノード計算器５４９1乃至５４９6からなるチェックノード計算部５４９、セレクタ５５０、サイクリックシフト回路５５１、制御部５５２から構成される。
【０３１０】
スイッチ５４０には、サイクリックシフト回路５５１から５つのメッセージデータD550が供給されるとともに、制御部５５２から、バリアブルノード計算部５４５またはチェックノード計算部５４９のうち、いま、演算が行われる計算部として一方の選択を表す選択信号D551が供給される。スイッチ５４０は、選択信号D551に基づいて、スイッチ５４１とスイッチ５４６のうち一方を、メッセージデータD550を供給するスイッチとして選択し、その選択したスイッチにメッセージデータD550を供給する。
【０３１１】
スイッチ５４１には、スイッチ５４０からメッセージデータD550が供給されるとともに、制御部５５２から検査行列のどの列に属するかの情報（Matrixデータ）を表す制御信号D552が供給される。スイッチ５４１は、制御信号D552にしたがって、５つのメッセージD550を格納するFIFOを、枝データ格納メモリ５４２のFIFO５４２1乃至５４２18の中から選択し、選択したFIFOに５つのメッセージD550をまとめて順番に供給していく。
【０３１２】
枝データ格納メモリ５４２は、図２３の枝データ格納メモリ５１６と同様に、１８個のFIFO５４２1乃至５４２18からなる。枝データ格納メモリ５４２のFIFO５４２1乃至５４２18には、スイッチ５４１から５つのメッセージD550がまとめて順番に供給され、FIFO５４２1乃至５４２18は、その５つのメッセージD550をまとめて順番に格納していく。また、枝データ格納メモリ５４２は、データを読み出す際には、FIFO５４２1から５つのメッセージD5421を順番に読み出し、セレクタ５４３に供給する。枝データ格納メモリ５４２は、FIFO５４２1からのデータの読み出しの終了後、FIFO５４２2乃至５４２18からも、順番に、メッセージD5422乃至D54218を読み出し、セレクタ５４３に供給する。
【０３１３】
セレクタ５４３には、制御部５５２からFIFO５４２1乃至５４２18のうち、メッセージデータを読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D553が供給されるとともに、枝データ格納メモリ５４２からメッセージ（データ）D5421乃至D54218が供給される。セレクタ５４３は、図２３のセレクタ５１７と同様に、制御部５２１から供給される選択信号D553にしたがって、FIFO５４２1乃至５４２18のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給される５つのメッセージデータを、メッセージ（データ）D543として、バリアブルノード計算部５４５に供給する。
【０３１４】
一方、受信データ用メモリ５４４は、通信路を通して受信した受信信号から、受信LLR（対数尤度比）を計算しており、その計算した受信LLRを５つまとめて受信データD544としてバリアブルノード計算部５４５に供給する。
【０３１５】
バリアブルノード計算部５４５は、図２３のバリアブルノード計算部５１９と同様に、５つのバリアブルノード計算器５４５1乃至５４５5からなる。バリアブルノード計算部５４５には、セレクタ５４３を介して５つのメッセージD543が供給され、そのメッセージD543が、バリアブルノード計算器５４５1乃至５４５5のそれぞれに１つずつ供給される。また、バリアブルノード計算部５４５には、受信データ用メモリ５４４から５つの受信データD544が供給され、その受信データD544が、バリアブルノード計算器５４５1乃至５４５5のそれぞれに１つずつ供給される。さらに、バリアブルノード計算部５４５には、制御部５５２から制御信号D554が供給され、その制御信号D554がバリアブルノード計算器５４５1乃至５４５5に供給される。
【０３１６】
バリアブルノード計算器５４５1乃至５４５5は、メッセージD543と受信データD544とを用いて、式（１）にしたがって、それぞれ演算を行い、その演算の結果、メッセージD545を得る。即ち、バリアブルノード計算部５４５は、LDPC符号の復号のための５個のバリアブルノードの演算を行い、その演算の結果、５つのメッセージD545を同時に求める。そして、バリアブルノード計算部５４５は、バリアブルノード計算器５４５1乃至５４５5の結果得られる５つのメッセージD545を、セレクタ５５０に供給する。
【０３１７】
ここで、制御部５５２からバリアブルノード計算部５４５に供給される制御信号D554は、図１１の制御信号D107に対応するものであり、バリアブルノード計算器５４５1乃至５４５5それぞれは、図１１のバリアブルノード計算器１０３と同様に構成される。
【０３１８】
スイッチ５４６には、スイッチ５４０から、５つのメッセージ（データ）D550が供給されるとともに、そのメッセージ（データ）D550が検査行列のどの行に属するかの情報を表す制御信号D555が制御部５５２から供給される。スイッチ５４６は、制御部５５２から供給される制御信号D555にしたがって、メッセージD550を格納するFIFOを、枝データ格納メモリ５４７のFIFO５４７1乃至５４７18の中から選択し、選択したFIFOに５つのメッセージD550をまとめて順番に供給していく。
【０３１９】
枝データ格納メモリ５４７は、図２３の枝データ格納メモリ５１１と同様に、６つのFIFO５４７1乃至５４７18からなる。枝データ格納メモリ５４７のFIFO５４７1乃至５４７6には、スイッチ５４６から、５つのメッセージD550がまとめて順番に供給され、FIFO５４７1乃至５４７6は、５つのメッセージD550をまとめて順番に格納していく。また、枝データ格納メモリ５４７は、データを読み出す際には、FIFO５４７1から５つのメッセージ（データ）D5461を順番に読み出し、次段のセレクタ５４８に供給する。枝データ格納メモリ５４７は、FIFO５４７1からのメッセージD5461の読み出しの終了後、FIFO５４７2乃至５４７6からも、順番に、メッセージD5462乃至D5466を読み出し、セレクタ５４８に供給する。
【０３２０】
セレクタ５４８には、制御部５５２から、FIFO５４７1乃至５４７6のうち、メッセージデータを読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D556が供給されるとともに、枝データ格納メモリ５４７から５つのメッセージ（データ）D5461乃至D5466が供給される。セレクタ５４８は、選択信号D546にしたがって、FIFO５４７1乃至５４７6のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給された５つのメッセージデータを、メッセージD547として、チェックノード計算部５４９に供給する。
【０３２１】
チェックノード計算部５４９は、図２３のチェックノード計算部５１３と同様に、５つのチェックノード計算器５４９1乃至５４９5からなる。チェックノード計算部５４９には、セレクタ５４８を介して５つのメッセージD547が供給され、そのメッセージD547が、チェックノード計算器５４９1乃至５４９5のそれぞれに１つずつ供給される。また、チェックノード計算部５４９には、制御部５５２から制御信号D557が供給され、その制御信号D557が、チェックノード計算器５４９1乃至５４９5に供給される。チェックノード計算器５４９1乃至５４９5は、それぞれメッセージD547を用いて、式（７）にしたがって演算を行い、その演算の結果、５つのメッセージD548を同時に求める。即ち、チェックノード計算部５１３は、LDPC符号の復号のための５個のチェックノード演算を行い、その演算の結果、５つのメッセージD548を得る。そして、チェックノード計算部５１３は、その５つのメッセージD548をセレクタ５５０に供給する。
【０３２２】
ここで、制御部５５２からチェックノード計算部５４９に供給される制御信号D557は、図１０の制御信号D106に対応するものであり、チェックノード計算部５４９1乃至５４９5それぞれは、図１０に示したチェックノード計算器１０１と同様に構成される。
【０３２３】
セレクタ５５０には、バリアブルノード計算部５４５からメッセージD545が供給されるとともに、チェックノード計算部５４９からメッセージD548が供給される。また、セレクタ５５０には、制御部５５２から、バリアブルノード計算部５４５とチェックノード計算部５４９のうち、いま、演算が行われる計算部として一方の選択を表す選択信号D558が供給される。セレクタ５５０は、選択信号D558に基づいて、バリアブルノード計算部５４５によるバリアブルノード演算の結果得られる５個の枝に対応するメッセージD545と、チェックノード計算部５４９によるチェックノード演算の結果得られる５つの枝に対応するメッセージD548のうち一方を選択し、その選択したメッセージをメッセージD549として、サイクリックシフト回路５５１に供給する。
【０３２４】
サイクリックシフト回路５５１には、セレクタ５５０からメッセージD549が供給されるとともに、制御部５５２から、そのメッセージD549に対応する枝が検査行列において元となる単位行列を幾つサイクリックシフトしたものであるかの情報（Matrixデータ）を表す制御信号D559が供給される。サイクリックシフト回路５５１は、制御信号D559を元に、５つのメッセージD549をサイクリックシフトし（並べ替え）、その結果をメッセージD550として、スイッチ５４０に供給する。
【０３２５】
なお、制御部５５２は、選択信号D551をスイッチ５４０に、制御信号D552をスイッチ５４１に、選択信号D553をセレクタ５４３に供給することにより、それぞれを制御する。また、制御部５５２は、制御信号D554をバリアブルノード計算部５４５に、制御信号D555をスイッチ５４６に供給することにより、それぞれを制御する。さらに、制御部５５２は、選択信号D556をセレクタ５４８に、制御信号D557をチェックノード計算部５４９に、選択信号D558をセレクタ５５０に、制御信号D559をサイクリックシフト回路５５１に供給することにより、それぞれを制御する。
【０３２６】
以上の動作を一巡することで、LDPC符号の１回の復号を行うことができる。図２４の復号装置５３０は、所定の回数だけLDPC符号を復号した後、図示しないが、式（５）にしたがって最終的な復号結果を求めて出力する。
【０３２７】
なお、枝データ（枝に対応するメッセージ）が欠けている箇所に関しては、メモリ格納時（枝データ格納メモリ５４２と５４７へのデータ格納時）には、何のメッセージも格納せず、また、ノード演算時（バリアブルノード計算部５４５でのバリアブルノード演算時とチェックノード計算部５４９でのチェックノード演算時と）にも何の演算も行わない。
【０３２８】
図２５は、図２４の復号装置５３０の復号処理を説明するフローチャートである。この処理は、例えば、受信データ用メモリ５４４に復号すべき受信データが格納されたとき、開始される。
【０３２９】
ステップＳ８１において、制御部５５２は、バリアブルノード計算部５４５とチェックノード計算部５４９のうち、いま、演算が行われる計算部として、バリアブルノード計算部５４５を選択し、その選択を表す選択信号D551と選択信号D558を、スイッチ５４０とセレクタ５５０にそれぞれ供給する。
【０３３０】
ステップＳ８１の処理後は、ステップＳ８２に進み、バリアブルノード計算部５４５は、バリアブルノード演算を行う。
【０３３１】
具体的には、バリアブルノード計算部５４５には、セレクタ５４３を介して、５つのメッセージD543（メッセージuj）が供給される。即ち、枝データ格納メモリ５４２は、後述するステップＳ９３で格納されたFIFO５４２1から５つのメッセージD5421を順番に読み出し、その後、FIFO５４２2乃至５４２18からも、順番に、メッセージD5422乃至D54218を読み出して、セレクタ５４３に供給する。
【０３３２】
セレクタ５４３には、制御部５５２からFIFO５４２1乃至５４２18のうち、メッセージ（データ）を読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D553が供給されるとともに、枝データ格納メモリ５４２からメッセージデータD5421乃至D54218が供給される。セレクタ５４３は、選択信号D553にしたがって、FIFO５４２1乃至５４２18のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給される５つのメッセージデータを、メッセージD543として、バリアブルノード計算部５４５に供給する。
【０３３３】
なお、受信用メモリ５４４から供給された受信データD544に対して、まだチェックノード演算が行われておらず、枝データ格納メモリ５４２にメッセージD550が格納されていない場合、バリアブルノード計算部５４５は、メッセージujを初期値に設定する。
【０３３４】
また、バリアブルノード計算部５４５には、受信データ用メモリ５４４から５つの受信データD544（受信値u0i）が供給され、その受信データD544が、バリアブルノード計算器５４５1乃至５４５5のそれぞれに１つずつ供給される。さらに、バリアブルノード計算部５４５には、制御部５５２から制御信号D554が供給され、その制御信号D554がバリアブルノード計算器５４５1乃至５４５5に供給される。
【０３３５】
バリアブルノード計算器５４５1乃至５４５5は、メッセージD543と受信データD544とを用いて、制御信号D554に基づいて、式（１）にしたがって、それぞれ演算を行い、その演算の結果５つのメッセージD545を同時に求める。
【０３３６】
即ち、制御部５５２がバリアブルノード計算部５４５に供給する制御信号D554は、前述の図１１で説明した制御信号D107に対応するものであり、バリアブルノード計算器５４５1乃至５４５5は、制御信号D544にしたがい、セレクタ５４３を介して、枝データ格納メモリ５４２から必要なメッセージD543（D542）を、それぞれ１つずつ読み出すとともに、受信データ用メモリ５４４から供給された受信データD544を用いて、バリアブルノード演算を行い、その演算の結果５つのメッセージD545を同時に求める。
【０３３７】
ステップＳ８２の処理後は、ステップＳ８３に進み、バリアブルノード計算部５４５は、バリアブルノード計算器５４５1乃至５４５5のバリアブルノード演算の結果得られる５つのメッセージD545（メッセージvi）をセレクタ５５０に出力し、ステップＳ８４に進む。
【０３３８】
ステップＳ８４において、セレクタ５５０は、ステップＳ８１で供給された選択信号D558に基づいて、バリアブルノード計算部５４５とチェックノード計算部５４９のうちの一方を選択し、一方から出力されるメッセージを、メッセージD549として、サイクリックシフト回路５５１に供給（出力）する。ここでは、選択信号D558は、バリアブルノード計算部５４５の選択を表しているので、セレクタ５５０は、ステップＳ８３で出力されたバリアブルノード演算の結果得られる５つのメッセージD545を、メッセージD549としてサイクリックシフト回路５５１に供給する。即ち、セレクタ５５０は、バリアブルノード計算部５４５とチェックノード計算部５４９のうち、いま、演算が行われている計算器から出力されるメッセージをサイクリックシフト回路５５１に供給する。
【０３３９】
ステップＳ８４の処理後は、ステップＳ８５に進み、サイクリックシフト回路５５１は、セレクタ５５０から供給された５つのメッセージD549を、サイクリックシフトする（並べ替える）。
【０３４０】
具体的には、サイクリックシフト回路５５１には、セレクタ５５０からメッセージD549が供給されるとともに、制御部５５２から、そのメッセージD549に対応する枝が検査行列において元となる単位行列を幾つサイクリックシフトしたものであるかの情報（Matrixデータ）を表す制御信号D559が供給される。サイクリックシフト回路５５１は、制御信号D559を元に、５つのメッセージD549をサイクリックシフトし、その結果をメッセージD550として、スイッチ５４０に供給する。
【０３４１】
ステップＳ８５の処理後は、ステップＳ８６に進み、スイッチ５４０は、ステップＳ８１で供給された制御信号D551に基づいて、枝データ格納メモリ５４２と枝データ格納メモリ５４７のうち一方を選択し、その選択した一方の枝データ格納メモリに、スイッチを介して、ステップＳ８５で、サイクリックシフト回路５５０から供給される５つのメッセージD550を供給する。即ち、ここでは、ステップＳ８１で供給された制御信号D551は、バリアブルノード計算部５４５の選択を表しているので、スイッチ５４０は、バリアブルノードからのメッセージを格納する枝データ格納メモリ５４７を選択し、その選択した枝データ格納メモリ５４７に、スイッチ５４６を介して、メッセージD550を供給する。
【０３４２】
具体的には、スイッチ５４６には、スイッチ５４０から、５つのメッセージ（データ）D550が供給されるとともに、そのメッセージ（データ）D550が検査行列のどの行に属するかの情報を表す制御信号D555が供給される。スイッチ５４６は、制御信号D555にしたがって、メッセージD550を格納するFIFOを、枝データ格納メモリ５４７のFIFO５４７1乃至５４７6の中から選択し、選択したFIFOに５つのメッセージデータD550をまとめて順番に供給していく。
【０３４３】
そして、枝データ格納メモリ５４７のFIFO５４７1乃至５４７18は、スイッチ５４６から供給された５つのメッセージデータD550をまとめて順番に格納していく。
【０３４４】
ステップＳ８６の処理後は、ステップＳ８７に進み、制御部５５２は、バリアブルノード計算部５４５により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ８２に戻り、上述した処理を繰り返す。
【０３４５】
一方、ステップＳ８７において、バリアブルノード計算部５４５は、全枝数のメッセージが演算されたと判定した場合、ステップＳ８８に進み、制御部５５２は、いま、演算が行われる計算部として、チェックノード計算部５４９を選択し、ステップＳ８１で生成したバリアブルノード計算部５４５の選択を表す選択信号D551とD558を、チェックノード計算部５４９の選択を表す選択信号D551とD558に変更する。
【０３４６】
ステップＳ８８の処理後は、ステップＳ８９に進み、チェックノード計算部５４９は、チェックノード演算を行う。
【０３４７】
具体的には、チェックノード計算部５４９には、セレクタ５４８を介して、５つのメッセージD547が供給される。即ち、枝データ格納メモリ５４７は、ステップＳ８６で格納されたFIFO５４７1から５つのメッセージD5461（メッセージvi）を順番に読み出し、その後、FIFO５４７2乃至５４７6からも、順番に、メッセージデータD5462乃至D5466を読み出し、セレクタ５４８に供給する。
【０３４８】
セレクタ５４８には、制御部５５２からFIFO５４７1乃至５４７6のうち、メッセージデータを読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D556が供給されるとともに、枝データ格納メモリ５４７からメッセージデータD5461乃至D5466が供給される。セレクタ５４８は、選択信号D556にしたがって、FIFO５４７1乃至５４７6のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給される５つのメッセージデータを、メッセージD547として、チェックノード計算部５４９に供給する。
【０３４９】
また、チェックノード計算部５４９には、制御部５５２から制御信号D557が供給される。チェックノード計算部５４９のチェックノード計算器５４９1乃至５４９5は、制御信号D557に基づいて、メッセージD547を用いて、上述した式（７）にしたがって、チェックノード演算を行い、その演算結果である５つのメッセージD548（メッセージuj）を同時に求める。
【０３５０】
即ち、制御部５５２がチェックノード計算部５４９に供給する制御信号D557は、前述の図１０で説明した制御信号D106に対応するものであり、チェックノード計算器５４９1乃至５４９5は、制御信号D557にしたがい、セレクタ５４８を介して、枝データ格納メモリ５４７から必要なメッセージD547（D546）を、それぞれ１つずつ読み出しながら、チェックノード演算を行い、その演算の結果５つのメッセージD548を同時に求める。
【０３５１】
ステップＳ８９の処理後は、ステップＳ９０に進み、チェックノード計算部５４９は、チェックノードの演算の結果得られる５つのメッセージD548をセレクタ５５０に出力して、ステップＳ９１に進む。
【０３５２】
ステップＳ９１において、セレクタ５５５は、ステップＳ８８で変更された選択信号D558に基づいて、バリアブルノード計算部５４５とチェックノード計算部５４９のうち一方を選択し、一方から出力されるメッセージを、メッセージD549として、サイクリックシフト回路５５１に供給する。ここでは、選択信号D558は、チェックノード計算部５４９の選択を表しているので、セレクタ５５０は、ステップＳ９０で出力されたチェックノード演算の結果得られるメッセージD548を、メッセージD549としてサイクリックシフト回路５５１に格納する。即ち、セレクタ５５０は、バリアブルノード計算部５４５とチェックノード計算部５４９のうち、いま、演算が行われている計算部から出力されるメッセージをサイクリックシフト回路５５１に供給する。
【０３５３】
ステップＳ９１の処理後は、ステップＳ９２に進み、サイクリックシフト回路５５１は、セレクタ５５０から供給された５つのメッセージD549を、サイクリックシフトする。
【０３５４】
具体的には、サイクリックシフト回路５５１には、セレクタ５５０からメッセージD549が供給されるとともに、制御部５５２から、そのメッセージD549に対応する枝が検査行列において元となる単位行列を幾つサイクリックシフトしたものであるかの情報（Matrixデータ）を表す制御信号D559が供給される。サイクリックシフト回路５５１は、制御信号D559を元に、５つのメッセージD549をサイクリックシフトし、その結果をメッセージD550として、スイッチ５４０に供給する。
【０３５５】
ステップＳ９２の処理後は、ステップＳ９３に進み、スイッチ５４０は、ステップＳ８８で変更された制御信号D551に基づいて、枝データ格納メモリ５４２と枝データ格納メモリ５４７のうち一方を選択し、その選択した一方の枝データ格納メモリに、スイッチを介して、ステップＳ９１でサイクリックシフト回路５５０から供給される５つのメッセージD550を供給する。即ち、ここでは、ステップＳ８８で供給された制御信号D551は、チェックノード計算部５４９の選択を表しているので、スイッチ５４０は、チェックノードからのメッセージを格納する枝データ格納メモリ５４２を選択し、その選択した枝データ格納メモリ５４２に、スイッチ５４１を介して、メッセージD540を供給する。
【０３５６】
具体的には、スイッチ５４２には、スイッチ５４０から、５つのメッセージ（データ）D550が供給されるとともに、そのメッセージ（データ）D550が検査行列のどの列に属するかの情報を表す制御信号D552が供給される。スイッチ５４１は、制御信号D552にしたがって、メッセージD550を格納するFIFOを、枝データ格納メモリ５４２のFIFO５４２1乃至５４２18の中から選び、選んだFIFOに５つのメッセージデータD550をまとめて順番に供給していく。
【０３５７】
そして、枝データ格納メモリ５４２のFIFO５４２1乃至５４２18は、スイッチ５４１から供給された５つのメッセージデータD550をまとめて順番に格納していく。
【０３５８】
ステップＳ９３の処理後は、ステップＳ９４に進み、制御部５５２は、チェックノード計算部５４９により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ８９に戻り、上述した処理を繰り返す。
【０３５９】
一方、ステップＳ９４において、制御部５５２は、チェックノード計算部５４９により、全枝数のメッセージが演算されたと判定した場合、処理を終了する。
【０３６０】
なお、復号装置５３０は、復号回数だけ図２５の復号処理を繰り返し行ない、枝データ格納メモリ５４２に、最後のチェックノード演算の結果得られるメッセージD550（メッセージuj）が格納された場合、枝データ格納メモリ５４２は、そのメッセージD550を上述した式（５）の演算を行う不図示のブロックに供給する。不図示のブロックには、さらに受信用メモリ５４４から受信データD544が供給され、不図示のブロックは、メッセージD550と受信データD544を用いて、式（５）の演算を行い、その演算結果を最終的な復号結果として出力する。
【０３６１】
上述したように、サイクリックシフト回路５５１には、バリアブルノード計算部５４５とチェックノード計算部５４９のうち、いま、演算が行われている計算部から出力されるメッセージが供給される。即ち、バリアブルノード演算は、チェックノード演算の結果であるメッセージujを用いて行われ、チェックノード演算は、バリアブルノード演算の結果であるメッセージviを用いて行われるため、復号装置５３０では、バリアブルノード演算とチェックノード演算が交互に行われる。従って、バリアブルノード計算部５４５とチェックノード計算部５４９のうち、いま、演算が行われている計算部から出力されるメッセージをサイクリックシフトすることにより、バリアブルノード演算の結果であるメッセージをサイクリックシフトするサイクリックシフト回路とチェックノード演算の結果であるメッセージをサイクリックシフトするサイクリックシフト回路を共有化して１つのサイクリックシフト回路にすることができ、バリアブルノード演算の結果であるメッセージをサイクリックシフトするサイクリックシフト回路５２０とチェックノード演算の結果であるメッセージをサイクリックシフトするサイクリックシフト回路５１３とを別々に有する図２３の復号装置５００に比べて、復号装置５３０の回路規模を小さくすることができる。
【０３６２】
図２６は、本発明を適用した図２２の検査行列Hで表現されるLDPC符号を復号する復号装置の他の一実施の形態の構成例を示している。
【０３６３】
図２６の復号装置５７０では、図２４のバリアブルノード計算部５４５およびチェックノード計算器５４９がさらに共有化され、１つのノード計算部５８１となっている。
【０３６４】
復号装置５７０は、スイッチ５４０、スイッチ５４１、枝データ格納メモリ５４２、セレクタ５４３、受信データ用メモリ５４４、スイッチ５４６、枝データ格納メモリ５４７、セレクタ５４８、サイクリックシフト回路５５１、セレクタ５８０、ノード計算部５８１、および制御部５８２から構成される。即ち、図２６の復号装置５７０は、図２４の復号装置５３０のバリアブルノード計算部５４５およびチェックノード計算部５４９をさらに供有化してノード計算部５８１にし、セレクタ５５０をセレクタ５８０に、制御部５５２を制御部５８２に代えたものである。
【０３６５】
なお、図２４と同一の符号を付したもの、即ち、図２６の復号装置５７０のスイッチ５４０、スイッチ５４１、枝データ格納メモリ５４２、セレクタ５４３、受信データ用メモリ５４４、スイッチ５４６、枝データ格納メモリ５４７、セレクタ５４８、およびサイクリックシフト回路５５１は、図２４の復号装置５３０のそれらと同一のものであり、説明は繰り返しになるので省略する。
【０３６６】
セレクタ５８０には、セレクタ５４３を介して、枝データ格納メモリ５４２に格納されているチェックノード演算の結果である５つのメッセージD543（メッセージuj）が供給されるとともに、セレクタ５４８を介して、枝データ格納メモリ５４７に格納されているバリアブルノード演算の結果である５つのメッセージD547（メッセージvi）が供給される。また、セレクタ５８０には、制御部５８２から、バリアブルノード演算とチェックノード演算のうち、いま、ノード計算部５８１で行う演算として一方の選択を表す選択信号D582が供給される。セレクタ５８０は、制御部５８２からの選択信号D582に基づいて、メッセージD543とメッセージD547のうち一方を選択し、その選択したメッセージをメッセージD580として、ノード計算部５８１に供給する。
【０３６７】
ノード計算部５８１は、５つのノード計算器５８１1乃至５８１5からなる。ノード計算部５８１には、セレクタ５８０を介して５つのメッセージD580が供給され、そのメッセージD580が、ノード計算器５８１1乃至５８１5のそれぞれに１つずつ供給される。また、ノード計算部５８１には、受信データ用メモリ５４４から５つの受信データD544が供給され、その受信データD544が、ノード計算器５８１1乃至５８１5のそれぞれに１つずつ供給される。さらに、ノード計算部５８１には、制御部５８２から制御信号D583が供給されるとともに、バリアブルノード演算またはチェックノード演算のうち、いま、ノード計算部５８１で行う演算として一方の選択を表す選択信号D584が供給され、その制御信号D583と選択信号D584がノード計算器５８１1乃至５８１5に供給される。
【０３６８】
ノード計算器５８１1乃至５８１5は、制御部５８２選択信号D584に基づき、バリアブルノード演算とチェックノード演算のうち一方を選択し、その選択した演算を行う。即ち、ノード計算器５８１1乃至５８１5は、制御信号D583に基づき、セレクタ５８０から供給されるメッセージD580と、受信用メモリ５４４から供給される受信データD544とを用い、式（１）にしたがって、それぞれ、LDPC符号の復号のためのバリアブルノード演算を行うか、あるいは、セレクタ５８０から供給されるメッセージD580を用い、式（７）にしたがって、それぞれ、LDPC符号の復号のためのチェックノードの演算を行う。つまり、ノード計算部５８１では、LDPC符号の復号のための５個のバリアブルノード演算、または５個のチェックノード演算が行われる。
【０３６９】
そして、ノード計算器５８１1乃至５８１5は、バリアブルノード演算またはチェックノード演算の結果得られる枝に対応する５つのメッセージを、メッセージD581として、サイクリックシフト回路５５１に供給する。
【０３７０】
ここで、制御部５８２からノード計算部５８１に供給される制御信号D583と選択信号D584は、図１８の制御部３５６からノード計算器３５４に供給される制御信号D362と選択信号D361に対応するものであり、ノード計算器５８１1乃至５８１5それぞれは、図１８のノード計算器３５４と同様に構成される。
【０３７１】
制御部５８２は、選択信号D551スイッチ５４０に、制御信号D552をスイッチ５４１に、選択信号D553をセレクタ５４３に、制御信号D555をスイッチ５４６に、選択信号D556をセレクタ５４８に、制御信号D559をサイクリックシフト回路５５１に、選択信号D582をセレクタ５８０に、制御信号D583と選択信号D584をノード計算部５８１に、それぞれ供給することにより、それぞれを制御する。
【０３７２】
図２７は、図２６の復号装置５７０の復号処理を説明するフローチャートである。この処理は、例えば、受信データ用メモリ５４４に復号すべき受信データが格納されたとき、開始される。
【０３７３】
ステップＳ１０１において、制御部５８２は、バリアブルノード演算とチェックノード演算のうち、いま、ノード計算部５８１で行う演算として、バリアブルノード演算を選択し、その選択を表す選択信号D551、D582、D584を、スイッチ５４０、セレクタ５８０、ノード計算部５８１にそれぞれ供給する。
【０３７４】
ステップＳ１０１の処理後は、ステップＳ１０２に進み、セレクタ５８０は、ステップＳ１０１で制御部５８２から供給された選択信号D582に基づいて、ノード計算部５８１に、メッセージD580を供給する。ここでは、制御部５８２から供給される選択信号D582は、バリアブルノード演算の選択を表しているので、セレクタ５８０は、後述するステップＳ１１３で、バリアブルノード演算に用いられるチェックノード演算の結果得られるメッセージ（メッセージuj）を格納する枝データ格納メモリ５４２から、セレクタ５４３を介して供給されるメッセージD543を、メッセージD580として、ノード計算部５８１に供給する。
【０３７５】
即ち、枝データ格納メモリ５４２は、後述するステップＳ１１３で格納されたFIFO５４２1から５つのメッセージD5421を順番に読み出し、その後、FIFO５４２2乃至５４２18からも、順番に、メッセージD5422乃至D54218を読み出し、セレクタ５４３に供給する。
【０３７６】
セレクタ５４３には、制御部５５２からFIFO５４２1乃至５４２18のうち、メッセージデータを読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D553が供給されるとともに、枝データ格納メモリ５４２からメッセージデータD5421乃至D54218が供給される。セレクタ５４３は、選択信号D553にしたがって、FIFO５４２1乃至５４２18のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給される５つのメッセージデータD542を、メッセージデータD543として、セレクタ５８０に供給する。そして、セレクタ５８０は、制御部５８２から供給される選択信号D582に基づいて、セレクタ５４３から供給されるメッセージD543（メッセージuj）を選択し、そのメッセージD543を、メッセージD580として、ノード計算部５８１に供給する。
【０３７７】
なお、受信用メモリ５４４から供給された受信データD544に対して、まだチェックノード演算が行われておらず、枝データ格納メモリ５４２にメッセージD550が格納されていない場合、枝用データ格納メモリ５４２は、セレクタ５４３とセレクタ５８０を介して、メッセージD580をノード計算部５８２に供給せず、ノード計算部５８２は、メッセージujを初期値に設定する。
【０３７８】
ステップＳ１０２の処理後は、ステップＳ１０３に進み、ノード計算部５８１は、バリアブルノード演算を行い、その演算結果をサイクリックシフト回路５５１に供給する。
【０３７９】
具体的には、ノード計算部５８１には、ステップＳ１０２でセレクタ５８０から５つのメッセージD580が供給されるとともに、受信データ用メモリ５４４から５つの受信データD544が供給され、メッセージD580と受信データD544が、ノード計算部５８１のノード計算器５８１1乃至５８１5のそれぞれに１つずつ供給される。さらに、ノード計算部５８１には、制御部５８２から制御信号D583と選択信号D584が供給され、その制御信号D583と選択信号D584がノード計算器５８１1乃至５８１5に供給される。
【０３８０】
ノード計算器５８１1乃至５８１5は、選択信号D584に基づいて、いま行う演算を選択する。即ち、ここでは、制御部５８２から供給される選択信号D584は、バリアブルノード演算の選択を表しているので、ノード計算器５８１1乃至５８１5は、制御部５８２により選択されたバリアブルノード演算を行う。つまり、ノード計算器５８１1乃至５８１5は、メッセージD580と受信データD544とを用いて、制御信号D583に基づいて、式（１）にしたがって、それぞれ演算を行い、その演算の結果得られるメッセージD581をサイクリックシフト回路５５１に供給する。
【０３８１】
ここで、制御部５８２がノード計算部５８１に供給する制御信号D583と選択信号D584は、前述の図１８で説明した制御信号D362と選択信号D361にそれぞれ対応するものであり、ノード計算器５８１1乃至５８１5は、選択信号D584に基づいて、いま行う演算を選択し、制御信号D582にしたがい、セレクタ５４３と５８０を介して、枝データ格納メモリ５４２から必要なメッセージD543（D542）を、それぞれ１つずつ読み出すとともに、受信データ用メモリ５４４から供給された受信データD544を用いて、バリアブルノード演算を行い、その演算の結果得られるメッセージD581をサイクリックシフト回路５５１に供給する。
【０３８２】
ステップＳ１０４の処理後は、ステップＳ１０５に進み、サイクリックシフト回路５５１は、ノード計算部５８１から供給されたバリアブルノード演算の結果得られる５個の枝に対応する５つのメッセージD581を、サイクリックシフトする。
【０３８３】
具体的には、サイクリックシフト回路５５１には、ノード計算部５８１からメッセージD581が供給されるとともに、制御部５８２から、そのメッセージD581に対応する枝が検査行列において元となる単位行列を幾つサイクリックシフトしたものであるかの情報（Matrixデータ）を表す制御信号D559が供給される。サイクリックシフト回路５５１は、制御信号D559を元に、５つのメッセージD581をサイクリックシフトし、その結果をメッセージD550として、スイッチ５４０に供給する。
【０３８４】
ステップＳ１０５の処理後は、ステップＳ１０６に進み、スイッチ５４０は、ステップＳ１０１で供給された制御信号D551に基づいて、枝データ格納メモリ５４２と枝データ格納メモリ５４７のうち一方を選択し、その選択した一方の枝データ格納メモリに、スイッチを介して、ステップＳ１０５でサイクリックシフト回路５５０から供給される５つのメッセージD550を供給する。即ち、ここでは、ステップＳ１０１で供給された制御信号D551は、バリアブルノード演算の選択を表しているので、スイッチ５４０は、バリアブルノードからのメッセージを格納する枝データ格納メモリ５４７を選択し、その選択した枝データ格納メモリ５４７に、スイッチ５４６を介して、メッセージD550を供給する。
【０３８５】
具体的には、スイッチ５４６には、スイッチ５４０から、５つのメッセージ（データ）D550が供給されるとともに、そのメッセージ（データ）D550が検査行列のどの行に属するかの情報を表す制御信号D555が供給される。スイッチ５４６は、制御信号D555にしたがって、メッセージD550を格納するFIFOを、枝データ格納メモリ５４７のFIFO５４７1乃至５４７6の中から選択し、選択したFIFOに５つのメッセージデータD550をまとめて順番に供給していく。
【０３８６】
そして、枝データ格納メモリ５４７のFIFO５４７1乃至５４７18は、スイッチ５４６から供給された５つのメッセージデータD550（メッセージvi）をまとめて順番に格納していく。
【０３８７】
ステップＳ１０６の処理後は、ステップＳ１０７に進み、制御部５８２は、ノード計算部５８１により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ１０２に戻り、上述した処理を繰り返す。
【０３８８】
一方、ステップＳ１０７において、制御部５８２は、ノード計算部５８１により、全枝数のメッセージが演算されたと判定した場合、ステップＳ１０８に進み、制御部５８２は、いま、ノード計算部５８１で行う演算として、チェックノード演算を選択し、ステップＳ１０１で生成したバリアブルノード演算の選択を表す選択信号D551、D582、D584を、チェックノード演算の選択を表す選択信号D551、D582、D584に変更する。
【０３８９】
ステップＳ１０８の処理後は、ステップＳ１０９に進み、セレクタ５８０は、ステップＳ１０１で制御部５８２から供給された選択信号D582に基づいて、ノード計算部５８１に、メッセージD580を供給する。ここでは、ステップＳ１０８で変更された選択信号D582は、チェックノード演算の選択を表しているので、セレクタ５８０は、ステップＳ１０６で、チェックノード演算に用いられるバリアブルノード演算の結果得られるメッセージ（メッセージvi）を格納する枝データ格納メモリ５４７から、セレクタ５４８を介して供給されるメッセージD547を、メッセージD580として、ノード計算部５８１に供給する。
【０３９０】
即ち、枝データ格納メモリ５４７は、ステップＳ１０６で格納されたFIFO５４７1から５つのメッセージD5461を順番に読み出し、その後、FIFO５４７2乃至５４７6からも、順番に、メッセージデータD5462乃至D5466を読み出し、セレクタ５４８に供給する。
【０３９１】
セレクタ５４８には、制御部５８２からFIFO５４７1乃至５４７6のうち、メッセージデータを読み出すFIFO（現在データが読み出されているFIFO）の選択を表す選択信号D556が供給されるとともに、枝データ格納メモリ５４７からメッセージデータD5461乃至D5466が供給される。セレクタ５４８は、選択信号D556にしたがって、FIFO５４７1乃至５４７6のうちの、現在データが読み出されているFIFOを選択し、その選択したFIFOから供給される５つのメッセージデータD546を、メッセージD547として、セレクタ５８０に供給する。そして、セレクタ５８０は、制御部５８２から供給される選択信号D582に基づいて、セレクタ５４８から供給されるメッセージD547（メッセージvi）を選択し、そのメッセージD547を、メッセージD580として、ノード計算部５８１に供給する。
【０３９２】
ステップＳ１０９の処理後は、ステップＳ１１０に進み、ノード計算部５８１は、チェックノード演算を行い、その演算結果をサイクリックシフト回路５５１に供給する。
【０３９３】
具体的には、ノード計算部５８１には、ステップＳ１０９でセレクタ５８０から５つのメッセージD580が供給され、メッセージD580が、ノード計算部５８１のノード計算器５８１1乃至５８１5のそれぞれに１つずつ供給される。さらに、ノード計算部５８１には、制御部５８２から制御信号D583と選択信号D584が供給され、その制御信号D583と選択信号D584がノード計算器５８１1乃至５８１5に供給される。
【０３９４】
ノード計算器５８１1乃至５８１5は、選択信号D584に基づいて、いま行う演算を選択する。即ち、ここでは、制御部５８２から供給される選択信号D584は、チェックノード演算の選択を表しているので、ノード計算器５８１1乃至５８１5は、制御部５８２により選択されたチェックノード演算を行う。つまり、ノード計算器５８１1乃至５８１5は、メッセージD580を用いて、制御信号D583に基づいて、式（７）にしたがって、それぞれ演算を行い、その演算の結果得られるメッセージD581をサイクリックシフト回路５５１に供給する。
【０３９５】
ここで、制御部５８２がノード計算部５８１に供給する制御信号D583と選択信号D584は、前述の図１８で説明した制御信号D362と選択信号D361にそれぞれ対応するものであり、ノード計算器５８１1乃至５８１5は、選択信号D584に基づいて、いま行う演算を選択し、制御信号D582にしたがい、セレクタ５４３と５８０を介して、枝データ格納メモリ５４２から必要なメッセージD543（D542）を、それぞれ１つずつ読み出しながら、チェックノード演算を行い、その演算の結果得られるメッセージD581をサイクリックシフト回路５５１に供給する。
【０３９６】
ステップＳ１１１の処理後は、ステップＳ１１２に進み、サイクリックシフト回路５５１は、ノード計算部５８１から供給されたチェックノード演算の結果得られる５個の枝に対応する５つのメッセージD581を、サイクリックシフトする。
【０３９７】
具体的には、サイクリックシフト回路５５１には、ノード計算部５８１からメッセージD581が供給されるとともに、制御部５８２から、そのメッセージD581に対応する枝が検査行列において元となる単位行列を幾つサイクリックシフトしたものであるかの情報（Matrixデータ）を表す制御信号D559が供給される。サイクリックシフト回路５５１は、制御信号D559を元に、５つのメッセージD581をサイクリックシフトし、その結果をメッセージD550として、スイッチ５４０に供給する。
【０３９８】
ステップＳ１１２の処理後は、ステップＳ１１３に進み、スイッチ５４０は、ステップＳ１０８で変更された制御信号D551に基づいて、枝データ格納メモリ５４２と枝データ格納メモリ５４７のうち一方を選択し、その選択した一方の枝データ格納メモリに、スイッチを介して、ステップＳ１１２で、サイクリックシフト回路５５１から供給される５つのメッセージD550を供給する。即ち、ここでは、ステップＳ１０８で変更された制御信号D551は、チェックノード演算の選択を表しているので、スイッチ５４０は、チェックノードからのメッセージを格納する枝データ格納メモリ５４２を選択し、その選択した枝データ格納メモリ５４２に、スイッチ５４１を介して、メッセージD550を供給する。
【０３９９】
具体的には、スイッチ５４２には、スイッチ５４０から、５つのメッセージ（データ）D550が供給されるとともに、そのメッセージ（データ）D550が検査行列のどの列に属するかの情報を表す制御信号D552が供給される。スイッチ５４６は、制御信号D552にしたがって、メッセージD550を格納するFIFOを、枝データ格納メモリ５４２のFIFO５４２1乃至５４２18の中から選択し、選択したFIFOに５つのメッセージデータD550をまとめて順番に供給していく。
【０４００】
そして、枝データ格納メモリ５４２のFIFO５４２1乃至５４２18は、スイッチ５４１から供給された５つのメッセージデータD550をまとめて順番に格納していく。
【０４０１】
ステップＳ１１３の処理後は、ステップＳ１１４に進み、制御部５８２は、ノード計算部５８１により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ１０９に戻り、上述した処理を繰り返す。
【０４０２】
一方、ステップＳ１１４において、制御部５８２は、チェックノード計算器５８１により、全枝数のメッセージが演算されたと判定した場合、処理を終了する。
【０４０３】
なお、復号装置５７０は、復号回数だけ図２７の復号処理を繰り返し行ない、枝データ格納メモリ５４２に最後のチェックノード演算の結果得られるメッセージD550が格納された場合、枝データ格納メモリ５４２は、そのメッセージD550を上述した式（５）の演算を行う不図示のブロックに供給する。不図示のブロックには、さらに、受信データ用メモリ５４４から受信データD544が供給され、不図示のブロックは、メッセージD550と受信データD544を用いて、式（５）の演算を行い、その演算結果を最終的な復号結果として出力する。
【０４０４】
上述したように、ノード計算部５８１では、バリアブルノード演算とチェックノード演算の両方の演算が行われる。即ち、バリアブルノード演算は、チェックノード演算の結果であるメッセージujを用いて行われ、チェックノード演算は、バリアブルノード演算の結果であるメッセージviを用いて行われるため、復号装置５７０では、バリアブルノード演算とチェックノード演算が交互に行われる。従って、ノード計算部５８１のノード計算器５８１1乃至５８１5は、バリアブルノード演算とチェックノード演算に必要な共通のブロックをそれぞれ共有化し、バリアブルノード演算とチェックノード演算を交互に行うことにより、バリアブルノード計算器とチェックノード計算器を共有化して、それぞれ１つのノード計算器にすることができ、バリアブルノード演算を行うバリアブルノード計算部５４５とチェックノード計算部５４９とを別々に有する図２４の復号装置５３０に比べて、さらに復号装置５７０の回路規模を小さくすることができる。
【０４０５】
上術した説明では、枝データ格納にFIFOを用いたが（枝データ格納メモリ５４２と５４７をFIFOで構成するようにしたが）、FIFOの代わりにRAMを用いても構わない。その場合、RAMには、P個の枝情報（枝に対応するメッセージ）を同時に読み出すことの出来るビット幅と、枝総数/Pのワード(word)数が必要となる。さらに、RAMへの書き込みは、検査行列の情報から、書き込もうとしているデータが次に読み出される際に何番目に読み出されるかを求め、その位置に書き込む。また、RAMからの読み出しの際には、アドレスの先頭から順次データを読み出す。FIFOの代わりにRAMを用いると、セレクタ５４１および５４６は不要になる。
【０４０６】
このように、枝データ格納にFIFOの代わりにRAMを用い、枝データ格納メモリ５４２および枝データ格納メモリ５４７をさらに共有化した復号装置を図２８に示す。
【０４０７】
図２８は、本発明を適用した図２２の検査行列Hで表現されるLDPC符号を復号する復号装置のさらに他の一実施の形態の構成例を示している。
【０４０８】
図２８の復号装置６００では、図２６の枝データ格納メモリ５４２および枝データ格納メモリ５４７がさらに共有化され、１つの枝用格納メモリ６１０となっている。
【０４０９】
復号装置６００は、受信データ用メモリ５４４、サイクリックシフト回路５５１、ノード計算部５８１、枝用メモリ６１０、および制御部６１１から構成される。即ち、図２８の復号装置６００は、図２６の復号装置５７０の枝データ格納メモリ５４２および枝データ格納メモリ５４７を共有化して枝用メモリ６１０にし、スイッチ５４０、セレクタ５８０を削除して、制御部５８２を制御部６１１に代えたものである。
【０４１０】
なお、図２６と同一の符号を付したもの、即ち、図２８の復号装置６００の受信データ用メモリ５４４、サイクリックシフト回路５５１、およびノード計算部５８１は、図２６の復号装置５７０のそれらと同一のものであり、説明は繰り返しになるので省略する。
【０４１１】
枝用メモリ６１０には、サイクリックシフト回路５５１から、ノード計算部５８１によるチェックノードの演算、またはバリアブルノードの演算の結果得られる５個の枝に対応する５つのメッセージD611がサイクリックシフトされた５つのメッセージD550が供給され、枝用メモリ６１０は、サイクリックシフト回路５５１から供給された５つのメッセージD550を同一アドレスに格納（記憶）し、既に格納してある５つのメッセージD550を、５つのメッセージD610として、５つ同時に読み出し、ノード計算部581に供給する。
【０４１２】
即ち、枝用メモリ６１０は、サイクリックシフト回路５５１から供給され、ノード計算部５８１がバリアブルノード演算またはチェックノード演算に用いる順番に、同一アドレスに格納してある５つのメッセージD550を読み出し、メッセージD610として、５つ同時にノード計算部５８１に供給すると同時に、サイクリックシフト回路５５１が出力する５つのメッセージD550を受信し、枝用メモリ６１０の既に読み出されたメッセージ（メッセージD610）が記憶されていたアドレスに、５つ同時に書き込む。即ち、枝用メモリ６１０は、ノード計算部５８１に供給するメッセージD610の５つ同時の読み出しと、ノード計算部５８１から供給されるメッセージD550の５つ同時の書き込みとを、同時に行う。
【０４１３】
なお、枝用メモリ６１０には、ノード計算部５８１のバリアブルノード演算、またはチェックノード演算により演算された枝に対応するメッセージがサイクリックシフトされた結果が格納されるので、枝用メモリ６１０に格納されるデータ量、即ち、枝用メモリ６１０に必要とされる記憶容量は、メッセージの量子化ビット数と、全枝数との乗算値となる。
【０４１４】
また、枝用メモリ６１０は、読み出しと書き込みが同時に可能な、例えば、デュアルポートRAMで構成することができる。
【０４１５】
制御部６１１は、制御信号D559、または制御信号D583と選択信号D584を、サイクリックシフト回路５５１、またはノード計算部５８１にそれぞれ供給することにより、それぞれを制御する。
【０４１６】
図２９は、図２８の復号装置６００の復号処理を説明するフローチャートである。この処理は、例えば、受信データ用メモリ５４４に復号すべき受信データが格納されたとき、開始される。
【０４１７】
ステップＳ１２１において、制御部６１１は、バリアブルノード演算とチェックノード演算のうち、いま、ノード計算部５８１で行う演算として、バリアブルノード演算を選択し、その選択を表す選択信号D584を、ノード計算部５８１に供給する。
【０４１８】
ステップＳ１２１の処理後は、ステップＳ１２２に進み、ノード計算部５８１は、ステップＳ１２１で制御部６１１から供給された選択信号D584に基づいて、バリアブルノード演算とチェックノード演算のうち、いま行う演算として、バリアブルノード演算を選択し、バリアブルノード演算を行う。
【０４１９】
具体的には、ノード計算部５８１には、枝用メモリ６１０から、後述するステップＳ１２９で格納（記憶）されたチェックノードからの５つのメッセージD610（メッセージuj）が供給されるとともに、受信データ用メモリ５４４から５つの受信データD544が供給され、メッセージD610と受信データD544が、ノード計算部５８１のノード計算器５８１1乃至５８１5のそれぞれに１つずつ供給される。また、ノード計算部５８１には、制御部６１１から制御信号D583と選択信号D584が供給される。
【０４２０】
なお、受信用メモリ５４４から供給された受信データD544に対して、まだチェックノード演算が行われておらず、枝用メモリ６１０にメッセージD550（D610）が格納されていない場合、枝用メモリ６１０は、メッセージD610をノード計算部５８１に供給せず、ノード計算部５８１は、メッセージujを初期値に設定する。
【０４２１】
ノード計算器５８１1乃至５８１5は、選択信号D584に基づいて、いま行う演算を選択する。即ち、ここでは、制御部６１１から供給される選択信号D584は、バリアブルノード演算の選択を表しているので、ノード計算器５８１1乃至５８１5は、バリアブルノード演算を行う。つまり、ノード計算器５８１1乃至５８１5は、メッセージD610と受信データD544とを用いて、制御信号D583に基づいて、式（１）にしたがって、それぞれ演算を行い、その演算の結果であるメッセージD611を得る。
【０４２２】
ここで、制御部５８２がノード計算部５８１に供給する制御信号D583と選択信号D584は、前述の図１８で説明した制御信号D362と選択信号D361にそれぞれ対応するものであり、ノード計算器５８１1乃至５８１5は、選択信号D584に基づいて、いま行う演算を選択し、制御信号D583にしたがい、枝用格納メモリ６１０から必要なメッセージD610を、それぞれ１つずつ読み出すとともに、受信データ用メモリ５４４から必要な受信データD544を、それぞれ１つずつ読み出して、バリアブルノード演算を行い、その演算の結果であるメッセージD611を得る。
【０４２３】
ステップＳ１２２の処理後は、ステップＳ１２３に進み、ノード計算部５８１は、バリアブルノードの演算の結果得られる５個の枝に対応する５つのメッセージD611を、サイクリックシフト回路５５１に供給し、ステップＳ１２４に進む。
【０４２４】
ステップＳ１２４において、サイクリックシフト回路５５１は、ノード計算部５８１から供給された５つのメッセージD611を、サイクリックシフトし、その結果を５つのメッセージD550として、枝用メモリ６１０の既に読みだされたメッセージ（D610）のアドレスに格納（記憶）する。なお、５つのメッセージD550は、同一のアドレスに格納される。
【０４２５】
ステップＳ１２４の処理後は、ステップＳ１２５に進み、ノード計算部５８１は、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ１２２に戻り、上述した処理を繰り返す。
【０４２６】
一方、ステップＳ１２５において、制御部６１１は、ノード計算部５８１により、全枝数のメッセージが演算されたと判定した場合、ステップＳ１２６に進み、制御部６１１は、いま、演算を行う演算として、チェックノード演算を選択し、ステップＳ１２１で生成したバリアブルノード演算の選択を表す選択信号D584を、チェックノード演算の選択を表す選択信号D584に変更する。
【０４２７】
ステップＳ１２６の処理後は、ステップＳ１２７に進み、ノード計算部５８１は、ステップＳ１２６で変更された選択信号D584に基づいて、バリアブルノード演算とチェックノード演算のうち、いま行う演算として、チェックノード演算を選択し、チェックノード演算を行う。
【０４２８】
具体的には、ノード計算部５８１には、枝用メモリ６１０から、ステップＳ１２４で格納（記憶）されたバリアブルノードからの５つのメッセージD610が供給され、メッセージD610が、ノード計算部５８１のノード計算器５８１1乃至５８１5のそれぞれに１つずつ供給される。
【０４２９】
ノード計算器５８１1乃至５８１5は、ステップＳ１２６で変更された選択信号D584に基づいて、いま行う演算を選択する。即ち、ここでは、選択信号D584は、チェックノード演算の選択を表しているので、ノード計算器５８１1乃至５８１5は、チェックノード演算を行う。つまり、ノード計算器５８１1乃至５８１5は、メッセージD610を用いて、制御信号D583に基づいて、式（７）にしたがって、それぞれ演算を行い、その演算の結果であるメッセージD611を得る。
【０４３０】
ここで、制御部５８２がノード計算部５８１に供給する制御信号D583と選択信号D584は、前述の図１８で説明した制御信号D362と選択信号D361にそれぞれ対応するものであり、ノード計算器５８１1乃至５８１5は、選択信号D584に基づいて、いま行う演算を選択し、制御信号D583にしたがい、枝用格納メモリ６１０から必要なメッセージD610を、それぞれ１つずつ読み出しながら、チェックノード演算を行い、その演算の結果であるメッセージD611を得る。
【０４３１】
ステップＳ１２７の処理後は、ステップＳ１２８に進み、ノード計算部５８１は、チェックノードの演算の結果得られる枝に対応するメッセージD611を、サイクリックシフト回路５５１に供給し、ステップＳ１２９に進む。
【０４３２】
ステップＳ１２９において、サイクリックシフト回路５５１は、ノード計算部５８１から供給された５つのメッセージD611を、サイクリックシフトし、その結果をメッセージD550として、枝用メモリ６１０の既に読みだされたメッセージのアドレスに格納する。なお、５つのメッセージD550は、同一のアドレスに格納（記憶）される。
【０４３３】
ステップＳ１２９の処理後は、ステップＳ１３０に進み、制御部６１１は、ノード計算部５８１により、全枝数のメッセージが演算されたかどうかを判定し、全枝数のメッセージが演算されていないと判定した場合、ステップＳ１２７に戻り、上述した処理を繰り返す。
【０４３４】
一方、ステップＳ１３０において、制御部６１１は、ノード計算器５８１により、全枝数のメッセージが演算されたと判定した場合、処理を終了する。
【０４３５】
なお、復号装置６００は、復号回数だけ図２９の復号処理を繰り返し行ない、枝用メモリ６１０に最後のチェックノード演算の結果得られるメッセージD550（メッセージuj）が供給された場合、枝用メモリ６１０は、そのメッセージD550を上述した式（５）の演算を行う不図示のブロックに供給する。不図示のブロックには、さらに、受信データ用メモリ５４４から受信データD544が供給され、不図示のブロックは、メッセージD550と受信データD544を用いて、式（５）の演算を行い、その演算結果を最終的な復号結果として出力する。
【０４３６】
上述したように、枝用メモリ６１０では、バリアブルノード演算またはチェックノード演算の結果得られるメッセージのうち、いま行われている演算の結果得られるメッセージが格納される。即ち、バリアブルノード演算は、チェックノード演算の結果であるメッセージujを用いて行われ、チェックノード演算は、バリアブルノード演算の結果であるメッセージviを用いて行われるため、復号装置６６０では、バリアブルノード演算とチェックノード演算が交互に行われる。従って、復号装置６００では、いま行われている演算の結果得られるメッセージを格納することにより、バリアブルノード演算の結果得られるメッセージを格納する枝データ格納メモリ５４２とチェックノード演算の結果得られるメッセージを格納する枝データ格納メモリ５４７を共有化して、１つの枝用メモリ６１０にすることができ、バリアブルノードのメッセージを格納するメモリ５４２と、チェックノードのメッセージを格納するメモリ５４７を別々に有する図２６の復号装置５７０に比べて、さらに、復号装置６００の回路規模を小さくすることができる。
【０４３７】
図３０は、本発明を適用した図２２の検査行列Hで表現されるLDPC符号を復号する復号装置の他の一実施の形態の構成例を示している。
【０４３８】
図３０の復号装置６００では、図２８のノード計算部５８１のノード計算器５８１1乃至ノード計算器５８１5のそれぞれを構成する各ブロック（演算素子）がさらに共有化され、計算部６４１の計算器６４１1乃至計算器６４１5となっている。
【０４３９】
ここで、計算部６４１の計算器６４１1乃至計算器６４１5で行われる計算について説明する。
【０４４０】
計算部６４１では、バリアブルノード演算またはチェックノード演算を行い、その演算の結果得られるメッセージを出力して枝用メモリに格納するのではなく、バリアブルノード演算またはチェックノード演算の途中結果を出力して、メモリ６４０に格納する。
【０４４１】
具体的には、計算部６４１は、上述した式（１）および以下に表す式（８）にしたがう第１の演算と、以下の式（９）にしたがう第２の演算を行い、その第１の演算結果である復号途中結果vi'と第２の演算結果である復号途中結果ujをメモリ６４０に格納させる。
【０４４２】
【数８】
2005065066.tif 000010
・・・（８）
【０４４３】
【数９】
2005065066.tif 000011
・・・（９）
【０４４４】
即ち、式（８）で表される復号途中結果vi'の絶対値|vi'|は、その右辺の絶対値|φ（｜vi｜）|に等しい。また、φ（ｘ）は、ｘ≧０で、φ（ｘ）＝ln（（ex＋１）/（ex−１））＝ln（１＋２/（ex−１））で定義されるので、φ（ｘ）≧０となり、|φ（｜vi｜）|は、φ（｜vi｜）に等しい。従って、復号途中結果vi'の絶対値|vi'|は、φ（｜vi｜）に等しい。さらに、φ（ｘ）≧０であるので、式（８）で表される復号途中結果vi'の符号ビットsign（vi'）は、その右辺の符号ビットsign（vi）に等しい。これにより、上述した式（７）のφ（｜vi｜）は、|vi'|に置換でき、式（７）のsign（vi）は、sign（vi'）に置換できるので、上述した式（７）で表されるメッセージujは、復号途中結果vi'を用いて、上述した式（９）で表すことができる。
【０４４５】
従って、計算部６４１が、式（１）および式（８）にしたがう第１の演算と、式（９）にしたがう第２の演算を交互に行い、最後の第２の演算の後、不図示のブロックが上述した式（５）の演算を行うことにより、LDPC符号の繰り返し復号を行うことができる。
【０４４６】
なお、ここでは、式（９）にしたがう第２の演算結果を、復号途中結果ujと記載するが、この復号途中結果ujは、式（７）のチェックノード演算結果ujに等しい。
【０４４７】
図３０の復号装置６３０は、この計算部６４１を、図２８のノード計算部５８１の代わりに備え、枝用メモリ６１０をメモリ６４０に、制御部６１１を制御部６４２に代えたものである。
【０４４８】
即ち、復号装置６３０は、受信データ用メモリ５４４、サイクリックシフト回路５５１、メモリ６４０、計算部６４１、および制御部６４２から構成される。
【０４４９】
なお、図２８と同一の符号を付したもの、即ち、図３０の復号装置６３０の受信データ用メモリ５４４とサイクリックシフト回路５５１は、図２８の復号装置６００のそれらと同一のものであり、説明は繰り返しになるので省略する。
【０４５０】
メモリ６４０には、サイクリックシフト回路５５１から、計算部６４１による演算結果である５つの復号途中結果D642がサイクリックシフトされた５つの復号途中結果D640が供給され、メモリ６４０は、サイクリックシフト回路５５１から供給された５つの復号途中結果D640を同一アドレスに、５つ同時に格納（記憶）し、既に格納してある５つの復号途中結果D640を、５つ同時に、５つのメッセージD641として、計算部６４１に供給する。なお、メモリ６５０は、計算部６４１による最後の第２の演算の結果得られる復号途中結果D630を格納する場合には、その復号途中結果D630を、上述した式（５）の演算を行う不図示のブロックに供給する。
【０４５１】
即ち、メモリ６４０は、サイクリックシフト回路５５１から供給され、同一アドレスに格納してある５つの復号途中結果D640を５つ同時に読み出し、復号途中結果D641として、計算部６４１に供給すると同時に、サイクリックシフト回路５５１が出力する５つの復号途中結果D640を受信し、メモリ６４０の既に読み出された復号途中結果（復号途中結果D640）が記憶されていたアドレスに、５つ同時に書き込む。即ち、メモリ６４０は、計算部６４１に供給する復号途中結果D640の５つ同時の読み出しと、計算部６４１から供給される復号途中結果D640の５つ同時の書き込みとを、同時に行う。
【０４５２】
なお、メモリ６４０には、計算部６４１の第１の演算、または第２の演算により演算された復号途中結果がサイクリックシフトされた結果が格納されるので、メモリ６４０に格納されるデータ量、即ち、枝用メモリ６４０に必要とされる記憶容量は、メッセージの量子化ビット数と、図２２の検査行列Hの“１”の数との乗算値となる。
【０４５３】
また、メモリ６４０は、読み出しと書き込みが同時に可能な、例えば、デュアルポートRAMで構成することができる。
【０４５４】
計算部６４１は、５つの計算器６４１1乃至６４１5からなる。計算部６４１には、メモリ６４０から５つの復号途中結果D641が供給され、そのメッセージD641が、計算器６４１1乃至６４１5のそれぞれに１つずつ供給される。また、計算部６４１には、受信データ用メモリ５４４から５つの受信データD544が供給され、その受信データD544が、計算器６４１1乃至６４１5のそれぞれに１つずつ供給される。さらに、計算部６４１には、制御部６４２から制御信号D583が供給されるとともに、第１の演算または第２の演算のうち、いま計算部６４１で行う演算として一方の選択を表す選択信号D643が供給され、その制御信号D583と選択信号D643が計算器６４１1乃至６４１5に供給される。
【０４５５】
計算器６４１1乃至６４１5は、選択信号D643に基づき、第１の演算と第２の演算のうち一方を選択し、その選択した演算を行う。即ち、計算器６４１1乃至６４１5は、制御信号D643に基づき、メモリ６４０から供給される復号途中結果D641と受信用メモリ５４４から供給され受信データD544とを用い、式（１）と式（８）にしたがって、それぞれ、LDPC符号の復号のための第１の演算を行うか、あるいは、メモリ６４０から供給されるメッセージD641を用い、式（９）にしたがって、それぞれ、LDPC符号の復号のための第２の演算を行う。
【０４５６】
そして、計算器６４１1乃至６４１5は、第１の演算または第２の演算の結果得られる５つの復号途中結果を、復号途中結果D642として、サイクリックシフト回路５５１に供給する。
【０４５７】
制御部６４２は、制御信号D559、または制御信号D583と選択信号D643を、サイクリックシフト回路５５１、または計算部６４１にそれぞれ供給することにより、それぞれを制御する。
【０４５８】
図３１は、図３０の計算器６４１1の構成例を示すブロック図である。
【０４５９】
図３１の計算器６４１1は、第１の演算または第２の演算を行う。
【０４６０】
なお、図３１では、計算器６４１1の構成について説明するが、図３０の計算器６４１2乃至６４１4も、図３１の計算器６４１1と同様に構成される。
【０４６１】
また、図３１では、復号途中結果が符号ビットを合わせて合計６ビット(bit)に量子化されているものとして、計算器６４１1を表している。さらに、図３１の計算器６４１1には、クロックｃｋが供給され、このクロックｃｋは、必要なブロックに供給されるようになっている。そして、各ブロックは、クロックｃｋに同期して処理を行う。
【０４６２】
図３１の計算器６４１1は、セレクタ６６１、積算部７０１、加算器６６６、セレクタ６６７、FIFOメモリ６６９、セレクタ６７０、減算器６７１、LUT６７２、乗算部７０２、FIFOメモリ６７８、EXOR回路６７９、セレクタ６８０から構成される。また、積算部７０１は、加算器６６２、レジスタ６６３、セレクタ６６４、およびレジスタ６６５から構成され、乗算部７０２は、EXOR回路６７３、レジスタ６７４、セレクタ６７５、およびレジスタ６７６から構成される。
【０４６３】
図３１の計算器６４１1は、制御部６４２から供給される、例えば、１ビットの制御信号D583と１ビットの選択信号D643に基づき、メモリ６４０から１つずつ読み出される復号途中結果D641を用いて、式（９）にしたがって第２の演算を行うか、あるいは復号途中結果D641と受信データ用メモリ５４４から供給される受信データD544を用いて、式（１）と式（８）にしたがって第１の演算を行う。
【０４６４】
即ち、計算器６４１1では、検査行列の各列の１に対応する６ビットの復号途中結果（Vi）、または検査行列の各行の１に対応する６ビットの復号途中結果（uj）が復号途中結果D641として１つずつ読み込まれると、その下位５ビットである絶対値D662がFIFOメモリ６６９に供給されるとともに、その絶対値D662において、１ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D663が、セレクタ６６１に供給される。また、復号途中結果D641の最上位ビットである符号ビットD661がEXOR回路６７３とFIFOメモリ６７８にそれぞれ供給される。さらに、計算器６４１1では、１つずつ読み込まれた６ビットの復号途中結果D641がセレクタ６６１に供給される。
【０４６５】
また、計算器６４１1には、制御部６４２から制御信号D583が供給され、その制御信号D583は、セレクタ６６４とセレクタ６７５に供給される。また、計算器６４１1には、制御部６４２から、第１の演算または第２の演算のうち一方の選択を表す選択信号D643が供給され、その選択信号D643がセレクタ６６１、セレクタ６６７、およびセレクタ６７０に供給される。さらに、計算器６４１1には、受信データ用メモリ５４４から受信データD544が供給され、その受信データD544が加算器６６６に供給される。
【０４６６】
まず最初に、検査行列の各行の１に対応する６ビットの復号途中結果ujが、復号途中結果D641として１つずつ読み込まれた場合の計算器６４１1の処理について説明する。このとき、制御部６４２は、第１の演算または第２の演算のうちの、第１の演算を、いま、計算器６４１1で行う演算として選択し、その選択を表す選択信号D583を計算器６４１1に供給するとともに、演算を制御するための制御信号D583の値を、計算器６４１1が１列に亘る復号途中結果（検査行列Hの各列の１に対応する第２の演算結果）を読み込む毎に、“０”から“１”に変更する。
【０４６７】
このように、制御部６４２により、いま、計算器６４１1で行う演算として、第１の演算が選択された場合、計算器６４１1では、制御部６４２から供給される、例えば、１ビットの制御信号D583に基づき、メモリ６４０から１つずつ読み込まれる復号途中結果D641を用いて、式（１）と式（８）にしたがって演算を行う。
【０４６８】
計算器６４１1では、検査行列の各行の１に対応する６ビットの復号途中結果D641（復号途中結果uj）が１つずつ読み込まれ、その下位５ビットである絶対値D662（|uj|）がFIFOメモリ６６９に供給されるとともに、その絶対値D662において、１ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D663が、セレクタ６６１に供給される。また、復号途中結果D641の最上位ビットである符号ビットD661（sign（uj））がEXOR回路６７３とFIFOメモリ６７８にそれぞれ供給される。さらに、計算器６４１1では、１つずつ読み込まれた６ビットの復号途中結果D641がセレクタ６６１に供給される。
【０４６９】
セレクタ６６１には、６ビットの復号途中結果D641（復号途中結果uj）と６ビットの値D663が供給される。また、セレクタ６６１には、第１の演算と第２の演算のうち一方の選択を表す選択信号D643が供給される。セレクタ６６１は、選択信号D643に基づいて、復号途中結果D641と値D663のうち一方を選択し、その選択した一方を値D664として、加算器６６２に供給する。ここでは、選択信号D643は、第１の演算の選択を表しているので、セレクタ６６１は、値D641(uj)を、値D664として加算器６６２に供給する。
【０４７０】
積算部７０１の加算器６６２は、値D641(uj)とレジスタ６６３に格納されている９ビットの値D665とを加算することにより、値D641を積算し、その結果得られる９ビットの積算値をレジスタ６６３に再格納する。なお、検査行列の１列に亘る１に対応する復号途中結果D641が積算された場合、レジスタ６６３はリセットされる。
【０４７１】
検査行列の１列に亘る復号途中結果D641（検査行列の各行の1に対応するすべての復号途中結果D641）が１つずつ読み込まれ、レジスタ６６３に１列分の値D641が積算された積算値（ｊ＝１からｊ＝ｄvまでのΣuj）が格納された場合、制御部６４２から供給される制御信号D583は、０から１に変化する。例えば、列の重みが「５」である場合、制御信号D583は、１から４クロック目までは、「０」となり、５クロック目では「１」となる。
【０４７２】
制御信号D583が「１」の場合、セレクタ６６４は、レジスタ６６３に格納されている値、即ち、検査行列の１列に亘る１に対応する復号途中結果D641（復号途中結果uj）が積算された９ビットの値D665（ｊ＝１からｊ＝ｄvまでのΣuj）を選択し、値D666として、レジスタ６６５に出力して格納させる。レジスタ６６５は、格納している値D666を、９ビットの値D667として、セレクタ６６４、加算器６６６、およびセレクタ６６７に供給する。
【０４７３】
制御信号D583が「０」の場合、セレクタ６６１は、レジスタ６６５から供給された値D667を選択し、レジスタ６６５に出力して再格納させる。即ち、検査行列の１列に亘る１に対応する復号途中結果D641（復号途中結果uj）が積算されるまで、レジスタ６６５は、前回積算されたujを、セレクタ６６４、加算器６６６、およびセレクタ６６７に供給する。
【０４７４】
加算器６６６では、レジスタ６６５から値D667が供給されるとともに、受信データ用メモリ５４４から受信データD544（LDPC符号）が供給される。加算器６６６は、値D667に、受信データ用メモリ５４４から供給された受信データD544（受信値u0i）を加算して、その結果得られる値D668をセレクタ６６７に供給する。
【０４７５】
セレクタ６６７には、加算器６６６から値D668が供給されるとともに、レジスタ６６５から値D667が供給される。また、セレクタ６６７には、制御部６４２から、第１の演算と第２の演算のうち一方の選択を表す選択信号D643が供給される。セレクタ６６７は、選択信号D643に基づいて、値D668と値D667のうち一方を選択し、その選択した値を、値D669として、減算器６７１に供給する。ここでは、選択信号D643は、第１の演算の選択を表しているので、セレクタ６６７は、値D668を選択し、値D669として減算器６７１に供給する。
【０４７６】
一方、FIFOメモリ６６９は、レジスタ６６５から新たな値D667（ｊ＝１からｊ＝ｄvまでのΣuj）が出力されるまでの間、メモリ６４０から供給された５ビットの復号途中結果D641の絶対値（｜uj｜）を遅延し、５ビットの値D670として出力する。その値D670において、１ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D671が、セレクタ６７０に供給される。
【０４７７】
以上の処理と並行して、乗算部７０２のEXOR回路６７３は、レジスタ６７４に格納されている１ビットの値D673と符号ビットD661との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、１ビットの乗算結果D672をレジスタ６７４に再格納する。なお、検査行列の１列に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された場合、レジスタ６７４はリセットされる。
【０４７８】
検査行列の１列に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された乗算結果D672がレジスタ６７４に格納された場合、制御部６４２から供給される制御信号D583は、「０」から「１」に変化する。
【０４７９】
制御信号D583が「１」の場合、セレクタ６７５は、レジスタ６７４に格納されている値、即ち、検査行列の１列に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された値D673を選択し、１ビットの値D674としてレジスタ６７６に出力して格納させる。レジスタ６７６は、格納している値D674を、１ビットの値D675として、セレクタ６７５とEXOR回路６７９に供給する。
【０４８０】
制御信号D583が「０」の場合、セレクタ６７５は、レジスタ６７４から供給された値D675を選択し、レジスタ６７６に出力して再格納させる。即ち、検査行列の１列に亘る１に対応する復号途中結果D641の符号ビットD661が乗算されるまで、レジスタ６７６は、前回格納した値を、セレクタ６７５とEXOR回路６７９に供給する。
【０４８１】
一方、FIFOメモリ６７８は、レジスタ６７６から新たな値D675がEXOR回路６７９に供給されるまでの間、符号ビットD661（sign（uj））を遅延し、１ビットの値D676として、出力する。FIFOメモリ６７８から出力された１ビットの値D676（sign（uj））を最上位ビットとするとともに、FIFOメモリ６６９から出力された５ビットの値D670（｜uj｜）を下位５ビットとした合計６ビットの値D678（uj）は、セレクタ６７０に供給される。また、１ビットの値D676は、EXOR回路６７９に供給される。
【０４８２】
セレクタ６７０には、FIFOメモリ６６９から６ビットの値D671が供給されるとともに、６ビットの値D678（uj）が供給される。また、セレクタ６７０には、制御部６４２から選択信号D643が供給される。セレクタ６７０は、第１の演算または第２の演算のうち一方の選択を表す選択信号D643に基づいて、値D671と値D678のうち一方を選択し、その選択した値を値D679として減算器６７１に供給する。ここでは、選択信号D643は、第１の演算の選択を表しているので、値D678（uj)を値D679として、減算器６７１に出力する。
【０４８３】
減算器６７１は、セレクタ６６７から供給された９ビットの値D669から、セレクタ６７０から供給された６ビットの値D679を減算し、その減算結果を、６ビットの減算値D680として出力する。即ち、減算器６７１は、検査行列の１列に亘る１に対応する復号途中結果D641（復号途中結果uj）の積算値と受信データD643（受信値u0i）との加算値から、検査行列の所定の１に対応する復号途中結果D641(uj)を減算して、その減算値（ｊ＝１からｊ＝ｄv−１までのΣujと受信値u0iの加算値、即ち、vi）を６ビットの減算値D680として出力する。即ち、減算器６７１では、検査行列の各列の１に対応する復号結果のうち、検査行列の所定の１に対応する復号結果以外のすべてを積算した値と、受信データD544を加算した値が減算値D680として出力される。出力された減算値D680は、その下位５ビットを値D681（｜vi｜）として、LUT６７２に供給され、上位１ビットを符号ビットD683（sign（vi））として、セレクタ６８０に供給される。ここでいう「所定の１」に対応する復号結果とは、式（１）と（８）の演算により復号途中結果vi’を求めたい枝からのメッセージに対応するujである。
【０４８４】
LUT６７２は、値D681（｜vi｜）に対してφの演算を行った５ビットの演算結果D682（φ（｜vi｜）)を出力する。即ち、値D681に対してφの関数を用いて変換された値が、演算結果D682として読み出され、出力される。
【０４８５】
一方、EXOR回路６７９は、レジスタ６７６から供給された１ビットの値D675と、FIFOメモリ６７８から供給された１ビットの値D676との排他的論理和を演算することにより、値D675を、値D676で除算し、１ビットの除算結果を除算値D684として、セレクタ６８０に供給する。
【０４８６】
セレクタ６８０には、減算器６７１から供給された１ビットの符号ビットD683（sign（vi））が供給されるとともに、EXOR回路６７９から１ビットの除算値D684が供給される。また、セレクタ６８０には、制御部６４２から選択信号D643が供給される。セレクタ６８０は、第１の演算または第２の演算のうち一方の選択を表す選択信号D643に基づいて、符号ビットD683と除算値D684のうち一方を選択し、その選択した１ビットの値をD685として、出力する。ここでは、選択信号は、第１の演算の選択を表しているので、値D683（sign（vi））を、値D685として出力する。
【０４８７】
LUT６７２から出力された５ビットの演算結果D682（φ（｜vi｜）を下位５ビットとするとともに、セレクタ６８０から出力された１ビットの値D685（sign（vi））を最上位ビットとする合計６ビットの復号途中結果D642（復号途中結果vi’）が出力される。即ち、演算結果D682と値D685が乗算され、検査行列の所定の１に対応する第１の演算結果である復号途中結果D642が出力される。
【０４８８】
以上のように、制御部６４２により、計算器６４１1で行う演算として、第１の演算が選択された場合、計算器６４１1では、式（１）と式（８）の演算が行われ、復号途中結果vi’が求められる。
【０４８９】
次に、検査行列の各列の１に対応する６ビットの復号途中結果vi'が、復号途中結果D641として１つずつ読み込まれた場合の計算器６４１1の処理について説明する。このとき、制御部６４２は、第１の演算または第２の演算のうちの、第２の演算を、いま、計算器６４１1で行う演算として選択し、その選択を表す選択信号D583を計算器６４１1に供給するとともに、演算を制御するための制御信号D583の値を、計算器６４１1が１行に亘る復号途中結果（検査行列Hの各行の１に対応する第１の演算の結果）を読み込む毎に、“０”から“１”に変更する。
【０４９０】
計算器６４１1では、制御部６４２が第２の演算を、いま、計算器６４１1で行う演算として選択した場合も、第１の演算を選択した場合と同様に演算が行われるが、選択信号D643が第２の演算の選択を表しているため、セレクタ６６１、セレクタ６６７、セレクタ６７０、およびセレクタ６８０では、上述した選択信号D643が第１の演算の選択を表している場合と異なる他方の値が選択される。
【０４９１】
即ち、制御部６４２により、いま、計算器６４１1で行う演算として、第２の演算が選択された場合、計算器６４１1では、制御部６４２から供給される、例えば、１ビットの制御信号D583に基づき、メモリ６４０から１つずつ読み込まれる復号途中結果D641を用いて、式（９）にしたがって演算を行う。
【０４９２】
計算器６４１1では、検査行列の各列の１に対応する６ビットの復号途中結果D641（復号途中結果vi'）が１つずつ読み込まれ、その下位ビットである絶対値D662(|vi'|)がFIFOメモリ６６９に供給されるとともに、その絶対値D662において、１ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D663が、セレクタ６６１に供給される。また、復号途中結果D641の最上位ビットである符号ビットD661（sign（vi'））がEXOR回路６７３とFIFOメモリ６７８にそれぞれ供給される。さらに、計算器６４１1では、１つずつ読み込まれた６ビットの復号途中結果D641がセレクタ６６１に供給される。
【０４９３】
セレクタ６６１には、６ビットの復号途中結果D641と６ビットの値D663(|vi'|)が供給される。また、セレクタ６６１には、第１の演算と第２の演算のうち一方の選択を表す選択信号D643が供給される。セレクタ６６１は、選択信号D643に基づいて、復号途中結果D641と値D663のうち一方を選択し、その一方を値D664として、加算器６６２に供給する。ここでは、選択信号D643は、第２の演算の選択を表しているので、セレクタ６６１は、値D663(|vi'|)を、値D664として加算器６６２に供給する。
【０４９４】
積算部７０１の加算器６６２は、値D664(|vi'|)とレジスタ６６３に格納されている９ビットの値D665とを加算することにより、値D664を積算し、その結果得られる９ビットの積算値をレジスタ６６３に再格納する。なお、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値D662(|vi|)に対する値D664が積算された場合レジスタ６６３はリセットされる。
【０４９５】
検査行列の１行に亘る復号途中結果D641（検査行列の各列のすべての復号途中結果D641）が１つずつ読み込まれ、レジスタ６６３に１行分の値D664が積算された積算値が格納された場合、制御部６４２から供給される制御信号D583は、０から１に変化する。例えば、行の重みが「９」である場合、制御信号D583は、１から８クロック目までは、「０」となり、９クロック目では「１」となる。
【０４９６】
制御信号D583が「１」の場合、セレクタ６６４は、レジスタ６６３に格納されている値、即ち、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値（|vi’|）が積算された９ビットの値D665（ｉ＝１からｉ＝ｄcまでのΣ|vi’|）を選択し、値D666として、レジスタ６６５に出力して格納させる。レジスタ６６５は、格納している値D666を、９ビットの値D667として、セレクタ６６４、加算器６６６、およびセレクタ６６７に供給する。
【０４９７】
制御信号D583が「０」の場合、セレクタ６６４は、レジスタ６６５から供給された値D667を選択し、レジスタ６６５に出力して再格納させる。即ち、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値D664（|vi’|）が積算されるまで、レジスタ６６５は、前回積算された|vi’|を、セレクタ６６４、加算器６６６、およびセレクタ６６７に供給する。
【０４９８】
加算器６６６では、レジスタ６６５から値D667が供給されるとともに、受信データ用メモリ５４４から受信データD544が供給される。加算器６６６は、値D667に、受信データ用メモリ５４４から供給された受信データD544を加算して、その結果得られる値D668をセレクタ６６７に供給する。
【０４９９】
セレクタ６６７には、加算器６６６から値D668が供給されるとともに、レジスタ６６５から値D667が供給される。また、セレクタ６６７には、制御部６４２から、第１の演算と第２の演算のうち一方の選択を表す選択信号D643が供給される。セレクタ６６７は、選択信号D643に基づいて、値D668と値D667のうち一方を選択し、その選択した値を、値D669として、減算器６７１に供給する。ここでは、選択信号D643は、第１の演算の選択を表しているので、セレクタ６６７は、値D667を選択し、値D669として減算器６７１に供給する。
【０５００】
一方、FIFOメモリ６６９は、レジスタ６６５から新たな値D667（ｉ＝１からｉ＝ｄCまでのΣ|vi’|）が出力されるまでの間、メモリ６４０から供給された５ビットの復号途中結果D641の絶対値D662（|vi’|）を遅延し、５ビットの値D670として出力する。その値D670において、１ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D671（|vi’|）が、セレクタ６７０に供給される。
【０５０１】
以上の処理と並行して、乗算部７０２のEXOR回路６７３は、レジスタ６７４に格納されている１ビットの値D673と符号ビットD661（sign（vi’））との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、１ビットの乗算結果D672をレジスタ６７４に再格納する。なお、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された場合、レジスタ６７４はリセットされる。
【０５０２】
検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された乗算結果D672がレジスタ６７４に格納された場合、制御部６４２から供給される制御信号D583は、「０」から「１」に変化する。
【０５０３】
制御信号D583が「１」の場合、セレクタ６７５は、レジスタ６７４に格納されている値、即ち、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された値D673（ｉ＝１からｉ＝ｄcまでのΠsign（vi’））を選択し、１ビットの値D674としてレジスタ６７６に出力して格納させる。レジスタ６７６は、格納している値D674を、１ビットの値D675として、セレクタ６７５とEXOR回路６７９に供給する。
【０５０４】
制御信号D583が「０」の場合、セレクタ６７５は、レジスタ６７６から供給された値D675を選択し、レジスタ６７６に出力して再格納させる。即ち、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661が乗算されるまで、レジスタ６７６は、前回格納した値を、セレクタ６７５とEXOR回路６７９に供給する。
【０５０５】
一方、FIFOメモリ６７８は、レジスタ６７６から新たな値D675がEXOR回路６７９に供給されるまでの間、符号ビットD661を遅延し、１ビットの値D676として、出力する。FIFOメモリ６７８から出力された１ビットの値D676を最上位ビットとするとともに、FIFOメモリ６６９から出力された５ビットの値D670を下位５ビットとした合計６ビットの値D678は、セレクタ６７０に供給される。また、１ビットの値D676は、EXOR回路６７９に供給される。
【０５０６】
セレクタ６７０には、FIFOメモリ６６９から６ビットの値D671（|vi’|)が供給されるとともに、６ビットの値D678が供給される。また、セレクタ６７０には、制御部６４２から選択信号D643が供給される。セレクタ６７０は、第１の演算または第２の演算のうち一方の選択を表す選択信号D643に基づいて、値D671と値D678のうち一方を選択し、その選択した値を値D679として減算器６７１に供給する。ここでは、選択信号D643は、第２の演算の選択を表しているので、値D671（|vi’|)を値D679として、減算器６７１に出力する。
【０５０７】
減算器６７１は、セレクタ６６７から供給された９ビットの値D669から、セレクタ６７０から供給された６ビットの値D679を減算し、その減算結果を、６ビットの減算値D680として出力する。即ち、減算器６７１は、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値D662 (|vi’|)の積算値から、検査行列の所定の１に対応する復号途中結果D641の絶対値(|vi’|)を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣ|vi’|）を６ビットの減算値D680として出力する。即ち、減算器６７１では、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値D662のうち、検査行列の所定の１に対応する復号途中結果D641以外の全てが積算された値が減算値D681として出力される。出力された減算値D680は、その下位５ビットが値D681として、LUT６７２に供給され、最上位ビットが符号ビットD683として、セレクタ６８０に供給される。ここでいう「所定の１」に対応する復号結果とは、式（９）の演算によりメッセージujを求めたい枝からのメッセージに対応するvi’である。
【０５０８】
LUT６７２は、値D681（ｉ＝１からｉ＝ｄc−１までのΣ（vi’)）に対してφ-1の演算を行った５ビットの演算結果D682（φ-1（Σ（vi’)）)を出力する。即ち、LUT６７２では、値D681に対してφの逆関数であるφ-1の関数を用いて変換された値が読み出され、演算結果D682として出力される。
【０５０９】
即ち、φは、φ＝φ-1となる関数だから、φのLUTを、φ-1のLUTとしても使える。即ち、φ＝φ-1のLUTは共有化できる。
【０５１０】
一方、EXOR回路６７９は、レジスタ６７６から供給された１ビットの値D675と、FIFOメモリ６７８から供給された１ビットの値D676との排他的論理和を演算することにより、値D675を、値D676で除算し、１ビットの除算結果を除算値D684として、セレクタ６８０に供給する。即ち、EXOR回路６７９は、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661の乗算値（ｉ＝１からｉ＝ｄcまでのΠsign（vi’））を、検査行列の所定の１に対応する復号途中結果D641の符号ビットD661で除算して、その除算値を除算値D684（ｉ＝１からｉ＝ｄc−１までのΠsign（vi’））として、セレクタ６８０に供給する。即ち、EXOR回路６７９では、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661のうち、検査行列の所定の１に対応する符号ビットD661以外のすべてが乗算された値が、除算値D684として出力される。ここでいう「所定の１」に対応する復号途中結果D641とは、式（９）の演算（第２の演算）によりメッセージujを求めたい枝からのメッセージに対応するvi’である。
【０５１１】
セレクタ６８０には、減算器６７１から供給された１ビットの符号ビットD683が供給されるとともに、EXOR回路６７９から１ビットの除算値D684が供給される。また、セレクタ６８０には、制御部６４２から選択信号D643が供給される。セレクタ６８０は、第１の演算または第２の演算のうち一方の選択を表す選択信号D643に基づいて、符号ビットD683と除算値D684のうち一方を選択し、その選択した１ビットの値をD685として、出力する。ここでは、選択信号は、第２の演算の選択を表しているので、除算値D684（ｉ＝１からｉ＝ｄc−１までのΠsign（vi’））を、値D685として出力する。
【０５１２】
LUT６７２から出力された５ビットの演算結果D682を下位５ビットとするとともに、セレクタ６８０から出力された１ビットの値D685を最上位ビットとする合計６ビットの復号途中結果D642（uj）が出力される。即ち、演算結果D682と値D685が乗算され、検査行列の検査行列の所定の１に対応する第２の演算結果である６ビットの復号結果D642（uj）が出力される。
【０５１３】
以上のように、制御部６４２により、計算器６４１1で行う演算として、第２の演算が選択された場合、計算器６４１1では、式（９）の演算が行われ、復号途中結果ujが求められる。
【０５１４】
上述したように、計算器６４１1では、第１の演算の結果である復号途中結果vi’と第２の演算の結果である復号途中結果ujを出力して、メモリ６４０に格納させることにより、LUTを共有化することができ、ノード計算器５８１k（K=1,2・・・5）に比べて、計算器６４１1の回路規模を小さくすることができる。また、計算器６４１1では、φとφ-1のLUTを１つのLUT６７２に共有化することができるので、図２８のノード計算器５８１kに比べて、効率よく演算を行うことができる。
【０５１５】
なお、計算器６４１1では、第２の演算が行われるときには、検査行列の各行の行の重みに基づいて、FIFOメモリ６６９とFIFOメモリ６７８における遅延量が、その行の重みの値に減らされ、第１の演算が行われるときには、検査行列の各列の列の重みに基づいて、FIFOメモリ６６９とFIFOメモリ６７８における遅延量が、その列の重みの値に減らされる。
【０５１６】
また、図３１の計算器６４１1では、LUT６７２は、出力側に設けたが、入力側、即ち、セレクタ６６１の前段に設けてもよい。
【０５１７】
図３２は、図３１の復号装置６３０の復号処理を説明するフローチャートである。この処理は、例えば、受信データ用メモリ５４４に復号すべき受信データが格納されたとき、開始される。
【０５１８】
ステップＳ１４１において、制御部６４２は、第１の演算と第２の演算のうち、いま、演算を行う演算として、第１の演算を選択し、その選択を表す選択信号D643を、計算部６４１に供給する。
【０５１９】
ステップＳ１４１の処理後は、ステップＳ１４２に進み、計算部６４１は、ステップＳ１４１で制御部６４２から供給された選択信号D643に基づいて、第１の演算と第２の演算のうち、いま計算部６４１で行う演算として、第１の演算を選択し、第１の演算を行う。
【０５２０】
具体的には、計算部６４１には、メモリ６４０から、後述するステップＳ１４９で格納された５つの復号途中結果D640（復号途中結果uj）が供給されるとともに、受信データ用メモリ５４４から５つの受信データD544（受信値u0i）が供給され、復号途中結果D640と受信データD544が、計算部６４１の計算器６４１1乃至６４１5のそれぞれに１つずつ供給される。また、計算部６４１には、制御部６４２から制御信号D583と選択信号D643が供給される。
【０５２１】
なお、受信用メモリ５４４から供給された受信データD544に対して、まだ第２の演算が行われておらず、メモリ６４０に復号途中結果D640（D641）が格納されていない場合、メモリ６４０は、復号途中結果D640を計算部６４１に供給せず、計算部６４１は、復号途中結果ujを初期値に設定する。
【０５２２】
計算器６４１1乃至６４１5は、選択信号D643に基づいて、いま行う演算を選択する。即ち、ここでは、制御部６４２から供給される選択信号D643は、第１の演算の選択を表しているので、計算器６４１1乃至６４１5は、第１の演算を行う。つまり、計算器６４１1乃至６４１5は、復号途中結果D640と受信データD544とを用いて、制御信号D583に基づいて、式（９）にしたがって、それぞれ演算を行い、その演算の結果である復号途中結果D642（vi）を得る。
【０５２３】
前述の図３１で説明したように、計算器６４１1乃至６４１5は、選択信号D643に基づいて、いま行う演算を選択し、メモリ６４０から必要な復号途中結果D640を、それぞれ１つずつ読み出すとともに、受信データ用メモリ５４４から必要な受信データD544を１つずつ読み出して、第１の演算を行い、その演算の結果である復号途中結果D642を得る。
【０５２４】
ステップＳ１４２の処理後は、ステップＳ１４３に進み、計算部６４１は、第１の演算の結果得られる５つの復号途中結果D642を、サイクリックシフト回路５５１に供給し、ステップＳ１４４に進む。
【０５２５】
ステップＳ１４４において、サイクリックシフト回路５５１は、計算部６４１から供給された５つの復号途中結果D642を、サイクリックシフトし、その結果である５つの復号途中結果D640をメモリ６４０の既に読みだされた復号途中結果（D641）のアドレスに格納する。なお、５つの復号途中結果D640は、同一のアドレスに格納される。
【０５２６】
ステップＳ１４４の処理後は、ステップＳ１４５に進み、制御部６４２は、計算部６４１により、全ての復号途中結果が演算されたかどうか、即ち、図２２の検査行列Hの“１”の数分の復号途中結果が演算されたかどうかを判定し、全ての復号途中結果が演算されていないと判定した場合、ステップＳ１４２に戻り、上述した処理を繰り返す。
【０５２７】
一方、ステップＳ１４５において、制御部６４２は、計算部６４１により、全ての復号途中結果が演算されたと判定した場合、ステップＳ１４６に進み、制御部６４２は、いま、演算を行う演算として、第２の演算を選択し、ステップＳ１４１で生成した第１の演算の選択を表す選択信号D643を、第２の演算の選択を表す選択信号D643に変更する。
【０５２８】
ステップＳ１４６の処理後は、ステップＳ１４７に進み、計算部６４１は、ステップＳ１４６で変更された選択信号D643に基づいて、第１の演算と第２の演算のうち、いま行う演算として、第２の演算を選択し、第２の演算を行う。
【０５２９】
具体的には、計算部６４１には、メモリ６４０から、ステップＳ１４４で格納された５つの復号途中結果D640が、復号途中結果D641として供給され、復号途中結果D641が、計算部６４１の計算器６４１1乃至６４１5のそれぞれに１つずつ供給される。
【０５３０】
計算器６４１1乃至６４１5は、ステップＳ１４６で変更された選択信号D643に基づいて、いま行う演算を選択する。即ち、ここでは、選択信号D643は、第２の演算の選択を表しているので、計算器６４１1乃至６４１5は、第２の演算を行う。つまり、計算器６４１1乃至６４１5は、復号途中結果D641を用いて、制御信号D583に基づいて、式（１）と式（８）にしたがって、それぞれ演算を行い、その演算の結果である復号途中結果D642（uj）を得る。
【０５３１】
前述の図３１で説明したように、計算器６４１1乃至６４１5は、選択信号D643に基づいて、いま行う演算を選択し、メモリ６４０ら必要な復号途中結果D641を、それぞれ１つずつ読み出しながら、第２の演算を行い、その演算の結果である復号途中結果D642を得る。
【０５３２】
ステップＳ１４７の処理後は、ステップＳ１４８に進み、計算部６４１は、第２の演算の結果得られる５つの復号途中結果D642を、サイクリックシフト回路５５１に供給し、ステップＳ１４９に進む。
【０５３３】
ステップＳ１４９において、サイクリックシフト回路５５１は、計算部６４１から供給された５つの復号途中結果D642を、サイクリックシフトし、その結果を５つの復号途中結果D640として、メモリ６４０の既に読みだされた復号途中結果（D641）のアドレスに格納する。なお、５つの復号途中結果D640は、同一のアドレスに格納される。
【０５３４】
ステップＳ１４９の処理後は、ステップＳ１５０に進み、制御部６４２は、計算部６４１により、全ての復号途中結果が演算されたかどうかを判定し、全ての復号途中結果が演算されていないと判定した場合、ステップＳ１４７に戻り、上述した処理を繰り返す。
【０５３５】
一方、ステップＳ１５０において、制御部６４２は、計算部６４１により、全ての復号途中結果が演算されたと判定した場合、処理を終了する。
【０５３６】
なお、復号装置６３０は、復号回数だけ図３２の復号処理を繰り返し行ない、メモリ６４０に、最後の第１の演算の結果得られる復号途中結果D642（uj）が格納された場合、その復号途中結果D642（uj）を上述した式（５）の演算を行う不図示のブロックに供給する。不図示のブロックには、さらに受信データ用メモリ５４４から受信データD544が供給され、不図示のブロックは、復号途中結果D642と受信データD544を用いて、式（５）の演算を行い、その演算結果を最終的な復号結果として出力する。
【０５３７】
図３３は、図３１の計算器６４１1の第１の演算処理を説明するフローチャートである。なお、図３３のフローチャートは、図３２のステップＳ１４２の第１の演算の処理を詳細に説明するフローチャートである。
【０５３８】
図３３では、図３１の計算器６４１1の処理について説明するが、タの計算器６４１2乃至計算器６４１5でも同様の処理が行なわれる。
【０５３９】
ステップＳ１６１において、積算部７０１は、復号途中結果D641（uj）を積算する。
【０５４０】
具体的には、積算部７０１の加算器６６２は、メモリ６４０から供給される６ビットの値D641(uj)と、レジスタ６６３に格納されている９ビットの値D665とを加算することにより、値D641を積算し、その結果得られる９ビットの積算値（第１の積算値）をレジスタ６６３に再格納する。
【０５４１】
検査行列の１列に亘る復号途中結果D641（検査行列の各行の1に対応するすべての復号途中結果D641）が１つずつ読み込まれ、レジスタ６６３に１列分の値D641が積算された積算値（ｊ＝１からｊ＝ｄvまでのΣuj）が格納された場合、制御部６４２から供給される制御信号D583は、０から１に変化する。
【０５４２】
制御信号D583が「１」の場合、セレクタ６６４は、レジスタ６６３に格納されている値、即ち、検査行列の１列に亘る１に対応する復号途中結果D641（復号途中結果uj）が積算された９ビットの値D665（ｊ＝１からｊ＝ｄvまでのΣuj）を選択し、値D666として、レジスタ６６５に出力して格納させる。レジスタ６６５は、格納している値D666を、９ビットの値D667として、セレクタ６６４と加算器６６６に供給する。
【０５４３】
制御信号D583が「０」の場合、セレクタ６６１は、レジスタ６６５から供給された値D667を選択し、レジスタ６６５に出力して再格納させる。即ち、検査行列の１列に亘る１に対応する復号途中結果D641（復号途中結果uj）が積算されるまで、レジスタ６６５は、前回積算されたujを、セレクタ６６４と加算器６６６に供給する。
【０５４４】
ステップＳ１６１の処理後は、ステップＳ１６２に進み、加算器６６６は、ステップＳ１６１で求められた積算値である値D667と、受信データ用メモリ５４４から供給される受信データD544（LDPC符号）とを加算して、値D666（加算値）を求め、セレクタ６６７を介して、減算器６７１に供給する。
【０５４５】
ステップＳ１６２の処理後は、ステップＳ１６３に進み、減算器６７１は、加算器６６６から供給された値D669（値D667）から、検査行列の所定の１に対応する復号途中結果D641(uj)を減算して、その減算値（ｊ＝１からｊ＝ｄv−１までのΣujと受信値u0iの加算値、即ち、vi）を６ビットの減算値D680（第１の減算値）として出力する。
【０５４６】
具体的には、FIFOメモリ６６９は、レジスタ６６５から新たな値D667（ｊ＝１からｊ＝ｄvまでのΣuj）が出力されるまでの間、メモリ６４０から供給された５ビットの復号途中結果D641の絶対値（｜uj｜）を遅延し、５ビットの値D670として出力する。
【０５４７】
一方、FIFOメモリ６７８は、レジスタ６７６から新たな値D675がEXOR回路６７９に供給されるまでの間、メモリ６４０から供給される復号途中結果D641の符号ビットD661（sign（uj））を遅延し、１ビットの値D676として、出力する。
【０５４８】
FIFOメモリ６７８から出力された１ビットの値D676（sign（uj））を最上位ビットとするとともに、FIFOメモリ６６９から出力された５ビットの値D670（｜uj｜）を下位５ビットとした合計６ビットの値D678（uj）は、セレクタ６７０を介して、減算器６７１に供給される。
【０５４９】
減算器６７１は、セレクタ６６７を介して、レジスタ６６５から供給された９ビットの値D669から、セレクタ６７０を介して供給された６ビットの値D679を減算し、その減算結果を、６ビットの減算値D680として出力する。即ち、減算器６７１は、検査行列の１列に亘る１に対応する復号途中結果D641（復号途中結果uj）の積算値と受信データD643（受信値u0i）との加算値から、検査行列の所定の１に対応する復号途中結果D641(uj)を減算して、その減算値（ｊ＝１からｊ＝ｄv−１までのΣujと受信値u0iの加算値、即ち、vi）を６ビットの減算値D680として出力する。即ち、減算器６７１では、検査行列の各列の１に対応する復号結果のうち、検査行列の所定の１に対応する復号結果以外のすべてを積算した値と、受信データD544を加算した値が減算値D680として出力される。ここでいう「所定の１」に対応する復号結果とは、式（１）と式（８）の演算によりメッセージvi’を求めたい枝からのメッセージに対応するujである。
【０５５０】
そして、出力された減算値D680は、その下位５ビットを値D681（｜vi｜）として、LUT６７２に供給され、上位１ビットを符号ビットD683（sign（vi））として、セレクタ６８０を介して出力される。
【０５５１】
ステップＳ１６３の処理後は、ステップＳ１６４に進み、LUT６７２は、減算器６７１から供給される減算値D680の下位５ビット（絶対値）である値D681（｜vi｜）に対して、φの関数を用いて変換した変換値（第１の変換値）を読み出し、出力する。即ち、LUT６７２は、値D681に対してφの演算を行った５ビットの演算結果D682（φ（｜vi｜）)を出力する。
【０５５２】
ステップＳ１６４の処理後は、ステップＳ１６５に進み、計算器６４１1では、LUT６７２から出力された５ビットの演算結果D682（φ（｜vi｜）と、セレクタ６８０から出力された１ビットの値D685（sign（vi））が乗算され、検査行列の所定の１に対応する第１の演算結果である復号途中結果D642として出力される。即ち、計算器６４１1では、５ビットの演算結果D682（φ（｜vi｜）を下位５ビットとするとともに、１ビットの値D685（sign（vi））を最上位ビットとする合計６ビットの復号途中結果D642（復号途中結果vi’）（第２の乗算値）が出力される。そして、計算器６４１1は処理を終了する。
【０５５３】
以上のように、計算器６４１1では、式（１）と式（８）の演算が行われ、復号途中結果vi’が求められる。
【０５５４】
図３４は、図３０の計算器６４１1の第２の演算処理を説明するフローチャートである。なお、図３３のフローチャートは、図３２のステップＳ１４７の第２の演算の処理を詳細に説明するフローチャートである。
【０５５５】
図３３では、図３１の計算器６４１1の処理について説明するが、他の計算器６４１2乃至計算器６４１5でも同様の処理が行なわれる。
【０５５６】
ステップＳ１８１において、積算部７０１は、メモリ６４０から供給される復号途中結果viの絶対値|vi|を積算する。
【０５５７】
具体的には、計算器６４１1では、検査行列の各列の１に対応する６ビットの復号途中結果D641（復号途中結果vi’）が１つずつ読み込まれ、その下位ビットである絶対値D662(|vi’|)がFIFOメモリ６６９に供給されるとともに、その絶対値D662において、１ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D663が、セレクタ６６１を介して、積算部７０１の加算器６６２に供給される。
【０５５８】
積算部７０１の加算器６６２は、値D664（D663(|vi’|)）とレジスタ６６３に格納されている９ビットの値D665とを加算することにより、値D664を積算し、その結果得られる９ビットの積算値（第２の積算値）をレジスタ６６３に再格納する。
【０５５９】
検査行列の１行に亘る復号途中結果D641（検査行列の各列のすべての復号途中結果D641）が１つずつ読み込まれ、レジスタ６６３に１行分の値D664が積算された積算値が格納された場合、制御部６４２から供給される制御信号D583は、０から１に変化する。
【０５６０】
制御信号D583が「１」の場合、セレクタ６６４は、レジスタ６６３に格納されている値、即ち、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値（|vi’|）が積算された９ビットの値D665（ｉ＝１からｉ＝ｄcまでのΣ|vi’|）を選択し、値D666として、レジスタ６６５に出力して格納させる。レジスタ６６５は、格納している値D666を、９ビットの値D667として、セレクタ６６４に供給するとともに、セレクタ６６７を介して減算器６７１に供給する。
【０５６１】
制御信号D583が「０」の場合、セレクタ６６４は、レジスタ６６５から供給された値D667を選択し、レジスタ６６５に出力して再格納させる。即ち、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値D664（|vi’|）が積算されるまで、レジスタ６６５は、前回積算された|vi’|を、セレクタ６６４に供給するとともに、セレクタ６６７を介して減算器６７１に供給する。
【０５６２】
ステップＳ１８１の処理後は、ステップＳ１８２に進み、減算器６７１は、セレクタ６６７を介して、レジスタ６６５から供給された９ビットの値D669から、所定の復号途中結果vi’の絶対値|vi’|を減算し、その減算結果を、６ビットの減算値D680（第２の減算値）として出力する。
【０５６３】
具体的には、FIFOメモリ６６９は、レジスタ６６５から新たな値D667（ｉ＝１からｉ＝ｄCまでのΣ|vi’|）が出力されるまでの間、メモリ６４０から供給された５ビットの復号途中結果D641の絶対値D662（|vi’|）を遅延し、５ビットの値D670として出力する。その値D670において、１ビットの値である“０”が最上位ビットに付加されることにより、ビット拡張が行われ、そのビット拡張の結果である６ビットの値D671（|vi’|）が、セレクタ６７０を介して、減算器６７１に供給される。
【０５６４】
減算器６７１は、レジスタ６６５から供給された検査行列の１行に亘る１に対応する復号途中結果D641の絶対値D662(|vi’|)の積算値から、FIFOメモリ６６９から供給された検査行列の所定の１に対応する復号途中結果D641の絶対値(|vi’|)を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣ|vi’|）を６ビットの減算値D680として出力する。即ち、減算器６７１では、検査行列の１行に亘る１に対応する復号途中結果D641の絶対値D662のうち、検査行列の所定の１に対応する復号途中結果D641以外の全てが積算された値が減算値D681として出力される。ここでいう「所定の１」に対応する復号結果とは、式（９）の演算によりメッセージujを求めたい枝からのメッセージに対応するvi’である。
【０５６５】
そして、出力された減算値D680は、その下位５ビットである絶対値が値D681として、LUT６７２に供給される。
【０５６６】
ステップＳ１８２の処理後は、ステップＳ１８３に進み、LUT６７２は、減算器６７１から供給される減算値D680の絶対値である値D681（ｉ＝１からｉ＝ｄc−１までのΣ（vi’)）に対して、φの逆関数であるφ-1の関数を用いて変換された値（第２の変換値）が読み出され、φ-1の演算を行った５ビットの演算結果D682（φ-1（Σ（vi’)）)を出力する。即ち、LUT６７２は、値D681（ｉ＝１からｉ＝ｄc−１までのΣ（vi’)）に対してφ-1の演算を行った５ビットの演算結果D682（φ-1（Σ（vi’)）)を出力する。
【０５６７】
ステップＳ１８３の処理後は、ステップＳ１８４に進み、乗算部７０２は、復号途中結果vi’の符号ビットを乗算する。
【０５６８】
具体的には、計算器６４１1では、復号途中結果D641の最上位ビットである符号ビットD661（sign（vi’））がEXOR回路６７３とFIFOメモリ６７８にそれぞれ供給される。そして、乗算部７０２のEXOR回路６７３は、レジスタ６７４に格納されている１ビットの値D673と符号ビットD661（sign（vi’））との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、１ビットの乗算結果D672をレジスタ６７４に再格納する。
【０５６９】
検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された乗算結果D672がレジスタ６７４に格納された場合、制御部６４２から供給される制御信号D583は、「０」から「１」に変化する。
【０５７０】
制御信号D583が「１」の場合、セレクタ６７５は、レジスタ６７４に格納されている値、即ち、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661が乗算された値D673（ｉ＝１からｉ＝ｄcまでのΠsign（vi’））を選択し、１ビットの値D674としてレジスタ６７６に出力して格納させる。レジスタ６７６は、格納している値D674を、１ビットの値D675として、セレクタ６７５とEXOR回路６７９に供給する。
【０５７１】
制御信号D583が「０」の場合、セレクタ６７５は、レジスタ６７６から供給された値D675を選択し、レジスタ６７６に出力して再格納させる。即ち、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661が乗算されるまで、レジスタ６７６は、前回格納した値を、セレクタ６７５とEXOR回路６７９に供給する。
【０５７２】
ステップＳ１８４の処理後は、ステップＳ１８５に進み、EXOR回路６７９は、レジスタ６７６から供給された１ビットの値D675、所定の復号途中結果vi’の符号ビットsign(vi’)を除算し、その除算結果を、１ビットの除算値D684（符号乗算値）として、セレクタ６８０を介して出力する。
【０５７３】
即ち、FIFOメモリ６７８は、レジスタ６７６から新たな値D675がEXOR回路６７９に供給されるまでの間、符号ビットD661を遅延し、１ビットの値D676として、EXOR回路６７９に供給する。
【０５７４】
EXOR回路６７９は、レジスタ６７６から供給された１ビットの値D675と、FIFOメモリ６７８から供給された１ビットの値D676との排他的論理和を演算することにより、値D675を、値D676で除算し、１ビットの除算結果を除算値D684として、セレクタ６８０に供給する。即ち、EXOR回路６７９は、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661の乗算値（ｉ＝１からｉ＝ｄcまでのΠsign（vi’））を、検査行列の所定の１に対応する復号途中結果D641の符号ビットD661で除算して、その除算値を除算値D684（ｉ＝１からｉ＝ｄc−１までのΠsign（vi’））として、セレクタ６８０に供給する。即ち、EXOR回路６７９では、検査行列の１行に亘る１に対応する復号途中結果D641の符号ビットD661のうち、検査行列の所定の１に対応する符号ビットD661以外のすべてが乗算された値が、除算値D684として、セレクタ６８０を介して出力される。ここでいう「所定の１」に対応する復号結果とは、式（９）の演算によりメッセージujを求めたい枝からのメッセージに対応するvi’である。
【０５７５】
ステップＳ１８５の処理後は、ステップＳ１８６に進み、計算器６４１1では、即ち、LUT６７２から出力された５ビットの演算結果D682と、EXOR回路６７９からセレクタ６８０を介して出力された１ビットの値D685とが乗算され、検査行列の所定の１に対応する第２の演算結果である６ビットの復号結果D642（uj）として出力される。即ち、５ビットの演算結果D682を下位５ビットとするとともに、１ビットの値D685を最上位ビットとする合計６ビットの復号途中結果D642（uj）（第１の乗算値）が出力される。そして、計算器６４１1は処理を終了する。
【０５７６】
以上のように、計算器６４１1では、式（９）の演算が行われ、復号途中結果ujが求められる。
【０５７７】
なお、上述したサイクリックシフト回路には、バレルシフタを用いると回路規模を小さくしながら所望の操作を実現できる。
【０５７８】
また、FIFOやRAMの物理的なビット幅が足りない場合には、複数のRAMを用いて同じ制御信号を与えることで、論理的に１つのRAMとみなすことができる。
【０５７９】
さらに、上述の場合には、説明を簡単にするために、Pが５の場合、即ち、検査行列を構成する構成行列の行数および列数が５の場合を例に挙げたが、構成行列の行数および列数Pは必ずしも５である必要はなく、検査行列によって異なる値を取ることもあり得る。例えば、Pは３６０や３９２であってもよい。
【０５８０】
また、本実施の形態では、符号長90、符号化率2/3のLDPC符号を用いたが、LDPC符号の符号長や符号化率は、幾つであっても構わない。例えば、構成行列の行数および列数Pが5の場合、枝総数が５以下であれば、どのような符号長、符号化率のLDPC符号でも、制御信号を代えるだけで、図２４の復号装置５３０、図２６の復号装置５７０、図２８の復号装置６００、図３０の復号装置６３０を用いて復号可能である。
【０５８１】
さらに、構成行列の行数および列数Pが所定の値で、枝の総数がある値以下、という条件を満たすあるLDPC符号の復号装置は、その条件を満たす、任意の符号長で、任意の符号化率のLDPC符号を復号することができる。
【０５８２】
検査行列が、構成行列の行数および列数Pの倍数でない場合は、検査行列の端数の外側にすべて０(all 0)の成分を付けてPの倍数とみなして適用できることがある。
【０５８３】
また、本実施の形態では、検査行列は構成行列から構成したが、検査行列は、構成行列から構成されなくてもよい。
【０５８４】
次に、上述した一連の処理は、ハードウェアにより行うこともできるし、ソフトウェアにより行うこともできる。一連の処理をソフトウェアによって行う場合には、そのソフトウェアを構成するプログラムが、汎用のコンピュータ等にインストールされる。
【０５８５】
そこで、図３４は、上述した一連の処理を実行するプログラムがインストールされるコンピュータの一実施の形態の構成例を示している。
【０５８６】
プログラムは、コンピュータに内蔵されている記録媒体としてのハードディスク９０５やＲＯＭ９０３に予め記録しておくことができる。
【０５８７】
あるいはまた、プログラムは、フレキシブルディスク、CD-ROM(Compact Disc Read Only Memory)，MO(Magneto Optical)ディスク，DVD(Digital Versatile Disc)、磁気ディスク、半導体メモリなどのリムーバブル記録媒体９１１に、一時的あるいは永続的に格納（記録）しておくことができる。このようなリムーバブル記録媒体９１１は、いわゆるパッケージソフトウエアとして提供することができる。
【０５８８】
なお、プログラムは、上述したようなリムーバブル記録媒体９１１からコンピュータにインストールする他、ダウンロードサイトから、ディジタル衛星放送用の人工衛星を介して、コンピュータに無線で転送したり、LAN(Local Area Network)、インターネットといったネットワークを介して、コンピュータに有線で転送し、コンピュータでは、そのようにして転送されてくるプログラムを、通信部９０８で受信し、内蔵するハードディスク９０５にインストールすることができる。
【０５８９】
コンピュータは、CPU(Central Processing Unit)９０２を内蔵している。CPU９０２には、バス９０１を介して、入出力インタフェース９１０が接続されており、CPU９０２は、入出力インタフェース９１０を介して、ユーザによって、キーボードや、マウス、マイク等で構成される入力部９０７が操作等されることにより指令が入力されると、それにしたがって、ROM(Read Only Memory)９０３に格納されているプログラムを実行する。あるいは、また、CPU９０２は、ハードディスク９０５に格納されているプログラム、衛星若しくはネットワークから転送され、通信部９０８で受信されてハードディスク９０５にインストールされたプログラム、またはドライブ９０９に装着されたリムーバブル記録媒体９１１から読み出されてハードディスク９０５にインストールされたプログラムを、RAM(Random Access Memory)９０４にロードして実行する。これにより、CPU９０２は、上述したフローチャートにしたがった処理、あるいは上述したブロック図の構成により行われる処理を行う。そして、CPU９０２は、その処理結果を、必要に応じて、例えば、入出力インタフェース９１０を介して、LCD(Liquid Crystal Display)やスピーカ等で構成される出力部９０６から出力、あるいは、通信部９０８から送信、さらには、ハードディスク９０５に記録等させる。
【０５９０】
ここで、本明細書において、コンピュータに各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいは個別に実行される処理（例えば、並列処理あるいはオブジェクトによる処理）も含むものである。
【０５９１】
また、プログラムは、１のコンピュータにより処理されるものであっても良いし、複数のコンピュータによって分散処理されるものであっても良い。さらに、プログラムは、遠方のコンピュータに転送されて実行されるものであっても良い。
【図面の簡単な説明】
【０５９２】
【図１】LDPC符号の検査行列Hを説明する図である。
【図２】LDPC符号の復号手順を説明するフローチャートである。
【図３】メッセージの流れを説明する図である。
【図４】LDPC符号の検査行列の例を示す図である。
【図５】検査行列のタナーグラフを示す図である。
【図６】バリアブルノードを示す図である。
【図７】チェックノードを示す図である。
【図８】LDPC符号の検査行列の例を示す図である。
【図９】ノード演算を１つずつ行うLDPC符号の復号装置の構成例を示すブロック図である。
【図１０】メッセージを１つずつ計算するチェックノード計算器の構成例を示すブロック図である。
【図１１】メッセージを１つずつ計算するバリアブルノード計算器の構成例を示すブロック図である。
【図１２】ノード演算を全て同時に行うLDPC符号の復号装置の構成例を示すブロック図である。
【図１３】メッセージを同時に計算するチェックノード計算器の構成例を示すブロック図である。
【図１４】メッセージを同時に計算するバリアブルノード計算器の構成例を示すブロック図である。
【図１５】本発明を適用した復号装置の一実施の形態の構成例を示すブロック図である。
【図１６】図１５の復号装置の復号処理を説明するフローチャートである。
【図１７】本発明を適用した復号装置の他の一実施の形態の構成例を示すブロック図である。
【図１８】図１７の復号装置のノード計算器の詳細構成例を示すブロック図である。
【図１９】図１７の復号装置の復号処理を説明するフローチャートである。
【図２０】本発明を適用した復号装置の他の一実施の形態の構成例を示すブロック図である。
【図２１】図２０の復号装置の復号処理を説明するフローチャートである。
【図２２】LDPC符号の検査行列の例を示す図である。
【図２３】復号装置の構成例を示すブロック図である。
【図２４】本発明を適用した復号装置の他の一実施の形態の構成例を示すブロック図である。
【図２５】図２４の復号装置の復号処理を説明するフローチャートである。
【図２６】本発明を適用した復号装置の他の一実施の形態の構成例を示すブロック図である。
【図２７】図２６の復号装置の復号処理を説明するフローチャートである。
【図２８】本発明を適用した復号装置の他の一実施の形態の構成例を示すブロック図である。
【図２９】図２８の復号装置の復号処理を説明するフローチャートである。
【図３０】本発明を適用した復号装置の他の一実施の形態の構成例を示すブロック図である。
【図３１】図３０の計算器の詳細構成例を示すブロック図である。
【図３２】図３０の復号装置の復号処理を説明するフローチャートである。
【図３３】図３１の計算器の第１の演算処理を説明するフローチャートである。
【図３４】図３１の計算器の第２の演算処理を説明するフローチャートである。
【図３５】本発明を適用したコンピュータの一実施の形態の構成例を示すブロック図である。
【符号の説明】
【０５９３】
３００  復号装置，  ３１０  枝用メモリ，  ３１１  スイッチ，  ３１２  バリアブルノード計算器，  ３１３  チェックノード計算器，  ３１４  セレクタ，  ３１５  受信用メモリ，  ３１６制御部，  ３４０  復号装置，  ３５０  スイッチ，  ３５１  枝用メモリ，  ３５２  枝用メモリ，  ３５３  セレクタ，  ３５４  ノード計算器，  ３５５  受信用メモリ，  ３５６  制御部，  ４３０  復号装置，  ４４０  枝用メモリ，  ４４１  ノード計算器，  ４４２  受信用メモリ，  ４４３  制御部，  ５３０  復号装置，  ５４０  スイッチ，  ５４１  スイッチ，  ５４２  枝データ格納メモリ，  ５４３  セレクタ，  ５４４  受信データ用メモリ，  ５４５  バリアブルノード計算部，  ５４６  スイッチ，  ５４７  枝データ格納メモリ，  ５４８  セレクタ，  ５４９  チェックノード計算部，  ５５０  セレクタ，  ５５１  サイクリックシフト回路，  ５５２  制御部，  ５７０  復号装置，  ５８０  セレクタ，  ５８１  ノード計算部，  ５８２  制御部，  ６００  復号装置，  ６１０  枝用メモリ，  ６１１  制御部，  ６３０  復号装置，  ６４０  メモリ，  ６４１  計算部，  ６４２  制御部，  ９０１  バス，  ９０２  CPU，  ９０３  ROM，  ９０４  RAM，  ９０５  ハードディスク，  ９０６  出力部，  ９０７  入力部，  ９０８  通信部，  ９０９  ドライブ，  ９１０  入出力インタフェース，  ９１１  リムーバブル記録媒体
【図１】
2005065066.tif 000012
【図２】
2005065066.tif 000013
【図３】
2005065066.tif 000014
【図４】
2005065066.tif 000015
【図５】
2005065066.tif 000016
【図６】
2005065066.tif 000017
【図７】
2005065066.tif 000018
【図８】
2005065066.tif 000019
【図９】
2005065066.tif 000020
【図１０】
2005065066.tif 000021
【図１１】
2005065066.tif 000022
【図１２】
2005065066.tif 000023
【図１３】
2005065066.tif 000024
【図１４】
2005065066.tif 000025
【図１５】
2005065066.tif 000026
【図１６】
2005065066.tif 000027
【図１７】
2005065066.tif 000028
【図１８】
2005065066.tif 000029
【図１９】
2005065066.tif 000030
【図２０】
2005065066.tif 000031
【図２１】
2005065066.tif 000032
【図２２】
2005065066.tif 000033
【図２３】
2005065066.tif 000034
【図２４】
2005065066.tif 000035
【図２５】
2005065066.tif 000036
【図２６】
2005065066.tif 000037
【図２７】
2005065066.tif 000038
【図２８】
2005065066.tif 000039
【図２９】
2005065066.tif 000040
【図３０】
2005065066.tif 000041
【図３１】
2005065066.tif 000042
【図３２】
2005065066.tif 000043
【図３３】
2005065066.tif 000044
【図３４】
2005065066.tif 000045
【図３５】
2005065066.tif 000046