近年、例えば、移動体通信や深宇宙通信といった通信分野、及び地上波又は衛星ディジタル放送といった放送分野の研究が著しく進められているが、それに伴い、誤り訂正符号化及び復号の効率化を目的として符号理論に関する研究も盛んに行われている。
符号性能の理論的限界としては、いわゆるシャノン(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による非特許文献1において最初に提案されたものであり、その後、非特許文献2等において再注目されるに至ったものである。
LDPC符号は、近年の研究により、ターボ符号等と同様に、符号長を長くしていくにしたがって、シャノン限界に近い性能が得られることがわかりつつある。また、LDPC符号は、最小距離が符号長に比例するという性質があることから、その特徴として、ブロック誤り確率特性がよく、さらに、ターボ符号等の復号特性において観測される、いわゆるエラーフロア現象が殆ど生じないことも利点として挙げられる。
以下、このようなLDPC符号について具体的に説明する。なお、LDPC符号は、線形符号であり、必ずしも2元である必要はないが、ここでは、2元であるものとして説明する。
LDPC符号は、そのLDPC符号を定義する検査行列(parity check matrix)が疎なものであることを最大の特徴とするものである。ここで、疎な行列とは、行列のコンポーネントの"1"の個数が非常に少なく構成されるものであり、疎な検査行列をHで表すものとすると、そのような検査行列Hとしては、例えば、図1に示すように、各列のハミング重み("1"の数)(weight)が"3"であり、且つ、各行のハミング重みが"6"であるもの等がある。
このように、各行及び各列のハミング重みが一定である検査行列Hによって定義されるLDPC符号は、レギュラーLDPC符号と称される。一方、各行及び各列のハミング重みが一定でない検査行列Hによって定義されるLDPC符号は、イレギュラーLDPC符号と称される。
このようなLDPC符号による符号化は、検査行列Hに基づいて生成行列Gを生成し、この生成行列Gを2元の情報メッセージに対して乗算することによって符号語を生成することで実現される。具体的には、LDPC符号による符号化を行う符号化装置は、まず、検査行列Hの転置行列HTとの間に、式GHT=0が成立する生成行列Gを算出する。ここで、生成行列Gが、k×n行列である場合には、符号化装置は、生成行列Gに対してkビットからなる情報メッセージ(ベクトルu)を乗算し、nビットからなる符号語c(=uG)を生成する。この符号化装置によって生成された符号語は、値が"0"の符号ビットが"+1"に、値が"1"の符号ビットが"−1"にといったようにマッピングされて送信され、所定の通信路を介して受信側において受信されることになる。
一方、LDPC符号の復号は、Gallagerが確率復号(Probabilistic Decoding)と称して提案したアルゴリズムであって、バリアブルノード(variable node(メッセージノード(message node)とも呼ばれる。))と、チェックノード(check node)とからなる、いわゆるタナーグラフ(Tanner graph)上での確率伝播(belief propagation)によるメッセージ・パッシング・アルゴリズムによって行うことが可能である。なお、以下、適宜、バリアブルノードとチェックノードを、単に、ノードともいう。
しかしながら、確率復号においては、各ノード間で受け渡されるメッセージが実数値であることから、解析的に解くためには、連続した値をとるメッセージの確率分布そのものを追跡する必要があり、非常に困難を伴う解析を必要とすることになる。そこで、Gallagerは、LDPC符号の復号アルゴリズムとして、アルゴリズムA又はアルゴリズムBを提案している。
LDPC符号の復号は、一般的には、図2に示すような手順にしたがって行われる。なお、ここでは、フレーム単位でLDPC符号化されたLDPC符号を受信値U0とし、チェックノードから出力されるメッセージをujとし、バリアブルノードから出力されるメッセージをviとする。メッセージとは、値の"0"らしさを、いわゆる対数尤度比(log likelihood ratio)で表現した実数値である。また、ここでは、受信値U0の"0"らしさの対数尤度比を、受信値u0iと表すこととする。
まず、LDPC符号の復号においては、図2に示すように、ステップS11において、受信値U0(受信値u0i)が受信され、メッセージujが"0"に初期化されるとともに、繰り返し処理のカウンタとしての整数をとる変数kが"0"に初期化される。ステップS12において、受信値u0iに基づいて、式(1)に示す演算を行うことによってメッセージviが求められ、さらに、このメッセージviに基づいて、式(2)に示す演算を行うことによってメッセージujが求められる。
なお、式(1)と式(2)におけるdvとdcは、それぞれ、検査行列Hの縦方向(行方向)と横方向(列方向)の"1"の個数を示す任意に選択可能とされるパラメータであり、例えば、(3,6)符号の場合には、dv=3,dc=6となる。
また、式(1)または(2)の演算においては、それぞれ、メッセージを出力しようとする枝(edge)から入力されたメッセージを、和または積演算のパラメータとしては用いないことから、和または積演算の範囲が、1乃至dv-1または1乃至dc-1となっている。さらに、式(2)に示す演算は、実際には、2入力v1,v2に対する1出力で定義される式(3)に示す関数R(v1,v2)のテーブルを予め作成しておき、これを式(4)に示すように連続的(再帰的)に用いることによって行われる。
ステップS12では、さらに、変数kが"1"だけインクリメントされる。ステップS13では、変数kが所定の繰り返し復号回数N以上であるか否かが判定される。ステップS13において、変数kがN以上ではないと判定された場合、処理はステップS12に戻り、以下、同様の処理が繰り返される。
一方、ステップS13において、変数kがN以上であると判定された場合、ステップS14において、式(5)に示す演算を行うことによって、最終的に出力する復号結果としてのメッセージvが求められて出力され、LDPC符号の復号処理が終了する。
なお、式(5)の演算は、式(1)の演算とは異なり、バリアブルノードに接続している全ての枝からの入力メッセージを用いて行われる。
このようなLDPC符号の復号では、例えば(3,6)符号の場合には、図3に示すように、各ノード間でメッセージの授受が行われる。なお、図3における"="で示すノード(バリアブルノード)では、式(1)に示した演算が行われ、"+"で示すノード(チェックノード)では、式(2)に示した演算が行われる。特に、アルゴリズムAにおいては、メッセージを2元化し、"+"で示すノードにて、dc-1個の入力メッセージの排他的論理和演算を行い、"="で示すノードにて、受信値Rに対して、dv-1個の入力メッセージが全て異なるビット値であった場合には、符号を反転して出力する。
また、一方で、近年、LDPC符号の復号の実装方法に関する研究も行われている。実装方法について述べる前に、まず、LDPC符号の復号を模式化して説明する。
図4は、(3,6)LDPC符号(符号化率1/2、符号長12)の検査行列(parity check matrix)Hの例である。LDPC符号の検査行列Hは、図5のように、タナーグラフを用いて書き表すことができる。なお、図5において、"+"で表わされるのが、チェックノードであり、"="で表わされるのが、バリアブルノードである。チェックノードとバリアブルノードは、それぞれ、検査行列Hの行と列に対応する。チェックノードとバリアブルノードとの間の結線は、枝(edge)であり、検査行列Hの"1"に相当する。即ち、検査行列Hの第j行第i列のコンポーネントが1である場合には、図5において、上からi番目のバリアブルノード("="のノード)と、上からj番目のチェックノード("+"のノード)とが、枝により接続される。枝は、バリアブルノードに対応する符号ビットが、チェックノードに対応する拘束条件を持つことを表わす。なお、図5は、図4の検査行列Hのタナーグラフとなっている。
確率伝播(Belief Propagation)、サムプロダクトアルゴリズム(Sum Product Algorithm)等と呼ばれるLDPC符号の復号方法は、バリアブルノードの演算とチェックノードの演算とを繰り返し行う。
バリアブルノードでは、図6のように、式(1)の演算を行う。すなわち、図6において、計算しようとしている枝に対応するメッセージviは、バリアブルノードに繋がっている残りの枝からのメッセージu1およびu2と、受信情報u0iを用いて計算される。他の枝に対応するメッセージも同様に計算される。
チェックノードの演算について説明する前に、式(2)を、式a×b=exp{ln(|a|)+ln(|b|)}×sign(a)×sign(b)の関係を用いて、式(6)のように書き直す。但し、sign(x)は、x≧0のとき1であり、x<0のとき-1である。
更に、x≧0において、非線形関数φ(x)=−ln(tanh(x/2))と定義すると、φ-1(x)=2tanh-1(e-x)であるから、式(6)は、式(7)のように書くことができる。
チェックノードでは、図7のように、式(7)の演算を行う。すなわち、図7において、計算しようとしている枝に対応するメッセージ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となる。
サムプロダクトアルゴリズムをハードウェアに実装する場合、式(1)で表わされるバリアブルノード演算および式(7)で表わされるチェックノード演算を、適度な回路規模と動作周波数で繰り返し行うことが必要である。
なお、バリアブルノードで行われる式(1)に示した演算は、上述した式(5)と以下の式(8)を組み合わせたものとして考えることができる。
即ち、上述した式(1)にしたがうバリアブルノード演算と式(7)にしたがうチェックノード演算とを行うのではなく、上述した式(7)と式(8)にしたがう第1の演算と、上述した式(5)にしたがう第2の演算とを行うことにより、LDPC符号を復号することもできる。
復号装置の実装の例としては、各ノードの演算を1つずつ順次行うことによって復号を行う復号装置(full serial decoder)、全ノードの演算を同時に行うことによって復号を行う復号装置(full parallel decoder)、1つでも全てでもなく、いくつかのノードの演算を同時に行うことによって復号を行う復号装置(party parallel decoder)などがある。
このうち、いくつかのノードの演算を同時に行うことによって復号を行う復号装置(party parallel decoder)は、メモリの異なるアドレスからの同時読み出し、もしくは同時書き込みを避けることが一般的には容易でなく、メモリアクセス制御が困難であるという問題がある。
しかしながら、P×Pの単位行列、その単位行列の1のうち1個以上が0になった行列(以下、適宜、準単位行列という)、単位行列または準単位行列をサイクリックシフト(cyclic shift)した行列(以下、適宜、シフト行列という)、単位行列、準単位行列、またはシフト行列のうちの2以上(複数)の和(以下、適宜、和行列という)、P×Pの0行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号、もしくは行や列の置換により、これらの行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号の場合、チェックノード演算とバリアブルノード演算をP個ずつ同時に行う復号装置が実現可能であることが知られている。
図8は、チェックノード演算とバリアブルノード演算をP個ずつ同時に行う復号装置の構成例を示している。
図8の復号装置10では、動作クロックの1クロック(clock)ごとに、P個の枝に対応するメッセージが計算される。
即ち、図8の復号装置10は、メッセージ計算部11、メッセージメモリ12、受信用メモリ13、および制御部14からなる。
図8の復号装置10では、メッセージメモリ12からメッセージ計算部11に、入力メッセージがP個ずつ読み出され、メッセージ計算部11において、各入力メッセージを用いて、所望のP個の枝に対応するP個の出力メッセージが計算される。そして、その計算によって求められたP個の出力メッセージが、メッセージメモリ12に格納されていく。図8の復号装置10では、以上の処理が繰り返し行われ、いわゆる繰り返し復号が行われる。
即ち、受信用メモリ13には、通信路を介して送信されてきたLDPC符号を受信することにより得られる、符号の0(または1)らしさを表す対数尤度比である受信値D10が間欠的に供給され、受信用メモリ13は、その受信値D10を格納する。
具体的には、受信用メモリ13は、2つのスイッチ20および23と、2つの受信値メモリ21および22により構成される。スイッチ20は、制御部14から供給される制御信号D18にしたがって、1フレームごとに、受信値D10を受信値メモリ21または受信値メモリ22に交互に供給する。
受信値メモリ21と22は、1フレーム分の受信値D10を格納可能であり、P個の受信値D10を同時に読み書き可能なRAM(Random Access Memory)により構成される。受信値メモリ21には、スイッチ20から1フレーム分の受信値D10が受信値D11として供給され、受信値メモリ21は、1フレーム分の受信値D11を格納する。また、受信値メモリ21は、既に格納してある1フレーム分の受信値D11を、P個ずつ受信値D13として読み出し、スイッチ23に供給する。
受信値メモリ22には、スイッチ20から1フレーム分の受信値D10が受信値D12として供給され、受信値メモリ22は、1フレーム分の受信値D12を格納する。また、受信値メモリ22は、既に格納してある1フレーム分の受信値D12を、P個ずつ受信値D14として読み出し、スイッチ23に供給する。
スイッチ23は、制御部14から供給される制御信号D18にしたがって、バリアブルノード演算時に、P個の受信値D13または受信値D14を、P個の受信値D15としてメッセージ計算部11に供給する。
また、バリアブルノード演算時には、メッセージメモリ12は、制御部14から供給される制御信号D20にしたがって、記憶しているP個のメッセージD16を読み出し、メッセージ計算部11に供給する。なお、メッセージメモリ12は、検査行列Hの1の数(全枝数)分のメッセージD17を格納可能であり、P個のメッセージD17を同時に読み書き可能なRAMにより構成される。さらに、バリアブルノード演算時には、制御部14は、制御信号D19として、バリアブルノード演算を指示する制御信号を、メッセージ計算部11に供給する。
メッセージ計算部11は、P個のメッセージ計算器111乃至11Pにより構成される。各メッセージ計算器111乃至11Pは、メッセージメモリ12から供給されるP個のメッセージD16と、受信用メモリ13のスイッチ23から供給されるP個の受信値D15を1つずつ用いて、制御部14からの制御信号D19にしたがって、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたP個の出力メッセージ(バリアブルノードメッセージ)viを、P個のメッセージD17として、メッセージメモリ12に供給する。
そして、メッセージメモリ12は、制御部14から供給される制御信号D20にしたがって、以上のようにしてメッセージ計算部11から供給されるP個のメッセージD17を記憶する。
一方、チェックノード演算時には、メッセージメモリ12は、制御部14から供給される制御信号D20にしたがって、記憶しているP個のバリアブルノードメッセージviを、P個のメッセージD16として読み出し、メッセージ計算部11に供給する。さらに、チェックノード演算時には、制御部14は、制御信号D19として、チェックノード演算を指示する制御信号を、メッセージ計算部11に供給する。
メッセージ計算部11の各メッセージ計算器111乃至11Pは、メッセージメモリ12から供給されるP個のメッセージD16の1つを用いて、制御部14からの制御信号D19にしたがって、式(7)のチェックノード演算を行い、そのチェックノード演算によって求められたP個の出力メッセージ(チェックノードメッセージ)ujを、P個のメッセージD17として、メッセージメモリ12に供給する。そして、メッセージメモリ12は、制御部14から供給される制御信号D20にしたがって、以上のようにしてメッセージ計算部11から供給されるP個のメッセージD17を記憶する。
メッセージメモリ12が記憶した、メッセージ計算部11から6個ずつ供給されたチェックノードメッセージujとしてのメッセージD17は、次のバリアブルノード演算時に、メッセージD16として読み出され、メッセージ計算部11に供給される。
次に、図9は、図8の受信値メモリ21および22、並びにメッセージメモリ12に対する読み書きのタイミングを示すタイミングチャートである。
図9においては、まず最初に、時間Aの間、あるフレームであるフレーム#1の受信値D11が、受信値メモリ21に書き込まれる(フレーム#1入力)。その書き込みの終了後、時間Bの間、フレーム#1の受信値D11が、受信値D13として、受信値メモリ21からP個ずつ読み出され、その読み出されたフレーム#1の受信値D13が受信値D15として復号される(フレーム#1復号)。即ち、時間Bの間、P個の受信値D15と、メッセージメモリ12から読み出されるP個のメッセージD16を1つずつ用いて、バリアブルノード演算とチェックノード演算がP個単位で繰り返し行われ、これらの演算の結果得られるメッセージD17が、メッセージメモリ12に書き込まれる。
また、時間Bの間、フレーム#1の次のフレームであるフレーム#2の受信値D12が、受信値メモリ22に書き込まれる(フレーム#2入力)。その書き込みの終了後、時間Cの間、フレーム#2の受信値D12が、受信値D14として、受信値メモリ22から読み出され、その読み出されたフレーム#2の受信値D14が、受信値D15として復号される(フレーム#2復号)。これにより、時間Cの間、メッセージメモリ12には、フレーム#2の受信値D15の復号におけるメッセージD17が書き込まれる。
その書き込みの終了後、時間Cの間、フレーム#2の次のフレームであるフレーム#3の受信値D11が、受信値メモリ21に書き込まれる(フレーム#3入力)。以下、同様にして、受信値メモリ21および22、並びにメッセージメモリ12のそれぞれに対する読み書きが行われていく。
次に、図10は、式(1)のバリアブルノード演算時における、受信用メモリ13とメッセージメモリ12に対する読み書きのタイミングを示すタイミングチャートである。なお、図10では、ノード次数(node degree)が9であるものとする。
図10においては、まず最初に、あるフレームの受信値D15(u0i)がP個ずつ受信用メモリ13から読み出されるとともに、P個のチェックノードメッセージu0としてのメッセージD16が、メッセージメモリ12から同時に読み出される。その読み出しの終了後、P個のチェックノードメッセージu1としてのメッセージD16が、メッセージメモリ12から同時に読み出される。以下、同様にして、P個の各チェックノードメッセージu2乃至u8としてのメッセージD16が、P個単位で順にメッセージメモリ12から同時に読み出される。
そして、メッセージ計算器111乃至11Pは、それぞれ、受信用メモリ13から読み出されたP個の受信値D15(u0i)の1つと、メッセージメモリ12から読み出されたP個のチェックノードメッセージu0乃至u8としてのメッセージD16の1つとを用いて、チェックノード演算を行う。なお、メッセージ計算器111乃至11Pは、それぞれ、チェックノードメッセージu0乃至u8を積算するので、メッセージ計算器111乃至11Pでは、ノード次数分、即ち9クロック分以上の遅延が生じる。図10の例では、12クロック分の遅延が生じている。
従って、P個のチェックノードメッセージu0としてのメッセージD16が読み出されてから、12クロック後には、メッセージD16と受信値D15を用いたバリアブルノード演算の結果得られる、P個のバリアブルノードメッセージv0としてのメッセージD17が、メッセージメモリ12に書き込まれる。以下、同様にして、P個のバリアブルノードメッセージv1乃至v8としてのメッセージD17が、P個単位で順にメッセージメモリ12に書き込まれる。
なお、図示は省略するが、式(7)のチェックノード演算や、式(5)に示す演算における読み書きのタイミングも、同様のタイミングでP個ずつ行われる。
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(Low Density Parity Check)符号を復号する復号装置(例えば、図11の復号装置100)であって、
間欠的に入力される前記LDPC符号の受信値を一時的に記憶し、記憶している前記受信値を連続的に読み出す第1の記憶手段(例えば、図13の入力バッファ513)と、
前記第1の記憶手段により連続的に読み出される受信値を記憶し、記憶している前記受信値を所定の単位ごとに読み出す第2の記憶手段(例えば、図13の連結メモリ514)と、
前記第2の記憶手段により所定の単位ごとに読み出された受信値を、前記所定の単位ごとに復号する復号手段(例えば、図11のメッセージ計算部102)と
を備え、
前記第2の記憶手段は、さらに、前記復号の途中結果を記憶し、記憶している前記復号の途中結果を前記所定の単位ごとに読み出して前記復号手段に出力し、
前記第1の記憶手段のビット幅は、前記第2の記憶手段のビット幅より小さい。
本発明の一側面の復号装置において、
前記第2の記憶手段は、
前記第1の記憶手段により連続的に読み出される受信値を記憶する受信値記憶手段(例えば、図13の受信値メモリ601)と、
前記復号の途中結果を記憶する途中結果記憶手段(例えば、図13のメッセージメモリ602)と
を備え、
前記受信値記憶手段と前記途中結果記憶手段は、ワード方向に接続される。
本発明の一側面の復号方法は、
間欠的に入力されるLDPC符号の受信値を一時的に記憶する第1の記憶手段(例えば、図13の入力バッファ513)と、前記第1の記憶手段により連続的に読み出される受信値を記憶する第2の記憶手段(例えば、図13の連結メモリ514)と、前記第2の記憶手段により所定の単位ごとに読み出された受信値を、前記所定の単位ごとに復号する復号手段(例えば、図11のメッセージ計算部102)とを備え、前記LDPC符号を復号する復号装置(例えば、図11の復号装置100)の復号方法であって、
前記第2の記憶手段よりビット幅が小さい前記第1の記憶手段が、前記間欠的に入力されるLDPC符号の受信値を一時的に記憶し(例えば、図16のステップS25)、
前記第1の記憶手段が、記憶している前記受信値を連続的に読み出し(例えば、図17のステップS32)、
前記第2の記憶手段が、前記第1の記憶手段により連続的に読み出される受信値を記憶し(例えば、図17のステップS33)、
前記第2の記憶手段が、記憶している前記受信値を前記所定の単位ごとに読み出し、
前記復号手段が、前記第2の記憶手段により所定の単位ごとに読み出された受信値を、前記所定の単位ごとに復号し(例えば、図18の復号処理)、
前記第2の記憶手段が、前記復号の途中結果を記憶し(例えば、図17のステップS39またはS41)、
前記第2の記憶手段が、記憶している前記復号の途中結果を前記所定の単位ごとに読み出して前記復号手段に出力する(例えば、図17のステップS38またはS40)
ステップを含む。
以下、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。
図11は、本発明を適用した復号装置の一実施の形態の構成例を示している。
なお、ここでは、P×Pの単位行列、準単位行列、単位行列と準単位行列の和、P×Pの0行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号、もしくは行や列の置換により、これらの行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号を復号することとする。
図11の復号装置100は、メモリ101、メッセージ計算部102、および制御部103により構成される。なお、図8と同一のものには同一の符号を付してあり、説明は繰り返しになるので、適宜省略する。
図11の復号装置100では、メモリ101からメッセージ計算部102に、入力メッセージがP個ずつ読み出され、メッセージ計算部102において、各入力メッセージを用いて、所望のP個の枝に対応するP個の出力メッセージが計算される。そして、その計算によって求められたP個の出力メッセージが、メモリ101に格納されていく。図11の復号装置100では、以上の処理が繰り返し行われ、いわゆる繰り返し復号が行われる。
即ち、メモリ101には、通信路を介して送信されてきたLDPC符号を受信することにより得られる、符号の0(または1)らしさを表す対数尤度比である受信値D10が間欠的に供給され、メモリ101は、その受信値D10を格納する。
バリアブルノード演算時には、メモリ101は、制御部103から供給されるアドレスを表す制御信号D103にしたがって、記憶しているP個の受信値D10を読み出し、P個の値D101として、メッセージ計算部102に供給する。
また、バリアブルノード演算時には、メモリ101は、制御部103から供給される制御信号D103にしたがって、記憶しているP個のメッセージD17をP個の値D101として読み出し、メッセージ計算部102に供給する。なお、メモリ101の詳細については、後述する図13を参照して説明する。さらに、バリアブルノード演算時には、制御部103は、制御信号D19として、バリアブルノード演算を指示する制御信号を、メッセージ計算部102に供給する。
メッセージ計算部102の各メッセージ計算器1021乃至102Pは、メモリ101から値D101として供給されるP個のメッセージとP個の受信値を1つずつ用いて、制御部103からの制御信号D19にしたがって、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られた復号の途中結果であるP個の出力メッセージ(バリアブルノードメッセージ)viを、P個のメッセージD17として、メモリ101に供給する。
そして、メモリ101は、制御部103から供給される制御信号D103にしたがって、以上のようにしてメッセージ計算部102から供給されるP個のメッセージD17を記憶する。
一方、チェックノード演算時には、メモリ101は、制御部103から供給される制御信号D103にしたがって、記憶しているP個のバリアブルノードメッセージviを、P個の値D101として読み出し、メッセージ計算部102に供給する。さらに、チェックノード演算時には、制御部103は、制御信号D19として、チェックノード演算を指示する制御信号を、メッセージ計算部102に供給する。
メッセージ計算部102の各メッセージ計算器1021乃至102Pは、メモリ101から値D101として供給されるP個のメッセージの1つを用いて、制御部103からの制御信号D19にしたがって、式(7)のチェックノード演算を行い、そのチェックノード演算によって求められた復号の途中結果であるP個の出力メッセージ(チェックノードメッセージ)ujを、P個のメッセージD17として、メモリ101に供給する。そして、メモリ101は、制御部103から供給される制御信号D103にしたがって、以上のようにしてメッセージ計算部102から供給されるP個のメッセージD17を記憶する。
メモリ101が記憶したメッセージ計算部102からの6個のチェックノードメッセージujとしてのメッセージD17は、次のバリアブルノード演算時に、値D101として読み出され、メッセージ計算部102に供給される。
次に、図12は、図11のメッセージ計算器1021の構成例を示している。
なお、図12では、メッセージ計算器1021について説明するが、他のメッセージ計算器1022乃至102Pも同様に構成される。
メッセージ計算器1021は、外部から受信値またはメッセージが入力される入力ポートとして、入力ポートP201を有する。また、メッセージ計算器1021は、外部にメッセージを出力するポートとして、出力ポートP202を有している。さらに、メッセージ計算器1021は、外部から制御信号が入力される入力ポートとして、入力ポートP203を有している。
メッセージ計算器1021は、入力ポートP201から入力される値D101を用い、入力ポートP203から入力される制御信号D19にしたがって、式(1)のバリアブルノード演算または式(7)のチェックノード演算を選択的に行い、その結果得られるメッセージD17を、出力ポートP202から出力する。
即ち、入力ポートP201には、メモリ101から読み出された受信値が、値D101として供給される。また、入力ポートP201には、メモリ101から読み出されたメッセージ(チェックノードメッセージujまたはバリアブルノードメッセージvi)が、値D101として供給される。さらに、入力ポートP203には、制御部103からの制御信号D19が供給される。
そして、入力ポートP201に供給された値D101は、セレクタ301のv端子に供給される。さらに、入力ポートP201に値D101として供給されたメッセージのうちの最上位ビットを除く下位ビット、即ち、メッセージの絶対値は、絶対値D303として、LUT300に供給され、メッセージのうちの最上位ビット、即ち、メッセージの符号ビットは、符号ビットD304として、EXOR回路306とFIFOメモリ320に供給される。
また、入力ポートP203に供給された制御信号D19は、セレクタ301および316に供給される。
セレクタ301および316は、v端子とc端子とを有し、制御信号D19にしたがい、v端子またはc端子のうちのいずれかに供給される値を選択して、後段に出力する。即ち、セレクタ301および316は、制御信号D19がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号D19がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、メッセージ計算器1021は、バリアブルノード演算と、チェックノード演算を行う。
即ち、メッセージ計算器1021では、以下のようにして、バリアブルノード演算が行われる。
バリアブルノード演算時においては、入力ポートP201には、メモリ101からP個ずつ読み出された受信値のうちの1つと、メモリ101からP個ずつ読み出された、検査行列の各行に対応するチェックノード(出力メッセージviを求めようとしているバリアブルノードに対応する列の、各行に対応するチェックノード)からのチェックノードメッセージujの1つが、順次、値D101として供給される。
入力ポートP201に値D101として供給された受信値とメッセージ(チェックノードメッセージuj)は、セレクタ301のv端子に供給され、バリアブルノード演算時にはv端子を選択しているセレクタ301から、値D306として、演算器302とFIFOメモリ320に供給される。
演算器302は、セレクタ301からの値D306(受信値u0iまたはチェックノードメッセージuj)とレジスタ303に格納されている積算値D307とを加算することにより、値D306を積算し、その結果得られる積算値を、レジスタ303に再格納する。なお、受信値と検査行列の1列に亘る全ての枝からのメッセージが値D306として積算された場合、レジスタ303はリセットされる。
受信値と検査行列の1列に亘るメッセージが値D306として1つずつ読み込まれ、レジスタ303に受信値と1列分のメッセージが積算された値が格納された場合、即ち、レジスタ303に、受信値と検査行列の1列に亘る全ての枝からのメッセージ(チェックノードメッセージuj)が積算された積算値(j=1からdVまでのΣujとu0iの和)が格納された場合、セレクタ304は、レジスタ303に格納されている値、即ち、受信値と検査行列の1列に亘る全ての枝からのメッセージが積算された積算値D307(j=1からdVまでのΣujとu0iの和)を選択し、レジスタ305に出力して格納させる。
レジスタ305は、格納している積算値D307を、値D308として、セレクタ304と演算器312に供給する。レジスタ303に受信値と1列分のメッセージが積算された値が格納される直前までは、セレクタ304は、レジスタ305から供給された値D308を選択し、レジスタ305に出力し再格納させる。即ち、受信値u0iと検査行列の1列に亘る全ての枝からのメッセージ(チェックノードメッセージuj)が積算されるまで、レジスタ305は、前回積算された値を、セレクタ304と演算器312に供給する。
一方、FIFOメモリ320は、レジスタ305から新たな値D308(j=1からdVまでのΣujとu0iの和)が出力されるまでの間、セレクタ301が出力した値D306を遅延し、値D315として演算器312に供給する。演算器312は、レジスタ305から供給された値D308から、FIFOメモリ320から供給された値D315を減算する。即ち、演算器312は、受信値u0iと検査行列の1列に亘る全ての枝からのメッセージ(チェックノードメッセージuj)の積算値D308(j=1からdVまでのΣujとu0iの和)から、求めたい枝からのメッセージ(チェックノードメッセージuj)を減算して、減算値D316(バリアブルノードメッセージvi)を求め、セレクタ316のv端子に供給する。
セレクタ316は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器312からの減算値D316を、メッセージD17(バリアブルノードメッセージvi)として、出力ポートP202から出力する。
以上のように、セレクタ301および316がv端子を選択しているメッセージ計算器1021では、式(1)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP202から出力される。
また、メッセージ計算器1021では、以下のようにして、チェックノード演算が行われる。
即ち、チェックノード演算時においては、入力ポートP201には、メモリ101からP個ずつ読み出された、検査行列の各列に対応するバリアブルノード(出力メッセージujを求めようとしているチェックノードに対応する行の、各列に対応するバリアブルノード)からのバリアブルノードメッセージviの1つが、順次、値D101として供給される。
入力ポートP201に値D101として供給されたメッセージ(バリアブルノードメッセージvi)のうちの最上位ビットを除く下位ビット、つまり、メッセージの絶対値D303(|vi|)は、LUT300に供給され、最上位ビット、つまりメッセージの符号ビットD304は、EXOR回路306とFIFOメモリ320にそれぞれ供給される。
LUT300は、そこに入力される値を引数xとして、式(7)のチェックノード演算における非線形関数φ(x)の演算結果を出力するLUTであり、絶対値D303(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D305(φ(|vi|))を読み出し、セレクタ301のc端子に供給する。
セレクタ301は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT300からの演算結果D305(φ(|vi|))を、値D306(φ(|vi|))として、演算器302とFIFOメモリ320に供給する。
演算器302は、値D306(φ(|vi|))とレジスタ303に格納されている積算値D307とを加算することにより、値D306を積算し、その結果得られる積算値をレジスタ303に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージの絶対値D303(|vi|)に対する演算結果(φ(|vi|))が積算された場合、レジスタ303はリセットされる。
検査行列の1行に亘るメッセージが値D101として1つずつ読み込まれ、レジスタ303に1行分の演算結果が積算された積算値が格納された場合、セレクタ304は、レジスタ303に格納されている値、即ち、検査行列の1行に亘る全ての枝からのメッセージ(バリアブルノードメッセージvi)から求められたφ(|vi|)が積算された積算値D307(i=1からi=dcまでのΣφ(|vi|))を選択し、レジスタ305に出力して格納させる。レジスタ305は、格納している積算値D307を、値D308として、セレクタ304と演算器312に供給する。
レジスタ303に1行分の演算結果が積算された積算値が格納される直前までは、セレクタ304は、レジスタ305から供給された値D308を選択し、レジスタ305に出力して再格納させる。即ち、検査行列の1行に亘る全ての枝からのメッセージ(バリアブルノードメッセージvi)から求められたφ(|vi|)が積算されるまで、レジスタ305は、前回積算されたφ(|vi|)の積算値を、セレクタ304と演算器312に供給する。
一方、FIFOメモリ320は、レジスタ305から新たな値D308(i=1からi=dcまでのΣφ(|vi|))が出力されるまでの間、LUT300がセレクタ301を介して出力した値D306(φ(|vi|))を遅延し、値D315として演算器312に供給する。演算器312は、レジスタ305から供給された値D308から、FIFOメモリ320から供給された値D315を減算し、その減算結果を、減算値D316としてLUT314に供給する。即ち、演算器312は、検査行列の1行に亘る全ての枝からのメッセージ(バリアブルノードメッセージvi)から求められたφ(|vi|)の積算値(i=1からi=dcまでのΣφ(|vi|))から、求めたい枝からのメッセージ(バリアブルノードメッセージvi)から求められたφ(|vi|)を減算して、その減算値(i=1からi=dc−1までのΣφ(|vi|))を減算値D316としてLUT314に供給する。
LUT314は、そこに入力される値を引数xとして、式(7)のチェックノード演算における非線形関数φ(x)の逆関数φ-1(x)の演算結果を出力するLUTであり、演算器312からの減算値D316(i=1からi=dc−1までのΣφ(|vi|))を引数として、逆関数φ-1(Σφ(|vi|))の演算を行った演算結果D318(φ-1(Σφ(|vi|)))を出力する。
なお、上述したように、非線形関数φ(x)の演算結果と逆関数φ-1(x)の演算結果とは等
しいので、LUT300と314とは、同一構成のLUTとなっている。
以上の処理と並行して、EXOR回路306は、レジスタ307に格納されている値D310と符号ビット(正負を表すビット)D304との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D309を、レジスタ307に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージの符号ビットD304が乗算された場合、レジスタ307はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージの符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納された場合、セレクタ308は、レジスタ307に格納されている値、即ち、検査行列の1行に亘る全ての枝からのメッセージの符号ビットD304が乗算された値D310(i=1からi=dcまでのΠsign(vi))を選択し、レジスタ309に出力して格納させる。レジスタ309は、格納している値D311を、セレクタ308とEXOR回路315に供給する。
検査行列の1行に亘る全ての枝からのメッセージの符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納される直前までは、セレクタ308は、レジスタ309から供給された値D311を選択し、レジスタ309に出力して再格納させる。即ち、検査行列の1行に亘る全ての枝からのメッセージ(バリアブルノードメッセージvi)の符号ビットD304が乗算されるまで、レジスタ309は、前回格納した値を、セレクタ308とEXOR回路315に供給する。
一方、FIFOメモリ320は、レジスタ309から新たな値D311(i=1からi=dcま
でのΠsign(vi))がEXOR回路315に供給されるまでの間、符号ビットD304を遅延し、1ビットの値D313としてEXOR回路315に供給する。EXOR回路315は、レジスタ309から供給された値D311と、FIFOメモリ320から供給された値D313との排他的論理和を演算することにより、値D311を、値D313で除算し、除算結果を除算値D319として出力する。即ち、EXOR回路315は、検査行列の1行に亘る全ての枝からのメッセージの符号ビットD304(sign(vi))の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージの符号ビットD304(sign(vi))で除算して、その除算値(i=1からi=dc−1までのΠsign(vi))を除算値D319として出力する。
そして、メッセージ計算器1021では、LUT314から出力された演算結果D318を下位ビットとするとともに、EXOR回路315から出力された除算値D319を最上位ビット(符号ビット)とするビット列D320(チェックノードメッセージuj)が、セレクタ316のc端子に供給される。
セレクタ316は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D320(チェックノードメッセージuj)を、メッセージD17として、出力ポートP202から出力する。
以上のように、セレクタ301および316がc端子を選択しているメッセージ計算器1021では、式(7)のチェックノード演算が行われ、その結果得られるメッセージ(チェックノードメッセージ)ujが、出力ポートP202から出力される。
なお、図示しないが、図11の復号装置100では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
図13は、図11のメモリ101の詳細構成例を示している。
図13のメモリ101は、プリバッファ511、スイッチ512、入力バッファ513、および連結メモリ514により構成される。メモリ101には、受信値D10が間欠的に入力され、この受信値D10は、プリバッファ511とスイッチ512の端子512Aに供給される。
プリバッファ511には、入力バッファ513に1フレーム分の受信値D512が書き込まれたとき、即ち、入力バッファ513から連絡メモリ514への転送が開始されるとき、入力バッファ513から、プリバッファ511の選択を表す制御信号D515が供給される。プリバッファ511は、その制御信号D515に応じて、受信値D10を一時的に記憶する。なお、プリバッファ511の記憶容量は、入力バッファ513から連結メモリ514へ1フレーム分の受信値D513を転送するために必要な時間内に、受信可能な受信値D10の最大数Mと、量子化ビット数との乗算値である。
これに対して、後述するように、入力バッファ513と、連結メモリ514の受信値D513を記憶する受信値メモリ601(後述する)の記憶容量は、それぞれ、1フレーム分の受信値のデータ量、即ち、符号長と量子化ビット数の乗算値であるので、プリバッファ511の記憶容量は、入力バッファ513と受信値メモリ601のそれぞれの記憶容量に比べて十分に小さい。
また、プリバッファ511は、記憶している受信値D10を受信値D511として連続的に読み出し、スイッチ512を介して入力バッファ513に供給する。さらに、プリバッファ511は、読み出し済みの受信値D10を削除する。プリバッファ511は、記憶している受信値D10がなくなった場合、受信値D10の読み出しと書き込みを停止し、スイッチ512に、端子512Aの選択を表す制御信号D514を供給する。これにより、間欠的に入力される受信値D10が、端子512Aを介して入力バッファ513に供給される。
スイッチ512は、3つの端子512A乃至512Cを有している。端子512Aには受信値D10が間欠的に入力され、端子512Bにはプリバッファ511が接続され、端子512Cには入力バッファ513が接続される。スイッチ512は、プリバッファ511から供給される制御信号D514に応じて、端子512Aと端子512Cを接続し、端子512Aに入力される受信値D10を、受信値D512として入力バッファ513に入力する。また、スイッチ512は、入力バッファ513から供給される制御信号D515に応じて、端子512Bと端子512Cを接続し、プリバッファ511から読み出された受信値D511を、受信値D512として入力バッファ513に入力する。
入力バッファ513の記憶容量は、例えば、符号長と量子化ビット数の乗算値であり、入力バッファ513は、スイッチ512により入力される受信値D512を、一時的に1フレーム分記憶する。なお、ここでは、入力バッファ513のビット幅は、連結メモリ514のビット幅の1/N(Nは2以上の整数)倍であり、ワード数は、連結メモリ514の受信値メモリ601のワード数のN倍であるものとするが、入力バッファ513のビット幅は、連結メモリ514のビット幅より小さければ、1/N倍である必要はない。
入力バッファ513は、1フレーム分の受信値D512の書き込みを完了した場合、例えば、入力バッファ513の空き容量がゼロになった場合、プリバッファ511とスイッチ512に制御信号D515を入力する。そして、入力バッファ513は、記憶している1フレーム分の受信値D512を、受信値D513として連続的に読み出し、連結メモリ514に転送する。即ち、入力バッファ513は、1フレーム単位、つまり、符号語単位で、受信値D512を連続的に読み出し、連結メモリ514に転送する。
このように、入力バッファ513は、受信値D512を一時的に記憶し、その受信値D512を1フレーム単位で受信値D513として連結メモリ514に転送するので、連結メモリ514が、記憶している受信値D513をP個ずつ読み出すことにより復号が行われている間も、入力バッファ513により、次のフレームの受信値D512を記憶することができる。これにより、受信用メモリ101では、受信値D512を連続して記憶することができ、その結果、スループットが向上する。
連結メモリ514は、入力バッファ513に直列に接続され、受信値メモリ601と、メッセージメモリ602がワード方向に接続されることにより構成される。連結メモリ514は、制御部103から供給される制御信号D103にしたがって、入力バッファ513から転送されてくる1フレーム分の受信値D513を、受信値メモリ601に格納し、メッセージ計算部102からP個ずつ出力される検査行列Hの1の数分のメッセージD17を、メッセージメモリ602に格納する。
従って、連結メモリ514の受信値メモリ601の記憶容量は、符号長と、量子化ビット数との乗算値であり、メッセージメモリ602の記憶容量は、検査行列Hの1の数と、量子化ビット数との乗算値である。
また、連結メモリ514は、制御信号D103にしたがって、受信値メモリ601に格納している受信値D513をP個ずつ読み出すか、メッセージメモリ602に格納しているメッセージD17をP個ずつ読み出し、値D101としてメッセージ計算部102に供給する。
以上のように、メモリ101では、入力バッファ513と連結メモリ514が直列に接続され、メッセージ計算部102への値D101の出力が、1つの連結メモリ514で行われるので、入力バッファ513は、P個の受信値D513を同時に読み出す必要がなく、入力バッファ513のビット幅を、量子化ビット数のP倍のビットより小さくすることができる。その結果、量子化ビット数のP倍のビット幅を有する2つの受信値メモリ21および22から構成される従来の受信用メモリ13(図8)に比べて、メモリ101を構成するRAMマクロの数を削減し、これにより、メモリ101の回路規模を削減することができる。
また、連結メモリ514は、受信値D513またはメッセージD17のいずれか一方をP個ずつ同時に読み出すので、連結メモリ514全体のビット幅は、量子化ビット数のP倍のビットとなり、ワード数は、符号長と検査行列Hの1の数の和からPを除算した値となる。
従って、図11の復号装置100では、メッセージメモリ12と受信用メモリ13を別々に設ける従来の復号装置10(図8)に比べて、復号装置を構成するメモリのビット幅を削減することができる。即ち、図8の復号装置10を構成するメモリ全体のビット幅は、同時に読み出す必要がある受信値D15とメッセージD16の数である2倍のP個と量子化ビット数の乗算値であるが、図11の復号装置100を構成するメモリ全体のビット幅は、同時に値D101として読み出す必要がある受信値またはメッセージのいずれか一方の数であるP個と、量子化ビット数の乗算値で済む。その結果、復号装置100を構成するRAMマクロの数を削減し、これにより、復号装置100の回路規模を削減することができる。
例えば、LDPC符号の量子化ビット数が5ビットであり、Pが360であるとき、連結メモリ514としては、1800(=360×5)ビット幅のRAMが1つ必要になる。また、入力バッファ513のビット幅が、連結メモリ514のビット幅の1/10倍である(N=1/10)とき、入力バッファ513としては、180(=1800/10)ビット幅のRAMが1つ必要になる。従って、RAMマクロのビット幅の上限が120ビットであるとすると、メモリ101を構成するRAMマクロの総数は、連結メモリ514を構成するRAMマクロの数である15(=1800/120)個と、入力バッファ513を構成するRAMマクロの数である2(=180/120(小数点繰上げ))個の和である17個となる。
このように、復号装置100において必要なRAMマクロの数は17個であり、従来の復号装置10において必要なRAMマクロの数である45個と比べて、RAMマクロの数を大幅に削減することができる。
次に、図14は、図13の入力バッファ513と連結メモリ514に対する受信値の読み書きのタイミングを示すタイミングチャートである。
図14においては、まず最初に、時間Pの間、あるフレームであるフレーム#1の受信値D512が、入力バッファ513に書き込まれる(フレーム#1入力)。その書き込みの終了後、時間Qの間、時間Pの間に書き込まれたフレーム#1の受信値D512が、受信値D513として、入力バッファ513から連結メモリ514に転送され、連絡メモリ514の受信値メモリ601に書き込まれる(転送)。
そして、その転送の終了後、時間Rの間、フレーム#1の次のフレームであるフレーム#2の受信値D512が、入力バッファ513に書き込まれる(フレーム#2入力)とともに、時間Qの間に連結メモリ514に転送されたフレーム#1の受信値D513が、値D101として、連結メモリ514の受信値メモリ601からP個ずつ読み出されて復号される(フレーム#1復号)。即ち、時間Rの間、受信値メモリ601から値D101としてP個ずつ読み出された受信値と、メッセージメモリ602から値D101としてP個ずつ読み出されたメッセージのそれぞれとを用いて、バリアブルノード演算とチェックノード演算がP個単位で繰り返し行われ、これらの演算の結果得られるメッセージD17は、連結メモリ514のメッセージメモリ602に書き込まれる。
次に、時間Sの間、時間Rの間に書き込まれたフレーム#2の受信値D512が、受信値D513として、入力バッファ513から連結メモリ514に転送され、連結メモリ514の受信値メモリ601に書き込まれる(転送)。その転送の終了後、時間Tの間、フレーム#2の次のフレームであるフレーム#3の受信値D512が、入力バッファ513に書き込まれる(フレーム#3入力)とともに、時間Sの間に連結メモリ514に転送されたフレーム#2の受信値D513が、値D101として、連結メモリ514から読み出されて復号される(フレーム#2復号)。以下、同様にして、入力バッファ513と連結メモリ514のそれぞれに対する受信値の読み書きが行われていく。
次に、図15は、図14の時間Rや時間Tに行われるバリアブルノード演算における、連結メモリ514に対するメッセージの読み書きのタイミングを示すタイミングチャートである。なお、図15では、ノード次数が9であるものとする。
図15においては、まず最初に、あるフレームの受信値(u0i)がP個ずつ値D101として連結メモリ514の受信値メモリ601から読み出される。その後、P個のチェックノードメッセージu0としての値D101が、連結メモリ514のメッセージメモリ602から同時に読み出される。以下、同様にして、P個の各チェックノードメッセージu1乃至u8としての値D101が、P個単位で順に連結メモリ514のメッセージメモリ602から同時に読み出される。このように、連結メモリ514は、受信値またはメッセージのうちのいずれか一方を、値D101としてP個同時に読み出す。
そして、メッセージ計算器1021乃至102Pは、それぞれ、受信値メモリ601から値D101として読み出されたP個の受信値(u0i)の1つと、P個の各チェックノードメッセージu0乃至u8の1つとを用いて、チェックノード演算を行う。なお、上述したように、メッセージ計算器1021乃至102Pは、それぞれ、チェックノードメッセージu0乃至u8を積算するので、メッセージ計算器1021乃至102Pでは、受信値u0iが入力されてからノード次数分の遅延、即ち10(=1+9)クロック分の遅延以上の遅延が生じる。即ち、図11の復号装置100では、受信値u0iとチェックノードメッセージu0を同時に読み出さないため、図8の復号装置10に比べて、1クロック分遅延が多くなる。
ここで、図15の例では、13クロック分の遅延が生じるものとする。従って、P個のチェックノードメッセージu0としての値D101が読み出されてから、12クロック後には、値D101として読み出されたメッセージと受信値を用いたバリアブルノード演算の結果得られる、P個のバリアブルノードメッセージv0としてのメッセージD17が、連結メモリ514のメッセージメモリ602に書き込まれる。以下、同様にして、P個のバリアブルノードメッセージv1乃至v8としてのメッセージD17が、P個単位で順にメッセージメモリ602に書き込まれる。
なお、図示は省略するが、図11の復号装置100の式(7)のチェックノード演算や、式(5)に示す演算における読み書きのタイミングも、同様のタイミングでP個ずつ行われる。復号装置100では、式(5)に示す演算における遅延は、図8の復号装置10に比べて1クロック分多くなるが、チェックノード演算における遅延は、図8の復号装置10と同一である。
次に、図16と図17を参照して、図13のメモリ101における受信値処理について説明する。この受信値処理は、例えば、各フレームの受信値D10がメモリ101に間欠的に入力されたとき、開始される。
ステップS21において、プリバッファ511は、制御信号D515に応じて、間欠的に入力される受信値D10の書き込みを開始する。ステップS22において、スイッチ512は、制御信号D515に応じて、プリバッファ511と入力バッファ513を接続する。即ち、あるフレームの受信値D10がメモリ101に間欠的に入力されるとき、その前のフレームの受信値D512の入力バッファ513への書き込みが終了しており、入力バッファ513から制御信号D515が出力される。従って、プリバッファ511は、その制御信号D515に応じて、受信値D10の書き込みを開始し、スイッチ512は、プリバッファ511と入力バッファ513を接続する。
ステップS23において、プリバッファ511は、入力バッファ513から連絡メモリ514への1フレーム分の受信値D513の転送に要する時間として予め設定された、所定の時間が経過したかどうかを判定する。ステップS23で所定の時間が経過していないと判定された場合、プリバッファ511は、所定の時間が経過するまで待機する。
ステップS23で所定の時間が経過したと判定された場合、ステップS24において、プリバッファ511は、既に書き込まれている受信値D10の受信値D511としての連続的な読み出しを開始する。即ち、プリバッファ511は、受信値D10の書き込みを行うとともに、受信値D511の読み出しを行う。プリバッファ511から読み出された受信値D511は、スイッチ512に供給され、受信値D512として入力バッファ513に供給される。
ステップS25において、入力バッファ513は、スイッチ512を介してプリバッファ511から供給される受信値D512の書き込みを開始する。ステップS26において、プリバッファ511は、プリバッファ511が空になったかどうか、即ち、プリバッファ511に書き込まれた受信値D10がすべて読み出されたかどうかを判定し、プリバッファ511が空になっていないと判定した場合、空になるまで待機する。
一方、ステップS26において、プリバッファ511が空になったと判定された場合、ステップS27において、プリバッファ511は、受信値D10の書き込みと読み出しを終了する。ステップS28において、プリバッファ511は、制御信号D514をスイッチ512に出力する。ステップS29において、スイッチ512は、プリバッファ511から供給される制御信号D514に応じて、端子512Aと入力バッファ513を接続する。
ステップS30において、入力バッファ513は、1フレーム分の受信値D512が書き込まれたかどうか、即ち、入力バッファ513の空き容量がゼロになったかどうかを判定する。ステップS30で1フレーム分の受信値D512がまだ書き込まれていないと判定された場合、1フレーム分の受信値D512がすべて書き込まれるまで待機する。
一方、ステップS30で1フレーム分の受信値D512が書き込まれたと判定された場合、ステップS31において、入力バッファ513は、制御信号D515をプリバッファ511とスイッチ512に出力する。
次に、図17のステップS32において、入力バッファ513は、書き込まれている1フレーム分の受信値D512を受信値D513として読み出し、その受信値D513の連結メモリ514への転送を開始する。
ステップS33において、連結メモリ514は、入力バッファ513から転送されてきた受信値D513の受信値メモリ601への書き込みを開始する。ステップS34において、入力バッファ513は、1フレーム分の受信値D513の転送が完了したかどうか、即ち、書き込まれている受信値D513のすべてを転送したかどうかを判定し、1フレーム分の受信値D513の転送がまだ完了していないと判定した場合、転送が完了するまで待機する。
一方、ステップS34で1フレーム分の受信値D513の転送が完了したと判定された場合、ステップS35において、入力バッファ513は、受信値D513の転送を終了する。ステップS36において、連結メモリ514は、入力バッファ513から転送されてきた受信値D513の受信値メモリ601への書き込みを終了する。
ステップS37において、連結メモリ514は、制御部103から供給される制御信号D103にしたがって、受信値メモリ601に書き込まれた受信値D513を、ワード単位でP個ずつ読み出し、値D101として、メッセージ計算部102に出力する。
ステップS38において、連結メモリ514は、制御部103から供給される制御信号D103にしたがって、チェックノードメッセージujとしてのメッセージD17を値D101としてP個ずつ読み出し、メッセージ計算部102に出力する。これにより、メッセージ計算部102では、ステップS37で出力された値D101としての受信値と、ステップS38で出力された値D101としてのメッセージを用いて、P個同時にバリアブルノード演算が行われる。そして、メッセージ計算部102から、バリアブルノード演算の結果得られたバリアブルノードメッセージviとしてのメッセージD17がP個ずつ連結メモリ514に供給される。
ステップS39において、連結メモリ514は、制御部103から供給される制御信号D103にしたがって、メッセージ計算部102からP個ずつ供給されるバリアブルノードメッセージviとしてのメッセージD17をメッセージメモリ602に記憶する。ステップS40において、連結メモリ514は、制御部103から供給される制御信号D103にしたがって、ステップS39で記憶されたバリアブルノードメッセージviとしてのメッセージD17を、P個ずつ値D101としてメッセージメモリ602から読み出し、メッセージ計算部102に出力する。
これにより、メッセージ計算部102では、ステップS40で出力されたバリアブルノードメッセージviとしての値D101を用いて、P個同時にチェックノード演算が行われる。そして、メッセージ計算部102から、チェックノード演算の結果得られたチェックノードメッセージujとしてのメッセージD17がP個ずつ連結メモリ514に供給される。
ステップS41において、連結メモリ514は、制御部103から供給される制御信号D103にしたがって、メッセージ計算部102からP個ずつ供給されるチェックノードメッセージujとしてのメッセージD17をメッセージメモリ602に記憶し、処理は終了する。
なお、ステップS37乃至S41の処理は、所定の復号回数分繰り返される。また、最後のステップS37の処理により読み出される受信値D513と、最後のステップS38の処理により値D101として読み出されるチェックノードメッセージujは、式(5)に示した演算に用いられ、その演算の結果得られるメッセージvは、復号結果として復号装置100から出力される。
次に、図18を参照して、図11の復号装置100における復号処理について説明する。この復号処理は、例えば、メモリ101から受信値と、チェックノードメッセージujが、値D101としてP個ずつ読み出されたとき、開始される。
ステップS51において、メッセージ計算部102は、メモリ101から値D101としてP個ずつ読み出される受信値と、チェックノードメッセージujとを用いて、式(1)のバリアブルノード演算をP個ずつ行い、バリアブルノードメッセージviとしてのメッセージD17をP個ずつ求める。
ステップS52において、メッセージ計算部102は、求められたバリアブルノードメッセージviとしてのメッセージD17をP個ずつメモリ101に供給する。これにより、メモリ101のメッセージメモリ602には、バリアブルノードメッセージviとしてのメッセージD17が記憶され、そのメッセージD17が、値D101としてP個ずつ読み出される。
ステップS53において、メッセージ計算部102は、メッセージメモリ602から値D101としてP個ずつ読み出された、バリアブルノードメッセージviを用いて、式(7)のチェックノード演算をP個ずつ行い、チェックノードメッセージujとしてのメッセージD17をP個ずつ求める。
ステップS54において、メッセージ計算部102は、求められたチェックノードメッセージujとしてのメッセージD17をP個ずつメモリ101に供給する。これにより、メモリ101のメッセージメモリ602には、チェックノードメッセージujとしてのメッセージD17が記憶され、そのメッセージD17が、ステップS51のバリアブルノード演算に用いられる。
なお、図18の復号処理は、1フレームの受信値に対して復号回数繰り返して行われる。そして、最後のステップS54の処理によりメモリ101に供給されるチェックノードメッセージujとしてのメッセージD17と、受信値は、式(5)に示した演算に用いられ、その演算の結果得られるメッセージvは、復号結果として復号装置100から出力される。
なお、図11の復号装置100では、P×Pの単位行列、準単位行列、単位行列と準単位行列の和、P×Pの0行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号、もしくは行や列の置換により、これらの行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号を復号することとしたが、P×Pの単位行列、準単位行列、単位行列、準単位行列、またはシフト行列のうちの2以上(複数)の和(以下、適宜、和行列という)、P×Pの0行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号、もしくは行や列の置換により、これらの行列の組み合わせで表すことが可能な検査行列Hを有するLDPC符号を復号するようにしてもよい。この場合、メモリ101とメッセージ計算部102の間に、値D101としてのメッセージをサイクリックシフトするサイクリックシフト回路が設けられる。
また、一般的に、LDPC符号は符号長が数千から数万と大きいため、Pの値も数百の大きさを持つものが使われる。その場合には、更に本発明に係る復号装置を用いる効果は大きくなる。
なお、上述したLDPC符号を復号する復号装置は、例えば、(ディジタル)衛星放送を受信するチューナなどに適用することができる。
100 復号装置, 101 メモリ, 102 メッセージ計算部, 511 プリバッファ, 513 入力バッファ, 514 連結メモリ, 601 受信値メモリ, 602 メッセージメモリ