(57)【要約】【課題】LDPC復号装置等の回路規模縮小を図る。【解決手段】受信データメモリ９１０には、並列数P=6の場合のPパラレルビットの受信データが2[word]分使って保持されている。制御部９１４の制御によって、2時刻のうちの最初の1時刻目に、Pパラレルビットのうち先に読み出されたP/2のビットの受信データがレジスタ９１２に一旦格納される。次の２時刻目に、Pパラレルビットのうちの残りのP/2のビットの受信データが受信データメモリ９１０から読み出されるので、この残りのP/2のビットの受信データと、レジスタ９１２に一旦格納されていた先のP/2のビットの受信データとが同時に、受信データD211として、メッセージ計算部９１３に送信される。本発明は、LDPC復号装置に適用可能である。【選択図】図２０
2008301152.tif 000002
【特許請求の範囲】
【請求項１】
LDPC(Low Density Parity Check)符号を復号する復号装置において、
送信されてきた前記LDPC符号を受信することにより得られる受信データを記憶する受信データ記憶手段と、
前記LDPC符号の復号をするためのバリアブルノードの演算、またはチェックノードの演算に用いるメッセージを記憶するメッセージ記憶手段と、
前記受信データ記憶手段に記憶された受信データと、前記メッセージ記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づいて、その単位行列毎に並列的に前記バリアブルノードの演算または前記チェックノードの演算をそれぞれ行い、各演算の結果得られる各メッセージを出力するメッセージ計算手段と、
前記メッセージ計算手段によって前記単位行列毎に並列的にバリアブルノードの演算が行われる際に、その演算に用いられる前記受信データをＲ回（Ｒは２以上の整数値）に分けて前記受信データ記憶手段から読み出す制御を行う制御手段と
を備え、
前記受信データ記憶手段は、前記受信データの前記受信データ記憶手段からの読み出し回数が１回である場合の構成と比較して、前記Ｒ回に増加した分だけビット数を減らしてワード数を増やした構成を有している
復号装置。
【請求項２】
前記Ｒ回は、前記検査行列の列のハミング重みに応じた回数である
請求項１に記載の復号装置。
【請求項３】
前記制御手段の制御により前記Ｒ回に分けられて前記受信データが前記受信データ記憶手段から読み出される毎に、読み出された分のデータを逐次格納していく格納手段をさらに備え、
前記制御手段は、前記Ｒ回に分けた前記受信データの前記受信データ記憶手段からの読み出しを終了したとき、さらに、最後に読み出した分のデータと、前記格納手段に逐次格納されていた分のデータとをあわせて、前記受信データとして前記メッセージ計算手段に提供する制御を行う
請求項１に記載の復号装置。
【請求項４】
LDPC(Low Density Parity Check)符号を復号する復号装置であって、
送信されてきた前記LDPC符号を受信することにより得られる受信データを記憶する受信データ記憶手段と、
前記LDPC符号の復号をするためのバリアブルノードの演算、またはチェックノードの演算に用いるメッセージを記憶するメッセージ記憶手段と、
前記受信データ記憶手段に記憶された受信データと、前記メッセージ記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づいて、その単位行列毎に並列的に前記バリアブルノードの演算または前記チェックノードの演算をそれぞれ行い、各演算の結果得られる各メッセージを出力するメッセージ計算手段とを備え、
前記受信データ記憶手段は、前記受信データの前記受信データ記憶手段からの読み出し回数が１回である場合の構成と比較して、その読み出し回数がＲ回に増加した分だけビット数を減らしてワード数を増やした構成を有している復号装置の復号方法において、
前記メッセージ計算手段によって前記単位行列毎に並列的にバリアブルノードの演算が行われる際に、その演算に用いられる前記受信データをＲ回（Ｒは２以上の整数値）に分けて前記受信データ記憶手段から読み出す制御を行う
ステップを含む復号方法。
【請求項５】
LDPC(Low Density Parity Check)符号を復号する復号装置であって、
送信されてきた前記LDPC符号を受信することにより得られる受信データを記憶する受信データ記憶手段と、
前記LDPC符号の復号をするためのバリアブルノードの演算、またはチェックノードの演算に用いるメッセージを記憶するメッセージ記憶手段と、
前記受信データ記憶手段に記憶された受信データと、前記メッセージ記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づいて、その単位行列毎に並列的に前記バリアブルノードの演算または前記チェックノードの演算をそれぞれ行い、各演算の結果得られる各メッセージを出力するメッセージ計算手段とを備え、
前記受信データ記憶手段は、前記受信データの前記受信データ記憶手段からの読み出し回数が１回である場合の構成と比較して、その読み出し回数がＲ回に増加した分だけビット数を減らしてワード数を増やした構成を有している復号装置を制御するコンピュータに、
前記メッセージ計算手段によって前記単位行列毎に並列的にバリアブルノードの演算が行われる際に、その演算に用いられる前記受信データをＲ回（Ｒは２以上の整数値）に分けて前記受信データ記憶手段から読み出す制御を行う
ステップを含む制御処理を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、復号装置および方法並びにプログラムに関し、特に、復号性能を維持しつつ回路規模を従来より縮小できるようになった復号装置および方法並びにプログラムに関する。
【背景技術】
【０００２】
通信システムにおいては、コーディングを使用して雑音のある通信チャネルに渡る信頼性ある通信が行われている。例えば、衛星ネットワークのようなワイヤレス（または無線）システムでは、地理的および環境的要因からの雑音源が多い。これらの通信チャネルは固定容量を表し、ある信号対雑音比（ＳＮＲ）におけるシンボル当たりのビットに関して表すことができ、シャノン限界として知られる理論的上限を規定している。結果として、コーディング設計はこのシャノン限界に近づくレートを達成することを目的としている。この目的は、帯域幅制約衛星システムに対して特に密接な関係がある。
【０００３】
近年では、シャノン限界に近い性能を示す符号化方法として、例えば、並列連接畳み込み符号(PCCC(Parallel Concatenated Convolutional Codes))や、縦列連接畳み込み符号(SCCC(Serially Concatenated Convolutional Codes))といった、いわゆるターボ符号化(Turbo coding)と称される手法が開発されている。また、これらのターボ符号が開発される一方で、古くから知られる符号化方法である低密度パリティ検査符号(Low Density Parity Check codes)（以下、LDPC符号と称する）が脚光を浴びつつある。
【０００４】
LDPC符号は、R. G. Gallagerによる非特許文献１において最初に提案されたものであり、その後、非特許文献２，３等において再注目されるに至ったものである。
【０００５】
LDPC符号は、近年の研究により、ターボ符号等と同様に、符号長を長くしていくに従って、シャノン限界に近い性能が得られることがわかりつつある。また、LDPC符号は、最小距離が符号長に比例するという性質があることから、その特徴として、ブロック誤り確率特性がよく、さらに、ターボ符号等の復号特性において観測される、いわゆるエラーフロア現象が殆ど生じないことが利点として挙げられる。
【０００６】
以下、このようなLDPC符号について具体的に説明する。なお、LDPC符号は、線形符号であり、必ずしも２元である必要はないが、ここでは、２元であるものとして説明する。
【０００７】
LDPC符号は、そのLDPC符号を定義する検査行列(parity check matrix)が疎なものであることを最大の特徴とするものである。ここで、疎な行列とは、行列のコンポーネントの"1"の個数が非常に少なく構成されるものであり、疎な検査行列をHで表すものとすると、そのような検査行列Hとしては、例えば、図１に示すように、各列のハミング重み（"1"の数）(weight)が"3"であり、且つ、各行のハミング重みが"6"であるもの等がある。
【０００８】
このように、各行及び各列のハミング重みが一定である検査行列Hによって定義されるLDPC符号は、レギュラーLDPC符号と称される。一方、各行及び各列のハミング重みが一定でない検査行列Hによって定義されるLDPC符号は、イレギュラーLDPC符号と称される。
【０００９】
このようなLDPC符号による符号化は、検査行列Hに基づいて生成行列Gを生成し、この生成行列Gを２元の情報メッセージに対して乗算することによって符号語を生成することで実現される。具体的には、LDPC符号による符号化を行う符号化装置は、まず、検査行列Hの転置行列HTとの間に、式GHT=0が成立する生成行列Gを算出する。ここで、生成行列Gが、k×n行列である場合には、符号化装置は、生成行列Gに対してkビットからなる情報メッセージ（ベクトルu）を乗算し、nビットからなる符号語ｃ（＝uＧ）を生成する。この符号化装置によって生成された符号語は、値が"0"の符号ビットが"+1"に、値が"1"の符号ビットが"−1"にといったようにマッピングされて送信され、所定の通信路を介して受信側において受信されることになる。
【００１０】
一方、LDPC符号の復号は、Gallagerが確率復号(Probabilistic Decoding)と称して提案したアルゴリズムであって、バリアブルノード(バリアブルノード（メッセージノード(message node)とも呼ばれる。）)と、チェックノード(チェックノード)とからなる、いわゆるタナーグラフ(Tanner graph)上での確率伝播(belief propagation)によるメッセージ・パッシング・アルゴリズムによって行うことが可能である。ここで、以下、適宜、バリアブルノードとチェックノードを、単に、ノードともいう。
【００１１】
しかしながら、確率復号においては、各ノード間で受け渡されるメッセージが実数値であることから、解析的に解くためには、連続した値をとるメッセージの確率分布そのもを追跡する必要があり、非常に困難を伴う解析を必要とすることになる。そこで、Gallagerは、LDPC符号の復号アルゴリズムとして、アルゴリズムＡ又はアルゴリズムＢを提案している。
【００１２】
LDPC符号の復号は、例えば、図２に示すような手順に従って行われる。なお、ここでは、符号長の長さのLDPC符号の受信データのi番目をU0(u0i)とし、チェックノードから出力されるj番目のメッセージ（チェックノードに接続しているj番目の枝から出力されるメッセージ）をujとし、バリアブルノードから出力されるi番目のメッセージ（バリアブルノードに接続しているi番目の枝から出力されるメッセージ）をviとする。また、ここでは、メッセージとは、値の"0"らしさを表す、いわゆる対数尤度比(log likelihood ratio)等を表現する実数値である。
【００１３】
まず、LDPC符号の復号においては、図２に示すように、ステップＳ１１において、受信データU0(u0i)が受信され、メッセージujが"0"に初期化されるとともに、繰り返し処理のカウンタとしての整数をとる変数kが"0"に初期化され、処理は、ステップＳ１２に進む。ステップＳ１２において、受信データU0(u0i)を用いて、式（１）に示すバリアブルノードの演算を行うことによってメッセージviが求められ、さらに、このメッセージviを用いて、式（２）に示すチェックノードの演算を行うことによってメッセージujが求められる。
【００１４】
【数１】
2008301152.tif 000003
・・・（１）
【００１５】
【数２】
2008301152.tif 000004
・・・（２）
【００１６】
ここで、式（１）と式（２）におけるdvとdcは、それぞれ、検査行列Hの縦方向（列）と横方向（行）の"1"の個数、つまり、列の重み（ハミング重み）と行の重みを示す任意に選択可能とされるパラメータであり、例えば、(3,6)符号の場合には、dv=3，dc=6となる。
【００１７】
なお、式（１）又は（２）の演算においては、それぞれ、メッセージを出力しようとする枝(edge)から入力されたメッセージを、和又は積演算の対象としては用いないことから、和又は積演算の範囲が、１ないしdv-1又は１ないしdc-1となっている。また、式（２）に示す演算は、２入力v1，v2に対して１が得られるる式（３）に示す関数R(v1,v2)のテーブルを予め作成しておき、これを式（４）に示すように連続的（再帰的）に用いることによって行うことができる。
【００１８】
【数３】
2008301152.tif 000005
・・・（３）
【００１９】
【数４】
2008301152.tif 000006
・・・（４）
【００２０】
ステップＳ１２では、さらに、変数kが"1"だけインクリメントされ、処理は、ステップＳ１３に進む。ステップＳ１３では、変数kが所定の繰り返し復号回数N以上であるか否かが判定される。ステップＳ１３において、変数kがN以上ではないと判定された場合、処理は、ステップＳ１２に戻り、以下、同様の処理が繰り返される。
【００２１】
また、ステップＳ１３において、変数kがN以上であると判定された場合、処理は、ステップＳ１４に進み、式（５）に示す演算を行うことによって最終的に出力する復号結果としてのメッセージvが求められて出力され、LDPC符号の復号処理が終了する。
【００２２】
【数５】
2008301152.tif 000007
・・・（５）
【００２３】
ここで、式（５）の演算は、式（１）の演算とは異なり、バリアブルノードに接続している全ての枝からのメッセージujを用いて行われる。
【００２４】
このようなLDPC符号の復号では、例えば(3,6)符号の場合には、図３に示すように、各ノード間でメッセージの授受が行われる。なお、図３において"="（イコール）で示すノードは、バリアブルノードを表し、式（１）に示したバリアブルノードの演算が行われる。また、図３において"+"（プラス）で示すノードは、チェックノードを表し、式（２）に示したチェックノードの演算が行われる。特に、アルゴリズムＡにおいては、メッセージを２元化し、"+"で示すチェックノードにて、dc-1個の入力メッセージ（チェックノードに入力されるメッセージvi）の排他的論理和演算を行い、"="で示すバリアブルノードにて、受信データRに対して、dv-1個の入力メッセージ（バリアブルノードに入力されるメッセージuj）が全て異なるビット値であった場合には、符号を反転して出力する。
【００２５】
また、近年、LDPC符号の復号の実装法に関する研究も行われている。実装方法について述べる前に、まず、LDPC符号の復号を摸式化して説明する。
【００２６】
図４は、(3,6)符号のLDPC符号（符号化率1/2、符号長12）の検査行列(parity check matrix)Hの例である。LDPC符号の検査行列Hは、図５のように、タナーグラフを用いて書き表すことができる。ここで、図５において、"+"で表されるのが、チェックノードであり、"="で表されるのが、バリアブルノードである。チェックノードとバリアブルノードは、それぞれ、検査行列の行と列に対応する。チェックノードとバリアブルノードとの間の結線は、枝(edge)であり、検査行列Hの"1"に相当する。すなわち、検査行列の第ｊ行第ｉ列のコンポーネントが１である場合には、図５において、上からｉ番目のバリアブルノード（"="のノード）と、上からｊ番目のチェックノード（"+"のノード）とが、枝により接続される。枝は、バリアブルノードに対応するLDPC符号（の受信データ）のビットが、チェックノードに対応する拘束条件を持つことを表す。なお、図５は、図４の検査行列Hのタナーグラフとなっている。
【００２７】
LDPC符号の復号方法であるサムプロダクトアルゴリズム(Sum Product Algorithm)は、バリアブルノードの演算とチェックノードの演算とを繰り返し行う。
【００２８】
バリアブルノードでは、図６のように、式（１）のバリアブルノードの演算を行う。すなわち、図６において、バリアブルノードに接続している枝のうちのi番目の枝に対応するメッセージviは、バリアブルノードに接続している残りの枝からのメッセージu1及びu2と、受信データu0iとを用いて計算される。他の枝に対応するメッセージも同様に計算される。
【００２９】
チェックノードの演算について説明する前に、式（２）を、式a×b=exp{ln(|a|)+ln(|b|)}×sign(a)×sign(b)の関係を用いて、式（６）のように書き直す。但し、sign(x)は、x≧0のとき1（論理０）であり、x＜0のとき-1（論理１）である。
【００３０】
【数６】
2008301152.tif 000008
・・・（６）
【００３１】
さらに、x≧0において、非線形関数φ(x)=-ln(tanh(x/2))を定義すると、その逆関数φ-1(x)は、式φ-1(x)=2tanh-1(e-x)で表されるから、式（６）は、式（７）のように書くことができる。
【００３２】
【数７】
2008301152.tif 000009
・・・（７）
【００３３】
チェックノードでは、図７のように、式（７）のチェックノードの演算を行う。すなわち、図７において、チェックノードに接続している枝のうちのj番目の枝に対応するメッセージujは、チェックノードに繋がっている残りの枝からのメッセージv1,v2,v3,v4,v5を用いて計算される。他の枝に対応するメッセージも同様に計算される。
【００３４】
なお、関数φ(x)は、φ(x)=ln((ex+1)/(ex-1))とも表すことができ、x＞0において、φ(x)=φ-1(x)、すなわち、非線形関数φ(x)の演算結果と、その逆関数φ-1(x)の演算結果とは同一である。関数φ(x)及びφ-1(x)をハードウェアに実装する際には、LUT(Look Up Table)を用いて実装される場合があるが、両者は同一のLUTとなる。
【００３５】
また、式（１）のバリアブルノードの演算は、式（５）と、次の式（８）とに分けることができる。
【００３６】
【数８】
2008301152.tif 000010
・・・（８）
【００３７】
したがって、式（５）及び式（８）と、式（７）の演算を繰り返し行うことにより、式（１）のバリアブルノードの演算と、式（７）のチェックノードの演算を繰り返し行うことができる。この場合、式（５）及び式（８）のバリアブルノードの演算のうちの、式（５）の演算の結果を、そのまま、最終的な復号結果とすることができる。
【００３８】
サムプロダクトアルゴリズムをハードウェアに実装して、復号装置とする場合、式（１）（、又は式（５）及び式（８））で表されるバリアブルノード演算（バリアブルノードの演算）及び式（７）で表されるチェックノード演算（チェックノードの演算）を、適度な回路規模と動作周波数で繰り返し行うことが必要である。
【００３９】
復号装置の実装の例として、単純に各ノードの演算を一つずつ順次行うことによって復号を行うフルシリアルの復号(full serial decoding)の実装法について説明する。
【００４０】
図８は、LDPC符号の復号を行う復号装置の構成例を示している。
【００４１】
図８の復号装置では、動作クロックの１クロック(clock)ごとに、１つの枝に対応するメッセージが計算される。
【００４２】
すなわち、図８の復号装置は、メッセージ計算部１０１、メッセージメモリ１０４、受信データメモリ１０５、制御部１０６からなる。また、メッセージ計算部１０１は、バリアブルノード計算器１０２とチェックノード計算器１０３とから構成されている。
【００４３】
図８の復号装置では、メッセージメモリ１０４からメッセージ計算部１０１に、メッセージが１つずつ読み出され、メッセージ計算部１０１において、そのメッセージを用いて、所望の枝に対応するメッセージが計算される。そして、その計算によって求められたメッセージが、メッセージメモリ１０４に格納されていく。図８の復号装置では、以上の処理が繰り返し行われ、いわゆる繰り返し復号が行われる。
【００４４】
すなわち、受信データメモリ１０５には、送信されてきたLDPC符号を受信することにより得られる、符号の0（又は1）らしさを表す対数尤度比である受信データ（LDPC符号）D100が供給され、受信データメモリ１０５は、その受信データD100を格納（記憶）する。
【００４５】
バリアブルノード演算時には、受信データメモリ１０５は、制御部１０６から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部１０１のバリアブルノード計算器１０２に供給する。
【００４６】
また、バリアブルノード演算時には、メッセージメモリ１０４は、制御部１０６から供給される制御信号に従って、記憶しているメッセージ（チェックノードメッセージuj）D102を読み出し、バリアブルノード計算器１０２に供給する。バリアブルノード計算器１０２は、メッセージメモリ１０４から供給されるメッセージD102と受信データメモリ１０５から供給される受信データD101を用い、式（１）のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ（バリアブルノードメッセージ）viを、メッセージD103として、メッセージメモリ１０４に供給する。
【００４７】
そして、メッセージメモリ１０４は、以上のようにしてバリアブルノード計算器１０２から供給されるメッセージD103を記憶する。
【００４８】
一方、チェックノード演算時には、メッセージメモリ１０４は、制御部１０６から供給される制御信号に従って、記憶しているバリアブルノードメッセージviを、メッセージD104として読み出し、チェックノード計算器１０３に供給する。
【００４９】
チェックノード計算器１０３は、メッセージメモリ１０４から供給されるメッセージD104を用いて、式（７）のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ（チェックノードメッセージ）ujを、メッセージD105として、メッセージメモリ１０４に供給する。
【００５０】
そして、メッセージメモリ１０４は、以上のようにしてチェックノード計算器１０３から供給されるメッセージD105を記憶する。
【００５１】
メッセージメモリ１０４が記憶したチェックノード計算器１０３からのメッセージD105、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD102として読み出され、バリアブルノード計算器１０２に供給される。
【００５２】
図９は、バリアブルノード演算を１つずつ行う図８のバリアブルノード計算器１０２の構成例を示している。
【００５３】
バリアブルノード計算器１０２は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、２つの入力ポートP101とP102を有し、外部にメッセージを供給（出力）するポートとして、１つの出力ポートP103を有している。そして、バリアブルノード計算器１０２は、入力ポートP101とP102それぞれから入力されるメッセージを用いて、式（１）のバリアブルノード演算を行い、その結果得られるメッセージを、出力ポートP103から出力する。
【００５４】
すなわち、入力ポートP101には、受信データメモリ１０５から読み出された受信データD101が供給される。また、入力ポートP102には、メッセージメモリ１０４から読み出されたメッセージD102（チェックノードメッセージuj）が供給される。
【００５５】
バリアブルノード計算器１０２では、検査行列の各行に対応するチェックノードからのメッセージD102（メッセージuj）が入力ポートP102から１つずつ読み込まれ、そのメッセージD102が、演算器１５１とFIFOメモリ１５５に供給される。また、バリアブルノード計算器１０２では、受信データメモリ１０５から受信データD101が入力ポートP101から1つずつ読み込まれ、演算器１５７に供給される。
【００５６】
演算器１５１は、メッセージD102（メッセージuj）とレジスタ１５２に格納されている値D151とを加算することにより、メッセージD102を積算し、その結果得られる積算値を、レジスタ１５２に再格納する。なお、検査行列の１列に亘る全ての枝からのメッセージD102が積算された場合、レジスタ１５２は０にリセットされる。
【００５７】
検査行列の１列に亘るメッセージD102が１つずつ読み込まれ、レジスタ１５２に１列分のメッセージD102が積算された値が格納された場合、すなわち、レジスタ１５２に、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値（ｊ＝１からdvまでのΣuj)が格納された場合、セレクタ１５３は、レジスタ１５２に格納されている値、すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算された積算値D151（ｊ＝１からdvまでのΣuj)を選択し、レジスタ１５４に出力して格納させる。
【００５８】
レジスタ１５４は、格納している値D151を、値D152として、セレクタ１５３と演算器１５６に供給する。レジスタ１５２に１列分のメッセージD102が積算された値が格納される直前までは、セレクタ１５３は、レジスタ１５４から供給された値D152を選択し、レジスタ１５４に出力し再格納させる。すなわち、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）が積算されるまで、レジスタ１５４は、前回積算された値を、セレクタ１５３と演算器１５６に供給する。
【００５９】
一方、FIFOメモリ１５５は、レジスタ１５４から新たな値D152（ｊ＝１からdvまでのΣuj)が出力されるまでの間、チェックノードからのメッセージD102を遅延し、値D153として演算器１５６に供給する。演算器１５６は、レジスタ１５４から供給された値D152から、FIFOメモリ１５５から供給された値D153を減算する。すなわち、演算器１５６は、検査行列の１列に亘る全ての枝からのメッセージD102（メッセージuj）の積算値（ｊ＝１からdvまでのΣuj）から、求めたい枝からのメッセージujを減算して、その減算値（ｊ＝１からdv-1までのΣuj）を求め、演算器１５７に供給する。
【００６０】
演算器１５７は、入力ポートP101からの受信データD101と、演算器１５６からの減算値（ｊ＝１からdv-1までのΣuj）とを加算し、その結果得られる加算値をメッセージD103（メッセージvi）として、出力ポートP103から出力する。
【００６１】
以上のように、バリアブルノード計算器１０２では、式（１）のバリアブルノード演算（vi=uoi＋Σuj）が行われ、その結果得られるメッセージ（バリアブルノードメッセージ）viが、出力ポートP103から出力される。
【００６２】
図１０は、チェックノード演算を１つずつ行う図８のチェックノード計算器１０３の構成例を示している。
【００６３】
チェックノード計算器１０３は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、１つの入力ポートP111を有し、外部にメッセージを供給（出力）するポートとして、１つの出力ポートP112を有している。そして、チェックノード計算器１０３は、入力ポートP111から入力されるメッセージを用いて、式（７）のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP112から出力する。
【００６４】
すなわち、入力ポートP111には、メッセージメモリ１０４から読み出されたメッセージD104（バリアブルノードメッセージvi）が供給される。
【００６５】
チェックノード計算器１０３では、検査行列の各列に対応するバリアブルノードからのメッセージD104（メッセージvi）が入力ポートP111から１つずつ読み込まれ、その最上位ビットを除く下位ビット、つまり、メッセージD104の絶対値D122(|vi|)が、LUT１２１に供給されるとともに、最上位ビット、つまりメッセージD104の符号ビット（正負を表すビット）D121が、EXOR回路１２９とFIFO(First In First Out)メモリ１３３にそれぞれ供給される。
【００６６】
LUT１２１は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の演算結果を出力するLUTであり、絶対値D122(|vi|)の供給に対して、非線形関数φ(|vi|)の演算を行った演算結果D123（φ(|vi|)）を読み出し、演算器１２２とFIFOメモリ１２７に供給する。
【００６７】
演算器１２２は、演算結果D123（φ(|vi|)）とレジスタ１２３に格納されている値D124とを加算することにより、演算結果D123を積算し、その結果得られる積算値をレジスタ１２３に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の絶対値D122(|vi|)に対する演算結果D123（φ(|vi|)）が積算された場合、レジスタ１２３は０にリセットされる。
【００６８】
検査行列の１行に亘るメッセージD104が１つずつ読み込まれ、レジスタ１２３に１行分の演算結果D123が積算された積算値が格納された場合、セレクタ１２４は、レジスタ１２３に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算された積算値D124（ｉ＝１からｄcまでのΣφ(|vi|)）を選択し、値D125として、レジスタ１２５に出力して格納させる。レジスタ１２５は、格納している値D125を、値D126として、セレクタ１２４と演算器１２６に供給する。
【００６９】
レジスタ１２３に１行分の演算結果D123が積算された積算値が格納される直前までは、セレクタ１２４は、レジスタ１２５から供給された値D126を選択し、レジスタ１２５に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)が積算されるまで、レジスタ１２５は、前回積算されたφ(|vi|)の積算値を、セレクタ１２４と演算器１２６に供給する。
【００７０】
一方、FIFOメモリ１２７は、レジスタ１２５から新たな値D126（ｉ＝１からdcまでのΣφ(|vi|)）が出力されるまでの間、LUT１２１が出力した演算結果D123（φ(|vi|)）を遅延し、値D127として演算器１２６に供給する。演算器１２６は、レジスタ１２５から供給された値D126から、FIFOメモリ１２７から供給された値D127を減算し、その減算結果を、減算値D128としてLUT１２８に供給する。すなわち、演算器１２６は、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）から求められたφ(|vi|)の積算値（ｉ＝１からdcまでのΣφ(|vi|)）から、求めたい枝からのメッセージ（ｉ＝dcのメッセージvi）から求められたφ(|vi|)を減算して、その減算値（ｉ＝１からdc-1までのΣφ(|vi|)）を減算値D128としてLUT１２８に供給する。
【００７１】
LUT１２８は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の逆関数φ-1(x)の演算結果を出力するLUTであり、演算器１２６からの減算値D128（ｉ＝１からdc-1までのΣφ(|vi|)）の供給に対して、逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D129（φ-1(Σφ(|vi|)))を出力する。
【００７２】
なお、上述したように、同一の引数xに対する非線形関数φ(x)の演算結果と逆関数φ-1(x)の演算結果とは等しいので、LUT１２１と１２８とは、同一構成のLUTとなっている。
【００７３】
以上の処理と並行して、EXOR回路１２９は、レジスタ１３０に格納されている値D131と符号ビット（正負を表すビット）D121との排他的論理和を演算することにより、メッセージD104の符号ビットD121どうしの乗算を行い、乗算結果D130をレジスタ１３０に再格納する。なお、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された場合、レジスタ１３０はリセットされる。
【００７４】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納された場合、セレクタ１３１は、レジスタ１３０に格納されている値、すなわち、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131（ｉ＝１からdcまでのΠsign(vi)）を選択し、値D132としてレジスタ１３２に出力して格納させる。レジスタ１３２は、格納している値D132を、値D133としてセレクタ１３１とEXOR回路１３４に供給する。
【００７５】
検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130（ｉ＝１からdcまでのΠsign(vi)）がレジスタ１３０に格納される直前までは、セレクタ１３１は、レジスタ１３２から供給された値D133を選択し、レジスタ１３２に出力して再格納させる。すなわち、検査行列の１行に亘る全ての枝からのメッセージD104（メッセージvi）の符号ビットD121が乗算されるまで、レジスタ１３２は、前回格納した値を、セレクタ１３１とEXOR回路１３４に供給する。
【００７６】
一方、FIFOメモリ１３３は、レジスタ１３２から新たな値D133（ｉ＝１からdcまでのΠsign(vi)）がEXOR回路１３４に供給されるまでの間、符号ビットD121を遅延し、１ビットの値D134としてEXOR回路１３４に供給する。EXOR回路１３４は、レジスタ１３２から供給された値D133と、FIFOメモリ１３３から供給された値D134との排他的論理和を演算することにより、値D133を、値D134で除算し、除算結果を除算値D135として出力する。すなわち、EXOR回路１３４は、検査行列の１行に亘る全ての枝からのメッセージD104の符号ビットD121（sign(vi)）の乗算値を、求めたい枝からのメッセージD104の符号ビットD121（sign(vi)）で除算して、その除算値（ｉ＝１からdc-1までのΠsign(vi)）を除算値D135として出力する。
【００７７】
そして、チェックノード計算器１０３では、LUT１２８から出力された演算結果D129を下位ビットとするとともに、EXOR回路１３４から出力された除算値D135を最上位ビット（符号ビット）とするビット列がメッセージD105（メッセージuj）として、出力ポートP112から出力される。
【００７８】
以上のように、チェックノード計算器１０３では、式（７）の演算が行われ、メッセージ（チェックノードメッセージ）ujが求められる。
【００７９】
なお、図示しないが、図８の復号装置では、復号の最終段（例えば、あらかじめ定められた繰り返し復号の回数Nだけ行われるバリアブルノード演算及びチェックノード演算のうちの最後に行われるバリアブルノード演算）において、式（１）のバリアブルノード演算の代わりに、式（５）の演算が行われ、その演算結果が、最終的な復号結果として出力される。
【００８０】
図８の復号装置によれば、メッセージメモリ１０４（図８）、バリアブルノード計算器１０２（図９）のFIFOメモリ１５５、チェックノード計算器１０３（図１０）のFIFOメモリ１２７及び１３３の容量さえ足りれば、様々な検査行列のLDPC符号を復号することができる。
【００８１】
図８の復号装置を繰り返し用いて復号する場合には、チェックノード計算とバリアブルノード計算を交互に行う必要があるため、１回復号するのにメッセージの数の２倍のクロック数が必要となる。但し、検査行列の構造を持つ LDPC符号の場合、各ノード計算器をP個持つ事で、1/P のクロック数で復号させることが可能になる。
【００８２】
以下、LDPCの単位行列毎にパラレルにノード演算を行う構成を有するLDPC符号の復号装置について説明する。なお、以下、かかる演算を、パリティパラレルの復号（partly parallel decoding）と称する。
【００８３】
パリティパラレルの復号を行うLDPC符号の復号装置において、P×Pの単位行列、その1のうち１個から数個が0になった行列、その cyclicshift、それらの複数の和、P×Pの0行列の組合せで表わすことができる検査行列を持つLDPC符号を復号する際には、チェックノード演算とバリアブルノード演算とをP個同時に行うことが可能になる。
【００８４】
例えば図１１は、6×6の単位行列、その 1 のうち1 個が 0 になった行列、それらの cyclic shift、それらの和、6×6の 0 行列の組み合わせで表わされる検査行列Hの一例を示している。なお、この符号は符号化率2/3、符号長108とされている。
【００８５】
さらに、以下、別個のバリアブルノード計算器とチェックノード計算器とを採用する代わりに、チェックノード演算とバリアブルノード演算との両演算を同一回路で切り替えて処理できるノード計算器を採用した場合の例として、パリティパラレルの復号を説明する。
【００８６】
図１２は、LDPC符号の復号であって、ノード計算器を用いてパリティパラレルの復号を行う復号装置の構成例を示している。ただし、図１２の例では、LDPC符号として上述した図１１の符号を復号することが想定されている。
【００８７】
図８の復号装置は、受信データメモリ２００、メッセージメモリ２０１、P=6個のノード計算器２１０−１乃至２１０−６を含むメッセージ計算部２０２、制御部２０３からなる。
【００８８】
なお、以下、ノード計算器２１０−１乃至２１０−６を個々に区別する必要が無い場合、これらをまとめて、ノード計算器２１０と称する。
【００８９】
受信データメモリ２００には、送信されてきたLDPC符号を受信することにより得られる、符号の0（又は1）らしさを表す対数尤度比である受信データ（LDPC符号）D200が供給され、受信データメモリ２００は、その受信データD200を格納（記憶）する。
【００９０】
バリアブルノード演算時には、受信データメモリ２００は、制御部２０３から供給される制御信号に従って、記憶している受信データを読み出し、受信データD201として、メッセージ計算部２０２のノード計算器２１０に供給する。
【００９１】
メッセージメモリ２０１は、制御部２０３の制御に基づいてメッセージデータを格納し、また適宜読み出すメモリである。すなわち、メッセージメモリ２０１は、ノード計算器２１０にメッセージD202，D203を適宜供給し、また、ノード計算器２１０の出力メッセージD204をメモリに適宜格納する。メッセージメモリ２０１は、２つのメッセージデータを同時に読み出すことができるように、独立に制御可能な２つ以上のメモリで構成されている。
【００９２】
メッセージ計算部２０２の各ノード計算器２１０は、バリアブルノード演算とチェックノード演算とを切り替えて処理することが可能な演算器である。
【００９３】
すなわち、バリアブルノード演算時には、ノード計算器２１０は、メッセージメモリ２０１から供給されるメッセージD202，D203と受信データメモリ２００から供給される受信データD201を用いて、式(１)等に従ってバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ（バリアブルノードメッセージ）viを、メッセージD204として、メッセージメモリ２０１に供給する。
【００９４】
また、チェックノード演算時には、ノード計算器２１０は、メッセージメモリ２０１から供給されるメッセージD202，D203を用いて、式(７)等に従ってチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ（チェックノードメッセージ）ujを、メッセージD204として、メッセージメモリ２０１に供給する。
【００９５】
ここでは、単位行列あたりのバリアブルノード 6個をパラレルに演算すべく、P=6個のノード計算器２１０−１乃至２１０−６が設けられている。例えば、1受信データ当りのビット数mを6とした場合、単位行列が6 ×6のサイズとなるので、受信データメモリ２００は、図１２に示されるように、1wordあたり36bitのRAMで構成されている。ノード演算は、単位行列あたりパラレルに行われるので、受信データメモリ２００から単位行列分のデータが同時に各ノード演算器２１０−１乃至２１０−６に送られる。
【００９６】
図１３は、式(１)に従ったバリアブルノード演算と、式(７)に従ったチェックノード演算とを相互に切り替えて行う図１２のノード計算器２１０の構成例を示している。
【００９７】
ノード計算器２１０は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、３つの入力ポートP301,P302,P303を有し、外部にメッセージを供給（出力）するポートとして、１つの出力ポートP304を有している。
【００９８】
すなわち、入力ポートP301には、図１２の受信データメモリ２００から読み出された受信データD201が供給される。また、入力ポートP302,P303には、メッセージメモリ２０１から読み出されたメッセージD202，D203が供給される。そして、後述するメッセージD321が、出力メッセージD204として出力ポートP304から出力されてメッセージメモリ２０１に供給される。
【００９９】
図１３のノード計算器２１０は、セレクタ３０１,３１１，３１６を有している。これらのセレクタ３０１,３１１，３１６が“v”の側を選択した場合には、図１３のノード計算器２１０はバリアブルノード演算を行うことになる。これに対して、セレクタ３０１,３１１，３１６が“c”の側を選択した場合には、図１３のノード計算器２１０はチェックノード演算を行うことになる。
【０１００】
まず、バリアブルノード演算を行う場合の動作の観点から、図１３のノード計算器２１０の説明をする。
【０１０１】
メッセージメモリ２０１から供給される 検査行列の１列に対応するチェックノードからのメッセージD202が入力ポートP302を介して、メッセージD301（メッセージuj）として一つずつ入力され、セレクタ３０１を通過してメッセージD306として加算器３０２に入力される。加算器３０２において、このメッセージD306に対して、レジスタ３０３に格納してあるデータD307が加算されて、その加算値がレジスタ３０３に再格納される。このように、データD307は、メッセージD301（メッセージuj）の積算値となる。
【０１０２】
1列分のメッセージD301（メッセージuj）が積算されると、その積算値D307（ｊ＝１からdvまでのΣuj)はセレクタ３０４を通過して、レジスタ３０５に格納される。
【０１０３】
また、ポートP302に入力されたメッセージD301（メッセージuj）と同じ値が再びメッセージメモリ２０１からメッセージD203として読み出されて、入力ポートP303を介して、遅延入力メッセージD302として、再び入力される。
【０１０４】
遅延入力メッセージD302は、セレクタ３１１を通過して、減算器３１２においてレジスタ３０５に格納されている積算メッセージD308から減算されて、その減算値D316（ｊ＝１からdv-1までのΣuj）が加算器３１３に供給される。加算器３１３にはまた、受信データメモリ２００からの受信データD201(u0i)が、入力ポートP301を介して受信データD300として供給される。そこで、加算器３１３において、減算値D316（ｊ＝１からdv-1までのΣuj）に対して、受信データD300 (u0i)が加算され、その加算値D317（ｊ＝１からdv-1までのΣuj＋u0i)がセレクタ３１６を通過して、メッセージD321となる。このメッセージD312が、出力メッセージD204として出力ポートP304から出力されてメッセージメモリ２０１に供給される。
【０１０５】
以上の内容を換言すると、図１３のノード計算器２１０は、バリアブルノードに繋がっている全てのチェックノードからのメッセージと受信データの和から、求めたいチェックノードからのメッセージを引いて、求めたい枝 (edge)へのメッセージを計算することで、式(１)の演算を実現している。
【０１０６】
次に、チェックノード演算を行う場合の動作の観点から、図１３のノード計算器２１０の説明をする。
【０１０７】
メッセージメモリ２０１から供給される 検査行列の１行に対応するバリアブルノードからのメッセージD202が入力ポートP302を介して、メッセージD301（メッセージvi）として一つずつ入力され、その絶対値D303(|vi|)がLUT３００に供給される。
【０１０８】
LUT３００は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の演算結果を出力するLUTであり、絶対値D303(|vi|)の供給に対して、非線形関数φ(|vi|)の演算を行った演算結果D305（φ(|vi|)）を読み出す。
【０１０９】
この演算結果D305（φ(|vi|)）は、セレクタ３０１を通過してメッセージD306として加算器３０２に入力される。加算器３０２において、このメッセージD306に対して、レジスタ３０３に格納してあるデータD307が加算されて、その加算値がレジスタ３０３に再格納される。このように、データD307は、演算結果D305（φ(|vi|)）の積算値となる。
【０１１０】
1行分のメッセージD301（メッセージvi）の各演算結果D305（φ(|vi|)）が積算されると、その積算値D307（i＝１からdcまでのΣφ(|vi|))はセレクタ３０４を通過して、レジスタ３０５に格納される。
【０１１１】
また、ポートP302に入力されたメッセージD301（メッセージvi）と同じ値が再びメッセージメモリ２０１からメッセージD203として読み出されて、入力ポートP303を介して、遅延入力メッセージD302として、再び入力される。
【０１１２】
遅延入力メッセージD302は、入力メッセージD301に対するLUT３００の演算と同様に、LUT３１０において、その絶対値 D312(|vi|)の供給に対して、非線形関数φ(|vi|)の演算が行われ、その演算結果D314（φ(|vi|)）が読み出される。
【０１１３】
この演算結果D314（φ(|vi|)）は、セレクタ３１１を通過してメッセージD315として減算器３１２に入力される。
【０１１４】
減算器３１２において、レジスタ３０５に格納されている積算メッセージD308から、メッセージD315が減算され、その減算値D316（i＝１からdc-1までのΣφ(|vi|))はLUT３１４に提供される。
【０１１５】
LUT３１４は、そこに入力される値を引数xとして、式（７）のチェックノード演算における非線形関数φ(x)の逆関数φ-1(x)の演算結果を出力するLUTであり、減算器３１２からの減算値D316（ｉ＝１からdc-1までのΣφ(|vi|)）の供給に対して、逆関数φ-1（Σφ(|vi|)）の演算を行った演算結果D318（φ-1(Σφ(|vi|)))を出力する。
【０１１６】
以上の処理と並行して、各メッセージD301の正負を表す符号ビット(sign bit)D304 (sign(vi))と、レジスタ３０７に格納されている値D310との排他的論理和がEXOR回路３０６において演算されることで、その演算結果D309がレジスタ３０７に再格納される。
【０１１７】
レジスタ３０７において、1行分の符号ビットが積算されたところで、その積算値D310(ｉ＝１からdcまでのΠsign(vi)）がセレクタ３０８を通過して、レジスタ３０９に格納される。
【０１１８】
また、積算に用いられた値D304(sign(vi))は遅延入力メッセージの符号ビットD313 として再度入力ポートP303から入力され、EXOR回路３１５に入力される。この符号ビットD313と、レジスタ３０９の積算値D311との排他的論理和がEXOR回路３１５において演算されることで、その演算結果、即ちｉ＝１からdc-1までのΠsign(vi)が符号ビットD319として出力される。
【０１１９】
最終的に、LUT３１４の演算結果D318（φ-1(Σφ(|vi|)))に対して、この符号ビットD319が付加された値D320が、セレクタ３１６を通過してメッセージD321となる。このメッセージD312が、出力メッセージD204として出力ポートP304から出力されてメッセージメモリ２０１に供給される。
【０１２０】
以上の内容を換言すると、図１３のノード計算器２１０は、チェックノードに繋がっている全てのバリアブルノードからのメッセージの和から、求めたいバリアブルノードからのメッセージを引くことで、式(７)の演算を実現している。
【０１２１】
ところで、バリアブルノード演算(式(１))とチェックノード演算(式(７))とは、u'j =φ(|uj|) × sign(uj)と置き換えることで、次の式（９），式（１０）のように書き直すことができる。
【０１２２】
【数９】
2008301152.tif 000011
・・・（９）
【数１０】
2008301152.tif 000012
・・・（１０）
【０１２３】
ここで、φ(x)＝φ-1(x)である。すなわち、バリアブルノード演算(式(９))とチェックノード演算(式(１０))のどちらの演算も入力データの絶対値に対してφ(x)の演算が行われることになる。そこで、チェックノード演算の場合には絶対値での積算を行い、別に求めた符号をかけて出力メッセージを計算することができる。一方、バリアブルノード演算の場合には符号ビットも含めて加算を行い、更に受信データを加算して出力メッセージとすることができる。
【０１２４】
図１４は、式(９)に従ったバリアブルノード演算と、式(１０)に従ったチェックノード演算とを相互に切り替えて行う図１２のノード計算器２１０の構成例を示している。
【０１２５】
ノード計算器２１０は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、３つの入力ポートP601,P602,P603を有し、外部にメッセージを供給（出力）するポートとして、１つの出力ポートP604を有している。
【０１２６】
すなわち、入力ポートP601には、図１２の受信データメモリ２００から読み出された受信データD201が供給される。また、入力ポートP602,P603には、メッセージメモリ２０１から読み出されたメッセージD602，D603が供給される。そして、後述するメッセージD622が、出力メッセージD204として出力ポートP604から出力されてメッセージメモリ２０１に供給される。
【０１２７】
図１４のノード計算器２１０は、セレクタ６０１,６１１，６１５を有している。これらのセレクタ６０１,６１１，６１５が“v”の側を選択した場合には、図１４のノード計算器２１０はバリアブルノード演算を行うことになる。これに対して、セレクタ６０１,６１１，６１５が“c”の側を選択した場合には、図１４のノード計算器２１０はチェックノード演算を行うことになる。
【０１２８】
まず、バリアブルノード演算を行う場合の動作の観点から、図１４のノード計算器２１０の説明をする。
【０１２９】
メッセージメモリ２０１から供給される 検査行列の１列に対応するチェックノードからのメッセージD202が入力ポートP602を介して、メッセージD601（メッセージu'j）として一つずつ入力される。その絶対値D603 (|u'j|)を引数xとするφ-1(x)の演算がLUT６００にて行われ、その演算結果D605 (|uj|)に符号ビットD604(sign(uj))がかけられた値D606(メッセージuj)がセレクタ６０１を通過して、値D607として加算器６０２に供給される。この値D607は、加算器６０２において、レジスタ６０３に格納されていたデータD608と加算されて、レジスタ ６０３に再格納される。このように、データD608は、メッセージD607（メッセージuj）の積算値となる。
【０１３０】
1列分のメッセージD607（メッセージuj）が積算されると、その積算値D608（ｊ＝１からdvまでのΣuj)はセレクタ６０４を通過して、レジスタ６０５に格納される。
【０１３１】
また、ポートP602に入力されたメッセージD601（メッセージu'j）と同じ値が再びメッセージメモリ２０１からメッセージD203として読み出されて、入力ポートP603を介して、遅延入力メッセージD602として、再び入力される。
【０１３２】
遅延入力メッセージD602のうちの、絶対値D613(|u'j|)を引数xとするφ-1(x)の演算がLUT６１０にて行われ、その演算結果D615(|uj|)に符号ビットD614(sign(uj))がかけられた値D616(メッセージuj)がセレクタ６１１を通過して、値D617として減算器６１２に供給される。
【０１３３】
減算器６１２において、レジスタ６０５に格納されている積算メッセージD609 から、この値D617が減算されて、その減算値D618（ｊ＝１からdv-1までのΣuj）が加算器６１３に供給される。加算器６１３にはまた、受信データメモリ２００からの受信データD201(u0i)が、入力ポートP601を介して受信データD600として供給される。そこで、加算器６１３において、減算値D618（ｊ＝１からdv-1までのΣuj）に対して、受信データD600 (u0i)が加算され、その加算値D619（ｊ＝１からdv-1までのΣuj＋u0i)がセレクタ６１５を通過して、メッセージD622となる。このメッセージD622が、出力メッセージD204として出力ポートP604から出力されてメッセージメモリ２０１に供給される。
【０１３４】
以上の内容を換言すると、図１４のノード計算器２１０は、バリアブルノードに繋がっている全てのチェックノードからのメッセージと受信データの和から、求めたいチェックノードからのメッセージを引いて、求めたい枝（edge）へのメッセージを計算することで、式(９)の演算を実現している。
【０１３５】
次に、チェックノード演算を行う場合の動作の観点から、図１４のノード計算器２１０の説明をする。
【０１３６】
メッセージメモリ２０１から供給される 検査行列の１行に対応するバリアブルノードからのメッセージD202が入力ポートP602を介して、メッセージD601（メッセージvi）として一つずつ入力され、その絶対値D603(|vi|)がLUT６００に供給される。その絶対値D603 (|vi|)を引数xとするφ(x)の演算がLUT６００にて行われ、その演算結果D605 (φ|vi|)がセレクタ６０１を通過して、値D607として加算器６０２に供給される。この値D607は、加算器６０２において、レジスタ６０３に格納されていたデータD608と加算されて、レジスタ ６０３に再格納される。このように、データD608は、演算結果D607（φ(|vi|)）の積算値となる。
【０１３７】
1行分のメッセージD601（メッセージvi）の各演算結果D607（φ(|vi|)）が積算されると、その積算値D608（i＝１からdcまでのΣφ(|vi|))はセレクタ６０４を通過して、レジスタ６０５に格納される。
【０１３８】
また、ポートP602に入力されたメッセージD601（メッセージvi）と同じ値が再びメッセージメモリ２０１からメッセージD203として読み出されて、入力ポートP603を介して、遅延入力メッセージD602として、再び入力される。
【０１３９】
遅延入力メッセージD602は、入力メッセージD601に対するLUT６００の演算と同様に、LUT６１０において、その絶対値 D613(|vi|)を引数xとするφ(x)の演算が行われ、その演算結果D615（φ(|vi|)）が読み出される。
【０１４０】
この演算結果D615（φ(|vi|)）は、セレクタ６１１を通過してメッセージD617として減算器６１２に入力される。
【０１４１】
減算器６１２において、レジスタ６０５に格納されている積算メッセージD609から、メッセージD617が減算され、その減算値D618（i＝１からdc-1までのΣφ(|vi|))が出力される。
【０１４２】
以上の処理と並行して、各メッセージD601の正負を表す符号ビット(sign bit)D604 (sign(vi))と、レジスタ６０７に格納されている値D611との排他的論理和がEXOR回路６０６において演算されることで、その演算結果D610がレジスタ６０７に再格納される。
【０１４３】
レジスタ６０７において、1行分の符号ビットが積算されたところで、その積算値D611(ｉ＝１からdcまでのΠsign(vi)）がセレクタ６０８を通過して、レジスタ６０９に格納される。
【０１４４】
また、積算に用いられた値D604(sign(vi))は遅延入力メッセージの符号ビットD614として再度入力ポートP603から入力され、EXOR回路６１４に入力される。この符号ビットD614と、レジスタ６０９の積算値D612との排他的論理和がEXOR回路６１４において演算されることで、その演算結果、即ちｉ＝１からdc-1までのΠsign(vi)が符号ビットD620として出力される。
【０１４５】
最終的に、減算器６１２からの減算値D618（i＝１からdc-1までのΣφ(|vi|))に対して、この符号ビットD620が付加された値D621が、セレクタ６１５を通過してメッセージD622となる。このメッセージD622が、出力メッセージD204として出力ポートP604から出力されてメッセージメモリ２０１に供給される。
【０１４６】
以上の内容を換言すると、図１４のノード計算器２１０は、チェックノードに繋がっている全てのバリアブルノードからのメッセージの和から、求めたいバリアブルノードからのメッセージを引くことで、式(１０)の演算を実現している。
【０１４７】
さらに、バリアブルノード演算(式(１))と チェックノード演算(式(７))は、v'i =φ(|vi|)×sign(vi)と置き換えることで、次の式（１２），式（１３）のように書き直すことができる。なお、式（１１）は、式（１２）との比較を容易にすべく、式（１）を再度書いたものである。
【０１４８】
【数１１】
2008301152.tif 000013
・・・（１１）
【数１２】
2008301152.tif 000014
・・・（１２）
【数１３】
2008301152.tif 000015
・・・（１３）
【０１４９】
ここで、φ(x)＝φ-1(x)である。すなわち、バリアブルノード演算(式(１２))とチェックノード演算(式(１３))のどちらの演算も入力データの絶対値に対してφ(x)の演算が行われることになる。そこで、チェックノード演算の場合には入力データに対して絶対値での積算行い、そのφ(x)の演算を行った後に、別に求めた符号ビットをかけて出力メッセージを計算することができる。一方、バリアブルノード演算の場合には入力データを符号ビットも含めて積算を行い、更に受信データを加算した後、その絶対値に対して、φ(x)の演算を行い、符号ビットをかけたものを出力メッセージとすることができる。
【０１５０】
図１５は、式(１２)に従ったバリアブルノード演算と、式(１３)に従ったチェックノード演算とを相互に切り替えて行う図１２のノード計算器２１０の構成例を示している。
【０１５１】
ノード計算器２１０は、外部からメッセージ（データ）が供給（入力）される入力ポートとして、３つの入力ポートP701,P702,P703を有し、外部にメッセージを供給（出力）するポートとして、１つの出力ポートP704を有している。
【０１５２】
すなわち、入力ポートP701には、図１２の受信データメモリ２００から読み出された受信データD201が供給される。また、入力ポートP702,P703には、メッセージメモリ２０１から読み出されたメッセージD702，D703が供給される。そして、後述するメッセージD722が、出力メッセージD204として出力ポートP704から出力されてメッセージメモリ２０１に供給される。
【０１５３】
図１５のノード計算器２１０は、セレクタ７００,７０５，７１２，７１５を有している。これらのセレクタ７００,７０５，７１２，７１５が“v”の側を選択した場合には、図１５のノード計算器２１０はバリアブルノード演算を行うことになる。これに対して、セレクタ７００,７０５，７１２，７１５が“c”の側を選択した場合には、図１５のノード計算器２１０はチェックノード演算を行うことになる。
【０１５４】
まず、バリアブルノード演算を行う場合の動作の観点から、図１５のノード計算器２１０の説明をする。
【０１５５】
メッセージメモリ２０１から供給される 検査行列の１列に対応するチェックノードからのメッセージD202が入力ポートP702を介して、メッセージD701（メッセージuj）として一つずつ入力され、セレクタ７００を通過してメッセージD705として加算器７０１に入力される。加算器７０１において、このメッセージD705に対して、レジスタ７０２に格納してあるデータD706と加算されて、レジスタ７０２に再格納される。このように、データD706は、メッセージD701（メッセージuj）の積算値となる。
【０１５６】
1列分のメッセージD701（メッセージuj）が積算されると、その積算値D706（ｊ＝１からdvまでのΣuj)はセレクタ７０３を通過して、レジスタ７０４に格納される。
【０１５７】
また、ポートP702に入力されたメッセージD701（メッセージuj）と同じ値が再びメッセージメモリ２０１からメッセージD203として読み出されて、入力ポートP703を介して、遅延入力メッセージD702として、再び入力される。
【０１５８】
遅延入力メッセージD702は、セレクタ７０５を通過して、減算器７１０においてレジスタ７０４に格納されている積算メッセージD707から減算されて、その減算値D714（ｊ＝１からdv-1までのΣuj）が加算器７１１に供給される。加算器７１１にはまた、受信データメモリ２００からの受信データD700(u0i)が、入力ポートP701を介して受信データD700として供給される。そこで、加算器７１１において、減算値D714（ｊ＝１からdv-1までのΣuj）に対して、受信データD700 (u0i)が加算され、その加算値D715（ｊ＝１からdv-1までのΣuj＋u0i=vi）の絶対値D716(|vi|)が、セレクタ７１２を通過して、絶対値D718(|vi|)となりLUT７１３に供給される。絶対値D718(|vi|)を引数xとするφ(x)の演算がLUT７１３にて行われ、その演算結果D719(φ|vi|)が出力される。
【０１５９】
以上の処理と並行して、加算部７１１からの加算値D715（vi）の符号ビット(sign bit)D717(sign(vi))が、セレクタ７１５を通過して符号ビットD721となる。この符号ビットD721が、LUT７１３の演算結果D719(φ|vi|)に掛け合わされてメッセージD722（φ|vi|×sign(vi))となる。このメッセージD722が、出力メッセージD204として出力ポートP704から出力されてメッセージメモリ２０１に供給される。
【０１６０】
以上の内容を換言すると、図１５のノード計算器２１０は、バリアブルノードに繋がっている全てのチェックノードからのメッセージと受信データの和から、求めたいチェックノードからのメッセージを引いて、求めたい枝（edge）へのメッセージを計算することで、式(１２)の演算を実現している。
【０１６１】
次に、チェックノード演算を行う場合の動作の観点から、図１５のノード計算器２１０の説明をする。
【０１６２】
メッセージメモリ２０１から供給される 検査行列の１行に対応するバリアブルノードからのメッセージD202が入力ポートP702を介して、メッセージD701（メッセージv'i）として一つずつ入力され、その絶対値D703(|v'i|)がセレクタ７００を通過して絶対値D705として加算器７０１に入力される。加算器７０１において、この絶対値D705に対して、レジスタ７０２に格納してあるデータD706が加算されて、レジスタ７０２に再格納される。このように、データD706は、絶対値D703(|v'i|)の積算値となる。
【０１６３】
1行分のメッセージD701（メッセージv'i）の絶対値D703(|v'i|)が積算されると、その積算値D706（i＝１からdcまでのΣ|v'i|)はセレクタ７０３を通過して、レジスタ７０４に格納される。
【０１６４】
また、ポートP702に入力されたメッセージD701（メッセージv'i）と同じ値が再びメッセージメモリ２０１からメッセージD203として読み出されて、入力ポートP703を介して、遅延入力メッセージD702として、再び入力される。
【０１６５】
遅延入力メッセージD702の絶対値 D711(|v'i|)はセレクタ７０５を通過して、減算器７１０においてレジスタ７０４に格納されている積算メッセージD707から減算されて、その減算値D714（i＝１からdc-1までのΣ|v'i|)がセレクタ７１２を通過して減算値D718としてLUT７１３に供給される。LUT７１３において、その減算値 D718(i＝１からdc-1までのΣ|v'i|)を引数xとするφ-1(x)の演算が行われ、その演算結果D719（φ-1（Σ|v'i|)  ただし、i＝１からdc-1まで）が読み出される。
【０１６６】
以上の処理と並行して、各メッセージD701の正負を表す符号ビット(sign bit)D704 (sign(v'i))と、レジスタ７０７に格納されている値D709との排他的論理和がEXOR回路７０６において演算されることで、その演算結果D708がレジスタ７０７に再格納される。
【０１６７】
レジスタ７０７において、1行分の符号ビットが積算されたところで、その積算値D709(ｉ＝１からdcまでのΠsign(v'i)）がセレクタ７０８を通過して、レジスタ７０９に格納される。
【０１６８】
また、積算に用いられた値D704(sign(v'i))は遅延入力メッセージの符号ビットD712として再度入力ポートP703から入力され、EXOR回路７１４に入力される。この符号ビットD712と、レジスタ７０９の積算値D710との排他的論理和がEXOR回路７１４において演算されることで、その演算結果、即ちｉ＝１からdc-1までのΠsign(v'i)が符号ビットD720として出力される。この符号ビットD720は、セレクタ７１５を通過してさらに符号ビットD721になる。
【０１６９】
最終的に、LUT７１３の演算結果D719（φ-1（Σ|v'i|)  ただし、i＝１からdc-1まで）に対して、この符号ビットD721が付加された値が、メッセージD722となる。このメッセージD722が、出力メッセージD204として出力ポートP704から出力されてメッセージメモリ２０１に供給される。
【０１７０】
以上の内容を換言すると、図１５のノード計算器２１０は、チェックノードに繋がっている全てのバリアブルノードからのメッセージの和から、求めたいバリアブルノードからのメッセージを引くことで、式(１３)の演算を実現している。
【０１７１】
なお、図示はしないが、復号の最終段においては、バリアブルノード演算の代わりに式(５)の演算を行い、その演算結果を復号結果として出力することになる。
【非特許文献１】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 parse 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符号の復号器では、メモリの回路規模はかなり大きく無視できない。特に、受信データメモリは、符号長n×1受信データ当りのビット数mの大きさのRAMが必要となり、これをいかに削減するかが課題である。
【０１７３】
即ち、複数のノード計算器を持ち、並列演算を行う従来の受信データメモリは、並列度Pに応じたbit幅のRAMが必要となっていた。
【０１７４】
例えば上述した図１２の例では並列度P=6としたため、P=６個のノード計算器２１０−１乃至２１０−６が採用されていた。そして、1受信データ当りのビット数mが6とされたため、受信データメモリ２００は、1wordあたり36bit(=P×m)のRAMで構成されていた。
【０１７５】
ところが、実際の並列度P=6よりもさらに高くなる場合が多い。このような場合、従来の受信データメモリは、受信値一つ当たり数 bitで量子化されている軟値を格納する必要があるため、数千ビット程度のビット幅のRAMが必要になってくることもある。
【０１７６】
一方で、物理的なRAM(RAMマクロ)は高々数百ビット程度のビット幅のRAMしか現状存在しないため、数千ビット程度のビット幅のRAMによる受信データメモリを実現するためには、これらのRAMマクロを複数個組み合わせる必要がでてくる。かかるRAMには、指定アドレスに読み書きを行うための制御回路が内蔵されていることを考慮すると、受信データメモリに使用するRAMマクロの個数が多くなればなるほど、その回路規模は増大してしまうことになる。
【０１７７】
例えば、上述のP並列演算復号器においてP=6（図１２の例）ではなくP=360を採用した場合、受信データ一つ当たりのビット数（量子化ビット数）mを同じく6bitとすると、図示はしないが、P×m=360×6=2160bit幅のRAMが、受信データメモリに必要となってくる。RAMマクロのビット幅の上限を120bit幅とすると、受信データメモリを構成するためには、RAMマクロを2160/120= 18個も使うことになる。このことが、P並列演算復号器の回路規模を増大させる要因となっていた。
【０１７８】
また、RAMマクロの個数自体は減らすことのみを目的とした場合には、例えば、受信データ一つ当たりのビット数（量子化ビット数）mを減らすことで、かかる目的を達成できる。しかしながら、受信データ一つ当たりのビット数（量子化ビット数）mを減らすことは、その分復号性能を劣化させてしまうことになり、得策ではない。
【０１７９】
本発明は、このような状況に鑑みてなされたものであり、復号性能を維持しつつその回路規模縮小を図ることを目的とするものである。
【課題を解決するための手段】
【０１８０】
本発明の一側面の復号装置は、LDPC(Low Density Parity Check)符号を復号する復号装置であって、送信されてきた前記LDPC符号を受信することにより得られる受信データを記憶する受信データ記憶手段と、前記LDPC符号の復号をするためのバリアブルノードの演算、またはチェックノードの演算に用いるメッセージを記憶するメッセージ記憶手段と、前記受信データ記憶手段に記憶された受信データと、前記メッセージ記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づいて、その単位行列毎に並列的に前記バリアブルノードの演算または前記チェックノードの演算をそれぞれ行い、各演算の結果得られる各メッセージを出力するメッセージ計算手段と、前記メッセージ計算手段によって前記単位行列毎に並列的にバリアブルノードの演算が行われる際に、その演算に用いられる前記受信データをＲ回（Ｒは２以上の整数値）に分けて前記受信データ記憶手段から読み出す制御を行う制御手段とを備え、前記受信データ記憶手段は、前記受信データの前記受信データ記憶手段からの読み出し回数が１回である場合の構成と比較して、前記Ｒ回に増加した分だけビット数を減らしてワード数を増やした構成を有している。
【０１８１】
前記Ｒ回は、前記検査行列の列のハミング重みに応じた回数である。
【０１８２】
前記制御手段の制御により前記Ｒ回に分けられて前記受信データが前記受信データ記憶手段から読み出される毎に、読み出された分のデータを逐次格納していく格納手段をさらに備え、前記制御手段は、前記Ｒ回に分けた前記受信データの前記受信データ記憶手段からの読み出しを終了したとき、さらに、最後に読み出した分のデータと、前記格納手段に逐次格納されていた分のデータとをあわせて、前記受信データとして前記メッセージ計算手段に提供する制御を行う。
【０１８３】
本発明の一側面の復号方法およびプログラムは、本発明の一側面の上述した復号装置に対応する方法およびプログラムである。
【０１８４】
本発明の一側面の復号装置および方法並びにプログラムにおいては、LDPC(Low Density Parity Check)符号を復号する復号装置が、送信されてきた前記LDPC符号を受信することにより得られる受信データを記憶する受信データ記憶手段と、前記LDPC符号の復号をするためのバリアブルノードの演算、またはチェックノードの演算に用いるメッセージを記憶するメッセージ記憶手段と、前記受信データ記憶手段に記憶された受信データと、前記メッセージ記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づいて、その単位行列毎に並列的に前記バリアブルノードの演算または前記チェックノードの演算をそれぞれ行い、各演算の結果得られる各メッセージを出力するメッセージ計算手段とを備えおり、前記受信データ記憶手段は、前記受信データの前記受信データ記憶手段からの読み出し回数が１回である場合の構成と比較して、その読み出し回数がＲ回に増加した分だけビット数を減らしてワード数を増やした構成を有している場合に、次のような処理が実行される。即ち、前記メッセージ計算手段によって前記単位行列毎に並列的にバリアブルノードの演算が行われる際に、その演算に用いられる前記受信データをＲ回（Ｒは２以上の整数値）に分けて前記受信データ記憶手段から読み出す制御が行われる。
【発明の効果】
【０１８５】
本発明によれば、LDPC(Low Density Parity Check)符号を復号する復号装置を提供できる。特に、復号性能を維持しつつ、その回路規模を従来より縮小できるようになる。
【発明を実施するための最良の形態】
【０１８６】
以下に本発明の実施の形態を説明するが、請求項に記載の構成要件と、明細書または図面における具体例との対応関係を例示すると、次のようになる。この記載は、請求項に記載されている発明をサポートする具体例が、明細書または図面に記載されていることを確認するためのものである。従って、明細書または図面中には記載されているが、構成要件に対応するものとして、ここには記載されていない具体例があったとしても、そのことは、その具体例が、その構成要件に対応するものではないことを意味するものではない。逆に、具体例が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その具体例が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
【０１８７】
さらに、この記載は、明細書または図面に記載されている具体例に対応する発明が、請求項に全て記載されていることを意味するものではない。換言すれば、この記載は、明細書または図面に記載されている具体例に対応する発明であって、この出願の請求項には記載されていない発明の存在、すなわち、将来、分割出願されたり、補正により追加される発明の存在を否定するものではない。
【０１８８】
本発明の一側面の復号装置は、
LDPC(Low Density Parity Check)符号を復号する復号装置（例えば図２０や図２１の復号装置）において、
送信されてきた前記LDPC符号を受信することにより得られる受信データを記憶する受信データ記憶手段（例えば図２０の受信データメモリ９１０や図２１の受信データメモリ９２０）と、
前記LDPC符号の復号をするためのバリアブルノードの演算、またはチェックノードの演算に用いるメッセージを記憶するメッセージ記憶手段（例えば図２０や図２１のメッセージメモリ９１１）と、
前記受信データ記憶手段に記憶された受信データと、前記メッセージ記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づいて、その単位行列毎に並列的に前記バリアブルノードの演算または前記チェックノードの演算をそれぞれ行い、各演算の結果得られる各メッセージを出力するメッセージ計算手段（例えば図２０や図２１の６並列のノード計算器２１０−１乃至２１０−６からなるメッセージ計算部９１３）と、
前記メッセージ計算手段によって前記単位行列毎に並列的にバリアブルノードの演算が行われる際に、その演算に用いられる前記受信データをＲ回（Ｒは２以上の整数値）に分けて前記受信データ記憶手段から読み出す制御を行う制御手段（例えば、図２０や図２１の制御部９１４。ただし、図２０の場合Ｒ＝２であり、図２１の場合Ｒ＝３である）と
を備え、
前記受信データ記憶手段は、前記受信データの前記受信データ記憶手段からの読み出し回数が１回である場合の構成と比較して、前記Ｒ回に増加した分だけビット数を減らしてワード数を増やした構成を有している（図２０の受信データメモリ９１０、図２１の受信データメモリ９２０の各構成と、図１２の従来の受信データメモリ２００の構成の差異参照）。
【０１８９】
また、本発明の一側面の復号装置は、
前記制御手段の制御により前記Ｒ回に分けられて前記受信データが前記受信データ記憶手段から読み出される毎に、読み出された分のデータを逐次格納していく格納手段）例えば図２０のレジスタ９１２や図２１のレジスタ群９２２）をさらに備え、
前記制御手段は、前記Ｒ回に分けた前記受信データの前記受信データ記憶手段からの読み出しを終了したとき、さらに、最後に読み出した分のデータと、前記格納手段に逐次格納されていた分のデータとをあわせて、前記受信データとして前記メッセージ計算手段に提供する制御を行う。
【０１９０】
以下、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。
【０１９１】
ここで、図１６に示されるようなdegree（チェックノードに接続している枝数、即ちメッセージujの入力数）が2のバリアブルノード演算について考える。
【０１９２】
かかるバリアルブルノード演算をする際の回路動作について、上述した図１３のノード計算器２１０を用いて説明する。
【０１９３】
図１３のノード計算器２１０は、上述したように、チェックノード計算器としても機能するが、ここでは、バリアブルノード計算器として機能している場合について考える。
【０１９４】
メッセージメモリ２０１から供給される 検査行列の１列に対応するチェックノードからのメッセージD202が入力ポートP302を介して、メッセージD301（メッセージu1 , u2）として一つずつ入力され、セレクタ３０１を通過してメッセージD306として加算器３０２に入力される。加算器３０２において、このメッセージD306に対して、レジスタ３０３に格納してあるデータD307が加算されて、レジスタ３０３に再格納される。
【０１９５】
1列分のメッセージD301（メッセージu1 , u2）が積算されると、その積算値D307（u1＋u2)はセレクタ３０４を通過して、レジスタ３０５に格納される。
【０１９６】
また、ポートP302に入力されたメッセージD301（メッセージu1 , u2）と同じ値が再びメッセージメモリ２０１からメッセージD203として読み出されて、入力ポートP303を介して、遅延入力メッセージD302として再び入力され、セレクタ３１１を通過して、遅延入力メッセージD315として１つずつ減算器３１２に入力される。
【０１９７】
減算器３１２において、レジスタ３０５に格納されている積算メッセージD308（u1＋u2)から遅延入力メッセージD315（u1 , u2）がそれぞれ減算されて、その減算値D316（u2 , u1）が加算器３１３に供給される。
【０１９８】
加算器３１３にはまた、受信データメモリ２００からの受信データD201(u0i)が、入力ポートP301を介して受信データD300として供給される。そこで、加算器３１３において、減算値D316（u2 , u1）に対して、受信データD300 (u0i)が加算され、その加算値D317（u0i＋u2 , u0i＋u1）がセレクタ３１６を通過して、メッセージD321となる。このメッセージD312が、出力メッセージD204として出力ポートP304から出力されてメッセージメモリ２０１に供給される。
【０１９９】
この場合、受信データD201(u0i)は、単位行列の列分同時に、各バリアブルノード演算器（図１２の例ではノード計算器２１０−１乃至２１０−６）の全てに入力される必要がある。よって、従来においては、受信データメモリは、m×P[bit] n/P[word]のRAMで構成するのが一般的であった。ここで、mは、1受信データ当りのビット数であり、Pはバリアブルノード演算器の並列数であり、nは符号長である。例えば、図１２の例では、m=6，P=6，n=108とされていたため、受信データメモリ２００は、36(=6×6)[bit] 18（=108/6）[word]のRAMで構成されていたのである。
【０２００】
ここで、図１６のdegreeが2のバリアブルノード演算を行う図１３のノード計算器２１０のタイミングチャートは、図１７に示されるようになる。
【０２０１】
図１７のタイミングチャートにおいて、timeはクロック（ただし、以下時刻と称する）を示し、先頭にDを付した符号は、図１３の対応する符号のデータを示している。即ち、例えば、time=1におけるデータD301の項目には、u1［1］が記述されているが、このことは、1時刻目においては、図１３の入力ポートP302の出力データD301は、メッセージu1［1］であることを示している。なお、メッセージu1またはu2の後の［］内の数字は、ノード番号（node num）を示している。以上のタイミングチャートの前提事項については、後述する図１９についても同様に当てはまる。
【０２０２】
なお、以下、先頭にDを付した符号を有するデータについては、その符号のみで区別することし、単にデータと称する。
【０２０３】
また、図１２の例では受信データメモリ２００が採用されているが、以下、図１２の例に限定せずに一般的な概念として説明するため、データD201の供給元は、符号を特につけない受信データメモリとする。
【０２０４】
この場合、受信データメモリからの受信データの読出しは、図１７のデータD300のタイミングチャート（下から２行目の各項目値）からも明らかなように、２時刻に１回Pパラレルビット(P×mビットであって、図１２の例では6×6=36ビット)ずつでよいことがわかる。即ち、２時刻に１回の割合で読み出されたPパラレルビットがP個のノード演算器２１０に各データD300としてそれぞれ同時に入力され、かつその2時刻の間それぞれ保持ればていればよいことがわかる。換言すると、degreeが2のバリアブルノードについての受信データメモリの受信データの読出しの更新要求時刻は、2時刻となる。図示はしないが、バリアブルノードのdegreeが2よりも多くなればなるほど、この更新要求時刻はより一段と長くなっていくことは自明である。
【０２０５】
さらに、図１８に示される構成のノード計算器２１０を採用した場合を考える。図１８のノード計算器２１０は、図１３の構成と比較して、図１３の加算器３１３の代わりに、セレクタ８１３が設けられている点が異なる。即ち、このセレクタ８１３には、図１３のデータD300に対応するデータD800と、図１３のデータD307に対応するデータD807とが入力され、その出力データが、図１３の加算器３０２に対応する加算器８０２に入力される点が図１３の構成とは異なる点である。
【０２０６】
動作の観点でいえば、次の点が図１３とは異なることになる。即ち、バリアブルノード演算を行う際には、図１３のデータD300に対応するデータD800とは入力メッセージujであり、図１３のデータD307に対応するデータD807とは受信データu0iとなる。従って、図１３のノード計算器２１０では加算器３０２において、入力メッセージujのみが積算されていたのに対して、図１８のノード計算器２１０では、対応する加算器８０２において、入力メッセージujと同時に受信データu0iが積算される点が異なる。図１８のノード計算器２１０のその他の動作については、図１３のノード計算器２１０の上述した動作と基本的に同様であるため、ここではその詳細な説明については省略する。
【０２０７】
図１６のdegreeが2のバリアブルノード演算を行う図１８のノード計算器２１０のタイミングチャートは、図１９に示されるようになる。
【０２０８】
図１９のタイミングチャートから明らかなように、degree数分の入力メッセージがデータD801として入力される期間（図１９の例ではdegreeが2のため2時刻の間）、加算器８０２においては、はじめにデータD801として入力されるメッセージ（図１９の例では、メッセージu1[k]：kは１以上の整数値）とともに受信データD800（u(k-1)i）が足し合わされてレジスタ８０３に格納され、その後は、データD801として入力されるメッセージ（図１９の例では、メッセージu2[k]）のみが、レジスタ８０３に格納されたデータD807と足しあわされてレジスタ８０３に再格納されることになる。
【０２０９】
よって、受信データメモリからの受信データの読出しは、2時刻に１回Pパラレルビットが次の単位行列のビットに正しく更新されたものが読み出されればよいだけでなく、さらに、図１８のノード計算器２１０に対しては、2時刻のうち1時刻だけ、対応する受信データu(k-1)iが入力されれば足り、残りの１時刻は任意のデータが入力されたとしても、図１８のノード計算器２１０は正常に動作する、ということがわかる。
【０２１０】
以上の内容に基づいて、本発明人は次のような手法を発明した。即ち、パリティパラレルの復号（partly parallel decoding）を伴うLDPC符号の復号を行う復号装置において、バリアブルノード演算のための受信データメモリからの単位行列分の受信データの読出しを複数回に分けることで、受信データメモリのビット数を減らしワード数を増やすという手法が、本発明人が発明した手法である。かかる手法を適用することで、受信データメモリに使用するRAMマクロの総数を減らすことができ、その結果、復号性能を維持しつつ復号装置全体の回路規模の削減を図ることができるようになる。
【０２１１】
具体的には例えば、かかる手法が適用された復号装置、即ち、本発明が適用される復号装置の構成例が、図２０に示されている。
【０２１２】
即ち、図２０は、LDPC符号の復号であって、ノード計算器を用いてパリティパラレルの復号を行う復号装置に対して本発明を適用した場合の構成例を示している。ただし、図２０の例では、従来の図１２の例との比較を容易なものとすべく、LDPC符号として上述した図１１の符号を復号することが想定されている。
【０２１３】
図２０の復号装置は、受信データメモリ９１０、メッセージメモリ９１１、レジスタ９１２、メッセージ計算部９１３、制御部９１４からなる。
【０２１４】
メッセージメモリ９１１、メッセージ計算部９１３、および、制御部９１４は、図１２のメッセージメモリ２０１、メッセージ計算部２０２、および、制御部２０３と基本的に同様の機能と構成を有している。この場合、メッセージ計算部２０２は、例えば図１３、図１４、図１５、図１８等の各種構成を有する６つのノード計算器２１０−１乃至２１０−６を採用することができる。ただし、この場合、ノード計算器２１０に対しては、データD201の変わりにデータD211が、データD202の変わりにデータD212が、データD203の変わりにデータD213が、それぞれ入力されることになる。また、ノード計算器２１０からは、データD204の変わりにデータD214が出力されることになる。
【０２１５】
受信データメモリ９１０は、（P×m）/2[bit](2×n)/P[word]のRAMから構成されている。具体的に例えば図２０の例では、従来の図１２の例との比較を容易なものとすべく、m=6，P=6，n=108とされているため、受信データメモリ９１０は、18(=(6×6)/2)[bit] 36（=(2×108)/6）[word]のRAMで構成されているのである。
【０２１６】
この場合、受信データメモリ９１０には、2[word]分使ってPパラレルビットの受信データが保持されている。そして、制御部９１４の制御によって、２時刻使ってPパラレルビットの受信データが受信データメモリ９１０から読み出されて、データD211としてメッセージ計算部９１３に入力されて、そのバリアブルノード演算に利用される。
【０２１７】
即ち、２時刻のうちの最初の1時刻目に、Pパラレルビットのうち先に読み出されたP/2のビットの受信データ（2[word]分のうちの先に読み出された1[word]分の受信データ）がレジスタ９１２に一旦格納される。次の２時刻目に、Pパラレルビットのうちの残りのP/2のビットの受信データ（2[word]分のうちの残りの1[word]分の受信データ）が受信データメモリ９１０から読み出されるので、この残りのP/2のビットの受信データと、レジスタ９１２に一旦格納されていた先のP/2のビットの受信データとが同時に、受信データD211として、メッセージ計算部９１３の各ノード演算器２１０−１乃至２１０−６に送信される。
【０２１８】
この場合、バリアブルノードのdegreeが2以上のLDPC符号の復号において、上述したように、バリアブルノード演算は1ノード当り2時刻以上常に必要とする。よって、このような受信データD211の送信タイミングが２時刻単位であっても、即ち、（P×m）/2[bit](2×n)/P[word]のRAMから構成される受信データメモリ９１０を採用した場合であっても、復号遅延が生ずることは無い。
【０２１９】
ただし、ノード計算器２１０が、例えば図１３、図１４、または図１５の構成を有する場合、図１７のデータD300のタイミングチャート（下から2行目の各項目値）から明らかなように、２時刻に渡って、同一受信データu(k-1)iが必要となる。即ち、図示はしないが、２時刻単位で受信データD211として提供される受信データu(k-1)iを、ノード計算器２１０内部で２時刻に渡って保持することが必要になる。
【０２２０】
ここで、図１２の従来の受信データメモリ２００と、図２０の受信データメモリ９１０との構成を比較するに、後者は前者に比較して半分のビット数のRAMで構成できていることがわかる。ただし、RAMマクロのビット幅の上限を120bit幅とすると、図２０に例示された受信データメモリ９１０を採用したからといって直ちにRAMマクロの削減には繋がらない。
【０２２１】
ところが、上述したように、実際の符号の並列度Pは、図２０の例であるP=6よりも遥かに高くなることが多い。例えばP=360の場合、受信データ一つ当たりの量子化ビット数mを6bitとすると、復号装置全体の構成を図２０のようにすることで、受信データメモリ９１０は、1080[bit]360[word]のRAMで構成できるようになる。この場合のRAMマクロの総数は、RAMマクロのビット幅の上限を 120bit幅とすると1080 / 120 = 9個となる。
【０２２２】
これに対して、図１２の従来の受信データメモリ２００では、［発明が解決しようとする課題］の欄で上述したように、P=360の場合のRAMマクロの総数は、18個も必要となる。
【０２２３】
よって、復号装置全体の構成を図２０のようにすることで、受信データメモリ９１０のRAMマクロの数として9個分も削減することが可能になり、その結果、復号装置全体の回路規模の削減を図ることが可能になる。さらに、この場合、上述したように、図２０の受信データD211の量子化ビット数は、従来の図１２の受信データD201の量子化ビット数と何等変わることは無いので、復号性能が劣化することもない。即ち、図２０の構成を採用することで、復号性能を維持しつつその回路規模縮小を図ることが可能になるのである。
【０２２４】
さらに、図２１に示されるように、RAMのビット数の大きさをより減らした受信データメモリ９２０を採用することもできる。即ち、図２１は、本発明が適用される復号装置の構成例であって、図２０とは異なる例を示している。
【０２２５】
図２１の復号装置は、図２０の復号装置に対して、受信データメモリ９１０の代わりに受信データメモリ９２０を設け、レジスタ９１２の代わりにレジスタ群９２２を設けている点が差異点である。図２１の復号装置のその他の構成は、図２０の復号装置と基本的に同様である。
【０２２６】
受信データメモリ９２０は、（P×m）/3[bit](3×n)/P[word]のRAMから構成されている。具体的に例えば図２１の例では、従来の図１２の例との比較を容易なものとすべく、m=6，P=6，n=108とされているため、受信データメモリ９２０は、12(=(6×6)/3)[bit] 54（=(3×108)/6）[word]のRAMで構成されているのである。
【０２２７】
この場合、受信データメモリ９２０には、3[word]分使ってPパラレルビットの受信データが保持されている。そして、制御部９１４の制御によって、３時刻使ってPパラレルビットの受信データが受信データメモリ９２０から読み出されて、データD211としてメッセージ計算部９１３に入力されて、メッセージ計算部９１３のバリアブルノード演算に利用される。
【０２２８】
即ち、３時刻のうちの最初の1時刻目に、Pパラレルビットのうち先に読み出されたP/3のビットの受信データ（3[word]分のうちの先に読み出された1[word]分の受信データ）がレジスタ群９２２のうちの図中上段のレジスタに一旦格納される。次の２時刻目に、Pパラレルビットのうちの次に読み出されたP/3のビットの受信データ（3[word]分のうちの次の1[word]分の受信データ）がレジスタ群９２２のうちの図中下段のレジスタに一旦格納される。そして、最後の３時刻目に、Pパラレルビットのうちの最後のP/3のビットの受信データが読みだされるので、このP/3のビットの受信データと、レジスタ群９２２の両レジスタにそれぞれ格納されていた2つの（P/3のビットの受信データ）とが同時に受信データD211として、メッセージ計算部９１３の各ノード演算器２１０−１乃至２１０−６に送信される。
【０２２９】
この場合、バリアブルノードのdegreeが3以上のLDPC符号の復号においては、バリアブルノード演算は1ノード当り3時刻以上常に必要となる。よって、このような受信データD211の送信タイミングが３時刻単位であっても、即ち、（P×m）/3[bit](3×n)/P[word]のRAMから構成される受信データメモリ９２０を採用した場合であっても、復号遅延が生ずることは無い。なお、degreeが2のLDPC符号のバリアブルノード演算に限って、従来では２時刻かけて演算していたものが、３時刻かかることになる。
【０２３０】
図２０の効果として説明した場合と同様に、例えばP=360である場合について考えるに、受信データ一つ当たりの量子化ビット数mを6bitとすると、復号装置の構成を図２１のようにすることで、受信データメモリ９２０は、720[bit]480[word]のRAMで構成できることになる。この場合のRAMマクロの総数は、RAMマクロのビット幅の上限を 120bit幅とすると720 / 120 = 6個となる。
【０２３１】
よって、復号装置の構成を図２１のようにすることで、受信データメモリ９１０のRAMマクロの数として、図２０の構成と比較して3個分、従来の図１２の構成と比較して12個分も削減することが可能になり、その結果、復号装置全体の回路規模の削減を図ることが可能になる。さらに、この場合、上述したように、図２１の受信データD211の量子化ビット数は、従来の図１２の受信データD201の量子化ビット数と何等変わることは無いので、復号性能が劣化することもない。即ち、図２１の構成を採用することで、復号性能を維持しつつその回路規模縮小を図ることが可能になるのである。
【０２３２】
以下同様に、図示はしないが、受信データの受信データメモリからの読み出し回数をR回（Rは2以上の整数値）とすれば、（P×m）/R[bit](R×n)/P[word]のRAMから構成された受信データメモリと、(R×n)/P[word]のデータを格納できるR-1個のレジスタ群とを備えた復号装置を採用すればよい。この場合、Rを大きくすればするほど、回路規模縮小効果の度合いはその分だけ顕著なものとなる。
【０２３３】
ここで、バリアブルノード演算の1ノード当りに要する処理時間は、上述したように、バリアブルノードのdegreeの大きさに応じて長くなっていく。よって、バリアブルノードのdegreeが大きくなればなるほど、受信データの受信データメモリからの読み出し回数であるR回もその分だけ多くすることができ、その結果、その分だけビット数を減らした受信データメモリを採用できるようになり、ひいては、その分だけ復号装置全体の回路規模も縮小できるようになる。
【０２３４】
また、バリアブルノードのdegreeの大きさとは、結局、検査行列の列のハミング重みを表すので、受信データの受信データメモリからの読み出し回数であるR回は、検査行列の列のハミング重みに応じて決定すると好適である。
【０２３５】
なお、ノード計算器２１０自体は、上述した各種例に限定されず、その他のものを採用した場合にも、本発明を適用できることは言うまでも無い。
【０２３６】
また、ノード計算器２１０の代わりに、バリアブルノード演算器とチェックノード演算器とが別の回路として構成されている復号装置に対しても、本発明を適用できることも言うまでも無い。
【０２３７】
さらにまた、ノード計算器２１０を用いずにバリアブルノード演算を行う場合にも、本発明を適用できることも言うまでも無い。
【０２３８】
なお、説明は省略するが、本発明が適用される上述した手法は、他の変調方式や符号化率が変わっても全く同様に適用することができる。即ち、本発明は他のおよび異なる実施形態を取ることができ、そのいくつかの詳細は全て本発明の精神および範囲を逸脱することなくさまざまな明白な点で修正できる。従って図面および発明の詳細な説明は本質的に例証とみなされるべきであり、限定的とみなされてはならない。
【０２３９】
ところで、上述した一覧表示処理も含む一連の処理は、ハードウェアにより実行させることもできるし、ソフトウエアにより実行させることもできる。
【０２４０】
上述した一連の処理をソフトウエアにより実行させる場合、本発明が適用される復号装置は、例えば、図２２に示されるコンピュータで構成することもできる。
【０２４１】
図２２において、CPU（Central Processing Unit）１２０１は、ROM（Read Only Memory）１２０２に記録されているプログラム、または記憶部１２０８からRAM（Random Access Memory）１２０３にロードされたプログラムに従って各種の処理を実行する。RAM１２０３にはまた、CPU１２０１が各種の処理を実行する上において必要なデータなども適宜記憶される。
【０２４２】
CPU１２０１、ROM１２０２、およびRAM１２０３は、バス１２０４を介して相互に接続されている。このバス１２０４にはまた、入出力インターフェース１２０５も接続されている。
【０２４３】
入出力インターフェース１２０５には、キーボード、マウスなどよりなる入力部１２０６、ディスプレイなどよりなる出力部１２０７、ハードディスクなどより構成される記憶部１２０８、および、モデム、ターミナルアダプタなどより構成される通信部１２０９が接続されている。通信部１２０９は、インターネットを含むネットワークを介して他の装置（図示せず）との間で行う通信を制御する。
【０２４４】
入出力インターフェース１２０５にはまた、必要に応じてドライブ１２１０が接続され、磁気ディスク、光ディスク、光磁気ディスク、或いは半導体メモリなどよりなるリムーバブルメディア１２１１が適宜装着され、それらから読み出されたコンピュータプログラムが、必要に応じて記憶部１２０８にインストールされる。
【０２４５】
一連の処理をソフトウエアにより実行させる場合には、そのソフトウエアを構成するプログラムが、専用のハードウェアに組み込まれているコンピュータ、または、各種のプログラムをインストールすることで、各種の機能を実行することが可能な、例えば汎用のパーソナルコンピュータなどに、ネットワークや記録媒体からインストールされる。
【０２４６】
このようなプログラムを含む記録媒体は、図２２に示されるように、装置本体とは別に、ユーザにプログラムを提供するために配布される、プログラムが記録されている磁気ディスク（フロッピディスクを含む）、光ディスク（CD-ROM(Compact Disk-Read Only Memory),DVD(Digital Versatile Disk)を含む）、光磁気ディスク（ＭＤ（Mini-Disk）を含む）、もしくは半導体メモリなどよりなるリムーバブルメディア（パッケージメディア）１２１１により構成されるだけでなく、装置本体に予め組み込まれた状態でユーザに提供される、プログラムが記録されているROM１２０２や、記憶部１２０８に含まれるハードディスクなどで構成される。
【０２４７】
なお、本明細書において、記録媒体に記録されるプログラムを記述するステップは、その順序に沿って時系列的に行われる処理はもちろん、必ずしも時系列的に処理されなくとも、並列的あるいは個別に実行される処理をも含むものである。
【０２４８】
また、本明細書において、システムとは、複数の装置や処理部により構成される装置全体を表すものである。
【図面の簡単な説明】
【０２４９】
【図１】LDPC 符号のparity check matrix（検査行列）の例を示す図である。
【図２】LDPC符号を復号する際の一連の処理行程を説明するフローチャートである。
【図３】メッセージの流れの説明図である。
【図４】(3,6) LDPC 符号の 検査行列 の例を示す図である。
【図５】図４の 検査行列 のタナーグラフを示す図である。
【図６】バリアブルノードでのメッセージ計算を説明する図である。
【図７】チェックノードでのメッセージ計算を説明する図である。
【図８】LDPC 符号の従来の復号装置の構成例を示すブロック図である。
【図９】バリアブルノード計算器の構成例を示すブロック図である。
【図１０】チェックノード計算器の構成例を示すブロック図である。
【図１１】LDPC 符号の 検査行列の例を示す図である。
【図１２】パリティパラレルの復号を行うLDPC符号の従来の復号装置の構成例を示すブロック図である。
【図１３】ノード計算器の第１の構成例を示すブロック図である。
【図１４】ノード計算器の第２の構成例を示すブロック図である。
【図１５】ノード計算器の第３の構成例を示すブロック図である。
【図１６】degreeが2 のバリアブルノードでのメッセージ計算を説明する図である。
【図１７】図１６のdegreeが2のバリアブルノード演算を行う図１３のノード計算器のタイミングチャート例である。
【図１８】ノード計算器の第４の構成例を示すブロック図である。
【図１９】図１６のdegreeが2のバリアブルノード演算を行う図１８のノード計算器のタイミングチャート例である。
【図２０】本発明が適用される復号装置であって、パリティパラレルの復号を行うLDPC符号の復号装置の構成例を示すブロック図である。
【図２１】本発明が適用される復号装置であって、パリティパラレルの復号を行うLDPC符号の復号装置の構成の別の例を示すブロック図である。
【図２２】本発明が適用される復号装置の他の実施形態としての、コンピュータの構成例を示すブロック図である。
【符号の説明】
【０２５０】
２１０  ノード計算部，  ９１０  受信データメモリ，  ９１１  メッセージメモリ，  ９１２  レジスタ，  ９１３  メッセージ計算部，  ９１４  制御部，  ９２０  受信データメモリ，  ９２２  レジスタ群，  １２０１  CPU，  １２０２  ROM，  １２０３  RAM，  １２０８  記憶部，  １２１０  リムーバブルメディア
【図１】
2008301152.tif 000016
【図２】
2008301152.tif 000017
【図３】
2008301152.tif 000018
【図４】
2008301152.tif 000019
【図５】
2008301152.tif 000020
【図６】
2008301152.tif 000021
【図７】
2008301152.tif 000022
【図８】
2008301152.tif 000023
【図９】
2008301152.tif 000024
【図１０】
2008301152.tif 000025
【図１１】
2008301152.tif 000026
【図１２】
2008301152.tif 000027
【図１３】
2008301152.tif 000028
【図１４】
2008301152.tif 000029
【図１５】
2008301152.tif 000030
【図１６】
2008301152.tif 000031
【図１７】
2008301152.tif 000032
【図１８】
2008301152.tif 000033
【図１９】
2008301152.tif 000034
【図２０】
2008301152.tif 000035
【図２１】
2008301152.tif 000036
【図２２】
2008301152.tif 000037