(57)【要約】【課題】LDPC符号の復号を、装置の大規模化を抑えつつ精度良く行う。【解決手段】チェックノード計算器１８１は、LDPC符号の復号のためのチェックノード演算であって、非線形関数φ(x)の演算および非線形関数の逆関数φ-1(x)の演算を含むチェックノード演算を行う。バリアブルノード計算器１０３は、LDPC符号の復号のためのバリアブルノードのバリアブルノード演算を行う。そして、チェックノード計算器１８１は、固定の量子化幅で数値を表現する固定小数点量子化値を入力として、非線形関数φ(x)の演算の結果を、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である準浮動小数点量子化値で出力するLUTと、準浮動小数点量子化値を入力として、逆関数φ-1(x)の演算の結果を、固定小数点量子化値で出力するLUTを有している。本発明は、例えば、衛星放送を受信するチューナに適用できる。【選択図】図１７
2007081601.tif 000002
【特許請求の範囲】
【請求項１】
LDPC(Low Density Parity Check)符号の復号装置であって、
前記LDPC符号の復号のためのチェックノードのチェックノード演算であって、非線形関数の演算および前記非線形関数の逆関数の演算を含む前記チェックノード演算を行う第１の演算手段と、
前記LDPC符号の復号のためのバリアブルノードのバリアブルノード演算を行う第２の演算手段と
を備え、
前記第１の演算手段は、
固定の量子化幅で数値を表現するビット列である第１の量子化値を入力として、前記非線形関数の演算の結果を、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値で出力する関数演算手段と、
前記第２の量子化値を入力として、前記非線形関数の逆関数の演算の結果を、前記第１の量子化値で出力する逆関数演算手段と
を有する
復号装置。
【請求項２】
前記第１の演算手段は、前記チェックノード演算と、前記バリアブルノード演算の一部とを行い、
前記第２の演算手段は、前記バリアブルノード演算の他の一部を行う
請求項１に記載の復号装置。
【請求項３】
前記第２の量子化値の量子化幅の最小値は、前記第１の量子化値の量子化幅以下である
請求項１に記載の復号装置。
【請求項４】
前記第２の量子化値の量子化幅の最小値は、前記第１の量子化値の量子化に一致する
請求項３に記載の復号装置。
【請求項５】
前記チェックノード演算は、前記非線形関数の演算後、前記非線形関数の逆関数の演算前に行われる積算をさらに含み、
前記第１の演算手段は、前記積算が行われる前に、前記第２の量子化値を、前記第１の量子化値に変換する
請求項１に記載の復号装置。
【請求項６】
前記第１の演算手段は、前記関数演算手段が出力する前記第２の量子化値を、前記第１の量子化値に変換する変換手段をさらに有する
請求項１に記載の復号装置。
【請求項７】
前記チェックノード演算は、前記非線形関数の演算の結果を遅延した、遅延後の前記非線形関数の演算の結果を用いて行われる演算をさらに含み、
前記第１の演算手段は、遅延後の前記非線形関数の演算の結果を用いて行われる演算の前に、遅延後の前記非線形関数の演算の結果を表す前記第２の量子化値を、前記第１の量子化値に変換する変換手段をさらに有する
請求項１に記載の復号装置。
【請求項８】
前記第１の演算手段は、前記遅延後の前記非線形関数の演算の結果を用いて行われる演算の後に、前記第１の量子化値を、前記第２の量子化値に変換し、前記逆関数演算手段に供給する他の変換手段をさらに有する
請求項７に記載の復号装置。
【請求項９】
前記関数演算手段は、前記第１の量子化値を入力として、前記非線形関数の演算の結果を、前記第２の量子化値で出力するLUT(Look Up Table)であり、
前記逆関数演算手段は、前記第２の量子化値を入力として、前記非線形関数の逆関数の演算の結果を、前記第１の量子化値で出力するLUTである
請求項１に記載の復号装置。
【請求項１０】
前記第１の演算手段は、
前記チェックノード演算のためにデータを遅延する遅延手段をさらに有し、
前記関数演算手段に入力される前記第１の量子化値、または前記関数演算手段から出力される前記第２の量子化値のうちの一方を、前記遅延手段が遅延するように構成される
請求項１に記載の復号装置。
【請求項１１】
前記第１の演算手段は、前記遅延手段が前記関数演算手段に入力される前記第１の量子化値を遅延するように構成される場合、前記遅延手段が前記第１の量子化値を遅延した、遅延後の前記第１の量子化値を入力として、前記非線形関数の演算の結果を、前記第２の量子化値で出力する他の関数演算手段をさらに有する
請求項１０に記載の復号装置。
【請求項１２】
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で表すものとすると、そのような検査行列Hとしては、例えば、図１に示すように、各列のハミング重み（"1"の数）(weight)が"3"であり、且つ、各行のハミング重みが"6"であるもの等がある。
【０００８】
このように、各行及び各列のハミング重みが一定である検査行列Hによって定義されるLDPC符号は、レギュラーLDPC符号と称される。一方、各行及び各列のハミング重みが一定でない検査行列Hによって定義されるLDPC符号は、イレギュラーLDPC符号と称される。
【０００９】
このようなLDPC符号による符号化は、検査行列Hに基づいて生成行列Gを生成し、この生成行列Gを２元の情報メッセージに対して乗算することによって符号語を生成することで実現される。具体的には、LDPC符号による符号化を行う符号化装置は、まず、検査行列Hの転置行列HTとの間に、式GHT=0が成立する生成行列Gを算出する。ここで、生成行列Gが、k×n行列（k行n列の行列）である場合には、検査行列Hは、n-k行n列の行列である。
【００１０】
符号化装置は、生成行列Gに対してkビットからなる情報メッセージ（ベクトル）uを乗算し、nビットからなる符号語（LDPC符号）ｃ（＝uＧ）を生成する。この符号化装置によって生成された符号語cは、値が"0"のビットが"+1"に、値が"1"のビットが"−1"にといったようにマッピングされて送信され、所定の通信路を介して受信側において受信されることになる。
【００１１】
なお、例えば、nビットの符号語cが、kビットの情報メッセージuに続けて、n-kビットのパリティビットを配置したビット列に一致する組織符号である場合に、n-k行n列の検査行列Hにおいて、nビットの符号語cのうちのkビットの情報メッセージuに対応するn-k行k列の部分を情報部というとともに、n-kビットのパリティビットに対応するn-k行n-k列の部分をパリティ部ということとすると、パリティ部が、下三角行列または上三角行列になっていれば、情報メッセージuのLDPC符号への符号化は、検査行列Hを用いて行うことができる。
【００１２】
即ち、例えば、検査行列Hが、図２に示すように、情報部と、下三角行列のパリティ部とで構成され、パリティ部の下三角の部分の要素が、すべて1であるとすると、符号語cのパリティビットの１番目のビットは、情報メッセージuのうちの、検査行列Hの情報部の第１行において1になっている要素に対応するビットのEXOR（排他的論理和）を演算した値となる。
【００１３】
また、符号語cのパリティビットの２番目のビットは、情報メッセージuのうちの、検査行列Hの情報部の第２行において1になっている要素に対応するビットと、パリティビットの１番目のビットのEXORを演算した値となる。
【００１４】
さらに、符号語cのパリティビットの３番目のビットは、情報メッセージuのうちの、検査行列Hの情報部の第３行において1になっている要素に対応するビットと、パリティビットの１番目および２番目のビットのEXORを演算した値となる。
【００１５】
以下、同様にして、符号語cのパリティビットのi番目のビットは、情報メッセージuのうちの、検査行列Hの情報部の第i行において1になっている要素に対応するビットと、パリティビットの１乃至i-1番目のビットのEXORを演算した値となる。
【００１６】
以上のようにして、n-kビットのパリティビットを求め、kビットの情報メッセージuに続けて配置することにより、nビットの符号語cを得ることができる。
【００１７】
一方、LDPC符号の復号は、Gallagerが確率復号(Probabilistic Decoding)と称して提案したアルゴリズムであって、バリアブルノード(variable node（メッセージノード(message node)とも呼ばれる。）)と、チェックノード(check node)とからなる、いわゆるタナーグラフ(Tanner graph)上での確率伝播(belief propagation)によるメッセージ・パッシング・アルゴリズムによって行うことが可能である。ここで、以下、適宜、バリアブルノードとチェックノードを、単に、ノードともいう。
【００１８】
なお、確率復号においては、各ノード間で受け渡されるメッセージが実数値であることから、解析的に解くためには、連続した値をとるメッセージの確率分布そのものを追跡する必要があり、非常に困難を伴う解析を必要とすることになる。そこで、Gallagerは、LDPC符号の復号アルゴリズムとして、アルゴリズムＡ又はアルゴリズムＢを提案している。
【００１９】
LDPC符号の復号は、一般的には、図３に示すような手順にしたがって行われる。なお、ここでは、LDPC符号（符号化cの）受信値をU0とし、チェックノードから出力されるメッセージ（以下、適宜、チェックノードノードメッセージともいう）をujとし、バリアブルノードから出力されるメッセージ（以下、適宜、バリアブルノードメッセージともいう）をviとする。また、メッセージは、"0"らしさを、いわゆる対数尤度比(log likelihood ratio)で表現した実数値である。さらに、受信値U0の"0"らしさの対数尤度比を、受信データu0iと表すこととする。
【００２０】
まず、LDPC符号の復号においては、図３に示すように、ステップＳ１１において、受信値U0(受信データu0i)が受信され、メッセージujが"0"に初期化されるとともに、繰り返し処理のカウンタとしての整数をとる変数kが"0"に初期化され、ステップＳ１２に進む。ステップＳ１２において、受信データu0iに基づいて、式（１）に示す演算を行うことによってバリアブルノードメッセージviが求められ、さらに、このバリアブルノードメッセージviに基づいて、式（２）に示す演算を行うことによってチェックノードメッセージujが求められる。
【００２１】
【数１】
2007081601.tif 000003
・・・（１）
【００２２】
【数２】
2007081601.tif 000004
・・・（２）
【００２３】
ここで、式（１）と式（２）におけるdvとdcは、それぞれ、検査行列Hの縦方向（行方向）と横方向（列方向）の"1"の個数を示す任意に選択可能とされるパラメータであり、例えば、(3,6)符号の場合には、dv=3，dc=6となる。
【００２４】
なお、式（１）または（２）の演算においては、それぞれ、メッセージを出力しようとする枝(edge)から入力されたメッセージを、和または積演算のパラメータとしては用いないことから、和または積演算の範囲が、１乃至dv-1または１乃至dc-1となっている。また、式（２）に示す演算は、実際には、２入力v1，v2に対する１出力で定義される式（３）に示す関数R(v1,v2)のテーブルを予め作成しておき、これを式（４）に示すように連続的（再帰的）に用いることによって行うことができる。
【００２５】
【数３】
2007081601.tif 000005
・・・（３）
【００２６】
【数４】
2007081601.tif 000006
・・・（４）
【００２７】
ステップＳ１２では、さらに、変数kが"1"だけインクリメントされ、ステップＳ１３に進む。ステップＳ１３では、変数kが所定の繰り返し復号回数N以上であるか否かが判定される。ステップＳ１３において、変数kがN以上ではないと判定された場合、ステップＳ１２に戻り、以下、同様の処理が繰り返される。
【００２８】
また、ステップＳ１３において、変数kがN以上であると判定された場合、ステップＳ１４に進み、式（５）に示す演算を行うことによって最終的に出力する復号結果としてのメッセージvが求められて出力され、LDPC符号の復号処理が終了する。
【００２９】
【数５】
2007081601.tif 000007
・・・（５）
【００３０】
ここで、式（５）の演算は、式（１）の演算とは異なり、バリアブルノードに接続している全ての枝からのメッセージを用いて行われる。
【００３１】
このようなLDPC符号の復号は、例えば(3,6)符号の場合には、図４に示すように、各ノード間でメッセージの授受が行われる。なお、図４における"="で示すノード（バリアブルノード）では、式（１）に示した演算が行われ、"+"で示すノード（チェックノード）では、式（２）に示した演算が行われる。特に、アルゴリズムＡにおいては、メッセージを２元化し、"+"で示すノードにて、そのノードに入力されるdc-1個のメッセージの排他的論理和演算を行い、"="で示すノードにて、受信データR(u0i)に対して、そのノードに入力されるdv-1個のメッセージが全て異なるビット値であった場合には、符号を反転して出力する。
【００３２】
また、一方で、近年、LDPC符号の復号の実装法に関する研究も行われている。実装方法について述べる前に、まず、LDPC符号の復号を摸式化して説明する。
【００３３】
図５は、(3,6)LDPC符号（符号化率1/2、符号長12）の検査行列(parity check matrix)の例である。LDPC符号の検査行列Ｈは、図６のように、タナーグラフを用いて書き表すことができる。ここで、図６において、"+"で表されるのが、チェックノードであり、"="で表されるのが、バリアブルノードである。チェックノードとバリアブルノードは、それぞれ、検査行列Ｈの行と列に対応する。チェックノードとバリアブルノードとの間の結線は、枝(edge)であり、検査行列の"1"に相当する。即ち、検査行列Ｈの第ｊ行第ｉ列のコンポーネントが１である場合には、図６において、上からｉ番目のバリアブルノード（"="のノード）と、上からｊ番目のチェックノード（"+"のノード）とが、枝により接続される。枝は、バリアブルノードに対応するLDPC符号のビットが、チェックノードに対応する拘束条件を持つことを表す。なお、図６は、図５の検査行列Ｈのタナーグラフとなっている。
【００３４】
LDPC符号の復号方法であるサムプロダクトアルゴリズム(Sum Product Algorithm)は、バリアブルノードの演算とチェックノードの演算とを繰り返し行う。
【００３５】
バリアブルノードでは、図７のように、式（１）の演算を行う。すなわち、図７において、計算しようとしている枝に対応するバリアブルノードメッセージviは、バリアブルノードに繋がっている残りの枝からのチェックノードメッセージu1およびu2と、受信データu0iを用いて計算される。他の枝に対応するバリアブルノードメッセージも同様に計算される。
【００３６】
チェックノードの演算について説明する前に、式（２）を、式a×b=exp｛ln(|a|)+ln(|b|)｝×sign(a)×sign(b)の関係を用いて、式（６）のように書き直す。但し、sign(x)は、xの符号（正または負）を表し、x≧0のとき1であり、x＜0のとき-1である。
【００３７】
【数６】
2007081601.tif 000008
・・・（６）
【００３８】
更に、x≧0において、非線形な関数（非線形関数）φ(x)を、式φ(x)=ln(tanh(x/2))と定義すると（ln()は自然対数関数）、その非線形関数φ(x)の逆関数φ-1(x)は、式φ-1(x)=2tanh-1(e-x)で表されるから、式（６）は、式（７）のように書くことができる。
【００３９】
【数７】
2007081601.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となる。
【００４２】
また、LDPC符号の復号方法は、サムプロダクトアルゴリズムの他、例えば、ビリーフプロパゲーション(Belief Propagation)などとも呼ばれるが、いずれにしても、行われる演算の内容は同様である。
【００４３】
復号装置へのサムプロダクトアルゴリズムの実装の例として、各ノードの演算を一つずつ順次行うことによって復号を行う場合(full serial decoding)の実装法について説明する。
【００４４】
なお、サムプロダクトアルゴリズムをハードウェアに実装する場合、式（１）で表されるバリアブルノード演算および式（７）で表されるチェックノード演算とを、適度な回路規模と動作周波数で繰り返し行うことが必要である。
【００４５】
また、ここでは、例えば、図９の、３６（行）×１０８（列）の検査行列Ｈで表現される符号（符号化率2/3、符号長108）を復号することとする。図９の検査行列Ｈの１の数は３２３であり、従って、そのタナーグラフでは、枝の数は３２３個となる。ここで、図９の検査行列では、０を、"."で表現している。
【００４６】
図１０は、LDPC符号の１回復号を行う復号装置の構成例を示している。
【００４７】
図１０の復号装置では、その動作する１クロック(clock)ごとに、１つの枝に対応するメッセージが計算される。
【００４８】
即ち、図１０の復号装置は、２つの枝用メモリ１００および１０２、１つのチェックノード計算器１０１、１つのバリアブルノード計算器１０３、１つの受信用メモリ１０４、１つの制御部１０５からなる。
【００４９】
図１０の復号装置では、枝用メモリ１００または１０２からメッセージが１つずつ読み出され、そのメッセージを用いて、所望の枝に対応するメッセージが計算される。そして、その計算によって求められたメッセージが１つずつ後段の枝用メモリ１０２または１００に格納されていく。繰り返し復号を行う際には、この１回復号を行う図１０の復号装置を複数個縦列に連接するか、もしくは図１０の復号装置を繰り返し用いることによって、繰り返し復号を実現する。なお、ここでは、例えば、図１０の復号装置が複数個接続されているものとする。
【００５０】
枝用メモリ１００は、前段の復号装置（図示せず）のバリアブルノード計算器１０３から供給されるメッセージ（バリアブルノードメッセージ）D100を、後段のチェックノード計算器１０１が読み出す順番に格納していく。そして、枝用メモリ１００は、チェックノード計算のフェーズでは、メッセージD100を、格納してある順番通りに、メッセージD101として、チェックノード計算器１０１に供給する。
【００５１】
チェックノード計算器１０１は、制御部１０５から供給される制御信号D106に基づき、枝用メモリ１００から供給されるメッセージD101（バリアブルノードメッセージvi）を用いて、式（７）に従って演算（チェックノード演算）を行い、その演算によって求められたメッセージD102（チェックノードメッセージuj）を、後段の枝用メモリ１０２に供給する。
【００５２】
枝用メモリ１０２は、前段のチェックノード計算器１０１から供給されるメッセージD102を、後段のバリアブルノード計算器１０３が読み出す順番に格納していく。そして、枝用メモリ１０２は、バリアブルノード計算のフェーズでは、メッセージD102を、格納してある順番通りに、メッセージD103として、バリアブルノード計算器１０３に供給する。
【００５３】
バリアブルノード計算器１０３には、制御部１０５から制御信号D107が供給されるとともに、受信用メモリ１０４から受信データD104が供給される。バリアブルノード計算器１０３は、制御信号D107に基づき、枝用メモリ１００から供給されるメッセージD103（チェックノードメッセージuj）と受信用メモリ１００から供給される受信データD104（受信データu0i）を用い、式（１）に従って演算（バリアブルノード演算）を行い、その演算の結果得られるメッセージD105（バリアブルノードメッセージvi）を、図示せぬ後段の復号装置の枝用メモリ１００に供給する。
【００５４】
受信用メモリ１０４には、LDPC符号の受信データu0iが格納される。制御部１０５は、バリアブルノード演算を制御する制御信号D106と、チェックノード演算を制御する制御信号D107を、それぞれチェックノード計算器１０１とバリアブルノード計算器１０３に供給する。
【００５５】
図１１は、チェックノード演算を１つずつ行う図１０のチェックノード計算器１０１の構成例を示している。
【００５６】
なお、図１１では、各メッセージが符号ビット（正負を表すビット）を合わせて合計６ビット(bit)に量子化されているものとして、チェックノード計算器１０１を表している。即ち、メッセージは、所定の数値範囲を符号ビット付きの６ビットで表すことができる６４値に均等に分割する各数値に割り当てられた６ビットの量子化値で表される。
【００５７】
また、図１１では、図９の検査行列Ｈで表されるLDPC符号のチェックノード演算が行われる。さらに、図１１のチェックノード演算器１０１には、クロックｃｋが供給され、このクロックｃｋは、必要なブロックに供給されるようになっている。そして、各ブロックは、クロックｃｋに同期して処理を行う。
【００５８】
図１１のチェックノード計算器１０１は、制御部１０５から供給される、例えば、1ビットの制御信号D106に基づき、枝用メモリ１００から１つずつ読み込まれるメッセージD101（バリアブルノードメッセージvi）を用いて、式（７）にしたがって演算を行う。
【００５９】
即ち、チェックノード計算器１０１では、検査行列Ｈの各列に対応するバリアブルノードからの６ビットのメッセージ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|)に対する演算結果D123が積算された場合、レジスタ１２３はリセットされる。
【００６２】
ここで、演算器１２２およびレジスタ１２３では、LUT１２１から供給される５ビットの演算結果D123（φ(|vi|)）が、最大で、FIFOメモリ１２７における最大の遅延回数分、即ち、検査行列Hの行の最大の重み分の回数だけ積算される。いま、図９の検査行列Hの行の最大の重みは９であり、従って、演算器１２２およびレジスタ１２３では、９ビットの演算結果D123（φ(|vi|)）が、最大で、９回積算される（５ビットの値の９個分の積算が行われる）。このため、演算器１２２の出力以降においては、５ビットの値を９回積算した値を表すことができるように、量子化ビット数は、LUT１２１が出力する５ビットの演算結果D1123（φ(|vi|)）よりも４ビット（９（回）を表すことができる最小のビット数）だけ多い９ビットになっている。
【００６３】
検査行列の1行に亘るメッセージD101（バリアブルノードメッセージvi）が１つずつ読み込まれ、レジスタ１２３に1行分の演算結果D123が積算された積算値が格納された場合、制御部１０５から供給される制御信号D106は、０から１に変化する。例えば、行の重み（row weight）が「９」である場合、制御信号D106は、１から８クロック目までは、「０」となり、９クロック目では「１」となる。
【００６４】
制御信号D106が「１」の場合、セレクタ１２４は、レジスタ１２３に格納されている値、即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算された９ビットの値D124（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）を選択し、値D125として、レジスタ１２５に出力して格納させる。レジスタ１２５は、格納している値D125を、９ビットの値D126として、セレクタ１２４と演算器１２６に供給する。制御信号D106が「０」の場合、セレクタ１２４は、レジスタ１２５から供給された値D126を選択し、レジスタ１２５に出力して再格納させる。即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１２５は、前回積算されたφ(|vi|)を、セレクタ１２４と演算器１２６に供給する。
【００６５】
一方、FIFOメモリ１２７は、レジスタ１２５から新たな値D126（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）が出力されるまでの間、LUT１２１が出力した５ビットの演算結果D123（φ(|vi|)）を遅延し、５ビットの値D127として演算器１２６に供給する。演算器１２６は、レジスタ１２５から供給された値D126から、FIFOメモリ１２７から供給された値D127を減算し、その減算結果を、５ビットの減算値D128としてLUT１２８に供給する。即ち、演算器１２６は、検査行列Hの1行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)の積算値から、チェックノードメッセージujを求めたい枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を減算値D128としてLUT１２８に供給する。
【００６６】
なお、演算器１２６は、レジスタ１２５から供給される９ビットの値D126から、FIFOメモリ１２７から供給される５ビットの値D127を減算するから、その減算結果は、最大で９ビットとなり得るのに対して、５ビットの減算値D128を出力する。このため、レジスタ１２５から供給される９ビットの値D126から、FIFOメモリ１２７から供給される５ビットの値D127を減算した減算結果が、５ビットで表せない場合、つまり、減算結果が、５ビットで表すことができる最大値（３１（２進数では１１１１１））を越える場合には、演算器１２６は、減算結果を、５ビットで表すことができる最大値にクリッピングし、５ビットの減算値D128を出力する。
【００６７】
LUT１２８は、減算値D128（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）に対して、式（７）における逆関数φ-1（Σφ(|vi|)）の演算を行った５ビットの演算結果D129（φ-1(Σφ(|vi|)))を出力する。
【００６８】
以上の処理と並行して、EXOR回路１２９は、レジスタ１３０に格納されている１ビットの値D131と符号ビットD121との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、１ビットの乗算結果D130をレジスタ１３０に再格納する。なお、検査行列Hの1行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）の符号ビットD121が乗算された場合、レジスタ１３０はリセットされる。
【００６９】
検査行列Hの1行に亘る全ての枝からのメッセージD101の符号ビットD121が乗算された乗算結果D130（ｉ＝１からｄcまでのΠsign(vi)）がレジスタ１３０に格納された場合、制御部１０５から供給される制御信号D106は、「０」から「１」に変化する。
【００７０】
制御信号D106が「１」の場合、セレクタ１３１は、レジスタ１３０に格納されている値、即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101の符号ビットD121が乗算された値D131（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）を選択し、１ビットの値D132としてレジスタ１３２に出力して格納させる。レジスタ１３２は、格納している値D132を、１ビットの値D133としてセレクタ１３１とEXOR回路１３４に供給する。制御信号D106が「０」の場合、セレクタ１３１は、レジスタ１３２から供給された値D133を選択し、レジスタ１３２に出力して再格納させる。即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）の符号ビットD121が乗算されるまで、レジスタ１３２は、前回格納した値を、セレクタ１３１とEXOR回路１３４に供給する。
【００７１】
一方、FIFOメモリ１３３は、レジスタ１３２から新たな値D133（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）がEXOR回路１３４に供給されるまでの間、符号ビットD121を遅延し、１ビットの値D134としてEXOR回路１３４に供給する。EXOR回路１３４は、レジスタ１３２から供給された値D133と、FIFOメモリ１３３から供給された値D134との排他的論理和を演算することにより、値D133を、値D134で除算し、１ビットの除算結果を除算値D135として出力する。即ち、EXOR回路１３４は、検査行列Hの１行に亘る全ての枝からのメッセージD101の符号ビットD121（sign(|vi|)）の乗算値を、チェックノードメッセージujを求めたい枝からのメッセージD101の符号ビットD121（sign(|vi|)）で除算して、その除算値（ｉ＝１からｉ＝ｄc−１までのΠsign(|vi|)）を除算値D135として出力する。
【００７２】
チェックノード計算器１０１では、LUT１２８から出力された５ビットの演算結果D129を下位５ビットとするとともに、EXOR回路１３４から出力された１ビットの除算値D135を最上位ビット（符号ビット）とする合計６ビットがメッセージD102（チェックノードメッセージuj）として出力される。
【００７３】
以上のように、チェックノード計算器１０１では、式（７）の演算が行われ、チェックノードメッセージujが求められる。
【００７４】
なお、図９の検査行列Hの行の重みの最大は９であるため、即ち、チェックノードに供給されるバリアブルノードメッセージviの最大数は９であるため、チェックノード計算器１０１は、９個のチェックノードメッセージviの非線形関数の演算結果（φ(|vi|)）を遅延させるFIFOメモリ１２７とFIFOメモリ１３３を有している。行の重みが９未満の行のチェックノードメッセージujを計算するときには、FIFOメモリ１２７とFIFOメモリ１３３における遅延量が、その行の重みの値に減らされる。
【００７５】
図１２は、バリアブルノード演算を１つずつ行う図１０のバリアブルノード計算器１０３の構成例を示している。
【００７６】
なお、図１２でも、図１１と同様に、各メッセージが符号ビットを合わせて合計６ビット(bit)に量子化されているものとして、バリアブルノード計算器１０３を表している。さらに、図１２でも、図９の検査行列Hで表されるLDPC符号のバリアブルノード演算が行われる。また、図１２のバリアブルノード計算器１０３には、クロックｃｋが供給され、クロックｃｋは、必要なブロックに供給されるようになっている。そして、各ブロックは、クロックｃｋに同期して処理を行う。
【００７７】
図１２のバリアブルノード計算器１０３は、制御部１０５から供給される、例えば、１ビットの制御信号D107に基づき、枝用メモリ１０２から１つずつ読み込まれるメッセージD103と、受信用メモリ１０４から読み込まれる受信データD104（u0i）を用いて、式（１）にしたがって演算（バリアブルノード演算）を行う。
【００７８】
即ち、バリアブルノード計算器１０３では、検査行列Hの各行に対応するチェックノードからの６ビットのメッセージD103（チェックノードメッセージuj）が１つずつ読み込まれ、そのメッセージD103が、演算器１５１とFIFOメモリ１５５に供給される。また、バリアブルノード計算器１０３では、受信用メモリ１０４から６ビットの受信データD104（u0i）が1つずつ読み込まれ、演算器１５６に供給される。さらに、バリアブルノード計算器１０３には、制御部１０５から制御信号D107が供給され、その制御信号D107は、セレクタ１５３に供給される。
【００７９】
演算器１５１は、６ビットのメッセージD103（チェックノードメッセージuj）とレジスタ１５２に格納されている９ビットの値D151とを加算することにより、６ビットのメッセージD103を積算し、その結果得られる９ビットの積算値を、レジスタ１５２に再格納する。なお、検査行列Hの1列に亘る全ての枝からのメッセージD103が積算された場合、レジスタ１５２はリセットされる。
【００８０】
ここで、演算器１５１およびレジスタ１５２では、６ビットのメッセージD103が、最大で、FIFOメモリ１５５における最大の遅延回数分、即ち、検査行列Hの列の最大の重み分の回数だけ積算される。いま、図９の検査行列Hの列の最大の重みは５であり、従って、演算器１５１およびレジスタ１５２では、６ビットのメッセージD103が、最大で、５回積算される（６ビットの値の５個分の積算が行われる）。このため、演算器１５１の出力以降においては、６ビットの値を５回積算した値を表すことができるように、量子化ビット数は、６ビットのメッセージD103よりも３ビット（５（回）を表すことができる最小のビット数）だけ多い９ビットになっている。
【００８１】
検査行列Hの1列に亘るメッセージD103が１つずつ読み込まれ、レジスタ１５２に1列分のメッセージD103が積算された値が格納された場合、制御部１０５から供給される制御信号D107は、「０」から「１」に変化する。例えば、列の重みが「５」である場合、制御信号D107は、１から４クロック目までは「０」となり、５クロック目では「１」となる。
【００８２】
制御信号D107が「１」の場合、セレクタ１５３は、レジスタ１５２に格納されている値、即ち、検査行列Hの１列に亘る全ての枝からのメッセージD103（チェックノードメッセージuj）が積算された９ビットの値D151（ｊ＝１からｄVまでのΣuj)を選択し、レジスタ１５４に出力して格納させる。レジスタ１５４は、格納している値D151を、９ビットの値D152として、セレクタ１５３と演算器１５６に供給する。制御信号D107が「０」の場合、セレクタ１５３は、レジスタ１５４から供給された値D152を選択し、レジスタ１５４に出力し再格納させる。即ち、検査行列Ｈの１列に亘る全ての枝からのメッセージD103（チェックノードメッセージuj）が積算されるまで、レジスタ１５４は、前回積算された値を、セレクタ１５３と演算器１５６に供給する。
【００８３】
一方、FIFOメモリ１５５は、レジスタ１５４から新たな値D152（ｊ＝１からｄVまでのΣuj）が出力されるまでの間、チェックノードからのメッセージD103を遅延し、６ビットの値D153として演算器１５６に供給する。演算器１５６は、レジスタ１５４から供給された値D152から、FIFOメモリ１５５から供給された値D153を減算する。即ち、演算器１５６は、検査行列Ｈの1列に亘る全ての枝からのメッセージD103（チェックノードメッセージuj）の積算値から、バリアブルノードメッセージviを求めたい枝からのチェックノードメッセージujを減算して、その減算値（ｊ＝１からｄv−１までのΣuj）を求める。さらに、演算器１５６には、その減算値（ｊ＝１からｄv−１までのΣuj）に、受信用メモリ１０４から供給された受信データD104（u0i）を加算して、その結果得られる６ビットの値をメッセージD105（バリアブルノードメッセージvi）として出力する。
【００８４】
以上のように、バリアブルノード計算器１０３では、式（１）の演算が行われ、バリアブルノードメッセージviが求められる。
【００８５】
なお、図９の検査行列Ｈの列の重みの最大は５であるため、即ち、バリアブルノードバリアブルノードに供給されるチェックノードメッセージujの最大数は５であるため、バリアブルノード計算器１０３は、５個のチェックノードメッセージujを遅延させるFIFOメモリ１５５を有している。列の重みが５未満の列のバリアブルノードメッセージviを計算するときには、FIFOメモリ１５５における遅延量が、その列の重みの値に減らされる。
【００８６】
また、演算器１５６は、レジスタ１５４から供給される９ビットの値D152から、FIFOメモリ１５５から供給される６ビットの値D153を減算するとともに、受信用メモリ１０４から供給される６ビットの受信データD104を加算する演算を行うから、その演算結果は、６ビットのメッセージD105で表すことができる最小値未満となるか、または最大値を越えることがある。演算器１５６は、演算結果が、６ビットのメッセージD105で表すことができる最小値未満である場合には、その最小値にクリッピングし、演算結果が、６ビットのメッセージD105で表すことができる最大値を越える場合には、その最大値にクリッピングする。
【００８７】
図１０の復号装置では、検査行列Hの重みにしたがって、制御部１０５から制御信号が与えられる。図１０の復号装置によれば、枝用メモリ１００および１０２、並びにチェックノード計算器１０１およびバリアブルノード計算器１０３のFIFOメモリ１２７，１３３，１５５の容量さえ足りれば、制御信号のみを変えることで様々な検査行列ＨのLDPC符号を復号することができる。
【００８８】
なお、図示しないが、図１０の復号装置において、復号の最終段においては、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【００８９】
図１０の復号装置を繰り返し用いて、LDPC符号を復号する場合には、チェックノード演算とバリアブルノード演算とが交互に行われる。即ち、図１０の復号装置では、チェックノード計算器１０１によるチェックノード演算の結果を用いて、バリアブルノード計算器１０３によりバリアブルノード演算が行われ、バリアブルノード計算器１０３によるバリアブルノード演算の結果を用いて、チェックノード計算器１０１によりチェックノード演算が行われる。
【００９０】
なお、図１０の復号装置は、各ノードの演算を一つずつ順次行うことによって、LDPC符号の復号を行う(full serial decoding)復号装置であるが、その他、全ノードの演算を同時に行う(full parallel decoding)復号装置（例えば、非特許文献１参照）や、一つでも全てでもない、ある数のノードの演算を同時に行う(partly parallel decoding)復号装置（例えば、非特許文献２や特許文献１を参照）も提案されている。
【００９１】
ところで、例えば、図１０の復号装置では、受信データD104を記憶する受信用メモリ１０４の記憶容量としては、少なくとも、LDPC符号の符号長と、受信データD104を表す量子化値のビット数（量子化ビット数）との乗算値だけのビット数が必要である。また、メッセージを記憶する枝用メモリ１００や１０２の記憶容量としては、少なくとも、枝の総数（全枝数）と、メッセージを表す量子化値のビット数（量子化ビット数）との乗算値だけのビット数が必要である。
【００９２】
従って、上述したように、符号長が１０８で、メッセージ（受信データD104を含む）を表す量子化値のビット数が６ビットで、枝の数が３２３である場合には、記憶容量が少なくとも648(=108×6)ビットの受信用メモリ１０４と、記憶容量が少なくとも1938(=323×6)ビットの枝用メモリ１００および１０２とが必要となる。
【００９３】
なお、ここでは、説明を簡単にするために、符号長を１０８としたが、現実的には、LDPC符号の符号長としては、数千程度が採用される。
【００９４】
一方、LDPC符号の復号の精度を向上させるには、単純には、受信データD104を含むメッセージを表す量子化値として、ある程度のビット数の量子化値を採用する必要がある。
【００９５】
しかしながら、上述したように、枝用メモリ１００および１０２、並びに受信用メモリ１０４の記憶容量は、メッセージを表す量子化値のビット数に比例するので、メッセージを、多くのビット数の量子化値で表すと、復号装置を構成するメモリとして、容量の大きなメモリが必要となり、装置の規模が大型化する。
【００９６】
【特許文献１】特開2004-364233号公報
【非特許文献１】C. Howland and A. Blanksby, "Parallel Decoding Architectures for Low Density Parity Check Codes", Symposium on Circuits and Systems, 2001
【非特許文献２】E. Yeo, P. Pakzad, B. Nikolic and V. Anantharam, "VLSI Architectures for iterative Decoders in Magnetic Recording Channels", IEEE Transactions on Magnetics, Vol. 37, No. 2, March 2001
【発明の開示】
【発明が解決しようとする課題】
【００９７】
ところで、図１０の復号装置において、チェックノード計算器１０１（図１１）で行われる式（７）のチェックノード演算のうちの、非線形関数φ(|vi|)の演算と、逆関数φ-1（Σφ(|vi|)）の演算の精度は、LDPC符号の復号の精度に影響する。
【００９８】
即ち、非線形関数φ(|vi|)の演算と、逆関数φ-1（Σφ(|vi|)）の演算の精度が悪ければ、LDPC符号の復号の精度も悪くなる。
【００９９】
非線形関数φ(|vi|)の演算と、逆関数φ-1（Σφ(|vi|)）の演算の精度は、例えば、演算に用いられる量子化値の量子化幅（ある量子化値が表す数値と、その量子化値と１だけ異なる量子化値が表す数値との差）を細かくすること、または、量子化値が表す数値のダイナミックレンジ（量子化値が表す数値の最大値と最小値との差）を大にすることにより、あるいは、その両方を行うことにより向上させることができる。
【０１００】
しかしながら、（現在のダイナミックレンジを維持したまま）量子化幅を細かくするにしても、（現在の量子化幅を維持したまま）量子化値が表す数値のダイナミックレンジを大にするにしても、量子化値のビット数は増加する。
【０１０１】
非線形関数φ(|vi|)の演算と、逆関数φ-1（Σφ(|vi|)）の演算の精度をある程度以上とするために、量子化幅が細かく、かつ、ダイナミックレンジが大の（数値を表すことができる）量子化値を、復号装置の全体に亘って採用した場合、そのような量子化値はビット数が大となるので、上述したように、復号装置を構成するメモリとして、容量の大きなメモリが必要となり、装置の規模が大型化する。
【０１０２】
さらに、非線形関数φ(|vi|)の演算と、逆関数φ-1（Σφ(|vi|)）の演算を、図１１に示したチェックノード計算器１０１のように、LUT（図１１におけるLUT１２１と１２８）で実現する場合には、ビット数が大の量子化値が入力および出力となるLUTとしては、容量が大のLUTが必要となる。そして、そのような容量が大のLUTが、チェックノード計算器１０１の回路規模のほとんどを占めることになる。
【０１０３】
本発明は、このような状況に鑑みてなされたものであり、LDPC符号の復号を、装置の大規模化を抑えつつ精度良く行うことができるようにするものである。
【課題を解決するための手段】
【０１０４】
本発明の一側面の復号装置または復号方法は、LDPC符号の復号のためのチェックノードのチェックノード演算であって、非線形関数の演算および非線形関数の逆関数の演算を含むチェックノード演算を行う第１の演算手段において、固定の量子化幅で数値を表現するビット列である第１の量子化値を入力として、非線形関数の演算の結果を、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値で出力する関数演算手段／ステップと、第２の量子化値を入力として、非線形関数の逆関数の演算の結果を、第１の量子化値で出力する逆関数演算手段／ステップとを含む。
【０１０５】
かかる一側面の復号装置または復号方法においては、LDPC符号の復号のためのチェックノードのチェックノード演算であって、非線形関数の演算および非線形関数の逆関数の演算を含むチェックノード演算が行われるときに、固定の量子化幅で数値を表現するビット列である第１の量子化値を入力として、非線形関数の演算の結果が、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値で出力され、第２の量子化値を入力として、非線形関数の逆関数の演算の結果が、第１の量子化値で出力される。
【発明の効果】
【０１０６】
本発明によれば、LDPC符号の復号を、装置の大規模化を抑えつつ精度良く行うことができる。
【発明を実施するための最良の形態】
【０１０７】
以下に本発明の実施の形態を説明するが、本発明の構成要件と、発明の詳細な説明に記載の実施の形態との対応関係を例示すると、次のようになる。この記載は、本発明をサポートする実施の形態が、発明の詳細な説明に記載されていることを確認するためのものである。従って、発明の詳細な説明中には記載されているが、本発明の構成要件に対応する実施の形態として、ここには記載されていない実施の形態があったとしても、そのことは、その実施の形態が、その構成要件に対応するものではないことを意味するものではない。逆に、実施の形態が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その実施の形態が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
【０１０８】
本発明の一側面の復号装置は、第１に、
LDPC(Low Density Parity Check)符号の復号装置（例えば、図１７や図２６の復号装置）であって、
前記LDPC符号の復号のためのチェックノードのチェックノード演算であって、非線形関数の演算（例えば、式（７）の非線形関数φ(|vi|)の演算）および前記非線形関数の逆関数の演算（例えば、式（７）の逆関数φ-1（Σφ(|vi|)）の演算）を含む前記チェックノード演算を行う第１の演算手段（例えば、図１７のチェックノード計算器１８１や、図２６の準チェックノード計算器４１２）と、
前記LDPC符号の復号のためのバリアブルノードのバリアブルノード演算を行う第２の演算手段（例えば、図１７のバリアブルノード計算器１０３や、図２６の準バリアブルノード計算器４１５）と
を備え、
前記第１の演算手段は、
固定の量子化幅で数値を表現するビット列である第１の量子化値を入力として、前記非線形関数の演算の結果を、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値で出力する関数演算手段（例えば、図１８のLUT２２１や、図２８のLUT４３２）と、
前記第２の量子化値を入力として、前記非線形関数の逆関数の演算の結果を、前記第１の量子化値で出力する逆関数演算手段（例えば、図１８のLUT２２８や、図２８のLUT４３９）と
を有する。
【０１０９】
本発明の一側面の復号装置では、第２に、
前記チェックノード演算が、前記非線形関数の演算後、前記非線形関数の逆関数の演算前に行われる積算（例えば、図１８の演算器１１２２、図２８の演算器４３３で行われる演算）をさらに含み、
前記第１の演算手段は、前記積算が行われる前に、前記第２の量子化値を、前記第１の量子化値に変換する。
【０１１０】
本発明の一側面の復号装置では、第３に、
前記第１の演算手段が、前記関数演算手段が出力する前記第２の量子化値を、前記第１の量子化値に変換する変換手段（例えば、図１８の変換器２３１や、図２８の変換器５０１）をさらに有する。
【０１１１】
本発明の一側面の復号装置では、第４に、
前記チェックノード演算が、前記非線形関数の演算の結果を遅延した、遅延後の前記非線形関数の演算の結果を用いて行われる演算（例えば、図１８の演算器１１２６や、図２８の演算器４３７で行われる演算）をさらに含み、
前記第１の演算手段は、遅延後の前記非線形関数の演算の結果を用いて行われる演算の前に、遅延後の前記非線形関数の演算の結果を表す前記第２の量子化値を、前記第１の量子化値に変換する変換手段（例えば、図１８の変換回路２３２や、図２８の変換回路５０２）をさらに有する。
【０１１２】
本発明の一側面の復号装置では、第５に、
前記第１の演算手段が、前記遅延後の前記非線形関数の演算の結果を用いて行われる演算の後に、前記第１の量子化値を、前記第２の量子化値に変換し、前記逆関数演算手段に供給する他の変換手段（例えば、図１８の変換回路２３３や、図２８の変換回路５０３）をさらに有する。
【０１１３】
本発明の一側面の復号装置では、第６に、
前記第１の演算手段が、
前記チェックノード演算のためにデータを遅延する遅延手段（例えば、図２８や、図３１、図３２のFIFOメモリ４３８）をさらに有し、
前記関数演算手段に入力される前記第１の量子化値、または前記関数演算手段から出力される前記第２の量子化値のうちの一方を、前記遅延手段が遅延するように構成される。
【０１１４】
本発明の一側面の復号装置では、第７に、
前記第１の演算手段は、前記遅延手段が前記関数演算手段に入力される前記第１の量子化値を遅延するように構成される場合、前記遅延手段が前記第１の量子化値を遅延した、遅延後の前記第１の量子化値を入力として、前記非線形関数の演算の結果を、前記第２の量子化値で出力する他の関数演算手段（例えば、図３２のLUT５０４）をさらに有する。
【０１１５】
本発明の一側面の復号方法は、
LDPC(Low Density Parity Check)符号の復号のためのチェックノードのチェックノード演算であって、非線形関数の演算（例えば、式（７）の非線形関数φ(|vi|)の演算）および前記非線形関数の逆関数の演算（例えば、式（７）の逆関数φ-1（Σφ(|vi|)）の演算）を含む前記チェックノード演算を行う第１の演算手段（例えば、図１７のチェックノード計算器１８１や、図２６の準チェックノード計算器４１２）と、
前記LDPC符号の復号のためのバリアブルノードのバリアブルノード演算を行う第２の演算手段（例えば、図１７のバリアブルノード計算器１０３や、図２６の準バリアブルノード計算器４１５）と
を備える復号装置（例えば、図１７や図２６の復号装置）の復号方法であって、
前記第１の演算手段において、
固定の量子化幅で数値を表現するビット列である第１の量子化値を入力として、前記非線形関数の演算の結果を、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値で出力する関数演算ステップ（例えば、図２５のステップＳ２１）と、
前記第２の量子化値を入力として、前記非線形関数の逆関数の演算の結果を、前記第１の量子化値で出力する逆関数演算ステップ（例えば、図２５のステップＳ２７）と
を含む。
【０１１６】
以下、図面を参照して、本発明の実施の形態について説明する。
【０１１７】
図１３は、本発明が適用される、LDPC符号を復号する復号装置の構成例を示している。なお、図中、図１０の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０１１８】
図１３の復号装置は、枝用メモリ１００，１０２、バリアブルノード計算器１０３、受信用メモリ１０４、制御部１０５が設けられている点で、図１０の復号装置と共通するが、チェックノード計算器１０１に代えてチェックノード計算器１７１が設けられている点で、図１０の復号装置と相違している。
【０１１９】
ここで、図１３の復号装置では、例えば、前述の図９に示した検査行列Hで表されるLDPC符号（符号化率2/3、符号長108）の復号が行われることとする。後述する図１７および図２６の復号装置においても同様である。
【０１２０】
図１３の復号装置では、チェックノード計算器１７１がチェックノード演算を行い、バリアブルノード計算器１０３がバリアブルノード演算を行い、これらのチェックノード演算とバリアブルノード演算とが交互に行われることによって、LDPC符号が復号される。
【０１２１】
即ち、受信用メモリ１０４には、LDPC符号の受信データu0iが、符号長（ここでは、上述したように108）の単位で順次供給されて記憶される。
【０１２２】
そして、バリアブルノード計算器１０３は、LDPC符号の復号のためのバリアブルノードのバリアブルノード演算を行う。
【０１２３】
即ち、枝用メモリ１０２には、後述するチェックノード計算器１７１によるチェックノード演算の結果としてのメッセージD102（チェックノードメッセージuj）が格納されており、枝用メモリ１０２は、そのメッセージD102を、メッセージD103として、バリアブルノード計算器１０３に供給する。さらに、バリアブルノード計算器１０３には、制御部１０５から制御信号D107が供給されるとともに、受信用メモリ１０４から受信データD104が供給される。
【０１２４】
バリアブルノード計算器１０３は、前述の図１２に示したように構成されており、制御信号D107に基づき、枝用メモリ１００から供給されるメッセージD103（チェックノードメッセージuj）と受信用メモリ１００から供給される受信データD104（u0i）を用い、式（１）に従ってバリアブルノード演算を行い、そのバリアブルノード演算の結果得られるメッセージD105（バリアブルノードメッセージvi）を、メッセージD100として、枝用メモリ１００に供給する。
【０１２５】
枝用メモリ１００は、バリアブルノード計算器１０３から供給される、バリアブルノード演算の結果であるメッセージD100（バリアブルノードメッセージvi）を格納していく。そして、枝用メモリ１００は、メッセージD100を、メッセージD101として読み出し、チェックノード計算器１７１に供給する。
【０１２６】
チェックノード計算器１７１は、LDPC符号の復号のためのチェックノードのチェックノード演算であって、非線形関数の演算および非線形関数の逆関数の演算を含むチェックノード演算を行う。
【０１２７】
即ち、チェックノード計算器１７１は、制御部１０５から供給される制御信号D106に基づき、枝用メモリ１００から供給されるメッセージD101（バリアブルノードメッセージvi）を用いて、非線形関数φ(x)の演算およびその非線形関数φ(x)の逆関数φ-1(x)の演算を含む式（７）に従ってチェックノード演算を行い、そのチェックノード演算によって求められたメッセージD102（チェックノードメッセージuj）を、後段の枝用メモリ１０２に供給する。
【０１２８】
枝用メモリ１０２は、前段のチェックノード計算器１７１から供給されるメッセージD102を格納していく。そして、枝用メモリ１０２に記憶されたメッセージD102は、上述したようにメッセージD103として読み出され、バリアブルノード計算器１０３に供給される。
【０１２９】
図１３の復号装置では、受信用メモリ１０４に記憶された符号長分の受信データu0iについて、バリアブルノード演算とチェックノード演算が、例えば、所定の複数回数だけ繰り返し行われ、また、最後の回には、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、受信用メモリ１０４に記憶された符号長分の受信データu0i（LDPC符号）の最終的な復号結果として出力される。
【０１３０】
図１３の復号装置は、チェックノード演算およびバリアブルノード演算を繰り返し行うことによって、LDPC符号を復号する点では、前述の図１０の復号装置と共通する。
【０１３１】
但し、図１３の復号装置は、チェックノード演算およびバリアブルノード演算として行う処理のうちの、非線形関数φ(x)の演算後から逆関数φ-1(x)の演算までの処理では、図１０の復号装置が使用している量子化値よりも精度の高い数値を表す量子化値を使用し、他の処理では、図１０の復号装置が使用しているのと同様の量子化値を使用する。
【０１３２】
ここで、図１０の復号装置では、上述したように、メッセージ（受信データu0iも同様）は、所定の数値範囲を符号ビット付きの６ビットで表すことができる６４値に均等に分割する各数値に割り当てられた６ビットの量子化値で表される。即ち、所定の数値範囲が−Ｒ／２から＋Ｒ／２であるとすると（Ｒ＞０）、メッセージを表す６ビットの各量子化値は、−Ｒ／２から＋Ｒ／２−Ｒ／６４までの、量子化幅であるＲ／６４きざみの６４の各数値に割り当てられ、その各数値を表す。いま、この、メッセージを表す６ビットの量子化値を、通常量子化値という。
【０１３３】
また、図１３の復号装置において、非線形関数φ(x)の演算後から逆関数φ-1(x)の演算までの処理で使用される、通常量子化値よりも精度の高い数値を表す量子化値を、高精度量子化値という。
【０１３４】
高精度量子化値は、通常量子化値よりも精度の高い数値を表すから、量子化幅、即ち、ある量子化値に割り当てられた数値と、その量子化値よりも１だけ小さい量子化値に割り当てられた数値との差（の絶対値）が通常量子化値よりも小さい。
【０１３５】
従って、高精度量子化値のビット数を、通常量子化値のビット数（ここでは６ビット）と同一とすると、高精度量子化値によって表すことができる数値範囲は、通常量子化値によって表すことができる数値範囲よりも狭くなる。即ち、高精度量子化値によって表すことができる最大値と最小値との差（ダイナミックレンジ）は、通常量子化値によって表すことができる最大値と最小値との差（ダイナミックレンジ）よりも狭くなる
【０１３６】
また、高精度量子化値のビット数を、通常量子化値のビット数と同一とした場合の、高精度量子化値によって表すことができるダイナミックレンジを、Dy1と表すとともに、そのような高精度量子化値の量子化幅を、Qd1と表すと、例えば、高精度量子化値の量子化幅をQd1のままで、ダイナミックレンジがDy1よりも広いDy2の数値範囲を高精度量子化値で表し、あるいは高精度量子化値の量子化幅をQd1より小さいQd2として、ダイナミックレンジがDy1の数値範囲を高精度量子化値で表す場合には、高精度量子化値のビット数は、通常量子化値のビット数よりも多く必要となる。
【０１３７】
通常量子化値よりも精度の高い数値を表す量子化値、つまり、量子化幅が通常量子化値よりも小さい量子化値であれば、ダイナミックレンジやビット数にかかわらず、高精度量子化値として採用しうるが、ここでは、量子化幅が通常量子化値よりも小さい量子化値であって、ダイナミックレンジが通常量子化値よりも広く、ビット数も通常量子化値よりも多い量子化値を、高精度量子化値として採用することとする。
【０１３８】
いま、高精度量子化値のビット数を、６ビットの通常量子化値よりも多い、例えば、符号ビットを含む１０ビットとすると、図１３の復号装置は、非線形関数φ(x)の演算後から逆関数φ-1(x)の演算までの処理（以下、適宜、非線形関数演算間処理という）では、１０ビットの高精度量子化値を使用し、他の処理では、６ビットの通常量子化値を使用する。
【０１３９】
ここで、非線形関数演算間処理は、チェックノード演算の一部の処理であり、その非線形関数演算間処理でのみ、１０ビットの高精度量子化値が使用される。従って、枝用メモリ１００と１０２に記憶されるメッセージにも、また、受信用メモリ１０４に記憶される受信データu0iにも、６ビットの通常量子化値が使用されるので、図１３の復号装置において、枝用メモリ１００，１０２、および受信用メモリ１０４に必要な記憶容量は、図１０の復号装置のそれと同一である。
【０１４０】
次に、図１４は、図１３のチェックノード計算器１７１の構成例を示している。なお、図中、図１１のチェックノード計算器１０１と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０１４１】
チェックノード計算器１７１は、図１１のLUT１２１、演算器１２２、レジスタ１２３、セレクタ１２４、レジスタ１２５、演算器１２６、FIFOメモリ１２７、LUT１２８それぞれに代えて、LUT１１２１、演算器１１２２、レジスタ１１２３、セレクタ１１２４、レジスタ１１２５、演算器１１２６、FIFOメモリ１１２７、LUT１１２８が設けられており、さらに、図１４において太線で示す部分のビット数が、高精度量子化値と通常量子化値とのビット数の差である４ビットだけ多くなっている点で、図１１のチェックノード計算器１０１と相違している。
【０１４２】
図１４のチェックノード計算器１７１も、図１１のチェックノード計算器１０１と同様に、制御部１０５から供給される、例えば、1ビットの制御信号D106に基づき、枝用メモリ１００から１つずつ読み込まれるメッセージD101（バリアブルノードメッセージvi）を用いて、式（７）にしたがってチェックノード演算を行う。
【０１４３】
即ち、図１５は、チェックノード計算器１７１で行われる処理を示している。
【０１４４】
チェックノード計算器１７１では、検査行列Hの各列に対応するバリアブルノードからの６ビットのメッセージD101（バリアブルノードメッセージvi）が、枝用メモリ１００（図１３）から１つずつ読み込まれ、その下位５ビットである絶対値D122(|vi|)がLUT１１２１に、その最上位ビットである符号ビットD121がEXOR回路１２９とFIFO(First In First Out)メモリ１３３にそれぞれ供給される。また、チェックノード計算器１７１には、制御部１０５から制御信号D106が供給され、その制御信号D106は、セレクタ１１２４とセレクタ１３１に供給される。
【０１４５】
LUT１１２１は、５ビットの絶対値D122(|vi|)に対して、式（７）における非線形関数φ(|vi|)の演算結果D1123（φ(|vi|)）を対応付けて記憶している。さらに、LUT１１２１では、絶対値D122(|vi|)は、通常量子化値で表されているのに対して、非線形関数φ(|vi|)の演算結果D1123（φ(|vi|)）は、符号ビットなしの高精度量子化値で表されている。即ち、LUT１１２１は、通常量子化値で表される５ビットの絶対値D122(|vi|)に対して、例えば、高精度量子化値で表される９ビットの、非線形関数φ(|vi|)の演算結果D1123（φ(|vi|)）を対応付けて記憶している。
【０１４６】
LUT１１２１は、ステップＳ１において、通常量子化値で表される５ビットの絶対値D122(|vi|)を入力として、それに対応付けられている、高精度量子化値で表される９ビットの、非線形関数φ(|vi|)の演算結果D1123（φ(|vi|)）を読み出し、演算器１１２２とFIFOメモリ１１２７に出力する。
【０１４７】
従って、LUT１１２１は、ステップＳ１において、式（７）における非線形関数φ(|vi|)を演算する処理、および通常量子化値を高精度量子化値に変換する処理を、等価的に行い、以降は、後述するLUT１１２８において、高精度量子化値を通常量子化値に変換する処理が行われるまで、高精度量子化値を使用して処理が行われる。
【０１４８】
その後、ステップＳ２において、演算器１１２２は、９ビットの演算結果D1123（φ(|vi|)）とレジスタ１１２３に格納されている１３ビットの値D1124とを加算することにより、演算結果D1123を積算し、その結果得られる１３ビットの積算値をレジスタ１１２３に再格納する。なお、検査行列Hの1行に亘る全ての枝からのメッセージD101の絶対値D122(|vi|)に対する演算結果が積算された場合、レジスタ１１２３はリセットされる。
【０１４９】
ここで、演算器１１２２およびレジスタ１１２３では、LUT１１２１から供給される９ビットの演算結果D1123（φ(|vi|)）が、最大で、FIFOメモリ１１２７における最大の遅延回数分、即ち、検査行列Hの行の最大の重み分の回数だけ積算される。いま、図９の検査行列Hの行の最大の重みは９であり、従って、演算器１１２２およびレジスタ１１２３では、９ビットの高精度量子化値が、最大で、９回積算される（９ビットの高精度量子化値の９個分の積算が行われる）。このため、演算器１１２２の出力以降においては、９ビットの高精度量子化値を９回積算した値を表すことができるように、高精度量子化値のビット数は、LUT１１２１が出力する９ビットの演算結果D1123（φ(|vi|)）よりも４ビット（９（回）を表すことができる最小のビット数）だけ多い１３ビットになっている。
【０１５０】
検査行列Hの1行に亘るメッセージD101（バリアブルノードメッセージvi）が１つずつ読み込まれ、レジスタ１１２３に1行分の演算結果D1123が積算された積算値が格納された場合、制御部１０５から供給される制御信号D106は、０から１に変化する。例えば、検査行列Hの行の重み（row weight）が「９」である場合、制御信号D106は、１から８クロック目までは、「０」となり、９クロック目では「１」となる。
【０１５１】
制御信号D106が「１」の場合、セレクタ１１２４は、ステップＳ３において、レジスタ１１２３に格納されている値、即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算された１３ビットの積算値D1124（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）を選択し、１３ビットの値D1125として、レジスタ１１２５に出力して格納させる。レジスタ１１２５は、格納している値D1125を、１３ビットの値D1126として、セレクタ１１２４と演算器１１２６に供給する。制御信号D106が「０」の場合、セレクタ１１２４は、レジスタ１１２５から供給された値D1126を選択し、レジスタ１１２５に出力して再格納させる。即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１１２５は、前回積算されたφ(|vi|)を、セレクタ１１２４と演算器１１２６に供給する。
【０１５２】
一方、FIFOメモリ１１２７は、レジスタ１１２５から新たな値D1126（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）が出力されるまでの間、LUT１１２１が出力した９ビットの演算結果D1123（φ(|vi|)）を遅延し、９ビットの値D1127として演算器１１２６に供給する。演算器１１２６は、ステップＳ４において、レジスタ１１２５から供給された１３ビットの値D1126から、FIFOメモリ１１２７から供給された９ビットの値D1127を減算し（レジスタ１１２５から供給された１３ビットの値D1126に、FIFOメモリ１１２７から供給された９ビットの値D1127に-1を乗算して得られる値を積算し）、その減算結果を、９ビットの減算値D1128としてLUT１１２８に供給する。
【０１５３】
即ち、演算器１１２６は、検査行列Hの1行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)の積算値から、チェックノードメッセージujを求めたい枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を減算値D1128としてLUT１１２８に供給する。
【０１５４】
なお、レジスタ１１２５から供給される１３ビットの値D1126から、FIFOメモリ１１２７から供給される９ビットの値D1127を減算した減算結果としての量子化値（高精度量子化値）が、９ビットの減算値D1128で表すことができる最大値を越える場合には、演算器１１２６は、減算結果としての高精度量子化値を、９ビットの高精度量子化値で表すことができる最大値にクリッピングし、９ビットの減算値D1128として出力する。
【０１５５】
LUT１１２８は、減算値D1128（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）に対して、式（７）における逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D1129（φ-1(Σφ(|vi|)))を対応付けて記憶している。さらに、LUT１１２８では、減算値D1128（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）は、高精度量子化値で表されているのに対して、逆関数φ-1（Σφ(|vi|)）の演算結果D1129（φ-1(Σφ(|vi|)))は、符号ビットなしの通常量子化値で表されている。即ち、LUT１１２８は、高精度量子化値で表される９ビットの減算値D1128（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）に対して、通常量子化値で表される５ビットの、逆関数φ-1（Σφ(|vi|)）の演算結果D1129（φ-1(Σφ(|vi|)))を対応付けて記憶している。
【０１５６】
LUT１１２８は、ステップＳ５において、高精度量子化値で表される９ビットの減算値D1128（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を入力として、それに対応付けられている、通常量子化値で表される５ビットの、逆関数φ-1（Σφ(|vi|)）の演算結果D1129（φ-1(Σφ(|vi|)))を読み出して出力する。
【０１５７】
従って、LUT１１２８は、ステップＳ５において、式（７）における逆関数φ-1(Σφ(|vi|))を演算する処理、および高精度量子化値を通常量子化値に変換する処理を、等価的に行い、以降は、上述したLUT１１２１において、通常量子化値を高精度量子化値に変換する処理が行われるまで、通常量子化値を使用して処理が行われる。
【０１５８】
以上の処理と並行して、EXOR回路１２９、レジスタ１３０、セレクタ１３１、レジスタ１３２、FIFOメモリ１３３、EXOR回路１３４では、図１１のチェックノード計算器１０１と同様の処理が行われ、これにより、EXOR回路１３４は、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）の符号ビットD121（sign(|vi|)）の乗算値を、チェックノードメッセージujを求めたい枝からのメッセージD101の符号ビットD121（sign(|vi|)）で除算して、その除算値（ｉ＝１からｉ＝ｄc−１までのΠsign(|vi|)）を除算値D135として出力する。
【０１５９】
そして、チェックノード計算器１７１では、LUT１１２８から出力された通常量子化値の５ビットの演算結果D1129を下位５ビットとするとともに、EXOR回路１３４から出力された１ビットの除算値D135を最上位ビット（符号ビット）とする合計６ビットの通常量子化値で表されるメッセージD102（チェックノードメッセージuj）が出力される。
【０１６０】
従って、チェックノード計算器１７１では、LUT１１２１において、通常量子化値を高精度量子化値に変換するとともに、LUT１１２８において、高精度量子化値を通常量子化値に変換することにより、チェックノード演算およびバリアブルノード演算として行う処理のうちの、非線形関数φ(x)の演算後からその逆関数φ-1(x)の演算までの処理では、高精度量子化値を使用し、他の処理では、通常量子化値を使用するので、LDPC符号の復号を、復号装置の大規模化を抑えつつ精度良く行うことができる。
【０１６１】
即ち、図１６は、非線形関数φ(x)と、その逆関数φ-1(y)とを示している。なお、図１６において、○印は、通常量子化値を採用した場合に、非線形関数φ(x)の演算結果とその引数xとがとり得る数値、および逆関数φ-1(y)とその引数ｙとがとり得る数値を示している。
【０１６２】
図１６の左側は、非線形関数φ(x)を示しており、図１６の右側は、その逆関数φ-1(y)を示している。
【０１６３】
図１６の左側に示した非線形関数φ(x)は、その引数xが、ある程度の大きな数値以上となると、ほぼ０となる。
【０１６４】
一方、図１６の右側に示した逆関数φ-1(y)は、その引数yが、数値0付近である場合に、急峻に変化する。
【０１６５】
従って、チェックノード演算である式（７）の演算において、非線形関数φ(|vi|)の演算後からその逆関数φ-1(x)の演算までの処理を、通常量子化値を使用して行った場合、演算精度が劣化する。
【０１６６】
即ち、非線形関数φ(x)の演算結果を、通常量子化値で表すと、ある程度の大きな数値以上の引数xに対しては、すべて、非線形関数φ(x)の演算結果として、同一の数値0を表す通常量子化値が得られる。つまり、ある程度の大きな数値以上の引数xに対する非線形関数φ(x)の演算結果は、ほぼ0となるため、通常量子化値によって精度良く表すことが困難である。
【０１６７】
また、式（７）のチェックノード演算において、逆関数φ-1(y)の引数yとなるのは、非線形関数φ(|vi|)の積算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）であるが、非線形関数φ(|vi|)の演算結果を表す通常量子化値は、上述したように、ある程度の大きな数値以上の引数|vi|に対しては、すべて、数値0を表す通常量子化値となる。
【０１６８】
従って、式（７）の積算の対象となる非線形関数φ(|vi|)の演算結果として、すべて、数値0を表す通常量子化値が得られた場合には、その積算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）も、数値0を表す通常量子化値となり、逆関数φ-1(y)の引数yとして、数値0を表す通常量子化値が与えられることになる。
【０１６９】
一方、逆関数φ-1(y)は、その引数yが、数値0付近である場合に急峻に変化するから、逆関数φ-1(y)の演算結果として、精度の良い演算結果を得るためには、特に、0付近の数値を精度良く表す量子化値によって、引数yを表現することが望ましい。
【０１７０】
しかしながら、通常量子化値を使用した場合には、上述したように、ある程度の大きな数値以上の引数|vi|に対しては、すべて、非線形関数φ(|vi|)の演算結果として、数値0を表す通常量子化値が得られ、その結果、逆関数φ-1（Σφ(|vi|)）の引数となる積算値Σφ(|vi|)を表す通常量子化値も、数値0を表す通常量子化値となる。
【０１７１】
このため、積算値Σφ(|vi|)が数値0付近の値である場合には、その積算値Σφ(|vi|)が僅かに違えば、本来は、逆関数φ-1（Σφ(|vi|)）の演算結果が大きく異なるはずなのに、0付近の積算値Σφ(|vi|)が、すべて数値0を表す通常量子化値で表されてしまうために、僅かに違う積算値Σφ(|vi|)に対し、逆関数φ-1（Σφ(|vi|)）の演算結果として、同一の演算結果、つまり、誤差の大きな演算結果が得られることになる。
【０１７２】
これに対して、非線形関数φ(|vi|)の演算後からその逆関数φ-1(x)の演算までの処理を、高精度量子化値を使用して行う場合には、ある程度の大きな数値以上の引数xに対しても、非線形関数φ(x)の演算結果として、0付近の数値を精度良く表す高精度量子化値が得られる。さらに、その結果、逆関数φ-1（Σφ(|vi|)）の引数となる積算値Σφ(|vi|)が、0付近の数値であっても、その数値を精度良く表す高精度量子化値が得られる。
【０１７３】
従って、積算値Σφ(|vi|)が数値0付近の値である場合であっても、その積算値Σφ(|vi|)が僅かに異なるごとに応じて異なる、精度の良い逆関数φ-1（Σφ(|vi|)）の演算結果（を表す高精度量子化値）が得られることになる。そして、その結果、LDPC符号の復号を精度良く行うことができる。
【０１７４】
さらに、非線形関数φ(|vi|)の演算後からその逆関数φ-1(x)の演算までの処理だけを、高精度量子化値を使用し、他の処理を、通常量子化値を使用して行うので、チェックノード計算器１７１（図１４）において高精度量子化値を使用する部分、即ち、LUT１１２１乃至LUT１１２８の規模が、高精度量子化値と通常量子化値とのビット数の差分の分だけ僅かに大きくなるだけであり、上述したように、図１３の復号装置の枝用メモリ１００，１０２、および受信用メモリ１０４に必要な記憶容量は、通常量子化値を使用する図１０の復号装置のそれと変わらない。
【０１７５】
従って、LDPC符号の復号を、復号装置の大規模化を抑えつつ精度良く行うことができる。
【０１７６】
なお、図９の検査行列Hの行の重みの最大は９であるため、即ち、チェックノードに供給されるメッセージの最大数は９であるため、チェックノード計算器１７１（図１４）は、９個のメッセージ（φ(|vi|)）を遅延させるFIFOメモリ１１２７とFIFOメモリ１３３を有し、行の重みが９未満の行のメッセージを計算するときには、FIFOメモリ１１２７とFIFOメモリ１３３における遅延量が、その行の重みの値に減らされる。
【０１７７】
ところで、図１４のチェックノード計算器１７１において、チェックノード演算における非線形関数φ(|vi|)の演算と逆関数φ-1(x)の演算とは、それぞれLUT１１２１とLUT１１２８で行われる。
【０１７８】
即ち、非線形関数φ(|vi|)の演算は、５ビットの通常量子化値を入力として、非線形関数φ(|vi|)の演算の結果を、９ビットの高精度量子化値で出力するLUT１１２１で行われ、逆関数φ-1(x)の演算は、９ビットの高精度量子化値を入力として、逆関数φ-1(x)の演算の結果を、５ビットの通常量子化値で出力するLUT１１２８で行われる。
【０１７９】
このようなLUT１１２１やLUT１１２８などのLUTの容量としては、入力としての量子化値のビット数をaビットとするとともに、出力としての量子化値をbビットとすると、2a×bビットだけの容量が必要となる。
【０１８０】
従って、入力および出力のいずれの量子化値も５ビットの通常量子化値である図１１のLUT１２１とLUT１２８には、25×5ビットの容量が必要である。
【０１８１】
一方、入力としての量子化値が５ビットの通常量子化値であり、出力としての量子化値が９ビットの高精度量子化値であるLUT１１２１には、25×9ビットの容量が必要であり、入力としての量子化値が９ビットの高精度量子化値であり、出力としての量子化値が５ビットの通常量子化値であるLUT１１２８には、29×5ビットの容量が必要である。
【０１８２】
従って、図１４のチェックノード計算器１７１におけるLUT１１２１やLUT１１２８に必要な容量は、図１１のチェックノード計算器１０１におけるLUT１２１やLUT１２８と比較して大になり、その分、図１４のチェックノード計算器１７１は、図１１のチェックノード計算器１０１よりも大型化する。さらに、その結果、図１３の復号装置も、図１０の復号装置と比較して大型化する。
【０１８３】
そこで、図１７は、本発明を適用した復号装置の第１実施の形態の構成例を示している。なお、図中、図１３の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０１８４】
図１７の復号装置は、枝用メモリ１００，１０２、バリアブルノード計算器１０３、受信用メモリ１０４、制御部１０５が設けられている点で、図１３の復号装置と共通するが、チェックノード計算器１７１に代えてチェックノード計算器１８１が設けられている点で、図１３の復号装置と相違している。
【０１８５】
ここで、図１７の復号装置では、図１３で説明したように、例えば、前述の図９に示した検査行列Hで表されるLDPC符号（符号化率2/3、符号長108）の復号が行われる。
【０１８６】
図１７の復号装置でも、図１３の復号装置と同様に、図１３のチェックノード計算器１７１に対応するチェックノード計算器１８１がチェックノード演算を行い、バリアブルノード計算器１０３がバリアブルノード演算を行い、これらのチェックノード演算とバリアブルノード演算とが交互に行われることによって、LDPC符号が復号される。
【０１８７】
従って、チェックノード計算器１８１でも、図１３のチェックノード計算器１７１と同様に、LDPC符号の復号のためのチェックノードのチェックノード演算であって、非線形関数の演算および非線形関数の逆関数の演算を含むチェックノード演算が行われ、即ち、制御部１０５から供給される制御信号D106に基づき、枝用メモリ１００から供給されるメッセージD101（バリアブルノードメッセージvi）を用いて、非線形関数φ(x)の演算およびその非線形関数φ(x)の逆関数φ-1(x)の演算を含む式（７）に従ってチェックノード演算が行われ、そのチェックノード演算によって求められたメッセージD102（チェックノードメッセージuj）が、後段の枝用メモリ１０２に供給される。
【０１８８】
但し、チェックノード計算器１８１では、固定の量子化幅で数値を表現するビット列である第１の量子化値を入力として、非線形関数φ(x)の演算の結果を、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値で出力する点、および、第２の量子化値を入力として、逆関数φ-1(x)の演算の結果を、第１の量子化値で出力する点が、図１３のチェックノード計算器１７１と異なっている。
【０１８９】
ここで、固定の量子化幅で数値を表現するビット列である第１の量子化値については、固定の量子化幅をSと表すとともに、第１の量子化値をQ1と表すと、第１の量子化値（ビット列）Q1+1が表す数値は、必ず、第１の量子化値Q1が表す数値よりもSだけ大きい数値となる。従って、第１の量子化値は、数値を、いわゆる固定小数点と呼ばれる表現形式で表現するビット列と等価であり、以下、適宜、固定小数点量子化値、または固定小数点形式の量子化値という。
【０１９０】
また、一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値については、量子化幅が、第２の量子化値の一部のビット列に応じて変化するので、第２の量子化値をQ2と表すと、第２の量子化値Q2+1が表す数値が、第２の量子化値Q2が表す数値よりもどれだけ大きい数値であるかは、第２の量子化値Q2とQ2+1の一部のビット列によって異なる。
【０１９１】
即ち、第２の量子化値Q2とQ2+1の一部のビット列によっては、第２の量子化値Q2+1が表す数値は、第２の量子化値Q2が表す数値よりも、ある数Sだけ大きい数値であることや、Sとは異なるある数S’だけ大きいことがある。つまり、第２の量子化値が、１だけ増加すると、その第２の量子化値が表す数値は、例えば、Sだけ増加することもあるし、Sとは異なるS’だけ増加することもある。
【０１９２】
一方、数値を、いわゆる浮動小数点と呼ばれる表現形式で表現するビット列は、符号ビット（正負を表すビット）を考慮しなければ、一般に、指数部eを一部のビット列に割り当てるとともに、仮数部fを残りのビット列に割り当てることによって、f×2eで表される数値を表す。
【０１９３】
数値f×2eを浮動小数点で表現するビット列については、例えば、指数部eとしてのビット列が0であれば、仮数部fとしてのビット列が1だけ増加することに、その指数部eと仮数部fとで構成される、数値を浮動小数点で表現するビット列が表す数値f×2eは、１ずつ増加する。また、例えば、指数部eとしてのビット列が1であれば、仮数部fとしてのビット列が1だけ増加することに、その指数部eと仮数部fとで構成される、数値を浮動小数点で表現するビット列が表す数値f×2eは、２ずつ増加する。
【０１９４】
従って、数値を浮動小数点で表現するビット列については、その一部のビット列に割り当てられる指数部eによっては、残りのビット列に割り当てられている仮数部fが1だけ増加すると、指数部eと仮数部fとで構成される、数値を浮動小数点で表現するビット列が表す数値は、例えば、1だけ増加することもあるし、2だけ増加することもある。
【０１９５】
一部のビット列に応じて決まる量子化幅で数値を表現するビット列である第２の量子化値は、その第２の量子化値が表す数値の増加の仕方が一部のビット列によって異なる点において、数値の増加の仕方が指数部eによって異なる、数値を浮動小数点で表現するビット列と共通する。
【０１９６】
以上のように、第２の量子化値は、数値を浮動小数点で表現するビット列に、いわば準ずるので、第２の量子化値を、以下、適宜、準浮動小数点量子化値、または準浮動小数点形式の量子化値という。
【０１９７】
なお、上述の通常量子化値および高精度量子化値は、いずれも、固定小数点量子化値である。
【０１９８】
次に、図１８は、図１７のチェックノード計算器１８１の構成例を示している。
【０１９９】
なお、図１８において、図１４のチェックノード計算器１７１と共通する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０２００】
即ち、図１８のチェックノード計算器１８１は、LUT１１２１とLUT１１２８に代えて、LUT２２１とLUT２２８がそれぞれ設けられており、かつ、変換回路２３１，２３２、および２３３が新たに設けられている他は、図１４のチェックノード計算器１７１と同様に構成されている。
【０２０１】
チェックノード計算器１８１は、式（７）のチェックノード演算を行うが、その際、上述したように、固定小数点量子化値を入力として、非線形関数φ(x)の演算の結果を、準浮動小数点量子化値で出力するとともに、準浮動小数点量子化値を入力として、逆関数φ-1(x)の演算の結果を、固定小数点量子化値で出力する。
【０２０２】
即ち、LUT２２１は、図１４のLUT１１２１と同様に、固定小数点量子化値でもある通常量子化値の５ビットの絶対値D122(|vi|)に対して、式（７）における非線形関数φ(|vi|)の演算結果を対応付けて記憶している。但し、LUT１１２１では、非線形関数φ(|vi|)の演算結果が、９ビットの高精度量子化値で表されているのに対して、LUT２２１では、非線形関数φ(|vi|)の演算結果が、５ビットの準浮動小数点量子化値で表されている。
【０２０３】
従って、LUT２２１は、５ビットの固定小数点量子化値に対し、その固定小数点量子化値が表す数値|vi|を入力として、非線形関数φ(|vi|)の演算を行った結果得られる数値を表す５ビットの準浮動小数点量子化値を対応付けて記憶している。
【０２０４】
そして、LUT２２１は、そこに供給される５ビットの固定小数点量子化値である絶対値D122(|vi|)に対応付けられている、非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値を、変換回路２３１とFIFO１１２７に供給する。
【０２０５】
LUT２２８は、図１４のLUT１１２８と同様に、５ビットの量子化値y（=Σφ(|vi|)）に対して、式（７）における逆関数φ-1(y)(=φ-1（Σφ(|vi|)））の演算結果を表す５ビットの通常量子化値を対応付けて記憶している。但し、LUT１１２８に対しては、逆関数φ-1(y)の引数yが９ビットの固定小数点量子化値でもある高精度量子化値で与えられるのに対して、LUT２２８に対しては、逆関数φ-1(y)の引数yが５ビットの準浮動小数点量子化値で、後述する変換回路２３３から与えられるようになっている。
【０２０６】
従って、LUT２２８は、５ビットの準浮動小数点量子化値（符号ビットなしの準浮動小数点量子化値）に対し、その準浮動小数点量子化値が表す数値Σφ(|vi|)を入力として、逆関数φ-1（Σφ(|vi|)）の演算を行った結果得られる数値を表す５ビットの固定小数点量子化値（符号ビットなしの固定小数点量子化値）を対応付けて記憶している。
【０２０７】
そして、LUT２２８は、そこに供給される５ビットの準浮動小数点量子化値F1128(Σφ(|vi|)）に対応付けられている、逆関数φ-1（Σφ(|vi|)）の演算結果を表す、通常量子化値でもある５ビットの固定小数点量子化値を、逆関数φ-1（Σφ(|vi|)）の演算結果D1129として出力する。
【０２０８】
変換回路２３１は、LUT２２１から供給される、非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値を、その非線形関数φ(|vi|)の演算結果を表す、高精度量子化値でもある９ビットの固定小数点量子化値（符号ビットなしの固定小数点量子化値）に変換する、数値の表現形式の変換を行い、その結果得られる９ビットの固定小数点量子化値D1123を、演算器１１２２に供給する。
【０２０９】
ここで、LUT２２１が出力する非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値は、上述したように、一部のビット列に応じて決まる量子化幅で数値を表現するビット列であるため、そのままでは、後段の演算器１１２２での積算を行うことが困難である。このため、変換回路２３１は、LUT２２１が出力する５ビットの準浮動小数点量子化値を、９ビットの高精度量子化値でもある固定小数点量子化値に変換する。
【０２１０】
変換回路２３２は、変換回路２３１と同様に、数値の表現形式の変換を行う。即ち、変換回路２３２には、LUT２２１が出力する非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値が、FIFO１１２７において遅延されて供給されるようになっている。変換回路２３２は、FIFO１１２７から供給される（遅延後の）５ビットの準浮動小数点量子化値を、９ビットの高精度量子化値でもある固定小数点量子化値に変換し、演算器１１２６に供給する。
【０２１１】
つまり、変換回路２３２は、変換回路２３１で準浮動小数点量子化値を固定小数点量子化値に変換するのと同様の理由で、後段の演算器１１２６の演算（積算）の対象となる５ビットの準浮動小数点量子化値を、９ビットの高精度量子化値でもある固定小数点量子化値に変換する。
【０２１２】
変換回路２３３は、変換回路２３１や２３２の変換とは逆の表現形式の変換を行う。即ち、変換回路２３３には、演算器１１２６から９ビットの高精度量子化値でもある固定小数点量子化値が供給されるようになっている。変換回路２３３は、演算器１１２６からの９ビットの固定小数点量子化値を５ビットの準浮動小数点量子化値に変換し、LUT２２８に入力として与える。
【０２１３】
なお、図１８では、９ビットの固定小数点量子化値（およびその９ビットの固定小数点量子化値を用いて行われた演算の結果）がやりとりされる接続線を、実線の太線で示してあり、５ビットの浮動小数点量子化値がやりとりされる接続線を、点線の太線で示してある。後述する図２８においても、同様である。
【０２１４】
次に、図１９を参照して、図１８のLUT２２１についてさらに説明する。
【０２１５】
LUT２２１には、図１９左の表に示す５ビットの通常量子化値でもある固定小数点量子化値が供給される。なお、図１９左の表では、５ビットの固定小数点量子化値としてのビット列とともに、そのビット列が表す１０進数の数値も示してある。
【０２１６】
LUT２２１は、５ビットの固定小数点量子化値に対して、その固定小数点量子化値が表す数値xを入力として式（７）における非線形関数φ(|vi|)の演算を行った結果得られる数値φ(x)を表す５ビットの準浮動小数点量子化値を出力する。
【０２１７】
図１９右の表は、LUT２２１が出力する５ビットの準浮動小数点量子化値を示している。ここで、図１９右の表には、５ビットの準浮動小数点量子化値としてのビット列とともに、その準浮動小数点量子化値に対応する固定小数点量子化値（準浮動小数点量子化値が表す数値を表す固定小数点量子化値）としての９ビットと、その９ビットが表す１０進数の数値も示してある。
【０２１８】
図１９左の表の５ビットの固定小数点量子化値が表す１０進数の数値の範囲は、０乃至３１であるのに対して、図１０右の表の５ビットの準浮動小数点量子化値（に対応する９ビットの固定小数点量子化値）が表す１０進数の数値の範囲は、０乃至４４８であり、従って、同一の５ビットでも、準浮動小数点量子化値の方が、固定小数点量子化値よりも広いダイナミックレンジの数値を表すことができる。なお、例えば、９ビットの固定小数点量子化値が表す１０進数の範囲は、０乃至５１１であるから、５ビットの準浮動小数点量子化値によれば、９ビットの固定小数点量子化値と同程度に広いダイナミックレンジの数値を表すことができる。
【０２１９】
また、図１９右の表の５ビットの準浮動小数点量子化値の量子化幅は、その一部のビットである上位３ビットによって異なっている。
【０２２０】
即ち、１０進数の数値で考えれば、５ビットの準浮動小数点量子化値の上位３ビットが０００である場合と００１である場合には、残りの下位２ビットが１だけ増加するごとに、５ビットの準浮動小数点量子化値が表す１０進数の数値は１ずつ増加する。従って、量子化幅は１になっている。
【０２２１】
また、５ビットの準浮動小数点量子化値の上位３ビットが０１０である場合には、残りの下位２ビットが１だけ増加するごとに、５ビットの準浮動小数点量子化値が表す１０進数の数値は２ずつ増加する。従って、量子化幅は２になっている。
【０２２２】
さらに、５ビットの準浮動小数点量子化値の上位３ビットが０１１である場合には、残りの下位２ビットが１だけ増加するごとに、５ビットの準浮動小数点量子化値が表す１０進数の数値は４ずつ増加する。従って、量子化幅は４になっている。
【０２２３】
以下、同様に、５ビットの準浮動小数点量子化値の上位３ビットが１００，１０１，１１０，１１１である場合には、それぞれ、量子化幅は、８，１６，３２，６４になっている。
【０２２４】
ここで、図１９右の表の５ビットの準浮動小数点量子化値の上位３ビットを準指数部eと呼ぶとともに、残りの下位２ビットを準仮数部fと呼ぶこととすると、準指数部eが０００である場合を除けば、５ビットの準浮動小数点量子化値が表す１０進数の数値は、(1+f/22)×2e+1となる。従って、準浮動小数点量子化値は、仮数部を(1+f/22)とし、指数部をe+1とする基数が2の浮動小数点（数）であるということができる。例えば、５ビットの準浮動小数点量子化値１０００１は、準指数部eである上位３ビットが１００（１０進数で４）であり、準仮数部fである下位２ビットが０１（１０進数で１）であるから、１０進数の数値で表すと、(1+1/22)×24+1=40となる。
【０２２５】
なお、準指数部eが０００である場合、５ビットの準浮動小数点量子化値が表す１０進数の数値は、f/2×2e+1となる。この場合、準浮動小数点量子化値は、仮数部をf/2とし、指数部をe+1とする基数が2の浮動小数点（数）であるということができる。
【０２２６】
上述のように、準浮動小数点量子化値の量子化幅は、その準浮動小数点量子化値が表す数値が大になるほど大になる（小になるほど小になる）。本実施の形態では、５ビットの準浮動小数点量子化値の最小の量子化幅が、例えば、９ビットの固定小数点量子化値でもある高精度量子化値の量子化幅以下（高精度量子化値の量子化幅と同一か、それよりも小さい値）になっており、従って、５ビットの準浮動小数点量子化値によれば、９ビットの高精度量子化値と同様に、非線形関数φ(x)の演算結果（図１６左側）として、0付近の数値を精度良く表すことができる。
【０２２７】
即ち、５ビットの準浮動小数点量子化値によれば、５ビットの固定小数点量子化値（通常量子化値）よりも広い、９ビットの固定小数点量子化値（高精度量子化値）と同程度のダイナミックレンジの数値を表すことができ、かつ、９ビットの固定小数点量子化値（高精度量子化値）と同様に（あるいは、それ以上に）、0付近の数値を精度良く表すことができる。
【０２２８】
次に、図２０を参照して、図１８の変換回路２３１についてさらに説明する。
【０２２９】
図２０は、変換回路２３１に入力される（与えられる）５ビットの準浮動小数点量子化値と、変換回路２３１が出力する９ビットの固定小数点量子化値との関係を示している。
【０２３０】
変換回路２３１は、上述したように、LUT２２１から供給される５ビットの準浮動小数点量子化値を、高精度量子化値でもある９ビットの固定小数点量子化値に変換する、数値の表現形式の変換を行う。
【０２３１】
即ち、変換回路２３１は、図２０の左から１番目の欄に示す５ビットの準浮動小数点量子化値を、図２０の左から２番目の欄に示す９ビットの固定小数点量子化値に変換して出力する。
【０２３２】
具体的には、変換回路２３１は、５ビットの準浮動小数点量子化値の準指数部（上位３ビット）eが０００である場合には、準仮数部（下位２ビット）fを、そのまま下位２ビットとし、かつ、残りの上位７ビットを０とする９ビットの固定小数点量子化値を出力する。
【０２３３】
また、変換回路２３１は、５ビットの準浮動小数点量子化値の準指数部eが００１である場合には、下位３ビット目（最下位ビットから数えて３ビット目）を１とするとともに、その直後の下位側の２ビットを準仮数部fとし、かつ、残りの上位６ビットを０とする９ビットの固定小数点量子化値を出力する。
【０２３４】
さらに、変換回路２３１は、５ビットの準浮動小数点量子化値の準指数部eが０１０である場合には、下位４ビット目を１とするとともに、その直後の下位側の２ビットを準仮数部fとし、かつ、残りの６ビットを０とする９ビットの固定小数点量子化値を出力する。
【０２３５】
以下、同様に、変換回路２３１は、準指数部がeで表され、準仮数部がfで表される５ビットの準浮動小数点量子化値に対して、下位e+1ビット目を１とするとともに、その直後の下位側の２ビットを準仮数部fとし、かつ、残りの６ビットを０とする９ビットの固定小数点量子化値を出力する。
【０２３６】
なお、図２０では、５ビットの準浮動小数点量子化値と、９ビットの固定小数点量子化値とともに、その固定小数点量子化値が表す１０進数の数値も、図２０の左から３番目（一番右）の欄に示してある。
【０２３７】
また、図１８の変換回路２３２も、上述した図１８の変換回路２３１と同一の表示形式の変換（準浮動小数点量子化値から固定小数点量子化値への変換）を行う。
【０２３８】
次に、図２１を参照して、図１８の変換回路２３１が行う表現形式の変換の処理について説明する。
【０２３９】
変換回路２３１は、５ビットの準浮動小数点量子化値が入力されると、その準浮動小数点量子化値の上位３ビットである準指数部eに基づき、９ビットのビット列に対して、準浮動小数点量子化値の下位２ビットである準仮数部fを挿入する位置（準仮数部fに置換するビット）を決定し、その位置に、準仮数部fを挿入した９ビットのビット列を、９ビットの固定小数点量子化値として出力する。
【０２４０】
即ち、変換回路２３１は、図２１に示すように、準指数部eとしての３ビットで表される値０００，００１，０１０，０１１，１００，１０１，１１０，１１１に対して、２ビットｘｙが未定の９ビットのビット列０００００００ｘｙ，００００００１ｘｙ，０００００１ｘｙ０，００００１ｘｙ００，０００１ｘｙ０００，００１ｘｙ００００，０１ｘｙ０００００，１ｘｙ００００００を対応付けて記憶している。
【０２４１】
そして、準浮動小数点量子化値の下位２ビットである準仮数部fの左から１番目のビットと２番目のビットを、それぞれ、ｘとｙと表すこととすると、変換回路２３１は、５ビットの準浮動小数点量子化値の上位３ビットである準指数部eに対応付けられている９ビットのビット列を選択し、その９ビットのビット列の未定の２ビットｘｙに対して、準仮数部fの左から１番目のビットｘと２番目のビットｙをセットすることにより、９ビットのビット列を得て、その９ビットのビット列を、９ビットの固定小数点量子化値として出力する。
【０２４２】
従って、変換回路２３１に対して、例えば、５ビットの準浮動小数点量子化値１０００１が入力された場合、その上位３ビットである準指数部eは１００であるから、変換回路２３１は、１００に対応付けられている９ビットのビット列０００１ｘｙ０００を選択する。
【０２４３】
そして、５ビットの準浮動小数点量子化値１０００１の下位２ビットである準仮数部fは０１であるから、変換回路２３１は、選択した９ビットのビット列０００１ｘｙ０００の未定の２ビットｘｙに対して、準仮数部fである０１の左から１番目のビット０と２番目のビット１をセットすることにより、９ビットのビット列０００１０１０００を得て、９ビットの固定小数点量子化値として出力する。
【０２４４】
なお、５ビットの準浮動小数点量子化値の最小の量子化幅と、９ビットの固定小数点量子化値の量子化幅とが同一であれば、図２１で説明したように、変換回路２３１において、浮動小数点量子化値の準仮数部f（であるビット列）をそのまま使用して、その準浮動小数点量子化値を固定小数点量子化値に変換することができるので、変換回路２３１は比較的簡単に構成することができ、従って、その回路規模もそれほど大きくはならない。
【０２４５】
次に、図２２を参照して、図１８の変換回路２３３についてさらに説明する。
【０２４６】
図２２は、変換回路２３３に入力される（与えられる）９ビットの固定小数点量子化値と、変換回路２３３が出力する５ビットの準浮動小数点量子化値との関係を示している。
【０２４７】
変換回路２３３は、上述したように、演算回路１１２６（図１８）から供給される９ビットの高精度量子化値でもある固定小数点量子化値を、５ビットの準浮動小数点量子化値に変換する、数値の表現形式の変換を行う。
【０２４８】
即ち、変換回路２３３は、図２２左の表に示す９ビットの固定小数点量子化値を、図２２右の表に示す５ビットの準浮動小数点量子化値に変換して出力する。
【０２４９】
ここで、図２２左の表には、９ビットの固定小数点量子化値を、その固定小数点量子化値が表す１０進数の数値とともに示してある。
【０２５０】
また、図２２右の表は、図２０と同一であり、従って、５ビットの準浮動小数点量子化値と、９ビットの固定小数点量子化値との対応関係を示している。
【０２５１】
変換回路２３３は、図２２左の表に示す９ビットの固定小数点量子化値の入力に対して、その固定小数点量子化値が表す１０進数に近い１０進数、即ち、例えば、図２２左の表に示す９ビットの固定小数点量子化値が表す１０進数以下の最大の１０進数を表す図２２右の表の固定小数点量子化値に対応する５ビットの準浮動小数点量子化値を出力する。
【０２５２】
具体的には、変換回路２３３は、図２２左の表に示す９ビットの固定小数点量子化値の入力に対して、その９ビットの固定小数点量子化値の上位６ビットが０である場合には、図２２右の表において、その９ビットの固定小数点量子化値に対応する５ビットの準浮動小数点量子化値を出力する。
【０２５３】
また、変換回路２３３は、図２２左の表に示す９ビットの固定小数点量子化値の入力に対して、その９ビットの固定小数点量子化値の上位５ビットが０であり、上位６ビット目（最上位ビットから６ビット目）が１である場合には、図２２右の表において、その９ビットの固定小数点量子化値の下位１ビット（最下位ビット）を０に切り捨てた固定小数点量子化値に対応する５ビットの準浮動小数点量子化値を出力する。
【０２５４】
さらに、変換回路２３３は、図２２左の表に示す９ビットの固定小数点量子化値の入力に対して、その９ビットの固定小数点量子化値の上位４ビットが０であり、上位５ビット目が１である場合には、図２２右の表において、その９ビットの固定小数点量子化値の下位２ビットを０に切り捨てた固定小数点量子化値に対応する５ビットの準浮動小数点量子化値を出力する。
【０２５５】
また、変換回路２３３は、図２２左の表に示す９ビットの固定小数点量子化値の入力に対して、その９ビットの固定小数点量子化値の上位３ビットが０であり、上位４ビット目が１である場合には、図２２右の表において、その９ビットの固定小数点量子化値の下位３ビットを０に切り捨てた固定小数点量子化値に対応する５ビットの準浮動小数点量子化値を出力する。
【０２５６】
変換回路２３３は、上位２ビットが０で、上位３ビット目が１の固定小数点量子化値や、上位１ビットが０で、上位２ビット目が１の固定小数点量子化値の入力に対しても、上述の場合と同様の５ビットの準浮動小数点量子化値を出力する。
【０２５７】
そして、変換回路２３３は、上位１ビット（最上位ビット）が１の固定小数点量子化値の入力に対して、図２２右の表において、その９ビットの固定小数点量子化値の下位６ビットを０に切り捨てた固定小数点量子化値に対応する５ビットの準浮動小数点量子化値を出力する。
【０２５８】
次に、図２３を参照して、図１８の変換回路２３３が行う表現形式の変換の処理について説明する。
【０２５９】
変換回路２３３は、９ビットの固定小数点量子化値が入力されると、その９ビットの固定小数点量子化値の、最も上位ビット側にある１の位置を検出し、その位置に基づき、３ビットの準指数部eと、２ビットの準仮数部fとを求めて、その３ビットの準指数部eと、２ビットの準仮数部fとを、最上位ビット側から順次並べた５ビットのビット列を、５ビットの準浮動小数点量子化値として出力する。
【０２６０】
即ち、９ビットの固定小数点量子化値をINと表し、さらに、９ビットの固定小数点量子化値INの最下位ビットから数えてa+1ビット目を、IN[a]と表す。但し、ここでは、a=0,1,・・・,8である。さらに、９ビットの固定小数点量子化値INの最下位ビットから数えてa+1ビット目からb+1ビット目までのビット列を、IN[a:b]と表す。但し、ここでは、b=0,1,・・・,8であり、また、a>bであるとする。
【０２６１】
変換回路２３３は、図２３に示すように、９ビットの固定小数点量子化値INのうちのビットIN[8]（最上位ビット）が、1になっている場合、指数部eを１１１とするとともに、９ビットの固定小数点量子化値INのうちのIN[7:6]の２ビットを仮数部fとする。
【０２６２】
また、変換回路２３３は、９ビットの固定小数点量子化値INのうちのビットIN[8]が０で、ビットIN[7]が1になっている場合、指数部eを１１０とするとともに、９ビットの固定小数点量子化値INのうちのIN[6:5]の２ビットを仮数部fとする。
【０２６３】
さらに、変換回路２３３は、９ビットの固定小数点量子化値INのうちの２ビットIN[8:7]が０で、ビットIN[6]が1になっている場合、指数部eを１０１とするとともに、９ビットの固定小数点量子化値INのうちのIN[5:4]の２ビットを仮数部fとする。
【０２６４】
また、変換回路２３３は、９ビットの固定小数点量子化値INのうちの３ビットIN[8:６]が０で、ビットIN[5]が1になっている場合、指数部eを１００とするとともに、９ビットの固定小数点量子化値INのうちのIN[4:3]の２ビットを仮数部fとする。
【０２６５】
さらに、変換回路２３３は、９ビットの固定小数点量子化値INのうちの４ビットIN[8:5]が０で、ビットIN[4]が1になっている場合、指数部eを０１１とするとともに、９ビットの固定小数点量子化値INのうちのIN[3:2]の２ビットを仮数部fとする。
【０２６６】
また、変換回路２３３は、９ビットの固定小数点量子化値INのうちの５ビットIN[8:4]が０で、ビットIN[3]が1になっている場合、指数部eを０１０とするとともに、９ビットの固定小数点量子化値INのうちのIN[2:1]の２ビットを仮数部fとする。
【０２６７】
さらに、変換回路２３３は、９ビットの固定小数点量子化値INのうちの６ビットIN[8:3]が０で、ビットIN[2]が1になっている場合、指数部eを００１とするとともに、９ビットの固定小数点量子化値INのうちのIN[1:0]の２ビットを仮数部fとする。
【０２６８】
また、変換回路２３３は、９ビットの固定小数点量子化値INのうちの７ビットIN[8:2]が０になっている場合、指数部eを０００とするとともに、９ビットの固定小数点量子化値INのうちのIN[1:0]の２ビットを仮数部fとする。
【０２６９】
そして、変換回路２３３は、準指数部eを上位３ビットとするとともに、準仮数部fを下位２ビットとする５ビットのビット列を、５ビットの準浮動小数点量子化値として出力する。
【０２７０】
従って、変換回路２３３に対して、例えば、９ビットの固定小数点量子化値００００１１０００が入力された場合、その９ビットの固定小数点量子化値INについては、その４ビットIN[8:5]が０で、ビットIN[4]が1になっているので、変換回路２３３は、指数部eを０１１とするとともに、９ビットの固定小数点量子化値INのうちのIN[3:2]の２ビット１０を仮数部fとする。そして、変換回路２３３は、準指数部eである０１１を上位３ビットとするとともに、準仮数部fである１０を下位２ビットとする５ビットのビット列０１１１０を、５ビットの準浮動小数点量子化値として出力する。
【０２７１】
なお、５ビットの準浮動小数点量子化値の最小の量子化幅と、９ビットの固定小数点量子化値の量子化幅とが同一であれば、図２３で説明したように、変換回路２３３において、固定小数点量子化値の一部のビット列をそのまま準仮数部fに使用して、その固定小数点量子化値を準浮動小数点量子化値に変換することができるので、変換回路２３３は比較的簡単に構成することができ、従って、その回路規模もそれほど大きくはならない。
【０２７２】
次に、図２４を参照して、図１８のLUT２２８についてさらに説明する。
【０２７３】
LUT２２１には、図２４右の表に示す５ビットの準浮動小数点量子化値が供給される。ここで、図２４右の表には、５ビットの準浮動小数点量子化値としてのビット列とともに、その準浮動小数点量子化値に対応する固定小数点量子化値としての９ビットと、その９ビットが表す１０進数の数値も示してある。
【０２７４】
LUT２２１は、５ビットの準浮動小数点量子化値に対して、その準浮動小数点量子化値が表す数値yを入力として式（７）における逆関数φ-1（Σφ(|vi|)）の演算を行った結果得られる数値φ-1(y)を表す５ビットの固定小数点量子化値を出力する。
【０２７５】
即ち、図２４左の表は、LUT２２８が出力する５ビットの固定小数点量子化値を示している。なお、図２４左の表では、５ビットの固定小数点量子化値としてのビット列とともに、そのビット列が表す１０進数の数値も示してある。
【０２７６】
図１９で説明したように、５ビットの固定小数点量子化値が表す１０進数の数値の範囲は、０乃至３１であるのに対して、５ビットの準浮動小数点量子化値（に対応する９ビットの固定小数点量子化値）が表す１０進数の数値の範囲は、０乃至４４８である。また、９ビットの固定小数点量子化値が表す１０進数の範囲は、０乃至５１１である。従って、５ビットの準浮動小数点量子化値は、５ビットの固定小数点量子化値よりも広い、９ビットの固定小数点量子化値と同程度のダイナミックレンジの数値を表すことができる。
【０２７７】
さらに、本実施の形態では、上述したように、５ビットの準浮動小数点量子化値の最小の量子化幅が、例えば、９ビットの固定小数点量子化値でもある高精度量子化値の量子化幅以下になっており、従って、５ビットの準浮動小数点量子化値によれば、９ビットの高精度量子化値と同様に、引数yが数値0付近である場合に急峻に変化する逆関数φ-1(y)の引数yとして、0付近の数値を精度良く表すことができる。
【０２７８】
即ち、５ビットの準浮動小数点量子化値によれば、５ビットの固定小数点量子化値（通常量子化値）よりも広い、９ビットの固定小数点量子化値（高精度量子化値）と同程度のダイナミックレンジの数値を表すことができ、かつ、９ビットの固定小数点量子化値（高精度量子化値）と同様に（あるいは、それ以上に）、0付近の数値を精度良く表すことができる。
【０２７９】
以上のように、LUT２２１は、ある程度の大きな数値以上の引数xに対して0付近の値となる非線形関数φ(x)の演算結果として、0付近の数値を精度良く表す５ビットの準浮動小数点量子化値を出力する。
【０２８０】
さらに、LUT２２８は、逆関数φ-1（Σφ(|vi|)）の引数となる積算値Σφ(|vi|)として入力される、0付近の数値を精度良く表す５ビットの浮動小数点量子化値に対して、逆関数φ-1（Σφ(|vi|)）の演算結果を、５ビットの通常量子化値でもある固定小数点量子化値で出力する。
【０２８１】
従って、５ビットの準浮動小数点量子化値によれば、ある程度の大きな数値以上の引数xに対する非線形関数φ(x)の演算結果である0付近の数値を精度良く表すことができ、かつ、逆関数φ-1（Σφ(|vi|)）の引数となる積算値Σφ(|vi|)が、0付近の数値であっても、その数値を精度良く表すことができるので、積算値Σφ(|vi|)が数値0付近の値である場合であっても、その積算値Σφ(|vi|)が僅かに異なるごとに応じて異なる、精度の良い逆関数φ-1（Σφ(|vi|)）の演算結果が得られることになる。そして、その結果、LDPC符号の復号を精度良く行うことができる。
【０２８２】
さらに、LUT２２１およびLUT２２８については、その入力と出力のいずれも５ビットとなるので、必要な容量は、25×5ビットとなる。従って、LUT２２１に必要とされる、回路規模に比例する容量は、対応する図１４のLUT１１２１の容量（25×9ビット）の５／９で済む。また、LUT２２８に必要とされる、回路規模に比例する容量は、対応する図１４のLUT１１２８の容量（29×5ビット）の１／２4で済む。
【０２８３】
従って、LUT２２１およびLUT２２８を小型に構成することができ、その結果、チェックノード計算器１８１（図１８）、ひいては、図１７の復号装置の大規模化を抑制することができる。
【０２８４】
次に、図２５のフローチャートを参照して、図１８のチェックノード計算器１８１の処理について説明する。
【０２８５】
チェックノード計算器１８１では、検査行列Hの各列に対応するバリアブルノードからの６ビットのメッセージD101（バリアブルノードメッセージvi）が、枝用メモリ１００（図１７）から１つずつ読み込まれ、その下位５ビットである絶対値D122(|vi|)がLUT２２１に、その最上位ビットである符号ビットD121がEXOR回路１２９とFIFOメモリ１３３にそれぞれ供給される。また、チェックノード計算器１８１には、制御部１０５（図１７）から制御信号D106が供給され、その制御信号D106は、セレクタ１１２４とセレクタ１３１に供給される。
【０２８６】
LUT２２１は、ステップＳ２１において、そこに供給される５ビットの絶対値D122(|vi|)を入力として、その５ビットの絶対値D122(|vi|)に一致する５ビットの通常量子化値でもある固定小数点量子化値（図１９左の表）に対応付けられている、非線形関数φ(|vi|)の演算結果を表す９ビットの準浮動小数点量子化値F1123を読み出し、変換回路２３１とFIFOメモリ１１２７に出力する。
【０２８７】
即ち、LUT２２１では、ステップＳ２１において、等価的に、固定小数点量子化値で表される絶対値D122(|vi|)を入力として、式（７）における非線形関数φ(|vi|)を演算する処理と、その演算結果を表す固定小数点量子化値を準浮動小数点量子化値に変換する、表現形式の変換とが行われる。
【０２８８】
変換回路２３１は、ステップＳ２２において、LUT２２１からの非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値F1123を、図２０で説明したように、９ビットの高精度量子化値でもある固定小数点量子化値に変換する、表示形式の変換を行い、その結果得られる９ビットの固定小数点量子化値D1123を、演算器１１２２に出力する。
【０２８９】
その後、ステップＳ２３において、演算器１１２２は、９ビットの固定小数点量子化値が表す非線形関数の演算結果D1123（φ(|vi|)）とレジスタ１１２３に格納されている１３ビットの値D1124とを加算することにより、演算結果D1123を積算し、その結果得られる１３ビットの積算値をレジスタ１１２３に再格納する。なお、検査行列Hの1行に亘る全ての枝からのメッセージD101の絶対値D122(|vi|)に対する演算結果が積算された場合、レジスタ１１２３はリセットされる。
【０２９０】
ここで、演算器１１２２およびレジスタ１１２３では、変換回路２３１から供給される９ビットの固定小数点量子化値が表す演算結果D1123（φ(|vi|)）が、最大で、FIFOメモリ１１２７における最大の遅延回数分、即ち、検査行列Hの行の最大の重み分の回数だけ積算される。いま、図９の検査行列Hの行の最大の重みは９であり、従って、演算器１１２２およびレジスタ１１２３では、９ビットの固定小数点量子化値が、最大で、９回積算される（９ビットの固定小数点量子化値の９個分の積算が行われる）。このため、演算器１１２２の出力以降においては、９ビットの固定小数点量子化値を９回積算した値を表すことができるように、接続線のビット数は、LUT２２１が出力する９ビットの固定小数点量子化値D1123よりも４ビット（９（回）を表すことができる最小のビット数）だけ多い１３ビットになっている。
【０２９１】
検査行列Hの1行に亘るメッセージD101（バリアブルノードメッセージvi）が枝用メモリ１００（図１７から）１つずつ読み込まれ、レジスタ１１２３に1行分の演算結果D1123が積算された積算値が格納された場合、制御部１０５から供給される制御信号D106は、０から１に変化する。例えば、検査行列Hの行の重み（row weight）が「９」である場合、制御信号D106は、１から８クロック目までは、「０」となり、９クロック目では「１」となる。
【０２９２】
制御信号D106が「１」の場合、セレクタ１１２４は、ステップＳ２４において、レジスタ１１２３に格納されている値、即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算された１３ビットの積算値D1124（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）を選択し、１３ビットの値D1125として、レジスタ１１２５に出力して格納させる。レジスタ１１２５は、格納している値D1125を、１３ビットの値D1126として、セレクタ１１２４と演算器１１２６に供給する。制御信号D106が「０」の場合、セレクタ１１２４は、レジスタ１１２５から供給された値D1126を選択し、レジスタ１１２５に出力して再格納させる。即ち、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１１２５は、前回積算されたφ(|vi|)を、セレクタ１１２４と演算器１１２６に供給する。
【０２９３】
一方、FIFOメモリ１１２７は、レジスタ１１２５から新たな値D1126（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）が出力されるまでの間、LUT２２１が出力した非線形関数の演算結果D1123（φ(|vi|)）を表す５ビットの準浮動小数点量子化値を遅延し、レジスタ１１２５から新たな値D1126（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）が出力されると、遅延後の５ビットの準浮動小数点量子化値F1127を、変換回路２３２に供給する。
【０２９４】
変換回路２３２は、変換回路２３１と同様に、FIFO１１２７からの、非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値F1127を、９ビットの高精度量子化値でもある固定小数点量子化値に変換する、表示形式の変換を行い、その結果得られる９ビットの固定小数点量子化値D1127を、演算器１１２６に供給する。
【０２９５】
演算器１１２６は、ステップＳ２５において、レジスタ１１２５から供給された１３ビットの値D1126から、FIFOメモリ１１２７から出力されて変換回路２３２で表現形式か変換された９ビットの値D1127を減算し（レジスタ１１２５から供給された１３ビットの値D1126に、９ビットの値D1127に-1を乗算して得られる値を積算し）、その減算結果を表す９ビットの高精度量子化値でもある固定小数点量子化値D1128を、変換回路２３３に供給する。
【０２９６】
即ち、演算器１１２６は、検査行列Hの1行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)の積算値から、チェックノードメッセージujを求めたい枝からのメッセージD101（バリアブルノードメッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を表す９ビットの固定小数点量子化値D1128を、変換回路２３３に供給する。
【０２９７】
なお、レジスタ１１２５から供給される１３ビットの値D1126から、FIFOメモリ１１２７から供給される９ビットの値D1127を減算した減算結果としての量子化値が、９ビットの固定小数点量子化値D1128で表すことができる最大値を越える場合には、演算器１１２６は、減算結果を、９ビットの固定小数点量子化値で表すことができる最大値にクリッピングして出力する。
【０２９８】
変換回路２３３は、ステップＳ２６において、演算器１１２６からの９ビットの固定小数点量子化値D1128を、図２２で説明したように、５ビットの準浮動小数点量子化値に変換する、表示形式の変換を行い、その結果得られる５ビットの準浮動小数点量子化値F1128を、LUT２２８に供給する。
【０２９９】
LUT２２８は、ステップＳ２７において、変換回路２３３から供給される、式（７）の積算値Σφ(|vi|)を表す５ビットの準浮動小数点量子化値F1128を入力として、その準浮動小数点量子化値F1128に対応付けられている、逆関数φ-1（Σφ(|vi|)）の演算結果を表す５ビットの通常量子化値でもある固定小数点量子化値D1129（φ-1(Σφ(|vi|)))を読み出して出力する。
【０３００】
即ち、LUT２２８では、ステップＳ２７において、等価的に、準浮動小数点量子化値で表される式（７）の積算値Σφ(|vi|)を入力として、式（７）における逆関数φ-1(φ(|vi|))を演算する処理と、その演算結果を表す浮動小数点量子化値を固定小数点量子化値に変換する、表現形式の変換とが行われる。
【０３０１】
以上の処理と並行して、EXOR回路１２９、レジスタ１３０、セレクタ１３１、レジスタ１３２、FIFOメモリ１３３、EXOR回路１３４では、図１１のチェックノード計算器１０１と同様の処理が行われ、これにより、EXOR回路１３４は、検査行列Hの１行に亘る全ての枝からのメッセージD101（バリアブルノードメッセージvi）の符号ビットD121（sign(|vi|)）の乗算値を、チェックノードメッセージujを求めたい枝からのメッセージD101の符号ビットD121（sign(|vi|)）で除算して、その除算値（ｉ＝１からｉ＝ｄc−１までのΠsign(|vi|)）を除算値D135として出力する。
【０３０２】
そして、チェックノード計算器１８１では、LUT２２８から出力された５ビットの固定小数点量子化値D1129を下位５ビットとするとともに、EXOR回路１３４から出力された１ビットの除算値D135を最上位ビット（符号ビット）とする合計６ビットの通常量子化値でもある固定小数点量子化値で表されるメッセージD102（チェックノードメッセージuj）が出力される。
【０３０３】
以上のように、チェックノード計算器１８１では、図１４のチェックノード計算器１７１と同様に、非線形関数φ(x)の演算後からその逆関数φ-1(x)の演算までの処理では、高精度量子化値でもある９ビットの固定小数点量子化値、または、その９ビットの固定小数点量子化値と同程度の精度で0付近の数値を表し、かつ、同程度のダイナミックレンジを有する５ビットの準浮動小数点量子化値を使用し、他の処理では、通常量子化値でもある固定小数点量子化値を使用するので、LDPC符号の復号を、復号装置の大規模化を抑えつつ（図１７の枝用メモリ１００と１０２、受信用メモリ１０４の容量を増加させずに）精度良く行うことができる。
【０３０４】
さらに、チェックノード計算器１８１では、LUT２２１において、５ビットの固定小数点量子化値を入力として、非線形関数φ(x)の演算の結果を、５ビットの準浮動小数点量子化値で出力し、かつ、LUT２２８において、５ビットの準浮動小数点量子化値を入力として、逆関数φ-1(x)の演算の結果を、５ビットの固定小数点量子化値で出力するので、かかる点からも、LDPC符号の復号を、復号装置の大規模化を抑えつつ（容量の小さいLUT２２１および２２８を用いて）精度良く行うことができる。
【０３０５】
なお、チェックノード計算器１８１においては、図１４のチェックノード計算器１７１と比較して、変換回路２３１乃至２３３が新たに必要となる。但し、準浮動小数点量子化値の量子化幅の最小値が、高精度量子化値でもある固定小数点量子化値の量子化幅と同程度であれば、変換回路２３１乃至２３３は、上述したように簡単に構成することができ、変換回路２３１乃至２３３を新たに設けることによる回路規模の増分は、それほど大きくはない。
【０３０６】
一方、上述したように、LUT２２１に必要とされる、回路規模に比例する容量は、対応する図１４のLUT１１２１の５／９で済み、LUT２２８に必要とされる、回路規模に比例する容量は、対応する図１４のLUT１１２８の１／２4で済むため、LUT２２１およびLUT２２８を採用することによる回路規模の削減量は、極めて大きい。
【０３０７】
従って、LUT２２１およびLUT２２８を採用した場合には、変換回路２３１乃至２３３を新たに設けることによる回路規模の増分を加味しても、チェックノード計算器１８１の回路規模を削減することができる。
【０３０８】
次に、図２６は、本発明を適用した、LDPC符号を復号する復号装置の第２実施の形態の構成例を示している。
【０３０９】
図２６の復号装置は、LDPC符号の復号を、復号装置の大規模化を抑えつつ精度良く行い、さらに、図１７の復号装置よりも、復号装置に必要となるメモリの記憶容量を低減することができるようになっている。
【０３１０】
なお、図２６の復号装置では、例えば、上述の図１７の復号装置と同様に、前述の図９に示した検査行列Hで表されるLDPC符号（符号化率2/3、符号長108）の復号が行われる。
【０３１１】
図２６において、復号装置は、復号途中結果格納用メモリ４１０、スイッチ４１１、準チェックノード計算器４１２、枝用メモリ４１３、準バリアブルノード計算器４１５、受信用メモリ４１６、および制御部４１７から構成され、図１７の復号装置と同様のチェックノード演算とバリアブルノード演算とを等価的に繰り返し行うことにより、LDPC符号を復号する。
【０３１２】
ここで、図２６の復号装置の各部について説明する前に、上述の図１８と、図２７乃至図２９を用いて、図２６の準チェックノード計算器４１２および準バリアブルノード計算器４１５と、図１７のチェックノード計算器１８１およびバリアブルノード計算器１０３との関係について説明する。
【０３１３】
図１８は、上述したように、チェックノード演算を行う図１７のチェックノード計算器１８１の構成例を示している。
【０３１４】
図２７は、バリアブルノード演算を行う図１７のバリアブルノード計算器１０３の構成例を示している。なお、図１７のバリアブルノード計算器１０３は、図１０のバリアブルノード計算器１０３と同一であり、従って、図２７に示した図１７のバリアブルノード計算器１０３は、図１２に示した図１０のバリアブルノード計算器１０３と同一構成となっている。
【０３１５】
但し、図２７では、図１２の演算器１５６を、２つの演算器１５６1と１５６2に分けて図示してある。即ち、図１２の演算器１５６は、前述したように、レジスタ１５４から供給された値D152から、FIFOメモリ１５５から供給された値D153を減算し、さらに、その減算値に、受信用メモリ１０４から供給された受信データD104を加算して、その結果得られる６ビットの値をメッセージD105（バリアブルノードメッセージvi）として出力するから、演算器１５６が行う処理は、レジスタ１５４から供給された値D152を対象に、FIFOメモリ１５５から供給された値D153を減算する減算処理と、受信用メモリ１０４から供給された受信データD104を加算する加算処理とに分けることができる。
【０３１６】
そこで、図２７では、図１２の演算器１５６を、加算処理を行う演算器１５６1と、減算処理を行う演算器１５６2とに分けて図示してある。
【０３１７】
一方、図２８は、図２６の準チェックノード計算器４１２の構成例を示しており、図２９は、図２６の準バリアブルノード計算器４１５の構成例を示している。
【０３１８】
図２６の復号装置では、準チェックノード計算器４１２がチェックノード演算そのものを行うとともに、準バリアブルノード計算器４１５kがバリアブルノード演算そのものを行うのではなく、準チェックノード計算器４１２がチェックノード演算とバリアブルノード演算の一部を行い、準バリアブルノード計算器４１５がバリアブルノード演算の他の一部を行う。
【０３１９】
即ち、図２８の準チェックノード計算器４１２は、ブロックＡ'とブロックＢ'から構成されている。ブロックＡ’は、図１８のチェックノード計算器１８１のチェックノード演算を行うブロックＡに対応している。また、ブロックＢ’は、図２７のバリアブルノード計算器１０３の一部である、検査行列Hの各列の全ての枝に対応するチェックノードメッセージujの積算値から、バリアブルノードメッセージviを求めたい枝に対応するチェックノードメッセージujを減算するブロックＢに対応している。
【０３２０】
一方、図２９の準バリアブルノード計算器４１５は、ブロックＣ'から構成されている。ブロックＣ'は、図２７のバリアブルノード計算器１０３の他の一部である、検査行列Hの各列の枝に対応するチェックノードメッセージujを積算し、その積算値に受信データu0iを加算するブロックＣに対応している。
【０３２１】
つまり、図１７のチェックノード計算器１８１は、図１８に示すように、チェックノード演算そのものを行うブロックＡで構成される。また、図１７のバリアブルノード計算器１０３は、図２７に示すように、検査行列Hの各列の全ての枝に対応するチェックノードメッセージujの積算値から、バリアブルノードメッセージviを求めたい枝に対応するチェックノードメッセージujを減算する、バリアブルノード演算の一部を行うブロックＢと、検査行列Hの各列の枝に対応するチェックノードメッセージujを積算し、その積算値に受信データu0iを加算する、バリアブルノード演算の他の一部を行うブロックＣとに分けることができる。
【０３２２】
図２８の準チェックノード計算器４１２は、図１８のブロックＡに対応するブロックＡ'と、図２７のブロックＢに対応するブロックＢ'から構成され、ブロックＢ’において、バリアブルノード演算の一部を行うとともに、ブロックＡにおいて、チェックノード演算そのものを行う。ここで、準チェックノード計算器４１２で行われる、バリアブルノード演算の一部とチェックノード演算を、以下、適宜、準チェックノード演算という。
【０３２３】
一方、図２９の準バリアブルノード計算器４１５は、図２７のブロックＣに対応するブロックＣ’で構成され、ブロックＣ’において、バリアブルノード演算の他の一部を行う。ここで、準バリアブルノード計算器４１５で行われる、バリアブルノード演算の他の一部を、以下、適宜、準バリアブルノード演算という。
【０３２４】
図２６の復号装置では、準チェックノード計算器４１２が、復号途中結果格納用メモリ４１０の記憶内容等を用いて、準チェックノード演算（バリアブルノード演算の一部とチェックノード演算）を行い、その結果得られるチェックノードメッセージujを、枝用メモリ４１３に供給して記憶させる。さらに、準バリアブルノード計算器４１５が、枝用メモリ４１３に記憶されたチェックノードメッセージuj等を用いて、準バリアブルノード演算（バリアブルノード演算の他の一部）を行い、その結果得られる復号途中結果vを、復号途中結果格納用メモリ４１０に供給して記憶させる。
【０３２５】
従って、図２６の復号装置では、準チェックノード計算器４１２による準チェックノード演算と、準バリアブルノード計算器４１５による準バリアブルノード演算とが交互に行われることにより、結局、チェックノード演算とバリアブルノード演算とが交互に行われ、これにより、LDPC符号の復号が行われる。
【０３２６】
なお、図２７のバリアブルノード計算器１０３では、ブロックＣにおいて、検査行列Hの各列の枝に対応するチェックノードメッセージujを積算し、その積算値に受信データu0iを加算する加算処理を行い、ブロックＢにおいて、その加算処理の結果得られる値（検査行列Hの各列の全ての枝に対応するチェックノードメッセージujの積算値と、受信データu0iとの加算値）からバリアブルノードメッセージviを、求めたい枝からのチェックノードメッセージujを減算する減算処理を行うために、バリアブルノードメッセージviを求めたい枝からのチェックノードメッセージujを、検査行列Hの各列の枝に対応するチェックノードメッセージujの積算が終了するまで遅延するFIFOメモリ１５５が必要となる。
【０３２７】
一方、図２８の準チェックノード計算器４１２のブロックＢ’では、対応するブロックＢ（図２７）と同様に、検査行列Hの各列の全ての枝に対応するチェックノードメッセージujの積算値から、バリアブルノードメッセージviを求めたい枝からのチェックノードメッセージujを減算する減算処理が行われるが、図２６の復号装置では、チェックノードメッセージujが枝用メモリ４１３に記憶されており、その枝用メモリ４１３から、準チェックノード計算器４１２に対して、バリアブルノードメッセージviを求めたい枝からのチェックノードメッセージuj（メッセージD411）が供給されるようになっている。
【０３２８】
従って、図２６の復号装置では、バリアブルノードメッセージviを求めたい枝からのチェックノードメッセージujを、検査行列Hの各列の枝に対応するチェックノードメッセージujの積算が終了するまで遅延するFIFOメモリ１５５（図２７）が必要ない。よって、図２６の復号装置は、FIFOメモリ１５５の分だけ、図１７の復号装置よりも小型に構成することができる。
【０３２９】
次に、図２６の準チェックノード計算器４１２（図２８）で行われる準チェックノード演算と、準バリアブルノード計算器４１５（図２９）で行われる準バリアブルノード演算について、式を用いて説明する。
【０３３０】
準チェックノード計算器４１２は、次の式（８）の演算（バリアブルノード演算の一部）と、上述した式（７）の演算（チェックノード演算）とを、準チェックノード演算として行い、その準チェックノード演算の結果であるチェックノードメッセージujを、枝用メモリ４１３に供給して格納（記憶）させる。また、準バリアブルノード計算器４１５は、上述した式（５）の演算（バリアブルノード演算の他の一部）を、準バリアブルノード演算として行い、その準バリアブルノード演算の結果である復号途中結果vを、復号途中結果格納用メモリ４１０に供給して格納させる。
【０３３１】
【数８】
2007081601.tif 000010
・・・（８）
【０３３２】
なお、式（８）のudvは、バリアブルノード演算によって、検査行列Hのｉ列のバリアブルノードメッセージviを求めようとする枝からのチェックノード演算（準チェックノード演算）の結果を表している。即ち、udvは、バリアブルノード演算によってバリアブルノードメッセージviを求めたい枝に対応するチェックノードメッセージuj（枝からのチェックノードメッセージuj）である。
【０３３３】
ここで、上述した式（５）の演算の結果得られる復号途中結果vは、受信データu0iと検査行列Hのｉ列の各行の１に対応するすべての枝からのチェックノード演算の結果得られたチェックノードメッセージujとを加算したものであるので、式（８）にしたがい、そのような復号途中結果vから、検査行列Hのｉ列の、各行の１に対応する枝からのチェックノード演算によって求められたチェックノードメッセージujのうち、バリアブルノードメッセージviを求めようとする枝からのチェックノードメッセージudvを減算することにより、各枝のバリアブルノードメッセージviを求めることができる。
【０３３４】
従って、バリアブルノードメッセージviを求める式（１）のバリアブルノード演算は、式（５）の演算と、式（８）の演算とに分けることができる。
【０３３５】
一方、チェックノードメッセージujを求めるチェックノード演算は、式（７）で表される。
【０３３６】
従って、式（１）のバリアブルノード演算と、式（７）のチェックノード演算との処理は、式（５）の演算と、式（８）および式（７）の演算との処理に等価である。
【０３３７】
そこで、図２６の復号装置では、準チェックノード計算器４１２において、式（８）および式（７）の演算（準チェックノード演算）を行うとともに、準バリアブルノード計算器４１５において、式（５）の演算（準バリアブルノード演算）を行い、LDPC符号の復号が行われる。
【０３３８】
なお、式（５）の準バリアブルノード演算によって求められる復号途中結果vは、式（１）のバリアブルノード演算の結果得られる各枝のバリアブルノードメッセージviに対して、そのバリアブルノードメッセージviに対応する枝からのチェックノードメッセージujを加算したものであるから、検査行列Hの1列（１つのバリアブルノード）に対して、１つだけ求められる。従って、符号長分の受信データu0iに対しては、符号長分（検査行列Ｈの列数）の復号途中結果vが求められる。
【０３３９】
図２６の復号装置では、準チェックノード計算器４１２が、準バリアブルノード計算器４１５による準バリアブルノード演算の結果である検査行列Hの各列に対応する復号途中結果vを用いて、準チェックノード演算を行い、その準チェックノード演算の結果得られるチェックノードメッセージ（各チェックノードが各枝に出力するチェックノードメッセージ）ujを、枝用メモリ４１３に格納する。
【０３４０】
従って、枝用メモリ４１３に必要な記憶容量は、チェックノード演算の結果を格納する図１７の枝用メモリ１０２と同様に、検査行列Hの１の数（全枝数）とチェックノードメッセージujの量子化ビット数（本実施の形態では、固定小数点量子化値でもある通常量子化値のビット数）とを乗算した値となる。
【０３４１】
一方、準バリアブルノード計算器４１５は、準チェックノード計算器４１２による準チェックノード演算の結果である検査行列Hのｉ列の、各行の“１”に対応するチェックノードメッセージujと受信データu0iを用いて、準バリアブルノード演算を行い、その準バリアブルノード演算の結果得られるｉ列に対応する復号途中結果vを、復号途中結果格納用メモリ４１０に格納する。
【０３４２】
従って、復号途中結果格納用メモリ４１０に必要な記憶容量は、検査行列Hの“１”の数より少ない検査行列Ｈの列数、即ち、LDPC符号の符号長と、復号途中結果vの量子化ビット数（本実施の形態では、固定小数点量子化値でもある通常量子化値のビット数）とを乗算した値となる。
【０３４３】
以上から、検査行列Hにおける１が疎らなLDPC符号を復号する図２６の復号装置では、図１７の枝用メモリ１００に比べて、復号途中結果格納用メモリ４１０の記憶容量を削減することができ、これにより、図２６の復号装置の装置規模を小さくすることができる。
【０３４４】
さらに、図２６の復号装置において、準バリアブルノード計算器４１５が行う式（５）の準バリアブルノード演算は、チェックノード演算とバリアブルノード演算とを交互に繰り返すことにより、LDPC符号の繰り返し復号を行うにあたって、そのLDPC符号の最終的な復号結果を求める演算であり、従って、図２６の復号装置には、図１７の復号装置のように、LDPC符号の最終的な復号結果を求める式（５）の演算を行う不図示のブロックを設ける必要がない。従って、そのようなブロックが不要な分だけ、図１７の復号装置に比べて、図２６の復号装置の装置規模を小さくすることができる。
【０３４５】
次に、図２６の復号装置の各部について詳細に説明する。
【０３４６】
復号途中結果格納用メモリ４１０には、準バリアブルノード計算器４１５から、検査行列Hの列ごとの、式（５）の準バリアブルノード演算の結果得られる復号途中結果D415（式（５）のv）が供給され、復号途中結果格納用メモリ４１０は、準バリアブルノード計算器４１５から供給される復号途中結果D415を、順次記憶する。復号途中結果格納用メモリ４１０に記憶された、検査行列Hの列ごとの復号途中結果D415は、そこから順次読み出され、スイッチ４１１に供給される。
【０３４７】
スイッチ４１１には、復号途中結果格納用メモリ４１０から復号途中結果D415が供給される他、受信用メモリ４１６から、受信データD417（u0i）が供給される。スイッチ４１１は、制御部４１７から供給される制御信号D421にしたがって、復号途中結果格納用メモリ４１０から供給される復号途中結果D415、または受信用メモリ４１６から供給される受信データD417のうちのいずれか一方を選択し、復号途中結果D411として、準チェックノード計算器４１２に供給する。
【０３４８】
即ち、受信用メモリ４１６に、受信データD417が記憶された直後（受信データD417が記憶された後、その受信データD417を用いた最初の準バリアブルノード演算が行われる前）は、その受信データD417に対する復調途中結果D415が、復号途中結果格納用メモリ４１０に記憶されていないため、その復調途中結果D415を用いた準チェックノード演算を行うことができない。そこで、受信用メモリ４１６に、受信データD417が記憶された直後においては、制御部４１７は、受信データD417の選択を指示する制御信号D421を、スイッチ４１１に供給する。これにより、スイッチ４１１では、受信用メモリ４１６から供給される受信データD417が選択され、復号途中結果D411として、準チェックノード計算器４１２に供給される。従って、この場合、準チェックノード計算器４１２では、受信データD417を、式（８）の復号途中結果vとして用いて、準チェックノード演算が行われる。なお、準チェックノード演算には、枝用メモリ４１３に記憶されたチェックノードメッセージujが使用されるが、枝用メモリ４１３のチェックノードメッセージujは、新たな受信データD417が、受信用メモリ４１６に記憶されたときに、０に初期化される。
【０３４９】
一方、受信用メモリ４１６に、受信データD417が記憶され、その受信データD417を用いた最初の準バリアブルノード演算が行われた後（、その受信データD417に対する最終的な復号結果が出力されるまで）は、その受信データD417に対する復調途中結果D415が、復号途中結果格納用メモリ４１０に記憶されているので、制御部４１７は、復号途中結果D415の選択を指示する制御信号D421を、スイッチ４１１に供給する。これにより、スイッチ４１１では、復号途中結果格納用メモリ４１０から供給される復号途中結果D415が選択され、復号途中結果D411として、準チェックノード計算器４１２に供給される。従って、この場合、準チェックノード計算器４１２では、復号途中結果D415を、式（８）の復号途中結果vとして、準チェックノード演算が行われる。
【０３５０】
準チェックノード計算器４１２には、スイッチ４１１から、式（８）の復号途中結果vとしての復号途中結果D411が供給される他、枝用メモリ４１３から、準チェックノード計算器４１２による前回の準チェックノード演算の結果得られたチェックノードメッセージujが、メッセージD413として供給される。また、準チェックノード計算器４１２には、制御部４１７から制御信号D420が供給される。
【０３５１】
準チェックノード計算器４１２は、スイッチ４１１からの復号途中結果D411（式（８）のv）と、メッセージD413(前回のチェックノードメッセージuj)を用いて、準チェックノード演算を行い、即ち、式（８）の演算を行い、その後、さらに、式（７）の演算を行い、これにより、式（７）のチェックノードメッセージujを、検査行列Hの枝（値が１になっている要素）ごとに求める。そして、準チェックノード計算器４１２は、式（８）の準チェックノード演算の結果得られる、各枝のチェックノードメッセージujを、メッセージD412として、枝用メモリ４１３に供給する。
【０３５２】
枝用メモリ４１３は、準チェックノード計算器４１２から供給される各枝のメッセージD412を、順次記憶する。枝用メモリ４１３に記憶された各枝のメッセージD412(uj)は、次の準チェックノード演算と、次の準バリアブルノード演算のために、そこから順次読み出され、メッセージD413として、準チェックノード計算器４１２と、準バリアブルノード演算器４１５に供給される。
【０３５３】
準バリアブルノード計算器４１５には、枝用メモリ４１３から、各枝のメッセージD413(チェックノードメッセージuj)が供給される。また、準バリアブルノード計算器４１５には、受信用メモリ４１６からLDPC符号の受信データD417（式（５）のu0i）が供給される。さらに、準バリアブルノード計算器４１５には、制御部４１７から制御信号D422が供給される。
【０３５４】
準バリアブルノード計算器４１５は、枝用メモリ４１３から、各枝のメッセージD413(uj)と、受信用メモリ４１６からの受信データD417(u0i)とを用いて、式（５）の準バリアブルノード演算を、検査行列Hの列ごとに行い、これにより、復号途中結果vを、検査行列Hの列ごとに求める。そして、準バリアブルノード計算器４１５は、式（５）の準バリアブルノード演算の結果得られる復号途中結果vを、復号途中結果D415として、復号途中結果格納用メモリ４１０に供給する。
【０３５５】
ここで、上述したように、復号途中結果格納用メモリ４１０では、準バリアブルノード計算器４１５から供給される復号途中結果D415が、順次記憶され、さらに、その記憶された復号途中結果D415は、そこから順次読み出され、スイッチ４１１に供給される。
【０３５６】
但し、準バリアブルノード計算器４１５において、最後の準バリアブルノード演算が行われた場合、即ち、例えば、受信用メモリ４１６に記憶された受信データD417について、あらかじめ決められた回数だけ、準チェックノード演算と準バリアブルノード演算とが繰り返し行われた場合、復号途中結果格納用メモリ４１０は、最後に行われた準バリアブルノード演算の結果としての復号途中結果D415を、受信用メモリ４１６に記憶された受信データD417（LDPC符号）の最終的な復号結果として出力する。
【０３５７】
受信用メモリ４１６は、通信路を通して受信した受信信号D416から計算されたLDPC符号の各ビットの０らしさの値である、符号長分の受信LLR（対数尤度比）を、受信データD417として記憶し、スイッチ４１１と準バリアブルノード計算器４１５に供給する。
【０３５８】
制御部４１７は、制御信号D420を準チェックノード計算器４１２に、制御信号D421をスイッチ４１１に、制御信号D422を準バリアブルノード計算器４１５に、それぞれ供給することにより、それぞれを制御する。
【０３５９】
以上のように構成される図２６の復号装置では、復号途中結果格納用メモリ４１０、準チェックノード計算器４１２、枝用メモリ４１３、準バリアブルノード計算器４１５の順で、データが一巡することで、１回の復号（繰り返し復号の１回分の処理（チェックノード演算とバリアブルノード演算））が行われる。図２６の復号装置では、所定の回数だけ繰り返して復号が行われた後、準バリアブルノード計算器４１５による準バリアブルノード演算の結果である復号途中結果D415が、最終的な復号結果として出力される。
【０３６０】
次に、図２６の準チェックノード計算器４１２と準バリアブルノード計算器４１５について、さらに詳述する。
【０３６１】
まず、図２８は、図２６の準チェックノード計算器４１２の構成例を示している。
【０３６２】
準チェックノード計算器４１２には、スイッチ４１１（図２６）から、式（８）の復号途中結果vとしての復号途中結果D411が供給されるとともに、枝用メモリ４１３（図２６）から、準チェックノード計算器４１２による前回の準チェックノード演算の結果得られたチェックノードメッセージuj（直前に行われた準バリアブルノード演算に用いられたチェックノードメッセージuj）のうちの、いま式（８）によってバリアブルノードメッセージviを求めようとしている枝からのチェックノードメッセージudvが、メッセージD413として供給される。さらに、準チェックノード計算器４１２には、制御部４１７（図２６）から制御信号D420が供給される。
【０３６３】
ここで、図２６の復号装置では、準チェックノード演算と準バリアブルノード演算とが繰り返し行われることにより、等価的に、図１７の復号装置と同様に、チェックノード演算とバリアブルノード演算とが繰り返し行われる。
【０３６４】
そして、図１７の復号装置では、チェックノード演算によって得られるメッセージujと、バリアブルノード演算によって得られるメッセージviとが、いずれも、符号ビットを含めて６ビットの通常量子化値でもある固定小数点量子化値で表されることとしたが、図２６の復号装置でも、メッセージujとメッセージviとは、いずれも、符号ビットを含めて６ビットの通常量子化値でもある固定小数点量子化値で表されることとする。また、図２６の復号装置において、受信用メモリ４１６に記憶される受信データD417も、図１７の復号装置と同様に、符号ビットを含めて６ビットの通常量子化値でもある固定小数点量子化値で表されていることとする。
【０３６５】
この場合、枝用メモリ４１３（図２６）から準チェックノード計算器４１２に供給されるメッセージD413(チェックノードメッセージudv)は、６ビットの通常量子化値でもある固定小数点量子化値で表される。また、スイッチ４１１（図２６）から準チェックノード計算器４１２に供給される復号途中結果D411(v)は、後述するように、９ビットの通常量子化値でもある固定小数点量子化値で表される。
【０３６６】
枝用メモリ４１３（図２６）から準チェックノード計算器４１２に供給された６ビットの通常量子化値でもある固定小数点量子化値によるメッセージD413（前回の準チェックノード演算の結果得られたチェックノードメッセージujのうちの、いま式（８）によってバリアブルノードメッセージviを求めようとしている枝からのチェックノードメッセージudv）と、スイッチ４１１（図２６）から準チェックノード計算器４１２に供給された９ビットの通常量子化値でもある固定小数点量子化値による復号途中結果D411(v)とは、いずれも、ブロックＢ’の演算器４３１に供給される。
【０３６７】
また、制御部４１７（図２６）から準チェックノード計算器４１２に供給された制御信号D420は、セレクタ４３５とセレクタ４４２に供給される。
【０３６８】
演算器４３１は、式（８）の演算、即ち、そこに供給される９ビットの復号途中結果D411（v）から、同じくそこに供給される６ビットの復号途中結果D413（udv）を減算し、これにより、バリアブルノードメッセージviを求め、そのバリアブルノードメッセージviを表す６ビットの通常量子化値でもある固定小数点量子化値D431（vi）を出力する。
【０３６９】
なお、演算器４３１は、前述した図１２のバリアブルノード計算器１０３を構成する演算器１５６と同様に、式（８）の演算結果が、６ビットの通常量子化値でもある固定小数点量子化値によって表される数値範囲外である場合には、その演算結果をクリッピングして出力する。
【０３７０】
演算器４３１が出力した６ビットの固定小数点量子化値D431(vi)は、ブロックＡ’に供給される。ブロックＡ’では、演算器４３１からの６ビットの固定小数点量子化値D431(バリアブルノードメッセージvi)のうち、最上位ビットの正負を示す符号ビットD432（sign（vi））がEXOR回路４４０およびFIFOメモリ４４４に供給され、下位５ビットの絶対値D433（|vi|）がLUT４３２に供給される。
【０３７１】
上述したように、ブロックＡ’は、図１８に示したチェックノード計算器１８１のブロックＡに対応しており、従って、ブロックＡと同様の処理を行う。
【０３７２】
即ち、ブロックＡ’において、LUT４３２、演算器４３３、レジスタ４３４、セレクタ４３５、レジスタ４３６、演算器４３７、FIFOメモリ４３８、LUT４３９、EXOR回路４４０、レジスタ４４１、セレクタ４４２、レジスタ４４３、FIFOメモリ４４４、EXOR回路４４５、変換回路５０１乃至５０３は、図１８のブロックＡのLUT２２１、演算器１１２２、レジスタ１１２３、セレクタ１１２４、レジスタ１１２５、演算器１１２６、FIFOメモリ１１２７、LUT２２８、EXOR回路１２９、レジスタ１３０、セレクタ１３１、レジスタ１３２、FIFOメモリ１３３、EXOR回路１３４、変換回路２３１乃至２３３とそれぞれ同様に構成されている。
【０３７３】
そして、ブロックＡ’において、LUT４３２は、演算器４３１からの５ビットの絶対値D433(|vi|)に一致する５ビットの通常量子化値でもある固定小数点量子化値を入力として、それに対応付けられている、非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値F434を読み出し、変換回路５０１とFIFOメモリ４３８に出力する。
【０３７４】
変換回路５０１は、図１８の変換回路２３１と同様に、LUT４３２からの５ビットの準浮動小数点量子化値F434を、９ビットの高精度量子化値でもある固定小数点量子化値D434に変換し、演算器４３３に出力する。
【０３７５】
演算器４３３は、変換回路５０１からの、非線形関数φ(|vi|)の演算結果を表す９ビットの固定小数点量子化値D434とレジスタ４３４に格納されている１３ビットの値D435とを加算することにより、非線形関数φ(|vi|)の演算結果を表す９ビットの固定小数点量子化値D434を積算し、その結果得られる１３ビットの高精度量子化値でもある固定小数点量子化値で表される積算値D435をレジスタ４３４に再格納する。なお、検査行列Hの1行に亘る全ての枝からのメッセージD431(バリアブルノードメッセージvi)の絶対値D433(|vi|)に対する演算結果が積算された場合、レジスタ４３４はリセットされる。
【０３７６】
ここで、演算器４３３が出力する積算値D435が１３ビットであり、LUT４３２から変換回路５０１を介して演算器４３３に入力されて積算の対象となる演算結果D434（φ(|vi|)）が９ビットであるのは、図１８において、演算器１１２２の出力が、演算器１１２２に入力される９ビットの演算結果D434（φ(|vi|)）よりも４ビットだけ多い１３ビットになっているのと同様の理由による。
【０３７７】
検査行列Hの1行に亘るメッセージD431(バリアブルノードメッセージvi)が１つずつ読み込まれ、レジスタ４３４に1行分の演算結果D434が積算された積算値が格納された場合、制御部４１７（図２６）から供給される制御信号D420は、０から１に変化する。例えば、検査行列Hの行の重み（row weight）が「９」である場合、制御信号D420は、８個目の演算結果D434が積算されるまでは、「０」となり、９個目の演算結果D434が積算されると「１」となる。
【０３７８】
制御信号D420が「１」の場合、セレクタ４３５は、レジスタ４３４に格納されている値、即ち、検査行列Hの１行に亘る全ての枝からのメッセージD431（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算された１３ビットの固定小数点量子化値D435（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）を選択し、１３ビットの固定小数点量子化値D436として、レジスタ４３６に出力して格納させる。レジスタ４３６は、格納している固定小数点量子化値D436を、１３ビットの固定小数点量子化値D437として、セレクタ４３５と演算器４３７に供給する。制御信号D420が「０」の場合、セレクタ４３５は、レジスタ４３６から供給された固定小数点量子化値D437を選択し、レジスタ４３６に出力して再格納させる。即ち、検査行列Hの１行に亘る全ての枝からのメッセージD431（バリアブルノードメッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ４３６は、前回積算されたφ(|vi|)を、セレクタ４３５と演算器４３７に供給する。
【０３７９】
一方、FIFOメモリ４３８は、レジスタ４３６から新たな固定小数点量子化値D437（ｉ＝１からｉ＝ｄcまでのΣφ(|vi|)）が出力されるまでの間、LUT４３２が出力した非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値F434を遅延し、５ビットの準浮動小数点量子化値F438として、変換回路５０２に供給する。
【０３８０】
変換回路５０２は、FIFO４３８からの５ビットの準浮動小数点量子化値F438を、９ビットの高精度量子化値でもある固定小数点量子化値D438に変換し、演算器４３７に供給する。
【０３８１】
演算器４３７は、レジスタ４３６から供給された１３ビットの固定小数点量子化値D437から、変換回路５０２から供給された９ビットの固定小数点量子化値D438を減算し、その減算結果として得られる９ビットの固定小数点量子化値D439を、LUT４３９に供給する。即ち、演算器４３７は、検査行列Hの1行に亘る全ての枝からのメッセージD431（バリアブルノードメッセージvi）から求められた非線形関数φ(|vi|)の演算結果の積算値から、チェックノードメッセージujを求めたい枝からのメッセージD431（バリアブルノードメッセージvi）から求められた非線形関数φ(|vi|)の演算結果を減算して、その減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を表す９ビットの固定小数点量子化値D439を、変換回路５０３に供給する。
【０３８２】
なお、レジスタ４３６から供給される１３ビットの固定小数点量子化値D437から、変換回路５０２から供給される９ビットの固定小数点量子化D438を減算した減算結果が、９ビットの高精度量子化値でもある固定小数点量子化値で表すことができる最大値を越える場合には、演算器４３７は、減算結果を、９ビットの高精度量子化値でもある固定小数点量子化値で表すことができる最大値にクリッピングして出力する。
【０３８３】
変換回路５０３は、演算器４３７からの、減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を表す９ビットの固定小数点量子化値D439を、５ビットの準浮動小数点量子化値F439に変換し、LUT４３９に供給する。
【０３８４】
LUT４３９は、変換回路５０３からの、減算値（ｉ＝１からｉ＝ｄc−１までのΣφ(|vi|)）を表す５ビットの準浮動小数点量子化値F439を入力として、それに対応付けられている、逆関数φ-1（Σφ(|vi|)）の演算結果を表す５ビットの通常量子化値でもある固定小数点量子化値を読み出して出力する。
【０３８５】
以上の処理と並行して、EXOR回路４４０は、レジスタ４４１に格納されている１ビットの値D442と符号ビットD432との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、１ビットの乗算結果D441をレジスタ４４１に再格納する。なお、検査行列の1行に亘る全ての１に対応する復号途中結果D411から求められたバリアブルノードメッセージvi(D431)の符号ビットD432が乗算された場合、レジスタ４４１はリセットされる。
【０３８６】
検査行列の1行に亘る全ての１に対応する復号途中結果D411から求められたバリアブルノードメッセージvi(D431)の符号ビットD432が乗算された乗算結果D441（ｉ＝１からｄcまでのΠsign(vi)）がレジスタ４４１に格納された場合、制御部４１７から供給される制御信号D420は、「０」から「１」に変化する。
【０３８７】
制御信号D420が「１」の場合、セレクタ４４２は、レジスタ４４１に格納されている値、即ち、検査行列の1行に亘る全ての１に対応する復号途中結果D411から求められた符号ビットD432が乗算された値D442（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）を選択し、１ビットの値D443としてレジスタ４４３に出力して格納させる。レジスタ４４３は、格納している値D443を、１ビットの値D444としてセレクタ４４２とEXOR回路４４５に供給する。制御信号D420が「０」の場合、セレクタ４４２は、レジスタ４４３から供給された値D444を選択し、レジスタ４４３に出力して再格納させる。即ち、検査行列の1行に亘る全ての１に対応する復号途中結果D411（復号途中結果v）から求められたバリアブルノードメッセージvi(D431)の符号ビットD432が乗算されるまで、レジスタ４４３は、前回格納した値を、セレクタ４４２とEXOR回路４４５に供給する。
【０３８８】
一方、FIFOメモリ４４４は、レジスタ４４３から新たな値D444（ｉ＝１からｉ＝ｄcまでのΠsign(vi)）がEXOR回路４４５に供給されるまでの間、符号ビットD432を遅延し、１ビットの値D445としてEXOR回路４４５に供給する。EXOR回路４４５は、レジスタ４４３から供給された値D444と、FIFOメモリ４４４から供給された値D445との排他的論理和を演算することにより、値D444を、値D445で除算し、１ビットの除算結果を除算値D446として出力する。即ち、EXOR回路４４５は、検査行列の1行に亘る全ての１に対応する復号途中結果D411から求められたバリアブルノードメッセージvi(D431)の符号ビットD432（sign(vi)）の乗算値を、チェックノードメッセージujを求めようとする枝からのバリアブルノードメッセージvi(D431)の符号ビットD432（sign(vi)）で除算して、その除算値（ｉ＝１からｉ＝ｄc−１までのΠsign(vi)）を除算値D446として出力する。
【０３８９】
そして、準チェックノード計算器４１２では、LUT４３９から出力された５ビットの通常量子化値D440を下位５ビットとするとともに、EXOR回路４４５から出力された１ビットの除算値D446を最上位ビット(符号ビット)とする合計６ビットの通常量子化値で表されるメッセージD412（チェックノードメッセージuj）が出力される。
【０３９０】
以上のように、準チェックノード計算器４１２では、式（７）と式（８）の演算が行われ、チェックノード演算の結果である、６ビットの通常量子化値によるチェックノードメッセージujが求められる。このチェックノードメッセージujは、準チェックノード計算器４１２から枝用メモリ４１３（図２６）に供給されて記憶される。
【０３９１】
なお、図９の検査行列の行の重みの最大は９であるため、準チェックノード計算器４１２は、９個の復号途中結果D411から求められる９個の演算結果D434（φ(|vi|)）を遅延させるFIFOメモリ４３８と、９個の符号ビットD432を遅延させるFIFOメモリ４４４を有している。行の重みが９未満の行のチェックノードメッセージujを計算するときには、FIFOメモリ４３８とFIFOメモリ４４４における遅延量が、その行の重みの値に減らされる。
【０３９２】
次に、図２９は、図２６の準バリアブルノード計算器４１５の構成例を示している。
【０３９３】
準バリアブルノード計算器４１５は、ブロックＣ’で構成される。ブロックＣ’は、上述したように、図２７に示したバリアブルノード計算器１０３のブロックＣに対応しており、従って、ブロックＣと同様の処理を行う。
【０３９４】
即ち、ブロックＣ’において、演算器４７１、レジスタ４７２、セレクタ４７３、レジスタ４７４、演算器４７５は、図２７のブロックＣの演算器１５１、レジスタ１５２、セレクタ１５３、レジスタ１５４、演算器１５６1とそれぞれ同様に構成されている。
【０３９５】
準バリアブルノード計算器４１５には、枝用メモリ４１３（図２６）から、チェックノード演算の結果であるメッセージD413(チェックノードメッセージuj)が供給され、そのメッセージD413は、演算器４７１に供給される。また、準バリアブルノード計算器４１５には、受信用メモリ４１６（図２６）から受信データD417(u0i)が供給され、その受信データD417は、演算器４７５に供給される。さらに、準バリアブルノード計算器４１５には、制御部４１７（図２６）から制御信号D422が供給され、その制御信号D422は、セレクタ４７３に供給される。
【０３９６】
ここで、準バリアブルノード計算器４１５に対して、枝用メモリ４１３（図２６）から供給されるメッセージD413(チェックノードメッセージuj)と、受信用メモリ４１６（図２６）から供給される受信データD417(u0i)とは、上述したように、いずれも、６ビットの通常量子化値でもある固定小数点量子化値で表されている。
【０３９７】
演算器４７１は、メッセージD413とレジスタ４７２に格納されている９ビットの値D471とを加算することにより、メッセージD413ujを積算し、その結果得られる９ビットの積算値を、レジスタ４７２に再格納する。なお、検査行列の１列に亘る全ての１に対応するメッセージD413(チェックノードメッセージuj)が積算された場合、レジスタ４７２はリセットされる。
【０３９８】
ここで、演算器４７１が出力する積算値が９ビットであり、演算器４３３に入力されて積算されるメッセージD413(uj)が６ビットであるのは、図１２において、演算器１５１の出力が、演算器１５１に入力される６ビットのメッセージD103よりも３ビットだけ多い９ビットになっているのと同様の理由による。
【０３９９】
レジスタ４７２に１列分のメッセージD413が積算された値が格納された場合、制御部４１７（図２６）から供給される制御信号D422は、「０」から「１」に変化する。例えば、列の重みが「５」である場合、制御信号D422は、４番目のメッセージD413が積算されるまでは「０」となり、５番目のメッセージD413が積算されると「１」となる。
【０４００】
制御信号D422が「１」の場合、セレクタ４７３は、レジスタ４７２に格納されている値、即ち、検査行列Ｈの１列に亘る全ての枝からのメッセージD413(チェックノードメッセージuj)が積算された９ビットの積算値D471（ｊ＝１からｄVまでのΣuj）を選択し、レジスタ４７４に出力して格納させる。レジスタ４７４は、格納している積算値D471を、９ビットの値D472として、セレクタ４７１と演算器４７５に供給する。制御信号D422が「０」の場合、セレクタ４７３は、レジスタ４７４から供給された９ビットの値D472を選択し、レジスタ４７４に出力し再格納させる。即ち、検査行列の１列に亘る全ての枝からのメッセージD413(チェックノードメッセージuj)が積算されるまで、レジスタ４７４は、前回の積算値D472を、セレクタ４７３と演算器４７５に供給する。
【０４０１】
演算器４７５は、９ビットの積算値D472と、受信用メモリ４１６（図２６）から供給された６ビットの受信データD417とを加算して、その結果得られる９ビットの値を復号途中結果D415（復号途中結果v）として出力する。
【０４０２】
以上のように、準バリアブルノード計算器４１５では、通常量子化値でもある固定小数点量子化値を使用したまま、式（５）の演算が行われ、９ビットの復号途中結果vが求められる。この復号途中結果vは、準バリアブルノード計算器４１５から復号途中結果格納用メモリ４１０（図２６）に供給されて記憶される。
【０４０３】
なお、復号途中結果格納用メモリ４１０には、９ビットの固定小数点量子化値（通常量子化値）で表された復号途中結果vが記憶され、この９ビットの復号途中結果vが、上述したように、スイッチ４１１（図２６）を介して、準チェックノード計算器４１２に供給される。
【０４０４】
図２６の復号装置でも、図１７の復号装置と同様に、準チェックノード計算器４１２において、非線形関数φ(x)の演算後からその逆関数φ-1(x)の演算までの処理では、高精度量子化値でもある９ビットの固定小数点量子化値、または、その９ビットの固定小数点量子化値と同程度の精度で0付近の数値を表し、かつ、同程度のダイナミックレンジを有する５ビットの準浮動小数点量子化値を使用し、他の処理では、通常量子化値でもある固定小数点量子化値を使用するので、LDPC符号の復号を、復号装置の大規模化（メッセージ等を記憶する復号途中結果格納用メモリ４１０や枝用メモリ４１３の大容量化）を抑えつつ精度良く行うことができる。
【０４０５】
さらに、準チェックノード計算器４１２（図２８）では、LUT４３２において、固定小数点量子化値を入力として、非線形関数φ(x)の演算の結果を、５ビットの準浮動小数点量子化値で出力し、かつ、LUT４３９において、５ビットの準浮動小数点量子化値を入力として、逆関数φ-1(x)の演算の結果を、固定小数点量子化値で出力するので、かかる点からも、LDPC符号の復号を、復号装置の大規模化（LUT４３２や４３９の大容量化）を抑えつつ精度良く行うことができる。
【０４０６】
さらにまた、図２６の復号装置では、準チェックノード計算器４１２において、チェックノード演算と、バリアブルノード演算の一部とを行い、準バリアブルノード計算器４１５において、バリアブルノード演算の他の一部を行うので、図１７の復号装置よりも、装置の規模を小さくすることができる。
【０４０７】
即ち、図２６の復号装置において、枝用メモリ４１３は、図１７の枝用メモリ１０２に対応し、復号途中結果格納用メモリ４１０は、図１７の枝用メモリ１００に対応し、受信用メモリ４１６は、図１７の受信用メモリ１０４に対応する。
【０４０８】
そして、図２６の枝用メモリ４１３と、対応する図１７の枝用メモリ１０２とは、いずれも、６ビットのチェックノードメッセージujを、全枝数分だけ記憶する必要があるので、全枝数の６ビット倍の記憶容量を必要とする。また、図２６の受信用メモリ４１６と、対応する図１７の受信用メモリ１０４も、いずれも、６ビットの受信データu0iを、符号長分だけ記憶する必要があるので、符号長の６ビット倍の記憶容量を必要とする。
【０４０９】
さらに、図１７の枝用メモリ１００は、図１７の枝用メモリ１０２と同様に、６ビットのバリアブルノードメッセージviを、全枝数分だけ記憶する必要があるので、全枝数の６ビット倍の記憶容量を必要とする。
【０４１０】
これに対して、図１７の枝用メモリ１００に対応する図２６の復号途中結果格納用メモリ４１０は、準バリアブルノード計算器４１５が出力する復号途中結果v(D415)を、符号長分だけ記憶する必要がある。復号途中結果vは、図２９で説明したように、９ビット（の通常量子化値）であるから、復号途中結果格納用メモリ４１０は、符号長の９ビット倍の記憶容量を必要とする。
【０４１１】
従って、全枝数が、符号長の3/2(=9ビット/6ビット）倍より少なければば、復号途中結果格納用メモリ４１０の記憶容量は、対応する図１７の枝用メモリ１００の記憶容量よりも大となる。
【０４１２】
しかしながら、LDPC符号の検査行列Hは疎らではあるが、全枝数（検査行列Hにおいて１になっている要素の総数）は、一般に、符号長（検査行列Hの列数）の3/2倍よりも大であり、例えば、図９の検査行列Hでも、全枝数(323個)は、符号長(108)の約3(≒323/108)倍になっている。
【０４１３】
従って、復号途中結果格納用メモリ４１０の記憶容量は、対応する図１７の枝用メモリ１００よりも少ない記憶容量とすることができる。
【０４１４】
その結果、図２６の復号装置は、復号途中結果格納用メモリ４１０の記憶容量を、対応する図１７の枝用メモリ１００の記憶容量よりも少なくすることができる分だけ、図１７の復号装置よりも、装置の規模を小さくすることができる。
【０４１５】
また、図２６の復号装置は、上述したように、（準バリアブルノード計算器４１５とは別に）式（５）を演算するブロックを設ける必要がなく、図２７（図１２）のFIFOメモリ１５５を設ける必要もないので、図１７の復号装置よりも、さらに小型に構成することができる。
【０４１６】
次に、図３０は、各種の復号装置についてのBER/FERのシミュレーション結果を示している。
【０４１７】
なお、図３０において、横軸は、１ビットあたりの信号電力対雑音電力比Eb/N0を表し、縦軸は、BER(Bit Error Rate)またはFER(Frame Error Rate)を表している。また、図３０では、BERは実線で、FERは点線で、それぞれ示してある。
【０４１８】
図３０において▽印は、図１３の復号装置においてLDPC符号の復号を行った場合、つまり、LUT１１２１（図１４）において、５ビットの通常量子化値でもある固定小数点量子化値を入力として、９ビットの高精度量子化値でもある固定小数点量子化値を出力し、かつ、LUT１１２８において、９ビットの高精度量子化値でもある固定小数点量子化値を入力として、５ビットの通常量子化値でもある固定小数点量子化値を出力することにより、LDPC符号の復号を行った場合のBERとFERを表している。
【０４１９】
また、図３０において○印は、図１７の復号装置において、LDPC符号の復号を行った場合、つまり、LUT２２１（図１８）において、５ビットの通常量子化値でもある固定小数点量子化値を入力として、５ビットの準浮動小数点量子化値を出力し、かつ、LUT２２８において、５ビットの準浮動小数点量子化値を入力として、５ビットの通常量子化値でもある固定小数点量子化値を出力することにより、LDPC符号の復号を行った場合のBERとFERを表している。
【０４２０】
図３０から、図１７の復号装置は、図１３の復号装置とほぼ同等の性能を有することが分かる。
【０４２１】
上述したように、図１７の復号装置を構成するLUT２２１とLUT２２８（図１８）は、図１３の復号装置を構成する、対応するLUT１１２１とLUT１１２８（図１４）よりも大幅に小型化することができ、従って、図１７の復号装置は、図１３の復号装置とほぼ同等の性能を有しながら、図１３の復号装置よりも小型に構成することができる。
【０４２２】
次に、図３１は、図２６の準チェックノード計算器４１２の他の構成例を示している。
【０４２３】
なお、図中、図２８における場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。即ち、図３１の準チェックノード計算器４１２は、図２８の準チェックノード計算器４１２と基本的に同様に構成されている。
【０４２４】
但し、図２８のチェックノード計算器４１２では、LUT４３２が、５ビットの固定小数点量子化値を入力として、非線形関数φ(|vi|)の演算結果を表す５ビットの準浮動小数点量子化値を出力するとともに、LUT４３９が、５ビットの準浮動小数点量子化値を入力として、逆関数φ-1（Σφ(|vi|)）の演算結果を表す５ビットの固定小数点量子化値を出力するのに対して、図３１のチェックノード計算器４１２では、LUT４３２が、５ビットの固定小数点量子化値を入力として、非線形関数φ(|vi|)の演算結果を表す６ビットの準浮動小数点量子化値を出力するとともに、LUT４３９が、６ビットの準浮動小数点量子化値を入力として、逆関数φ-1（Σφ(|vi|)）の演算結果を表す５ビットの固定小数点量子化値を出力するようになっている。
【０４２５】
即ち、図３１のチェックノード計算器４１２では、例えば、準仮数部fが３ビットで、準指数部eも３ビットの、合計で６ビットの準浮動小数点量子化値が用いられている。
【０４２６】
なお、図３１では、準浮動小数点量子化値が６ビットであることに対応して、変換回路５０１および５０２は、６ビットの準浮動小数点量子化値を９ビットの固定小数点量子化値に変換し、変換回路５０３は、９ビットの固定小数点量子化値を６ビットの準浮動小数点量子化値に変換するようになっている。
【０４２７】
図３１の準チェックノード計算器４１２では、準浮動小数点量子化値が５ビットではなく、６ビットになっていることを除けば、図２８の準チェックノード計算器４１２と同様にして、準チェックノード演算が行われる。
【０４２８】
図３１の準チェックノード計算器４１２によれば、３ビットの準仮数部fと３ビットの準指数部eからなる６ビットの準浮動小数点量子化値が採用されているので、２ビットの準仮数部fと３ビットの準指数部eからなる５ビットの準浮動小数点量子化値を採用する図２８のチェックノード演算器４１２に比較して、LUT４３２および４３９の容量は多少増加するものの、より精度の高い準チェックノード演算を行うことができる。
【０４２９】
次に、準チェックノード計算器４１２では、準チェックノード演算の一部の演算である演算器４３７で行われる演算のために、FIFOメモリ４３８がデータを遅延する。即ち、図２８や図３１の準チェックノード計算器４１２では、FIFOメモリ４３８が、LUT４３２が出力する非線形関数φ(|vi|)の演算結果を遅延し、変換回路５０２を介して演算器４３７に供給することにより、演算器４３７が、その遅延後の非線形関数φ(|vi|)の演算結果を用いて演算を行う。
【０４３０】
ところで、図２８では、LUT４３２が、５ビットの固定小数点量子化値の入力に対して、非線形関数φ(|vi|)の演算結果としての５ビットの準浮動小数点量子化値を出力するが、図３１では、LUT４３２が、５ビットの固定小数点量子化値の入力に対して、非線形関数φ(|vi|)の演算結果としての６ビットの準浮動小数点量子化値を出力する。従って、FIFOメモリ４３８としては、５ビットの準浮動小数点量子化値を遅延する図２８の場合よりも、６ビットの準浮動小数点量子化値を遅延する図３１の場合の方が、容量の大きいFIFOメモリが必要となる。
【０４３１】
そこで、準チェックノード計算器４１２は（図１８のチェックノード計算器１８１も同様）、LUT４３２に入力される固定小数点量子化値と、LUT４３２から出力される準浮動小数点量子化値とのうちの、ビット数が少ない方を、FIFOメモリ４３８で遅延するように構成することができる。
【０４３２】
即ち、図３２は、LUT４３２に入力される固定小数点量子化値が５ビットで、LUT４３２から出力される準浮動小数点量子化値が６ビットである場合の、ビット数が少ない、LUT４３２に入力される固定小数点量子化値を、FIFOメモリ４３８で遅延するように構成した図２６の準チェックノード計算器４１２の構成例を示している。
【０４３３】
なお、図中、図３１における場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
【０４３４】
図３２の準チェックノード計算器４１２では、FIFOメモリ４３８において、LUT４３２から出力される６ビットの準浮動小数点量子化値ではなく、LUT４３２に入力される５ビットの固定小数点量子化値が遅延されるようになっている。
【０４３５】
さらに、図３２の準チェックノード計算器４１２では、FIFOメモリ４３８において、LUT４３２から出力される６ビットの準浮動小数点量子化値ではなく、LUT４３２に入力される５ビットの固定小数点量子化値を遅延することに伴い、FIFOメモリ４３８で遅延された後の５ビットの固定小数点量子化値を入力として、非線形関数φ(|vi|)の演算結果を表す６ビットの準浮動小数点量子化値を出力する、LUT４３２と同様に構成されるLUT５０４が、FIFOメモリ４３８と変換回路５０２との間に、新たに設けられている。
【０４３６】
以上のように構成される図３２の準チェックノード計算器４１２では、FIFOメモリ４３８において、LUT４３２から出力される６ビットの準浮動小数点量子化値ではなく、LUT４３２に入力される５ビットの固定小数点量子化値が遅延されて出力される。その後、LUT５０４が、FIFOメモリ４３８が出力する、遅延後の５ビットの固定小数点量子化値を入力として、非線形関数φ(|vi|)の演算結果を表す６ビットの準浮動小数点量子化値を出力する。
【０４３７】
そして、変換回路５０２は、LUT５０４が出力する６ビットの準浮動小数点量子化値を、９ビットの固定小数点量子化値に変換し、演算器４３７に供給する。これにより、演算器４３７では、変換回路５０２から供給される、遅延後の非線形関数φ(|vi|)の演算結果を用いて演算が行われる。
【０４３８】
なお、図３２の準チェックノード計算器４１２において行われるその他の処理は、図３１の場合と同様である。
【０４３９】
以上のように、LUT４３２に入力される固定小数点量子化値と、LUT４３２から出力される準浮動小数点量子化値とのうちの、ビット数が少ない方を、FIFOメモリ４３８で遅延するように、準チェックノード計算器４１２を構成することにより、即ち、例えば、LUT４３２に入力される固定小数点量子化値が５ビットで、LUT４３２から出力される準浮動小数点量子化値が６ビットである場合には、図３２に示したように、ビット数が少ない、LUT４３２に入力される固定小数点量子化値を、FIFOメモリ４３８で遅延するように、準チェックノード計算器４１２を構成することにより、FIFOメモリ４３８として、容量の小さいFIFOメモリを採用することができる。
【０４４０】
ここで、図３２に示したように、LUT４３２に入力される固定小数点量子化値を、FIFOメモリ４３８で遅延するように、準チェックノード計算器４１２を構成する場合には、FIFOメモリ４３８と変換回路５０２との間に、LUT５０４を新たに設ける必要がある。このため、LUT４３２に入力される固定小数点量子化値と、LUT４３２から出力される準浮動小数点量子化値とのビット数が同一である場合には、準チェックノード計算器４１２は、図２８に示したように、LUT４３２から出力される準浮動小数点量子化値を、FIFOメモリ４３８で遅延するように構成する方が、LUT５０４を設けずにすむ分だけ回路規模を小さくすることができる。
【０４４１】
また、LUT４３２に入力される固定小数点量子化値を、FIFOメモリ４３８で遅延するように、準チェックノード計算器４１２を構成する場合には、FIFOメモリ４３８と変換回路５０２との間に、LUT５０４を新たに設ける必要があるので、LUT４３２に入力される固定小数点量子化値と、LUT４３２から出力される準浮動小数点量子化値とのうちのいずれを、FIFOメモリ４３８で遅延するかは、LUT４３２に入力される固定小数点量子化値と、LUT４３２から出力される準浮動小数点量子化値とのビット数の大小関係の他、LUT５０４の規模を考慮して決めるのが望ましい。
【０４４２】
即ち、LUT４３２に入力される固定小数点量子化値が、LUT４３２から出力される準浮動小数点量子化値のビット数以上のビット数である場合には、準チェックノード計算器４１２は、図２８に示したように、LUT４３２から出力される準浮動小数点量子化値を、FIFOメモリ４３８で遅延するように構成することにより、回路規模を小さくすることができる。
【０４４３】
また、LUT４３２に入力される固定小数点量子化値が、LUT４３２から出力される準浮動小数点量子化値のビット数未満のビット数である場合には、LUT４３２に入力される、ビット数が小の固定小数点量子化値をFIFOメモリ４３８で遅延するときのFIFOメモリ４３８の規模およびそのとき必要となるLUT５０４の規模を合わせた規模と、LUT４３２から出力される、ビット数が大の準浮動小数点量子化値をFIFOメモリ４３８で遅延するときのFIFOメモリ４３８の規模とを比較し、規模が小さくなる方の構成を採用するのが望ましい。
【０４４４】
なお、本実施の形態では、各ノードの演算を一つずつ順次行うフルシリアルデコード(full serial decoding)のアーキテクチャを有する復号装置を採用したが、復号装置のアーキテクチャは、特に限定されるものではない。即ち、本発明は、フルシリアルデコードのアーキテクチャを有する復号装置の他、例えば、全ノードの演算を同時に行うフルパラレルデコード(full parallel decoding)のアーキテクチャを有する復号装置や、一つでも全てでもない、ある数のノードの演算を同時に行う一部パラレルデコード(partly parallel decoding)のアーキテクチャを有する復号装置にも適用可能である。
【０４４５】
フルパラレルデコードのアーキテクチャを有する復号装置や、一部パラレルデコードのアーキテクチャを有する復号装置は、チェックノード演算を行うチェックノード計算器（準チェックノード計算器）を複数有することから、非線形関数φ(x)やその逆関数φ-1(y)の演算を行う（演算結果を出力する)LUTの容量の削減の効果は、さらに大になる。
【０４４６】
また、検査行列Hは、図９に示したものに限定されるものではない。
【０４４７】
さらに、固定小数点量子化値である通常量子化値や高精度量子化値、準浮動小数点量子化値のビット数（量子化ビット数）も、上述した値に限定されるものではない。
【０４４８】
さらに、図１７の枝用メモリ１００および１０２、受信用メモリ１０４や、図２６の復号途中結果格納用メモリ４１０、枝用メモリ４１３、受信用メモリ４１６としては、例えば、ＲＡＭ(Read Only Memory)を使用することができる。ここで、これらの枝用メモリ１００等として使用するRAMの１ワードあたりのビット数（ビット幅）や、RAMが記憶することができるワード数は、特に限定されるものではない。また、RAMのビット幅やワード数によっては、複数のRAMに対して、同様の制御信号（例えば、チップセレクト信号やアドレス信号）を与えることにより、その複数のRAMを論理的に１つのRAMとみなして、枝用メモリ１００等として使用することができる。即ち、例えば、物理的に１つのRAMのビット幅が、受信データu0i等の量子化ビット数に足りない場合には、複数のRAMを論理的に１つのRAMとみなして、受信データu0i等を記憶させることができる。
【０４４９】
また、本実施の形態では、非線形関数φ(x)、またはその逆関数φ-1(x)の演算を、LUT１１２１（図１８）やLUT４３２（図２８）、またはLUT１１２８（図１８）やLUT４３９（図２８）といったLUTによって行うようにしたが、非線形関数φ(x)やその逆関数φ-1(x)の演算は、例えば、CPU(Central Processing Unit)や論理回路によって行うことが可能である。
【０４５０】
さらに、図１８のチェックノード計算器１８１では、FIFO１１２７において、LUT２２１が出力する５ビットの準浮動小数点量子化値を遅延するようにしたが、FIFO１１２７では、LUT２２１が出力する５ビットの準浮動小数点量子化値ではなく、その５ビットの準浮動小数点量子化値の表示形式を変換回路２３１で変換して得られる９ビットの固定小数点量子化値を遅延するようにすることが可能である。この場合、図１８において、FIFO１１２７の後段に設けられている変換回路２３２は、不要となる。
【０４５１】
但し、FIFO１１２７において、５ビットの準浮動小数点量子化値を遅延する場合には、９ビットの固定小数点量子化値を遅延する場合に比較して、FIFO１１２７の容量を小さくすることができる。図２８のFIFO４３８についても同様である。
【０４５２】
なお、上述したLDPC符号を復号する復号装置は、例えば、（ディジタル）衛星放送を受信するチューナなどに適用することができる。
【図面の簡単な説明】
【０４５３】
【図１】LDPC符号の検査行列Hを説明する図である。
【図２】パリティ部が下三角行列になっている検査行列Hを示す図である。
【図３】LDPC符号の復号手順を説明するフローチャートである。
【図４】メッセージの流れを説明する図である。
【図５】LDPC符号の検査行列Hの例を示す図である。
【図６】検査行列Hのタナーグラフを示す図である。
【図７】バリアブルノードを示す図である。
【図８】チェックノードを示す図である。
【図９】LDPC符号の検査行列Hの例を示す図である。
【図１０】ノード演算を一つずつ行うLDPC符号の復号装置の構成例を示すブロック図である。
【図１１】メッセージを一つずつ計算するチェックノード計算器１０１の構成例を示すブロック図である。
【図１２】メッセージを一つずつ計算するバリアブルノード計算器１０３の構成例を示すブロック図である。
【図１３】本発明が適用される復号装置の構成例を示すブロック図である。
【図１４】チェックノード計算器１７１の構成例を示すブロック図である。
【図１５】チェックノード計算器１７１の処理を説明するためのフローチャートである。
【図１６】非線形関数φ(x)と、その逆関数φ-1(y)とを示す図である。
【図１７】本発明を適用した復号装置の第１実施の形態の構成例を示すブロック図である。
【図１８】チェックノード計算器１８１の構成例を示すブロック図である。
【図１９】LUT２２１を説明するための図である。
【図２０】変換回路２３１を説明するための図である。
【図２１】変換回路２３１の処理を説明する図である。
【図２２】変換回路２３３を説明するための図である。
【図２３】変換回路２３３の処理を説明する図である。
【図２４】LUT２２８を説明するための図である。
【図２５】チェックノード計算器１８１の処理を説明するためのフローチャートである。
【図２６】本発明を適用した復号装置の第２実施の形態の構成例を示すブロック図である。
【図２７】バリアブルノード計算器１０３の構成例を示すブロック図である。
【図２８】準チェックノード計算器４１２の構成例を示すブロック図である。
【図２９】準バリアブルノード計算器４１５の構成例を示すブロック図である。
【図３０】BER/FERを示す図である。
【図３１】準チェックノード計算器４１２の他の構成例を示すブロック図である。
【図３２】準チェックノード計算器４１２のさらに他の構成例を示すブロック図である。
【符号の説明】
【０４５４】
１００，１０２  枝用メモリ，  １０３  バリアブルノード計算器，  １０４  受信用メモリ，  １０５  制御部，  １２９  EXOR回路，  １３０  レジスタ，  １３１  セレクタ，  １３２  レジスタ，  １３３  FIFOメモリ，  １３４  EXOR回路，  １７１，１８１  チェックノード計算器，  ２２１，２２８  LUT，  ２３１乃至２３３  変換回路，  ４１０  復号途中結果格納用メモリ，  ４１１  スイッチ，  ４１２  準チェックノード計算器，  ４１３  枝用メモリ，  ４１５  準バリアブルノード計算器，  ４１６  受信用メモリ，  ４１７  制御部，  ４３１  演算器，  ４３２  LUT，  ４３３  演算器，  ４３４  レジスタ，  ４３５  セレクタ，  ４３６  レジスタ，  ４３７  演算器，  ４３８  FIFOメモリ，  ４３９  LUT，  ４４０  EXOR回路，  ４４１  レジスタ，  ４４２  セレクタ，  ４４３  レジスタ，  ４４４  FIFOメモリ，  ４４５  EXOR回路，  ４７１  演算器，  ４７２  レジスタ，  ４７３  セレクタ，  ４７４  レジスタ，  ４７５  演算器，  ５０１乃至５０３  変換回路，  ５０４  LUT，  １２１１  LUT，  １１２２  演算器，  １１２３  レジスタ，  １１２４  セレクタ，  １１２５  レジスタ，  １１２６  演算器，  １１２７  FIFOメモリ，  １１２８  LUT
【図１】
2007081601.tif 000011
【図２】
2007081601.tif 000012
【図３】
2007081601.tif 000013
【図４】
2007081601.tif 000014
【図５】
2007081601.tif 000015
【図６】
2007081601.tif 000016
【図７】
2007081601.tif 000017
【図８】
2007081601.tif 000018
【図９】
2007081601.tif 000019
【図１０】
2007081601.tif 000020
【図１１】
2007081601.tif 000021
【図１２】
2007081601.tif 000022
【図１３】
2007081601.tif 000023
【図１４】
2007081601.tif 000024
【図１５】
2007081601.tif 000025
【図１６】
2007081601.tif 000026
【図１７】
2007081601.tif 000027
【図１８】
2007081601.tif 000028
【図１９】
2007081601.tif 000029
【図２０】
2007081601.tif 000030
【図２１】
2007081601.tif 000031
【図２２】
2007081601.tif 000032
【図２３】
2007081601.tif 000033
【図２４】
2007081601.tif 000034
【図２５】
2007081601.tif 000035
【図２６】
2007081601.tif 000036
【図２７】
2007081601.tif 000037
【図２８】
2007081601.tif 000038
【図２９】
2007081601.tif 000039
【図３０】
2007081601.tif 000040
【図３１】
2007081601.tif 000041
【図３２】
2007081601.tif 000042