以下に本発明の実施の形態を説明するが、本発明の構成要件と、明細書又は図面に記載の実施の形態との対応関係を例示すると、次のようになる。この記載は、本発明をサポートする実施の形態が、明細書又は図面に記載されていることを確認するためのものである。したがって、明細書又は図面中には記載されているが、本発明の構成要件に対応する実施の形態として、ここには記載されていない実施の形態があったとしても、そのことは、その実施の形態が、その構成要件に対応するものではないことを意味するものではない。逆に、実施の形態が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その実施の形態が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
本発明の一側面の復号装置は、
LDPC(Low Density Parity Check)符号を復号する復号装置(例えば、図25の復号装置)であり、
前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段(例えば、図25のメッセージメモリ104)と、
前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段(例えば、図25のメッセージ計算部201)と
を備え、
前記メッセージ計算手段は、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリ(例えば、図26の小FIFOメモリ317)を有し、
前記遅延メモリは、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する。
一側面の復号装置には、
前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から2回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行う制御手段(例えば、図25の制御部202)をさらに設けることができ、
前記メッセージ計算手段には、前記記憶手段から2回読み出される同一のメッセージのうちの1回目に読み出されるメッセージが供給されるポート(例えば、図26の入力ポートP201)と、2回目に読み出されるメッセージが供給されるポート(例えば、図26の入力ポートPD201)との2つのポートを設けることができる。
一側面の復号装置には、
前記遅延メモリで遅延されたメッセージと、前記記憶手段から2回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段(例えば、図26のセレクタ318)をさらに設けることができる。
前記メッセージ計算手段には、
チェックノードに入力される入力データxに対して、非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力する1のLUT(Look Up Table)(例えば、図26のLUT300)と、
チェックノードから出力された出力データxに対して、前記非線形関数の逆関数φ-1(x)=2tanh-1(e-x)の演算結果を出力する他の1のLUT(例えば、図26のLUT314)と
を設けることができ、
チェックノードの演算時には、データを、前記1のLUTと他の1のLUTを経由させ、
バリアブルノードの演算時には、データを、前記1のLUTと他の1のLUTをバイパスさせる
ことができる。
前記メッセージ計算手段には、チェックノードに入力される入力データxに対して、逆関数φ-1(x)=2tanh-1(e-x)と同一の演算結果が得られる非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力するとともに、バリアブルノードに入力される入力データxに対して、前記逆関数φ-1(x)の演算結果を出力するLUT(Look Up Table)(例えば、図31のLUT600)を設けることができる。
前記メッセージ計算手段には、バリアブルノードから出力された出力データxに対して、逆関数φ-1(x)=2tanh-1(e-x)と同一の演算結果が得られる非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力するとともに、チェックノードから出力された出力データxに対して、前記逆関数φ-1(x)の演算結果を出力するLUT(Look Up Table)(例えば、図36のLUT713)を設けることができる。
本発明の一側面の制御方法、又は、プログラムは、
LDPC(Low Density Parity Check)符号を復号する復号装置(例えば、図25の復号装置)を制御する制御方法、又は、復号装置を制御するコンピュータに実行させるプログラムであり、
前記復号装置は、
前記LDPC符号の復号のためのバリアブルノードの演算、又はチェックノードの演算に用いるメッセージを記憶する記憶手段(例えば、図25のメッセージメモリ104)と、
前記記憶手段に記憶されたメッセージを用いて、前記LDPC符号を定義する検査行列に基づき、前記バリアブルノードの演算、又は前記チェックノードの演算を行い、演算の結果得られるメッセージを出力するメッセージ計算手段(例えば、図25のメッセージ計算部201)と
を備え、
前記メッセージ計算手段は、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージを一時記憶することにより遅延する遅延メモリ(例えば、図26の小FIFOメモリ317)を有し、
前記遅延メモリは、前記検査行列の重みの最大値よりも少ない数のメッセージを記憶する場合において、
前記メッセージ計算手段が出力するメッセージを前記記憶手段に書き込む書き込み制御と、前記メッセージ計算手段での演算に用いられる同一のメッセージを、前記記憶手段から2回読み出し、前記メッセージ計算手段に供給する読み出し制御とを行い(例えば、図15のステップS101ないしS103)、
前記バリアブルノードの演算において、前記バリアブルノードに対応する前記検査行列の列の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記列の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から2回目に読み出されたメッセージを選択し、
前記チェックノードの演算において、前記チェックノードに対応する前記検査行列の行の重みが、前記遅延メモリが記憶可能なメッセージの数以下であるときに、前記遅延メモリで遅延されたメッセージを選択し、前記行の重みが、前記遅延メモリが記憶可能なメッセージの数以下でないときに、前記記憶手段から2回目に読み出されたメッセージを選択する
ように、前記遅延メモリで遅延されたメッセージと、前記記憶手段から2回目に読み出されたメッセージとのうちの一方を、前記バリアブルノードの演算、又は前記チェックノードの演算に用いるメッセージとして選択する選択手段(例えば、図26のセレクタ318)を制御する(例えば、図15のステップS121ないしS123)
ステップを含む。
以下、本発明の実施の形態について、図面を参照しながら説明する。
前述したように、LDPC符号を復号する復号装置においては、バリアブルノードの演算や、チェックノード演算に用いるメッセージを一時記憶することにより、メッセージを遅延するためのメモリ(例えば、図9のFIFOメモリ155(図9)や、図10のFIFOメモリ127及び133)が必要となるが、まず最初に、そのようなメモリが不要な復号装置について説明する。
図12は、メッセージを遅延するためのメモリが不要な復号装置の構成例を示すブロック図である。
なお、図中、図8の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図12の復号装置は、メッセージ計算部101に代えてメッセージ計算部171が設けられているとともに、制御部106に代えて制御部174が設けられている他は、図8の復号装置と同様に構成されている。
図12の復号装置は、図8の復号装置と同様に、フルシリアルの復号を繰り返し行う。
すなわち、図12の復号装置は、メッセージメモリ104、受信データメモリ105、メッセージ計算部171、制御部174からなる。また、メッセージ計算部171は、バリアブルノード計算器172とチェックノード計算器173とから構成されている。
図12の復号装置では、メッセージメモリ104から、メッセージが1つずつ読み出され、メッセージ計算部171において、そのメッセージを用いて、所望の枝に対応するメッセージが計算される。そして、その計算によって求められたメッセージが、メッセージメモリ104に格納されていく。図12の復号装置では、以上の処理が繰り返し行われることで、繰り返し復号が行われる。
すなわち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(又は1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を格納(記憶)する。
バリアブルノード演算時には、受信データメモリ105は、制御部174から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部171のバリアブルノード計算器172に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部174から供給される制御信号に従い、記憶している同一のメッセージを2回読み出して(注目しているバリアブルノードから出力されるバリアブルノードメッセージviを求めるのに必要なチェックノードメッセージ(注目しているバリアブルノードに接続されているチェックノードからのチェックノードメッセージ)ujを、2回繰り返し読み出して)、1回目に読み出したメッセージをメッセージD102として、バリアブルノード計算器172に供給し、2回目に読み出したメッセージをメッセージDD102として、バリアブルノード計算器172に供給する。バリアブルノード計算器172は、メッセージメモリ104から供給されるメッセージD102とDD102、及び受信データメモリ105から供給される受信データD101を用い、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ(バリアブルノードメッセージ)viを、メッセージD103として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部174から供給される制御信号に従い、バリアブルノード計算器172から供給されるメッセージD103を記憶する(書き込む)。
一方、チェックノード演算時には、メッセージメモリ104は、制御部174から供給される制御信号に従って、記憶している同一のメッセージ(バリアブルノードメッセージvi)を2回読み出して(注目しているチェックノードから出力されるチェックノードメッセージujを求めるのに必要なバリアブルノードメッセージ(注目しているチェックノードに接続されているバリアブルノードからのバリアブルノードメッセージ)viを、2回繰り返し読み出して)、1回目に読み出したメッセージをメッセージD104として、チェックノード計算器173に供給し、2回目に読み出したメッセージをメッセージDD104として、チェックノード計算器173に供給する。
チェックノード計算器173は、メッセージメモリ104から供給されるメッセージD104とDD104を用いて、式(7)のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ(チェックノードメッセージ)ujを、メッセージD105として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部174から供給される制御信号に従い、チェックノード計算器173から供給されるメッセージD105を記憶する(書き込む)。
メッセージメモリ104が記憶したチェックノード計算器173からのメッセージD105、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD102及びDD102として読み出され、バリアブルノード計算器172に供給される。
図13は、図12のバリアブルノード計算器172の構成例を示している。
なお、図中、図9のバリアブルノード計算器102と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
バリアブルノード計算器172は、メッセージを遅延するためのメモリ(図9のバリアブルノード計算器102に設けられているFIFOメモリ155)を設けずに構成されている。
但し、バリアブルノード計算器172は、外部からメッセージ(データ)が供給(入力)される入力ポートとして、3つの入力ポートP101,P102,PD102を有している。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。また、入力ポートP102には、メッセージメモリ104から2回読み出される同一のメッセージD102及びDD102のうちの1回目に読み出されるメッセージD102が供給(入力)され、入力ポートPD102には、2回目に読み出されるメッセージDD102が供給される。
チェックノード計算器173は、入力ポートP101,P102,PD102それぞれから入力されるメッセージを用いて、復号しようとするLDPC符号を定義する検査行列に基づき、式(1)のバリアブルノード演算を行い、その結果得られるメッセージを、出力ポートP103から出力する。
すなわち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP102には、メッセージメモリ104から読み出されたメッセージD102(チェックノードメッセージuj)が供給される。
そして、バリアブルノード計算器172では、検査行列の各行に対応するチェックノードからのメッセージD102、すなわち、メッセージメモリ104から1回目に読み出されたメッセージujが、入力ポートP102から1つずつ入力され、そのメッセージD102が、演算器151に供給される。
また、バリアブルノード計算器172では、受信データメモリ105から受信データD101が入力ポートP101から1つずつ読み込まれ、演算器157に供給される。
演算器151は、メッセージD102(メッセージuj)とレジスタ152に格納されている値D151とを加算することにより、メッセージD102を積算し、その結果得られる積算値を、レジスタ152に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD102が積算された場合、レジスタ152はリセットされる。
検査行列の1列に亘るメッセージD102が1つずつ読み込まれ、レジスタ152に1列分のメッセージD102が積算された値が格納された場合、すなわち、レジスタ152に、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)が積算された積算値(j=1からdvまでのΣuj)が格納された場合、セレクタ153は、レジスタ152に格納されている値、すなわち、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)が積算された積算値D151(j=1からdvまでのΣuj)を選択し、レジスタ154に出力して格納させる。
レジスタ154は、格納している値D151を、値D152として、セレクタ153と演算器156に供給する。レジスタ152に1列分のメッセージD102が積算された値が格納される直前までは、セレクタ153は、レジスタ154から供給された値D152を選択し、レジスタ154に出力し再格納させる。すなわち、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)が積算されるまで、レジスタ154は、前回積算された値を、セレクタ153と演算器156に供給する。
一方、レジスタ154から新たな値D152(j=1からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ152に1列分のメッセージD102が積算された積算値(j=1からdvまでのΣuj)が格納された直後、バリアブルノード計算器172においては、メッセージD102(メッセージuj)と同一のメッセージDD102、すなわち、メッセージメモリ104から2回目に読み出されたメッセージujが、入力ポートPD102から1つずつ入力され、そのメッセージDD102が、演算器156に供給される。
演算器156は、レジスタ154から供給された積算値D152から、入力ポートPD102からのメッセージDD102を減算する。すなわち、演算器156では、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)の積算値D152(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージDD102を減算して、減算値(j=1からdv-1までのΣuj)を求め、演算器157に供給する。
演算器157は、入力ポートP101からの受信データD101と、演算器156からの減算値(j=1からdv-1までのΣuj)とを加算し、その結果得られる加算値をメッセージD103(メッセージvi)として、出力ポートP103から出力する。
以上のように、バリアブルノード計算器172では、式(1)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP103から出力される。
図14は、図12のチェックノード計算器173の構成例を示している。
なお、図中、図10のチェックノード計算器103と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
チェックノード計算器173は、データを遅延するためのメモリ(図10のチェックノード計算器103に設けられているFIFOメモリ127及び133)を設けずに構成されている。
但し、チェックノード計算器173は、外部からメッセージ(データ)が供給(入力)される入力ポートとして、2つの入力ポートP111とPD111を有している。
入力ポートP111には、メッセージメモリ104から2回読み出される同一のメッセージD104及びDD104のうちの1回目に読み出されるメッセージD104が供給(入力)され、入力ポートPD111には、2回目に読み出されるメッセージDD104が供給される。
チェックノード計算器173は、入力ポートP111とPD111それぞれから入力されるメッセージを用いて、復号しようとするLDPC符号を定義する検査行列に基づき、式(7)のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP112から出力する。
すなわち、入力ポートP111には、メッセージメモリ104から読み出されたメッセージD104(バリアブルノードメッセージuj)が供給される。
そして、チェックノード計算器173では、検査行列の各列に対応するバリアブルノードからのメッセージD104(メッセージvi)が入力ポートP111から1つずつ入力され、その最上位ビットを除く下位ビット、つまり、メッセージD104の絶対値D122(|vi|)が、LUT121に供給されるとともに、最上位ビット、つまりメッセージD104の符号ビットD121が、EXOR回路129に供給される。
LUT121は、非線形関数φ(x)の演算結果を記憶しており、絶対値D122(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D123(φ(|vi|))を読み出し、演算器122に供給する。
演算器122は、演算結果D123(φ(|vi|))とレジスタ123に格納されている値D124とを加算することにより、演算結果D123を積算し、その結果得られる積算値をレジスタ123に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD104の絶対値D122(|vi|)に対する演算結果D123(φ(|vi|))が積算された場合、レジスタ123はリセットされる。
検査行列の1行に亘るメッセージD104が1つずつ読み込まれ、レジスタ123に1行分の演算結果D123が積算された積算値が格納された場合、セレクタ124は、レジスタ123に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)から求められたφ(|vi|)が積算された積算値D124(i=1からi=dcまでのΣφ(|vi|))を選択し、積算値D125として、レジスタ125に出力して格納させる。レジスタ125は、格納している積算値D125を、値D126として、セレクタ124と演算器126に供給する。
レジスタ123に1行分の演算結果D123が積算された積算値が格納される直前までは、セレクタ124は、レジスタ125から供給された値D126を選択し、レジスタ125に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)から求められたφ(|vi|)が積算されるまで、レジスタ125は、前回積算されたφ(|vi|)の積算値を、セレクタ124と演算器126に供給する。
一方、レジスタ125から新たな値D126(i=1からi=dcまでのΣφ(|vi|))の出力が開始されると、すなわち、レジスタ125に1行分の演算結果D123が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納された直後、チェックノード計算器173において、メッセージD104(メッセージvi)と同一のメッセージDD104、すなわち、メッセージメモリ104から2回目に読み出されたメッセージviが、入力ポートPD104から1つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT135に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、EXOR回路134に供給される。
LUT135は、LUT121と同様のLUTで、メッセージDD104の絶対値(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果(φ(|vi|))を読み出し、演算器126に供給する。
演算器126は、レジスタ125から供給された値D126から、LUT135からの演算結果(φ(|vi|))を減算し、減算結果を、減算値D128としてLUT128に供給する。すなわち、演算器126は、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)から求められたφ(|vi|)の積算値(i=1からi=dcまでのΣφ(|vi|))から、求めたい枝からのメッセージvi(i=dcのvi)としてのメッセージDD104から求められたφ(|vi|)を減算して、その減算値(i=1からi=dc-1までのΣφ(|vi|))を減算値D128としてLUT128に供給する。
LUT128は、逆関数φ-1(x)の演算結果を記憶している、LUT121や135と同様のLUTであり、演算器126からの減算値D128(i=1からi=dc-1までのΣφ(|vi|))を引数として、逆関数φ-1(Σφ(|vi|))の演算を行った演算結果D129(φ-1(Σφ(|vi|)))を出力する。
以上の処理と並行して、EXOR回路129は、レジスタ130に格納されている値D131と符号ビット(正負を表すビット)D121との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D130をレジスタ130に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された場合、レジスタ130はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130(i=1からdcまでのΠsign(vi))がレジスタ130に格納された場合、セレクタ131は、レジスタ130に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131(i=1からi=dcまでのΠsign(vi))を選択し、値D132としてレジスタ132に出力して格納させる。レジスタ132は、格納している値D132を、値D133としてセレクタ131とEXOR回路134に供給する。
検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130(i=1からdcまでのΠsign(vi))がレジスタ130に格納される直前までは、セレクタ131は、レジスタ132から供給された値D133を選択し、レジスタ132に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)の符号ビットD121が乗算されるまで、レジスタ132は、前回格納した値を、セレクタ131とEXOR回路134に供給する。
一方、レジスタ132から新たな値D133(i=1からi=dcまでのΠsign(vi))がEXOR回路134に供給されたとき、すなわち、レジスタ130に1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131(i=1からi=dcまでのΠsign(vi))が格納されたとき、上述したように、レジスタ125には、1行分の演算結果D123が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納される。
レジスタ125に1行分の演算結果D123が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納されると、上述したように、チェックノード計算器173において、メッセージD104(メッセージvi)と同一のメッセージDD104、すなわち、メッセージメモリ104から2回目に読み出されたメッセージviが、入力ポートPD104から1つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT135に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、EXOR回路134に供給される。
EXOR回路134は、レジスタ132から供給された値D133と、入力ポートPD104からのメッセージDD104の符号ビットとの排他的論理和を演算することにより、値D133を、メッセージDD104の符号ビットで除算し、除算結果を除算値D135として出力する。すなわち、EXOR回路134は、検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージviとしてのメッセージDD104の符号ビット(i=dcのsign(vi))で除算して、その除算値(i=1からi=dc-1までのΠsign(vi))を除算値D135として出力する。
そして、チェックノード計算器173では、LUT128から出力された演算結果D129を下位ビットとするとともに、EXOR回路134から出力された除算値D135を最上位ビット(符号ビット)とするビット列がメッセージD105(メッセージuj)として、出力ポートP112から出力される。
以上のように、チェックノード計算器173では、式(7)の演算が行われ、メッセージ(チェックノードメッセージ)ujが求められる。
なお、図示しないが、図12の復号装置では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
次に、図15のフローチャートを参照して、図12の復号装置の制御部174によるメッセージメモリ104に対するメッセージ(データ)の読み書き制御の処理について説明する。
なお、以下、適宜、ノードにおいてメッセージを求めるのに用いられる、そのノードに入力されるメッセージを、入力メッセージというとともに、ノードにおいて、入力メッセージを用いて求められて出力されるメッセージを、出力メッセージという。
ステップS101において、制御部174は、ある注目しているノード(注目ノード)から出力される出力メッセージ(注目ノードに接続している枝から出力されるメッセージ)を求めるのに必要な入力メッセージ、すなわち、注目ノードに接続している枝から入力されるメッセージを読み出し、メッセージ計算部171に供給するように(入力メッセージの1回目の読み出しを行うように)、メッセージメモリ104を制御して、ステップS102に進む。
ステップS102では、制御部174は、直前のステップS101でメッセージメモリ104から読み出したのと同一の入力メッセージを読み出し、メッセージ計算部171に供給するように(入力メッセージの2回目の読み出しを行うように)、メッセージメモリ104を制御して、ステップS103に進む。
すなわち、ステップS101及びS102では、メッセージ計算部171での演算(チェックノード演算又はバリアブルノード演算)に用いられる同一の入力メッセージを、メッセージメモリ104から2回読み出し、メッセージ計算部171に供給する読み出し制御が行われる。
ステップS103では、制御部174は、メッセージ計算部171がステップS101とS102でメッセージメモリ104から読み出された入力メッセージを用いて演算を行うことにより求めた出力メッセージを書き込むように、メッセージメモリ104を制御する。
すなわち、ステップS103では、メッセージ計算部171が式(1)又は式(7)の演算を行うことによって出力する出力メッセージをメッセージメモリ104に書き込む書き込み制御が行われる。
そして、ステップS103からステップS101に戻り、制御部174は、他のノードを新たな注目ノードとし、その新たな注目ノードから出力される出力メッセージを求めるのに必要な入力メッセージを読み出して、メッセージ計算部171に供給するように、メッセージメモリ104を制御し、以下、同様の処理を繰り返す。
メッセージメモリ104は、前述したように、RAM#AとRAM#Bとの2バンク構成になっており、制御部174は、そのRAM#AとRAM#Bのそれぞれを対象に、図15で説明した読み書き制御を行う。
すなわち、図16は、図12の復号装置のメッセージメモリ104に対するメッセージの読み書きのタイミングを示すタイミングチャートである。
図16のタイミングチャートは、前述の図11のタイミングチャートと同様に、メッセージメモリ104を構成するRAM#AとRAM#Bのそれぞれに対する読み書きのタイミングを表している。
図16においては、まず最初に、あるノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの1回目の読み出しが行われる(R1(node#1))。その読み出しの終了後、ノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの2回目の読み出しが行われる(R2(node#1))のと同時に、次のノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの1回目の読み出しが行われる(R1(node#2))。
ノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの2回目の読み出しが終了し、メッセージ計算部171において、ノードnode#1からの出力メッセージが求められると、そのノードnode#1からの出力メッセージがRAM#Aに書き込まれる(W(node#1))のと同時に、ノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの2回目の読み出しが行われる(R2(node#2))。
ノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの2回目の読み出しが終了し、メッセージ計算部171において、ノードnode#2からの出力メッセージが求められると、そのノードnode#2からの出力メッセージがRAM#Bに書き込まれる(W(node#2))のと同時に、次のノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの1回目の読み出しが行われる(R1(node#3))。
ノードnode#2からの出力メッセージのRAM#Bへの書き込みと、ノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの1回目の読み出しとが終了すると、ノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの2回目の読み出しが行われる(R2(node#3))のと同時に、次のノードnode#4からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの1回目の読み出しが行われる(R1(node#4))。
ノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの2回目の読み出しが終了し、メッセージ計算部171において、ノードnode#3からの出力メッセージが求められると、そのノードnode#3からの出力メッセージがRAM#Aに書き込まれる(W(node#3))のと同時に、ノードnode#4からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの2回目の読み出しが行われる(R2(node#4))。
以下、同様にして、メッセージメモリ104を構成するRAM#AとRAM#Bのそれぞれに対するメッセージの読み書きが行われていく。
図12の復号装置によれば、メッセージ計算部171において出力メッセージを求めるのに必要な(同一の)入力メッセージを、メッセージメモリ104から2回読み出すことによって、メッセージ計算部171の内部において、入力メッセージを遅延せずに済むので、メッセージ計算部171を、データを遅延するためだけのメモリ(図9のバリアブルノード計算器102に設けられているFIFOメモリ155、並びに図10のチェックノード計算器103に設けられているFIFOメモリ127及び133)を設けずに構成することができる。そして、その結果、復号装置の規模を削減することができる
なお、データを遅延するためだけのメモリ(以下、適宜、遅延メモリという)を設けずに、メッセージメモリ104から同一の入力メッセージを2回読み出す図12の復号装置におけるメッセージメモリ104に対するメッセージの読み書きのタイミング(図16)と、遅延メモリを設けて、メッセージメモリ104から入力メッセージを1回だけ読み出す図8の復号装置におけるメッセージメモリ104に対するメッセージの読み書きのタイミング(図11)とを比較して分かるように、図12の復号装置は、あるノードからの出力メッセージを求めるためのメッセージメモリ104に対するメッセージの読み書きに、図8の復号装置の1.5倍程度の時間を要し、したがって、図8の復号装置と同一の回数の繰り返し復号を行うには、メッセージの読み書きに時間を要する分だけ高速に動作することが要求される(高速な動作クロックを必要とする)。
しかしながら、特に、ノードすべてについて、出力メッセージを求める演算を同時(並列)に行うフルパラレルの復号(full parallel decoding)を行う復号装置や、1つでもなくすべてでもないp個のノードについて、出力メッセージを求める演算を同時に行う一部並列の復号(例えば、特許文献1に記載の復号)を行う復号装置を、遅延メモリを設けて構成した場合には、多数の遅延メモリが必要となり、装置全体の規模に大きく影響する。
かかる復号装置において、図12の復号装置のように、メッセージメモリ104から同一の入力メッセージを2回読み出して、出力メッセージを求めることによって、遅延メモリを不要とする構成を採用することにより、復号装置において多少の高速な動作が要求されることにはなるが、その代償として、極めて大きな装置規模の削減の効果を得ることができる。
なお、本明細書では、説明を簡単にするために、フルシリアルの復号装置を説明するが、図12の復号装置を含め、以下説明する復号装置の構成や処理の方法は、フルパラレルの復号を行う復号装置や、一部並列の復号を行う復号装置に適用することができ、そのような復号装置に適用した場合に、特に大きな装置規模の削減の効果を得ることができる。
上述したように、図12の復号装置によれば、メッセージ計算部171において出力メッセージを求めるのに必要な(同一の)入力メッセージを、メッセージメモリ104から2回読み出すことによって、メッセージ計算部171の内部において、入力メッセージを遅延せずに済むので、遅延メモリ(図9のバリアブルノード計算器102に設けられているFIFOメモリ155、並びに図10のチェックノード計算器103に設けられているFIFOメモリ127及び133)が不要となるが、出力メッセージを求めるためのメッセージメモリ104に対するメッセージの読み書きに、図8の復号装置の1.5倍程度の時間を要することとなる。
さらに、遅延メモリが不要な図12の復号装置では、復号の対象のLDPC符号を定義する検査行列の重みが、メッセージ計算部171での演算に要する時間に対して小である場合には、メッセージメモリ104に対するメッセージの読み書きに、さらなる時間を要することとなる。
すなわち、ノードに接続している、ある枝から出力されるメッセージ(出力メッセージ)は、そのノードに接続している枝すべてから入力されるメッセージ(入力メッセージ)の積算値から、出力メッセージを求めようとしている枝から入力される入力メッセージを減算すること等によって求められるため、検査行列の重みが、メッセージ計算部171での演算に要する時間に対して小である場合、つまり、メッセージメモリ104に対して読み書きされるメッセージの数が小である場合には、例えば、ノードに接続している枝すべてから入力される入力メッセージの積算値から減算すべき入力メッセージを、メッセージメモリ104から読み出すことができるのに、その積算値が求められるまで、入力メッセージの読み出しを待つ必要が生じることがある。また、メッセージメモリ104に出力メッセージの書き込みをすることができるのに、その出力メッセージが求められるまで、出力メッセージの書き込みを待つ必要が生じることがある。
以上のように、メッセージメモリ104に対するメッセージの読み書きを待つ時間が生じる場合には、結果として、メッセージメモリ104に対するメッセージの読み書きに、さらなる時間を要することとなる。
メッセージメモリ104に対するメッセージの読み書きに時間を要すると、1回の復号に要する時間も大になり、その分だけ、繰り返し復号を行うことができる回数が減って、復号性能が劣化する(復号結果の信頼性が低くなる)ことになる。
そこで、規模を削減しつつ、復号性能の劣化を抑制することができる復号装置について説明する。
すなわち、図17は、本発明を適用した復号装置の第1実施の形態の構成例を示すブロック図である。
なお、図中、図12の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図12の復号装置は、メッセージ計算部171に代えてメッセージ計算部181が設けられているとともに、制御部174に代えて制御部184が設けられている他は、図12の復号装置と同様に構成されている。
図17の復号装置は、図12の復号装置と同様に、フルシリアルの復号を繰り返し行う。
すなわち、図17の復号装置は、メッセージメモリ104、受信データメモリ105、メッセージ計算部181、制御部184からなる。また、メッセージ計算部181は、バリアブルノード計算器182とチェックノード計算器183とから構成されている。
図17の復号装置では、メッセージメモリ104から、メッセージが1つずつ読み出され、メッセージ計算部181において、そのメッセージを用いて、復号の対象のLDPC符号を定義する検査行列に基づき、所望の枝に対応するメッセージが計算される。そして、その計算によって求められたメッセージが、メッセージメモリ104に格納されていく。図17の復号装置では、以上の処理が繰り返し行われることで、繰り返し復号が行われる。
すなわち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(又は1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を格納(記憶)する。
バリアブルノード演算時には、受信データメモリ105は、制御部184から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部181のバリアブルノード計算器182に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部184から供給される制御信号に従い、記憶している同一のメッセージを1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD102として、バリアブルノード計算器182に供給し、2回目に読み出したメッセージをメッセージDD102として、バリアブルノード計算器182に供給する。バリアブルノード計算器182は、メッセージメモリ104から1回目に読み出されたメッセージD102、及び受信データメモリ105から供給される受信データD101を用い、さらには、メッセージメモリ104から2回目に読み出されたメッセージDD102を、必要に応じて用いて、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ(バリアブルノードメッセージ)viを、メッセージD103として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部184から供給される制御信号に従い、バリアブルノード計算器182から供給されるメッセージD103を記憶する(書き込む)。
一方、チェックノード演算時には、メッセージメモリ104は、制御部184から供給される制御信号に従って、記憶している同一のメッセージ(バリアブルノードメッセージvi)を1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD104として、チェックノード計算器183に供給し、2回目に読み出したメッセージをメッセージDD104として、チェックノード計算器183に供給する。
チェックノード計算器183は、メッセージメモリ104から1回目に読み出されたメッセージD104を用い、さらには、メッセージメモリ104から2回目に読み出されたメッセージDD104を、必要に応じて用いて、式(7)のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ(チェックノードメッセージ)ujを、メッセージD105として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部184から供給される制御信号に従い、チェックノード計算器183から供給されるメッセージD105を記憶する(書き込む)。
メッセージメモリ104が記憶したチェックノード計算器183からのメッセージD105、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD102(さらには、メッセージDD102)として読み出され、バリアブルノード計算器182に供給される。
なお、図17の復号装置において、制御部184は、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を必要に応じて行う。
さらに、制御部184は、制御信号C104を、メッセージ計算部181に供給することにより、そのメッセージ計算部181を構成するバリアブルノード計算器182、及びチェックノード計算器183を制御する。
ここで、バリアブルノード計算器182は、制御部184からの制御信号C104に従い、メッセージメモリ104から2回目に読み出されたメッセージDD102を選択的に用いて、式(1)のバリアブルノード演算を行う。チェックノード計算器183も、制御部184からの制御信号C104に従い、メッセージメモリ104から2回目に読み出されたメッセージDD104を選択的に用いて、式(7)のチェックノード演算を行う。
図18は、図17のバリアブルノード計算器182の構成例を示している。
なお、図中、図9のバリアブルノード計算器102、又は図13のバリアブルノード計算器172と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
バリアブルノード計算器182は、メッセージを遅延するための遅延メモリとしての小FIFOメモリ161と、セレクタ162とを有している。
小FIFOメモリ161は、図9のFIFOメモリ155と同様に、チェックノードからのメッセージとしての、メッセージメモリ104から1回目に読み出されたメッセージD102を一時記憶することにより遅延する。
但し、図9のFIFOメモリ155は、少なくとも、検査行列の列の重みdvの最大値に等しい数のメッセージを記憶することができる容量を有していたが、小FIFOメモリ161は、検査行列の列の重みdvの最大値よりも少ない数(であって1以上)のメッセージを記憶する容量しか有していない。
したがって、小FIFOメモリ161は、FIFOメモリ155よりも容量が小さいので、規模も小さい。
小FIFOメモリ161は、メッセージメモリ104から1回目に読み出されたメッセージD102を遅延し、セレクタ162のf端子に供給する。
セレクタ162は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ161で遅延されたメッセージD102が供給される。また、セレクタ162のm端子には、メッセージメモリ104から2回目に読み出されたメッセージDD102が供給される。
さらに、セレクタ162には、制御部184(図17)から制御信号C104が供給されるようになっている。
セレクタ162は、制御部184からの制御信号C104に従い、小FIFOメモリ161で遅延されたメッセージD102と、メッセージメモリ104から2回目に読み出されたメッセージとのうちの一方を、バリアブルノードの演算に用いるメッセージとして選択し、値D153として、演算器156に供給する。
なお、バリアブルノード計算器182には、入力ポートP101,P102,PD102の他、入力ポートP104を有しており、制御部184からの制御信号C104は、入力ポートP104を介して、セレクタ162に供給される。
また、制御部184は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ161が記憶可能なメッセージの数以下であるときには、小FIFOメモリ161で遅延されたメッセージD102を選択することをセレクタ162に指示する信号を、制御信号C104として、バリアブルノード計算器182に供給する。
さらに、制御部184は、バリアブルノードに対応する列の重みが、小FIFOメモリ161が記憶可能なメッセージの数以下でないときには、メッセージメモリ104から2回目に読み出されたメッセージDD102を選択することをセレクタ162に指示する信号を、制御信号C104として、バリアブルノード計算器182に供給する。
ここで、制御部184は、小FIFOメモリ161で遅延されたメッセージD102を選択することをセレクタ162に指示する制御信号C104を、バリアブルノード計算器182に供給する場合、つまり、制御信号C104が、メッセージメモリ104から2回目に読み出されたメッセージDD102を選択することをセレクタ162に指示する信号でない場合には、メッセージメモリ104からのメッセージの読み出しについては、メッセージメモリ104からメッセージを1回だけ読み出す読み出し制御を行う。
したがって、制御部184では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ161が記憶可能なメッセージの数以下でない場合には、図15で説明した、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ161が記憶可能なメッセージの数以下である場合には、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御は行われず、1回だけ読み出す読み出し制御、すなわち、図15のステップS101及びS102のうちの、ステップS101だけが行われる。
以上のように構成されるバリアブルノード計算器182は、入力ポートP101,P102,PD102それぞれから入力されるメッセージを必要に応じて用いて、式(1)のバリアブルノード演算を行い、その結果得られるメッセージを、出力ポートP103から出力する。
すなわち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP102には、メッセージメモリ104から読み出されたメッセージD102(チェックノードメッセージuj)が供給される。
そして、バリアブルノード計算器182では、検査行列の各行に対応するチェックノードからのメッセージD102、すなわち、メッセージメモリ104から1回目に読み出されたメッセージujが、入力ポートP102から1つずつ入力され、そのメッセージD102が、演算器151と小FIFO161に供給される。
また、バリアブルノード計算器182では、受信データメモリ105から受信データD101が入力ポートP101から1つずつ読み込まれ、演算器157に供給される。
演算器151は、メッセージD102(メッセージuj)とレジスタ152に格納されている値D151とを加算することにより、メッセージD102を積算し、その結果得られる積算値を、レジスタ152に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD102が積算された場合、レジスタ152はリセットされる。
検査行列の1列に亘るメッセージD102が1つずつ読み込まれ、レジスタ152に1列分のメッセージD102が積算された値が格納された場合、すなわち、レジスタ152に、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)が積算された積算値(j=1からdvまでのΣuj)が格納された場合、セレクタ153は、レジスタ152に格納されている値、すなわち、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)が積算された積算値D151(j=1からdvまでのΣuj)を選択し、レジスタ154に出力して格納させる。
レジスタ154は、格納している値D151を、値D152として、セレクタ153と演算器156に供給する。レジスタ152に1列分のメッセージD102が積算された値が格納される直前までは、セレクタ153は、レジスタ154から供給された値D152を選択し、レジスタ154に出力し再格納させる。すなわち、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)が積算されるまで、レジスタ154は、前回積算された値を、セレクタ153と演算器156に供給する。
一方、レジスタ154から新たな値D152(j=1からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ152に1列分のメッセージD102が積算された積算値(j=1からdvまでのΣuj)が格納された直後、バリアブルノード計算器182においては、メッセージD102(メッセージuj)と同一のメッセージDD102、すなわち、メッセージメモリ104から2回目に読み出されたメッセージujが、入力ポートPD102から1つずつ入力され、そのメッセージDD102が、セレクタ162のm端子に供給される。
また、小FIFOメモリ161は、レジスタ154から新たな値D152(j=1からdvまでのΣuj)が出力されるまでの間、メッセージメモリ104から1回目に読み出されたメッセージD102を遅延し、セレクタ162のf端子に供給する。
ここで、小FIFOメモリ161が記憶することができるメッセージの数がd1個であるとすると、小FIFOメモリ161は、上述したように、検査行列の列の重みdvの最大値よりも少ない数のメッセージを記憶する容量しか有していないため、レジスタ154に、検査行列の、ある1列に対応するdv個のメッセージD102の積算値(j=1からdvまでのΣuj)が格納され、レジスタ154から出力されるまでの間、小FIFOメモリ161において、その1列に対応するdv個のメッセージD102を遅延することができないことがある。
すなわち、小FIFOメモリ161が記憶することができるメッセージの数d1が、レジスタ152に積算値が格納されるdv個のメッセージD102が入力されるバリアブルノードに対応する検査行列の列の重みdvよりも小である場合には、小FIFOメモリ161では、その列に対応するdv個のメッセージD102のうちの、d1+1個目のメッセージが記憶されるときに、1個目のメッセージが出力されてしまうため、レジスタ154において、小FIFOメモリ161が記憶可能なメッセージの個数d1よりも多いdv個のメッセージD102の積算値が出力されるまでの間、そのdv個のメッセージD102すべてを、小FIFOメモリ161に記憶しておくことができない。
そこで、制御部184(図17)は、上述したように、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する列の重みdvが、小FIFOメモリ161が記憶可能なメッセージの数d1以下でないときには、メッセージメモリ104から2回目に読み出されたメッセージDD102を選択することをセレクタ162に指示する信号を、制御信号C104として、バリアブルノード計算器182に供給する。
バリアブルノード計算器182において、制御部184からの制御信号C104は、入力ポートP104を介して、セレクタ162に供給される。
セレクタ162は、制御信号C104に従い、端子mに供給される、メッセージメモリ104から2回目に読み出されたメッセージDD102を選択し、値D153として演算器156に供給する。
演算器156は、レジスタ154から供給された積算値D152から、セレクタ162からの値D153(いまの場合、入力ポートPD102からのメッセージDD102)を減算する。すなわち、演算器156では、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)の積算値D152(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージD153を減算して、減算値(j=1からdv-1までのΣuj)を求め、演算器157に供給する。
一方、制御部184(図17)は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ161が記憶可能なメッセージの数d1以下であるときには、小FIFOメモリ161で遅延されたメッセージD102を選択することをセレクタ162に指示する信号を、制御信号C104として、バリアブルノード計算器182に供給する。
バリアブルノード計算器182において、制御部184からの制御信号C104は、入力ポートP104を介して、セレクタ162に供給される。
セレクタ162は、制御信号C104に従い、端子fに供給される、小FIFOメモリ161で遅延されたメッセージD102を選択し、値D153として演算器156に供給する。
ここで、小FIFOメモリ161が記憶することができるメッセージの数d1が、レジスタ152に積算値が格納されるdv個のメッセージD102が入力されるバリアブルノードに対応する検査行列の列の重みdvよりも小でない場合には、レジスタ152において、小FIFOメモリ161が記憶可能なメッセージの個数d1よりも多くないdv個のメッセージD102が積算されるまでの間、そのdv個のメッセージD102すべてを、小FIFOメモリ161に記憶しておくこと、つまり、dv個のメッセージD102が積算されるまでの間、そのdv個のメッセージD102すべてを遅延することができ、その遅延後のメッセージD102を、dv個のメッセージD102の積算が終了した後に出力することができる。
そこで、制御部184(図17)は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ161が記憶可能なメッセージの数d1以下であるときには、小FIFOメモリ161で遅延されたメッセージD102を選択することをセレクタ162に指示する制御信号C104を、バリアブルノード計算器182のセレクタ162に供給し、これにより、セレクタ162では、小FIFOメモリ161で遅延されたメッセージD102が選択され、値D153として演算器156に供給される。
演算器156は、レジスタ154から供給された積算値D152から、セレクタ162からの値D153(いまの場合、小FIFOメモリ161で遅延されたメッセージD102)を減算する。すなわち、演算器156では、検査行列の1列に亘る全ての枝からのメッセージD102(メッセージuj)の積算値D152(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージD153を減算して、減算値(j=1からdv-1までのΣuj)を求め、演算器157に供給する。
演算器157は、入力ポートP101からの受信データD101と、演算器156からの減算値(j=1からdv-1までのΣuj)とを加算し、その結果得られる加算値をメッセージD103(メッセージvi)として、出力ポートP103から出力する。
以上のように、バリアブルノード計算器182では、式(1)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP103から出力される。
図19は、図17のチェックノード計算器183の構成例を示している。
なお、図中、図10のチェックノード計算器103、及び図14のチェックノード計算器173と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
チェックノード計算器183は、データを遅延するための遅延メモリとしての、小FIFOメモリ141及び143と、セレクタ142及び144とを有している。
小FIFOメモリ141は、図10のFIFOメモリ127と同様に、メッセージメモリ104から1回目に読み出されたメッセージD104からLUT121で求められた非線形関数φ(|vi|)の演算結果D123(φ(|vi|))を遅延する。
但し、図10のFIFOメモリ127は、少なくとも、検査行列の行の重みdcの最大値に等しい数のメッセージ(から求められる非線形関数φ(|vi|)の演算結果)を記憶することができる容量を有していたが、小FIFOメモリ141は、検査行列の行の重みdcの最大値よりも少ない数(であって1以上)のメッセージを記憶する容量しか有していない。
したがって、小FIFOメモリ141は、FIFOメモリ127よりも容量が小さいので、規模も小さい。
小FIFOメモリ141は、メッセージメモリ104から1回目に読み出されたメッセージD104から求められた非線形関数φ(|vi|)の演算結果D123を遅延し、セレクタ142のf端子に供給する。
セレクタ142は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ141で遅延された非線形関数φ(|vi|)の演算結果が供給される。また、セレクタ142のm端子には、メッセージメモリ104から2回目に読み出されたメッセージDD104からLUT135で求められた非線形関数φ(|vi|)の演算結果が供給される。
さらに、セレクタ142には、制御部184(図17)から制御信号C104が供給されるようになっている。
セレクタ142は、制御部184からの制御信号C104に従い、小FIFOメモリ141で遅延された、メッセージから求められた非線形関数φ(|vi|)の演算結果と、メッセージメモリ104から2回目に読み出されたメッセージから求められた非線形関数φ(|vi|)の演算結果とのうちの一方を、チェックノードの演算に用いるメッセージ(から求められた非線形関数φ(|vi|)の演算結果)として選択し、値D127として、演算器126に供給する。
小FIFOメモリ143は、図10のFIFOメモリ133と同様に、メッセージメモリ104から1回目に読み出されたメッセージD104の符号ビットD121を遅延する。
但し、図10のFIFOメモリ133は、少なくとも、検査行列の行の重みdcの最大値に等しい数のメッセージ(の符号ビット)を記憶することができる容量を有していたが、小FIFOメモリ143は、検査行列の行の重みdcの最大値よりも少ない数(であって1以上)のメッセージを記憶する容量しか有していない。
したがって、小FIFOメモリ143は、FIFOメモリ133よりも容量が小さいので、規模も小さい。
小FIFOメモリ143は、メッセージメモリ104から1回目に読み出されたメッセージD104の符号ビットD121を遅延し、セレクタ144のf端子に供給する。
セレクタ144は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ143で遅延された、メッセージメモリ104から1回目に読み出されたメッセージD104の符号ビットが供給される。また、セレクタ142のm端子には、メッセージメモリ104から2回目に読み出されたメッセージDD104の符号ビットが供給される。
さらに、セレクタ144には、制御部184(図17)から制御信号C104が供給されるようになっている。
セレクタ144は、制御部184からの制御信号C104に従い、小FIFOメモリ143で遅延された符号ビットと、メッセージメモリ104から2回目に読み出されたメッセージの符号ビットとのうちの一方を、チェックノードの演算に用いるメッセージ(の符号ビット)として選択し、値D134として、EXOR回路134に供給する。
なお、チェックノード計算器183には、入力ポートP111とPD111の他、入力ポートP114を有しており、制御部184からの制御信号C104は、入力ポートP114を介して、セレクタ142及び144に供給される。
また、制御部184は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みが、小FIFOメモリ143が記憶可能なメッセージ(から求められたφ(|vi|))の数以下であるとき(このときは、検査行列の行の重みが、小FIFOメモリ143が記憶可能なメッセージ(の符号ビット)の数以下であるときでもある)には、小FIFOメモリ141で遅延されたメッセージD104(から求められたφ(|vi|))を選択することをセレクタ142に指示するとともに、小FIFOメモリ143で遅延されたメッセージ(の符号ビット)を選択することをセレクタ144に指示する信号を、制御信号C104として、チェックノード計算器183に供給する。
さらに、制御部184は、チェックノードに対応する行の重みが、小FIFOメモリ141が記憶可能なメッセージ(から求められたφ(|vi|))の数以下でないとき(このときは、検査行列の行の重みが、小FIFOメモリ143が記憶可能なメッセージ(の符号ビット)の数以下でないときでもある)には、メッセージメモリ104から2回目に読み出されたメッセージDD104(から求められたφ(|vi|))を選択することをセレクタ142に指示するとともに、メッセージメモリ104から2回目に読み出されたメッセージDD104(の符号ビット)を選択することをセレクタ144に指示する信号を、制御信号C104として、チェックノード計算器183に供給する。
ここで、制御部184は、小FIFOメモリ141で遅延されたメッセージD104のφ(|vi|)を選択することをセレクタ142に指示する(とともに、小FIFOメモリ143で遅延されたメッセージD104の符号ビットを指示することをセレクタ144に指示する)制御信号C104を、チェックノード計算器183に供給する場合、つまり、制御信号C104が、メッセージメモリ104から2回目に読み出されたメッセージDD104のφ(|vi|)を選択することをセレクタ142に指示する信号でない場合には、メッセージメモリ104からのメッセージの読み出しについては、メッセージメモリ104からメッセージを1回だけ読み出す読み出し制御を行う。
したがって、制御部184では、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みが、小FIFOメモリ141が記憶可能なメッセージの数以下でない場合には、図15で説明した、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みが、小FIFOメモリ141が記憶可能なメッセージの数以下である場合には、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御は行われず、1回だけ読み出す読み出し制御、すなわち、図15のステップS101及びS102のうちの、ステップS101だけが行われる。
以上のように構成されるチェックノード計算器183は、入力ポートP111とPD111それぞれから入力されるメッセージを必要に応じて用いて、式(7)のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP112から出力する。
すなわち、入力ポートP111には、メッセージメモリ104から読み出されたメッセージD104(バリアブルノードメッセージuj)が供給される。
そして、チェックノード計算器183では、検査行列の各行に対応するバリアブルノードからのメッセージD104(メッセージvi)が入力ポートP111から1つずつ入力され、その最上位ビットを除く下位ビット、つまり、メッセージD104の絶対値D122(|vi|)が、LUT121に供給されるとともに、最上位ビット、つまりメッセージD104の符号ビットD121が、EXOR回路129と小FIFOメモリ143に供給される。
LUT121は、絶対値D122(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D123(φ(|vi|))を読み出し、演算器122と小FIFO141に供給する。
演算器122は、演算結果D123(φ(|vi|))とレジスタ123に格納されている値D124とを加算することにより、演算結果D123を積算し、その結果得られる積算値をレジスタ123に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD104の絶対値D122(|vi|)に対する演算結果D123(φ(|vi|))が積算された場合、レジスタ123はリセットされる。
検査行列の1行に亘るメッセージD104が1つずつ読み込まれ、レジスタ123に1行分の演算結果D123が積算された積算値が格納された場合、セレクタ124は、レジスタ123に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)から求められたφ(|vi|)が積算された積算値D124(i=1からi=dcまでのΣφ(|vi|))を選択し、積算値D125として、レジスタ125に出力して格納させる。レジスタ125は、格納している積算値D125を、値D126として、セレクタ124と演算器126に供給する。
レジスタ123に1行分の演算結果D123が積算された積算値が格納される直前までは、セレクタ124は、レジスタ125から供給された値D126を選択し、レジスタ125に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)から求められたφ(|vi|)が積算されるまで、レジスタ125は、前回積算されたφ(|vi|)の積算値を、セレクタ124と演算器126に供給する。
一方、レジスタ125から新たな値D126(i=1からi=dcまでのΣφ(|vi|))の出力が開始されると、すなわち、レジスタ125に1行分の演算結果D123が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納された直後、チェックノード計算器183において、メッセージD104(メッセージvi)と同一のメッセージDD104、すなわち、メッセージメモリ104から2回目に読み出されたメッセージviが、入力ポートPD111から1つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT135に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、セレクタ144のm端子に供給される。
LUT135は、メッセージDD104の絶対値(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果(φ(|vi|))を読み出し、セレクタ142のm端子に供給する。
また、小FIFOメモリ141は、レジスタ125から新たな値D126(i=1からdcまでのΣφ(|vi|))が出力されるまでの間、LUT121からのメッセージD104の演算結果D123(φ(|vi|))を遅延し、セレクタ142のf端子に供給する。
ここで、小FIFOメモリ141が記憶することができるメッセージ(のφ(|vi|))の数がd2個であるとすると、小FIFOメモリ141は、上述したように、検査行列の行の重みdcの最大値よりも少ない数のメッセージ(のφ(|vi|))を記憶する容量しか有していないため、レジスタ125に、検査行列の、ある1行に対応するdc個のメッセージD104のφ(|vi|)の積算値(i=1からdcまでのΣφ(|vi|))が格納され、レジスタ125から出力されるまでの間、小FIFOメモリ141において、その1行に対応するdc個のメッセージD104のφ(|vi|)を遅延することができないことがある。
すなわち、小FIFOメモリ141が記憶することができるメッセージの数d2が、レジスタ125にφ(|vi|)の積算値が格納されるdc個のメッセージD102が入力されるチェックノードに対応する検査行列の行の重みdcよりも小である場合には、小FIFOメモリ141では、その行に対応するdc個のメッセージD104のうちの、d2+1個目のメッセージのφ(|vi|)が記憶されるときに、1個目のメッセージのφ(|vi|)が出力されてしまうため、レジスタ125において、小FIFOメモリ141が記憶可能なメッセージの個数d2よりも多いdc個のメッセージD104のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD104のφ(|vi|)すべてを、小FIFOメモリ141に記憶しておくことができない。
そこで、制御部184(図17)は、上述したように、メッセージを求めようとしている枝が接続しているチェックノードに対応する行の重みdcが、小FIFOメモリ141が記憶可能なメッセージの数d2以下でないときには、メッセージメモリ104から2回目に読み出されたメッセージDD104から求められたφ(|vi|)を選択することをセレクタ142に指示する信号を、制御信号C104として、チェックノード計算器183に供給する。
チェックノード計算器183において、制御部184からの制御信号C104は、入力ポートP114を介して、セレクタ142に供給される。
セレクタ142は、制御信号C104に従い、端子mに供給される、メッセージメモリ104から2回目に読み出されたメッセージDD102からLUT135で求められたφ(|vi|)を選択し、値D127として演算器126に供給する。
一方、制御部184(図17)は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ141が記憶可能なメッセージの数d2以下であるときには、小FIFOメモリ141で遅延されたメッセージD104のφ(|vi|)を選択することをセレクタ142に指示する信号を、制御信号C104として、チェックノード計算器183に供給する。
チェックノード計算器183において、制御部184からの制御信号C104は、入力ポートP114を介して、セレクタ142に供給される。
セレクタ142は、制御信号C104に従い、端子fに供給される、小FIFOメモリ141で遅延されたメッセージD104のφ(|vi|)を選択し、値D127として演算器156に供給する。
ここで、小FIFOメモリ141が記憶することができるメッセージの数d2が、レジスタ125に積算値が格納されるdc個のメッセージD104が入力されるチェックノードに対応する検査行列の行の重みdcよりも小でない場合には、レジスタ125において、小FIFOメモリ141が記憶可能なメッセージの個数d2よりも多くないdc個のメッセージD104のφ(|vi|)の積算値(i=1からdcまでのΣφ(|vi|))が出力されるまでの間、そのdc個のメッセージD104のφ(|vi|)すべてを、小FIFOメモリ141に記憶しておくこと、つまり、dc個のメッセージD104のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD104のφ(|vi|)すべてを遅延することができ、その遅延後のメッセージD104のφ(|vi|)を、dc個のメッセージD104のφ(|vi|)の積算が終了した後に出力することができる。
そこで、制御部184(図17)は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ141が記憶可能なメッセージの数d2以下であるときには、小FIFOメモリ141で遅延されたメッセージD104のφ(|vi|)を選択することをセレクタ162に指示する制御信号C104を、チェックノード計算器183のセレクタ142に供給し、これにより、セレクタ142では、小FIFOメモリ141で遅延されたメッセージD104のφ(|vi|)が選択され、値D127として演算器126に供給される。
演算器126は、レジスタ125から供給された値D126から、セレクタ142からの値D127(φ(|vi|))を減算し、減算結果を、減算値D128としてLUT128に供給する。すなわち、演算器126は、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)から求められたφ(|vi|)の積算値(i=1からi=dcまでのΣφ(|vi|))から、求めたい枝からのメッセージvi(i=dcのvi)から求められたφ(|vi|)を減算して、その減算値(i=1からi=dc-1までのΣφ(|vi|))を減算値D128としてLUT128に供給する。
LUT128は、演算器126からの減算値D128(i=1からi=dc-1までのΣφ(|vi|))を引数として、逆関数φ-1(Σφ(|vi|))の演算を行った演算結果D129(φ-1(Σφ(|vi|)))を出力する。
一方、EXOR回路129は、レジスタ130に格納されている値D131と符号ビットD121との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D130をレジスタ130に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された場合、レジスタ130はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130(i=1からdcまでのΠsign(vi))がレジスタ130に格納された場合、セレクタ131は、レジスタ130に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131(i=1からi=dcまでのΠsign(vi))を選択し、値D132としてレジスタ132に出力して格納させる。レジスタ132は、格納している値D132を、値D133としてセレクタ131とEXOR回路134に供給する。
検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された乗算結果D130(i=1からdcまでのΠsign(vi))がレジスタ130に格納される直前までは、セレクタ131は、レジスタ132から供給された値D133を選択し、レジスタ132に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD104(メッセージvi)の符号ビットD121が乗算されるまで、レジスタ132は、前回格納した値を、セレクタ131とEXOR回路134に供給する。
レジスタ132から新たな値D133(i=1からi=dcまでのΠsign(vi))がEXOR回路134に供給されたとき、すなわち、レジスタ130に1行に亘る全ての枝からのメッセージD104の符号ビットD121が乗算された値D131(i=1からi=dcまでのΠsign(vi))が格納されたとき、上述したように、レジスタ125には、1行分の演算結果D123が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納される。
レジスタ125に1行分の演算結果D123が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納されると、上述したように、チェックノード計算器183において、メッセージD104(メッセージvi)と同一のメッセージDD104、すなわち、メッセージメモリ104から2回目に読み出されたメッセージviが、入力ポートPD104から1つずつ入力され、そのメッセージDD104のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD104の絶対値(|vi|)が、LUT135に供給されるとともに、最上位ビット、つまりメッセージDD104の符号ビットが、セレクタ144のm端子に供給される。
また、小FIFOメモリ143は、レジスタ132から新たな値D133(i=1からi=dcまでのΠsign(vi))が出力されるまでの間、メッセージメモリ104から1回目に読み出されたメッセージD104の符号ビットD121を遅延し、セレクタ144のf端子に供給する。
ここで、小FIFOメモリ143が記憶することができるメッセージ(の符号ビット)の数が、小FIFOメモリ141と同一のd2個であるとすると、小FIFOメモリ143は、上述したように、検査行列の行の重みdcの最大値よりも少ない数のメッセージ(の符号ビット)を記憶する容量しか有していないため、レジスタ132に、検査行列の、ある1行に対応するdc個のメッセージD104の符号ビットD121の乗算結果(i=1からdcまでのΠsign(vi))が格納され、レジスタ132から出力されるまでの間、小FIFOメモリ143において、その1行に対応するdc個のメッセージD104の符号ビットD121を遅延することができないことがある。
すなわち、小FIFOメモリ143が記憶することができるメッセージの数d2が、レジスタ132に符号ビットD121の乗算結果が格納されるdc個のメッセージD102が入力されるチェックノードに対応する検査行列の行の重みdcよりも小である場合には、小FIFOメモリ143では、その行に対応するdc個のメッセージD104のうちの、d2+1個目のメッセージの符号ビットD121が記憶されるときに、1個目のメッセージの符号ビットD121が出力されてしまうため、レジスタ132において、小FIFOメモリ143が記憶可能なメッセージの個数d2よりも多いdc個のメッセージD104の符号ビットD121が格納されるまでの間、そのdc個のメッセージD104の符号ビットD121すべてを、小FIFOメモリ143に記憶しておくことができない。
そこで、制御部184(図17)は、上述したように、メッセージを求めようとしている枝が接続しているチェックノードに対応する行の重みdcが、小FIFOメモリ143が記憶可能なメッセージの数d2以下でないとき(このときは、行の重みdcが、小FIFOメモリ141が記憶可能なメッセージの数d2以下でないときでもある)には、メッセージメモリ104から2回目に読み出されたメッセージDD104の符号ビットを選択することをセレクタ144に指示する信号を、制御信号C104として、チェックノード計算器183に供給する。
チェックノード計算器183において、制御部184からの制御信号C104は、入力ポートP114を介して、セレクタ144に供給される。
セレクタ144は、制御信号C104に従い、端子mに供給される、メッセージメモリ104から2回目に読み出されたメッセージDD102の符号ビットを選択し、値D134としてEXOR回路134に供給する。
一方、制御部184(図17)は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ143が記憶可能なメッセージの数d2以下であるときには、小FIFOメモリ143で遅延されたメッセージD104の符号ビットを選択することをセレクタ142に指示する信号を、制御信号C104として、チェックノード計算器183に供給する。
チェックノード計算器183において、制御部184からの制御信号C104は、入力ポートP114を介して、セレクタ144に供給される。
セレクタ144は、制御信号C104に従い、端子fに供給される、小FIFOメモリ143で遅延されたメッセージD104の符号ビットを選択し、値D134としてEXOR回路134に供給する。
EXOR回路134は、レジスタ132から供給された値D133と、セレクタ144からの符号ビットD134との排他的論理和を演算することにより、値D133を、符号ビットD134で除算し、除算結果を除算値D135として出力する。すなわち、EXOR回路134は、検査行列の1行に亘る全ての枝からのメッセージD104の符号ビットD121の乗算値D133(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージviとしてのメッセージの符号ビットD134(i=dcのsign(vi))で除算して、その除算値(i=1からi=dc-1までのΠsign(vi))を除算値D135として出力する。
そして、チェックノード計算器183では、LUT128から出力された演算結果D129を下位ビットとするとともに、EXOR回路134から出力された除算値D135を最上位ビット(符号ビット)とするビット列がメッセージD105(メッセージuj)として、出力ポートP112から出力される。
以上のように、チェックノード計算器183では、式(7)の演算が行われ、メッセージ(チェックノードメッセージ)ujが求められる。
なお、図示しないが、図17の復号装置では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
次に、図20のフローチャートを参照して、図17の制御部184が制御信号C104により、セレクタ142及び144(図19)、並びにセレクタ162(図18)を制御するセレクタ制御の処理について説明する。
なお、ここでは、説明を簡単にするために、小FIFOメモリ141及び143(図19)、並びに小FIFOメモリ161(図18)が記憶可能なメッセージの個数(以下、適宜、記憶可能個数という)は、すべて同一のd個であるとする。但し、小FIFOメモリ141及び143(図19)と、小FIFOメモリ161(図18)とが記憶可能なメッセージの個数は、異なっていても良い。
ステップS121において、制御部184は、メッセージを求めようとして注目しているノード(注目ノード)に対応する検査行列の重み(注目ノードがバリアブルノードである場合には、そのバリアブルノードに対応する列の重みであり、注目ノードがチェックノードである場合には、そのチェックノードに対応する行の重み)が、記憶可能個数dよりも大であるかどうかを判定する。
ステップS121において、注目ノードに対応する検査行列の重みが、記憶可能個数dより大でないと判定された場合、すなわち、注目ノードに接続している枝に対応する出力メッセージを求めるのに用いられる入力メッセージの個数が、記憶可能個数d以下である場合、処理は、ステップS122に進み、制御部184は、FIFOメモリの出力、すなわち、例えば、図18のバリアブルノード計算器182については、小FIFOメモリ161が出力するメッセージを、図19のチェックノード計算器183については、小FIFOメモリ141が出力するメッセージのφ(|vi|)と、小FIFOメモリ143が出力するメッセージの符号ビットとを、それぞれ選択することを指示する制御信号C104を出力し、処理は、ステップS121に戻る。
この場合、図18のバリアブルノード計算器182では、セレクタ162において、制御信号C104に従い、小FIFOメモリ161が出力するメッセージが選択され、演算器156に供給される。
また、図19のチェックノード計算器183では、セレクタ142において、制御信号C104に従い、小FIFOメモリ141が出力するメッセージのφ(|vi|)が選択され、演算器126に供給されるとともに、セレクタ144において、制御信号C104に従い、小FIFOメモリ143が出力するメッセージの符号ビットが選択され、EXOR回路134に供給される。
なお、入力メッセージの個数が、記憶可能個数d以下である場合、制御部184では、上述したように、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御(図15のステップS101及びS102の両方)は行われず、1回だけ読み出す読み出し制御(図15のステップS101)が行われる。
一方、ステップS121において、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であると判定された場合、すなわち、注目ノードに接続している枝に対応する出力メッセージを求めるのに用いられる入力メッセージの個数が、記憶可能個数dを越えている場合、処理は、ステップS123に進み、制御部184は、メッセージメモリ104(図17)から2回目に読み出されたメッセージ(データ)、すなわち、例えば、図18のバリアブルノード計算器182については、メッセージメモリ104から2回目に読み出されたメッセージDD102を、図19のチェックノード計算器183については、メッセージメモリ104から2回目に読み出されたメッセージDD102からLUT135で求められたφ(|vi|)と、メッセージメモリ104から2回目に読み出されたメッセージDD102の符号ビットとを、それぞれ選択することを指示する制御信号C104を出力し、処理は、ステップS121に戻る。
すなわち、この場合、制御部184では、上述したように、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御(図15のステップS101及びS102の両方)が行われ、これにより、メッセージメモリ104からは、同一のメッセージが2回読み出される。
この場合、図18のバリアブルノード計算器182では、セレクタ162において、制御信号C104に従い、メッセージメモリ104から2回目に読み出されたメッセージDD102が選択され、演算器156に供給される。
また、図19のチェックノード計算器183では、セレクタ142において、制御信号C104に従い、メッセージメモリ104から2回目に読み出されたメッセージDD102からLUT135で求められたφ(|vi|)が選択され、演算器126に供給されるとともに、セレクタ144において、制御信号C104に従い、メッセージメモリ104から2回目に読み出されたメッセージDD102の符号ビットが選択され、EXOR回路134に供給される。
以上のように、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ141及び143(図19)、並びに小FIFOメモリ161(図18)を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ127及び133(図10)、並びにFIFOメモリ155(図9)を設ける場合に比較して、復号装置の規模を削減することができる。
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合(記憶可能個数dより大でない場合)には、FIFOメモリの出力を選択して、ノード(バリアブルノード、チェックノード)の演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ127及び133(図10)、並びにFIFOメモリ155(図9)を有する図8の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図8の復号装置と同様の回数だけ繰り返し復号を行うことができるので(1回の復号に要する時間が図8の復号装置と同様となるので)、復号性能が劣化することを防止(抑制)することができる。
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ104から同一のメッセージを2回読み出し、2回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
以上から、図17の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
ところで、図17の復号装置では、出力メッセージを求める手段としてのメッセージ計算部181を、バリアブルノード演算を行うバリアブルノード計算器182と、チェックノード演算を行うチェックノード計算器183とで構成するようにしたが、出力メッセージを求める手段は、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有化して構成し、バリアブルノード演算とチェックノード演算とを、選択的に行うようにすることで、復号装置の規模の、さらなる削減をすることができる。
そこで、次に、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有化し、かつ、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを設けた復号装置について説明するが、その前段階の準備として、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部が共有化され、かつ、少なくとも、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリが設けられた復号装置について説明する。
すなわち、図21は、そのような復号装置の構成例を示すブロック図である。
なお、図中、図8の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図21の復号装置は、メッセージ計算部101に代えてメッセージ計算部191が設けられているとともに、制御部106に代えて制御部192が設けられている他は、図8の復号装置と同様に構成されている。
図21の復号装置は、図8の復号装置と同様に、フルシリアルの復号を繰り返し行う。
図21の復号装置では、メッセージメモリ104からメッセージ計算部191に、入力メッセージが1つずつ読み出され、メッセージ計算部191において、その入力メッセージを用いて、所望の枝に対応する出力メッセージが計算される。そして、その計算によって求められた出力メッセージが、メッセージメモリ104に格納されていく。図21の復号装置では、以上の処理が繰り返し行われ、いわゆる繰り返し復号が行われる。
すなわち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(又は1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を記憶する。
バリアブルノード演算時には、受信データメモリ105は、制御部192から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部191に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部192から供給される制御信号に従って、記憶しているメッセージD201を読み出し、メッセージ計算部191に供給する。さらに、バリアブルノード演算時には、制御部192は、制御信号C203として、バリアブルノード演算を指示する制御信号を、メッセージ計算部191に供給する。
メッセージ計算部191は、メッセージメモリ104から供給される入力メッセージD201と受信データメモリ105から供給される受信データD101を用い、制御部192からの制御信号C203に従って、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られた出力メッセージ(バリアブルノードメッセージ)viを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、以上のようにしてメッセージ計算部191から供給されるメッセージD202を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部192から供給される制御信号に従って、記憶しているバリアブルノードメッセージviを、入力メッセージD201として読み出し、メッセージ計算部191に供給する。
さらに、チェックノード演算時には、制御部192は、制御信号C203として、チェックノード演算を指示する制御信号を、メッセージ計算部191に供給する。
メッセージ計算部191は、メッセージメモリ104から供給される入力メッセージD201を用い、制御部192からの制御信号C203に従って、式(7)のチェックノード演算を行い、そのチェックノード演算にって求められた出力メッセージ(チェックノードメッセージ)ujを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、以上のようにしてメッセージ計算部191から供給されるメッセージD202を記憶する。
メッセージメモリ104が記憶したメッセージ計算部191からのチェックノードメッセージujとしてのメッセージD202は、次のバリアブルノード演算時に、メッセージD201として読み出され、メッセージ計算部191に供給される。
次に、図22は、図21のメッセージ計算部191の構成例を示している。
メッセージ計算部191は、外部からメッセージ(データ)が供給(入力)される入力ポートとして、2つの入力ポートP101とP201を有し、外部にメッセージを供給(出力)するポートとして、1の出力ポートP202を有している。さらに、メッセージ計算部191は、外部から制御信号が供給(入力)される入力ポートとして、1つの入力ポートP203を有している。
メッセージ計算部191は、入力ポートP201から入力されるメッセージ、さらには、必要に応じて、入力ポートP101から入力されるメッセージ(受信データ)を用い、入力ポートP203から入力される制御信号C203に従って、復号の対象のLDPC符号を定義する検査行列に基づき、式(1)のバリアブルノード演算又は式(7)のチェックノード演算を選択的に行い、その結果得られるメッセージを、出力ポートP202から出力する。
すなわち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP201には、メッセージメモリ104から読み出されたメッセージD201(チェックノードメッセージuj又はバリアブルノードメッセージvi)が供給される。さらに、入力ポートP203には、制御部192からの制御信号C203が供給される。
そして、入力ポートP101に供給された受信データD101は、演算器313に供給され、入力ポートP201に供給されたメッセージD201は、セレクタ301のv端子に供給される。さらに、入力ポートP201に供給されたメッセージD201のうちの最上位ビットを除く下位ビット、すなわち、メッセージD201の絶対値は、値D303として、LUT300に供給され、メッセージD201のうちの最上位ビット、すなわち、メッセージD201の符号ビットは、値D304として、EXOR回路306とFIFOメモリ320に供給される。
また、入力ポートP203に供給された制御信号C203は、セレクタ301及び316に供給される。
セレクタ301及び316は、v端子とc端子とを有し、制御信号C203に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ301及び316は、制御信号C203がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C203がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、メッセージ計算部191は、バリアブルノード演算時には、実質的に、図23に示す構成となって、バリアブルノード演算を行い、チェックノード演算時には、実質的に、図24に示す構成となって、チェックノード演算を行う。
すなわち、図23は、バリアブルノード演算時のメッセージ計算部191の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ301及び316はv端子を選択するが、図23では、図22に図示した構成のうちの、セレクタ301及び316がv端子を選択することによってバリアブルノード演算時に(実質的に)機能しない部分(バリアブルノード演算に関係がない部分)の図示を省略してある。
バリアブルノード演算時においては、入力ポートP101には、受信データメモリ105から1つずつ読み出された受信データD101が供給される。また、入力ポートP201には、メッセージメモリ104から1つずつ読み出された、検査行列の各行に対応するチェックノード(出力メッセージviを求めようとしているバリアブルノードに対応する列の、各行に対応するチェックノード)からのチェックノードメッセージujが、順次、メッセージD201として供給される。
入力ポートP101に供給された受信データD101は、演算器313に供給される。
また、入力ポートP201に供給されたメッセージD201(メッセージuj)は、セレクタ301のv端子に供給され、バリアブルノード演算時にはv端子を選択しているセレクタ301から、メッセージD306として、演算器302とFIFOメモリ320に供給される。
演算器302は、セレクタ301からのメッセージD306(メッセージuj)とレジスタ303に格納されている値D307とを加算することにより、メッセージD306を積算し、その結果得られる積算値を、レジスタ303に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD306が積算された場合、レジスタ303はリセットされる。
検査行列の1列に亘るメッセージD201が1つずつ読み込まれ、レジスタ303に1列分のメッセージD306が積算された値が格納された場合、すなわち、レジスタ303に、検査行列の1列に亘る全ての枝からのメッセージD306(メッセージuj)が積算された積算値(j=1からdvまでのΣuj)が格納された場合、セレクタ304は、レジスタ303に格納されている値、すなわち、検査行列の1列に亘る全ての枝からのメッセージD306(メッセージuj)が積算された積算値D307(j=1からdvまでのΣuj)を選択し、レジスタ305に出力して格納させる。
レジスタ305は、格納している値D307を、値D308として、セレクタ304と演算器312に供給する。レジスタ303に1列分のメッセージD306が積算された値が格納される直前までは、セレクタ304は、レジスタ305から供給された値D308を選択し、レジスタ305に出力し再格納させる。すなわち、検査行列の1列に亘る全ての枝からのメッセージD306(メッセージuj)が積算されるまで、レジスタ305は、前回積算された値を、セレクタ304と演算器312に供給する。
一方、FIFOメモリ320は、少なくとも、検査行列の重みの最大値と同一の数のメッセージを記憶することができる容量を有し、レジスタ305から新たな値D308(j=1からdvまでのΣuj)が出力されるまでの間、セレクタ301が出力したチェックノードからのメッセージD306を遅延し、値D315として演算器312に供給する。演算器312は、レジスタ305から供給された値D308から、FIFOメモリ320から供給された値D315を減算する。すなわち、演算器312は、検査行列の1列に亘る全ての枝からのメッセージD306(メッセージuj)の積算値D308(j=1からdvまでのΣuj)から、求めたい枝からのメッセージD315(uj)を減算して、減算値D316(j=1からdv-1までのΣuj)を求め、演算器313に供給する。
演算器313は、入力ポートP101からの受信データD101と、演算器312からの減算値D316(j=1からdv-1までのΣuj)とを加算し、その結果得られる加算値D317(バリアブルノードメッセージvi)を、セレクタ316のv端子に供給する。
セレクタ316は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器313からの加算値D317を、メッセージD202(メッセージvi)として、出力ポートP202から出力する。
以上のように、セレクタ301及び304がv端子を選択しているメッセージ計算部191では、式(1)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP202から出力される。
図24は、チェックノード演算時の図22のメッセージ計算部191の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ301及び316はc端子を選択するが、図24では、図22に図示した構成のうちの、セレクタ301及び316がc端子を選択することによってチェックノード演算時に(実質的に)機能しない部分(チェックノード演算に関係がない部分)の図示を省略してある。
チェックノード演算時においては、入力ポートP201には、メッセージメモリ104から1つずつ読み出された、検査行列の各列に対応するバリアブルノード(出力メッセージujを求めようとしているチェックノードに対応する行の、各列に対応するバリアブルノード)からのバリアブルノードメッセージviが、順次、メッセージD201として供給される。
入力ポートP201に供給されたメッセージD201(メッセージuj)のうちの最上位ビットを除く下位ビット、つまり、メッセージD201の絶対値D303(|vi|)は、LUT300に供給され、最上位ビット、つまりメッセージD201の符号ビットD304は、EXOR回路306とFIFOメモリ320にそれぞれ供給される。
LUT300は、そこに入力される値を引数xとして、式(7)のチェックノード演算における非線形関数φ(x)の演算結果を出力するLUT(φ(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行に亘る全ての枝からのメッセージD201の絶対値D303(|vi|)に対する演算結果D306(φ(|vi|))が積算された場合、レジスタ303はリセットされる。
検査行列の1行に亘るメッセージD201が1つずつ読み込まれ、レジスタ303に1行分の演算結果D306が積算された積算値が格納された場合、セレクタ304は、レジスタ303に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)から求められたφ(|vi|)が積算された積算値D307(i=1からi=dcまでのΣφ(|vi|))を選択し、レジスタ305に出力して格納させる。レジスタ305は、格納している積算値D307を、値D308として、セレクタ304と演算器312に供給する。
レジスタ303に1行分の演算結果D306が積算された積算値が格納される直前までは、セレクタ304は、レジスタ305から供給された値D308を選択し、レジスタ305に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)から求められたφ(|vi|)が積算されるまで、レジスタ305は、前回積算されたφ(|vi|)の積算値を、セレクタ304と演算器312に供給する。
一方、FIFOメモリ320は、レジスタ305から新たな値D308(i=1からi=dcまでのΣφ(|vi|))が出力されるまでの間、LUT300が出力した演算結果D306(φ(|vi|))を遅延し、値D315として演算器312に供給する。演算器312は、レジスタ305から供給された値D308から、FIFOメモリ320から供給された値D315を減算し、その減算結果を、減算値D316としてLUT314に供給する。すなわち、演算器312は、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)から求められたφ(|vi|)の積算値(i=1からi=dcまでのΣφ(|vi|))から、求めたい枝からのメッセージD201(メッセージvi)から求められたφ(|vi|)を減算して、その減算値(i=1からi=dc-1までのΣφ(|vi|))を減算値D316としてLUT314に供給する。
LUT314は、そこに入力される値を引数xとして、式(7)のチェックノード演算における非線形関数φ(x)の逆関数φ-1(x)の演算結果を出力するLUT(φ-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行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された場合、レジスタ307はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納された場合、セレクタ308は、レジスタ307に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された値D310(i=1からi=dcまでのΠsign(vi))を選択し、レジスタ309に出力して格納させる。レジスタ309は、格納している値D311を、セレクタ308とEXOR回路315に供給する。
検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納される直前までは、セレクタ308は、レジスタ309から供給された値D311を選択し、レジスタ309に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)の符号ビットD304が乗算されるまで、レジスタ309は、前回格納した値を、セレクタ308とEXOR回路315に供給する。
一方、FIFOメモリ320は、レジスタ309から新たな値D311(i=1からi=dcまでのΠsign(vi))がEXOR回路315に供給されるまでの間、セレクタ301からの演算結果D306(φ(|vi|))とともに、符号ビットD304を遅延し、1ビットの値D313としてEXOR回路315に供給する。EXOR回路315は、レジスタ309から供給された値D311と、FIFOメモリ320から供給された値D313との排他的論理和を演算することにより、値D311を、値D313で除算し、除算結果を除算値D319として出力する。すなわち、EXOR回路315は、検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304(sign(vi))の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージD201の符号ビットD304(sign(vi))で除算して、その除算値(i=1からi=dc-1までのΠsign(vi))を除算値D319として出力する。
そして、メッセージ計算部191では、LUT314から出力された演算結果D318を下位ビットとするとともに、EXOR回路315から出力された除算値D319を最上位ビット(符号ビット)とするビット列D320(チェックノードメッセージuj)が、セレクタ316のc端子に供給される。
セレクタ316は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D320(メッセージuj)を、メッセージD202(メッセージvi)として、出力ポートP202から出力する。
以上のように、セレクタ301及び304がc端子を選択しているメッセージ計算部191では、式(7)のチェックノード演算が行われ、その結果得られるメッセージ(チェックノードメッセージ)ujが、出力ポートP202から出力される。
なお、図示しないが、図21の復号装置では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
図21の復号装置によれば、メッセージメモリ104と、メッセージ計算部191のFIFOメモリ320の容量さえ足りれば、様々な検査行列のLDPC符号を復号することができる。
また、図21の復号装置のメッセージ計算部191(図22)では、図23と図24とを比較して分かるように、値の積算を行って積算値を出力する演算器302及びレジスタ303、積算値から、ある値を減算して減算値を出力するセレクタ304、レジスタ305、及び演算器312、並びに値を遅延する遅延メモリとしてのFIFOメモリ320が、バリアブルノード演算とチェックノード演算とで共有されているので、例えば、図8の復号装置のように、独立のバリアブルノード計算器102とチェックノード計算器103とを有するメッセージ計算部101よりも回路規模を小さくすることができる。
次に、図25は、本発明を適用した復号装置の第2実施の形態の構成例を示すブロック図である。
なお、図中、図21の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図25の復号装置は、メッセージ計算部191に代えて、メッセージ計算部201が設けられているとともに、制御部192に代えて、制御部202が設けられている他は、図21の復号装置と同様に構成されている。
図25の復号装置では、メッセージ計算部201が、図21の復号装置のメッセージ計算部191と同様に、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図25の復号装置では、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部201が、図22のメッセージ計算部191のFIFOメモリ320のように、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを有している。
また、図25の復号装置では、制御部202が、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を行う。
さらに、制御部202は、図21の制御部192と同様に、制御信号C203を、メッセージ計算部201に供給し、その制御信号C203によって、式(1)のバリアブルノード演算、又は式(7)のチェックノード演算を行うことを、メッセージ計算部201に指示する。
また、制御部202は、図20のフローチャートで説明したように、セレクタ制御の処理を行い、制御信号C104に相当する制御信号C204を、メッセージ計算部201に供給する。メッセージ計算部201は、制御部202からの制御信号C204に従い、メッセージメモリ104から2回目に読み出されるメッセージを選択的に用いて、式(1)のバリアブルノード演算や、式(7)のチェックノード演算を行う。
以上のように構成される復号装置では、制御部202の制御に従い、メッセージメモリ104から、入力メッセージが1つずつ読み出され、メッセージ計算部201において、その入力メッセージを用いて、所望の枝に対応する出力メッセージが計算される。そして、その計算によって求められた出力メッセージが、メッセージメモリ104に格納されていく。図25の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
すなわち、受信データメモリ105には、受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を格納(記憶)する。
バリアブルノード演算時には、受信データメモリ105は、制御部202から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部201に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部202から供給される制御信号に従い、記憶している同一のメッセージを1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD201として、メッセージ計算部201に供給し、2回目に読み出したメッセージをメッセージDD201として、メッセージ計算部201に供給する。
メッセージ計算部201は、メッセージメモリ104から1回目に読み出されたメッセージD201、及び受信データメモリ105から供給される受信データD101、さらには、必要に応じて、メッセージメモリ104から2回目に読み出されたメッセージDD201を用い、制御部202から供給される制御信号C203が表すバリアブルノード演算の指示、及び制御部202から供給される制御信号C204に従って、復号の対象のLDPC符号を定義する検査行列に基づき、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ(バリアブルノードメッセージ)viを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部202から供給される制御信号に従い、メッセージ計算部201から供給されるメッセージD202(バリアブルノードメッセージvi)を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部202から供給される制御信号に従って、記憶している同一のメッセージ(バリアブルノードメッセージvi)を1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD201として、メッセージ計算部201に供給し、2回目に読み出したメッセージをメッセージDD201として、メッセージ計算部201に供給する。
メッセージ計算部201は、メッセージメモリ104から1回目に読み出されたメッセージD201、さらには、必要に応じて、メッセージメモリ104から2回目に読み出されたメッセージDD201を用い、制御部202からの制御信号C203が表すチェックノード演算の指示、及び制御部202から供給される制御信号C204に従って、復号の対象のLDPC符号を定義する検査行列に基づき、式(7)のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ(チェックノードメッセージ)ujを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部202から供給される制御信号に従い、メッセージ計算部201から供給されるメッセージD202(チェックノードメッセージuj)を記憶する。
メッセージメモリ104が記憶したメッセージ計算部201からのメッセージD202、すなわち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD201、さらには、必要に応じてメッセージDD201として、1回、又は2回読み出され、メッセージ計算部201に供給される。
図26は、図25のメッセージ計算部201の構成例を示している。
なお、図中、図22のメッセージ計算部191と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
メッセージ計算部201には、図22の入力ポートP101,P201、及びP203の他に、入力ポートPD201及びP204が新たに設けられているとともに、LUT310及びセレクタ311が新たに設けられている。
さらに、メッセージ計算部201には、図22のFIFOメモリ320に代えて、小FIFOメモリ317が設けられ、さらに、セレクタ318が新たに設けられている。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。入力ポートP201には、メッセージメモリ104から2回読み出される同一のメッセージD201及びDD201のうちの1回目に読み出されるメッセージ(以下、適宜、1回目のメッセージともいう)D201が供給(入力)され、入力ポートPD201には、2回目に読み出されるメッセージ(以下、適宜、2回目のメッセージともいう)DD201が供給される。
入力ポートP203には、制御部202(図25)から制御信号C203が供給され、入力ポートP204には、制御部202から制御信号C204が供給される。
メッセージ計算部201は、入力ポートP201から入力される1回目のメッセージD201や、入力ポートPD201から入力される2回目のメッセージDD201、入力ポートP101から入力されるメッセージ(受信データ)を用い、入力ポートP203から入力される制御信号C203に従って、式(1)のバリアブルノード演算又は式(7)のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP202から出力する。
すなわち、入力ポートP101に供給された受信データD101は、演算器313に供給され、入力ポートP201に供給された1回目のメッセージD201は、セレクタ301のv端子と、小FIFOメモリ317に供給される。
さらに、入力ポートP201に供給された1回目のメッセージD201のうちの最上位ビットを除く下位ビット、すなわち、メッセージD201の絶対値は、値D303として、LUT300に供給され、1回目のメッセージD201のうちの最上位ビット、すなわち、メッセージD201の符号ビットは、値D304として、EXOR回路306に供給される。
また、入力ポートPD201に供給された2回目のメッセージDD201は、セレクタ318のm端子に供給される。
さらに、入力ポートP203に供給された制御信号C203は、セレクタ301,311、及び316に供給される。
セレクタ301,311、及び316は、v端子とc端子とを有し、制御信号C203に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ301,311、及び316は、制御信号C203がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C203がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、図26のメッセージ計算部201では、制御信号C203がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号C203がチェックノード演算を指示しているときには、チェックノード演算が行われる。
なお、小FIFOメモリ317は、メッセージを遅延するための遅延メモリであり、メッセージメモリ104からの1回目のメッセージD201を、図22のFIFOメモリ320と同様に一時記憶して遅延する。
但し、図22のFIFOメモリ320は、少なくとも、検査行列の重み(列の重みdv及び行の重みdc)の最大値に等しい数のメッセージを記憶することができる容量を有していたが、小FIFOメモリ317は、検査行列の重みの最大値よりも少ない数(であって1以上)のメッセージを記憶する容量しか有していない。
したがって、小FIFOメモリ317は、FIFOメモリ320よりも容量が小さいので、規模も小さい。
小FIFOメモリ317は、上述したように、メッセージメモリ104からの1回目のメッセージD201を遅延し、セレクタ318のf端子に供給する。
セレクタ318は、入力端子として、f端子とm端子とを有しており、上述したように、f端子には、小FIFOメモリ317で遅延されたメッセージD201が供給され、m端子には、メッセージメモリ104からの2回目のメッセージDD201が供給される。
さらに、セレクタ318には、制御部202(図25)から入力ポートP204に供給される制御信号C204が供給される。
セレクタ318は、制御部202からの制御信号C204に従い、小FIFOメモリ317で遅延された1回目のメッセージD201と、メッセージメモリ104からの2回目のメッセージDD201とのうちの一方を、バリアブルノード又はチェックノードの演算に用いるメッセージとして選択して出力する。
セレクタ318が出力するメッセージ、すなわち、小FIFOメモリ317で遅延された1回目のメッセージD201、又は、メッセージメモリ104からの2回目のメッセージDD201は、セレクタのv端子に供給されるとともに、そのうちの最上位ビットを除く下位ビット、つまり、絶対値は、値D312として、LUT310に供給され、最上位ビット、つまり、符号ビットは、値D313として、EXOR回路306に供給される。
ここで、図25の復号装置において、制御部202は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ317が記憶可能なメッセージの数以下であるときには、小FIFOメモリ317で遅延された1回目のメッセージD201を選択することをセレクタ318に指示する信号を、制御信号C204として、メッセージ計算部201の入力ポートP204に供給する。
また、制御部202は、バリアブルノードに対応する列の重みが、小FIFOメモリ317が記憶可能なメッセージの数以下でないときには、メッセージメモリ104からの2回目のメッセージDD201を選択することをセレクタ318に指示する信号を、制御信号C204として、メッセージ計算部201の入力ポートP204に供給する。
なお、制御部202は、小FIFOメモリ317で遅延されたメッセージD201を選択することをセレクタ318に指示する制御信号C204を、メッセージ計算部201に供給する場合、つまり、制御信号C204が、メッセージメモリ104から2回目に読み出されたメッセージDD201を選択することをセレクタ318に指示する信号でない場合には、メッセージメモリ104からのメッセージの読み出しについては、メッセージメモリ104からメッセージを1回だけ読み出す読み出し制御を行う。
したがって、制御部202では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ317が記憶可能なメッセージの数以下でない場合には、図15で説明した、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みが、小FIFOメモリ317が記憶可能なメッセージの数以下である場合には、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御は行われず、1回だけ読み出す読み出し制御、すなわち、図15のステップS101及びS102のうちの、ステップS101だけが行われる。
次に、図27を参照して、図26のメッセージ計算部201で行われるバリアブルノード演算とチェックノード演算について説明する。
図27左側は、式(1)のバリアブルノード演算を行うバリアブルノードと、式(7)のチェックノード演算を行うチェックノードとを模式的に示している。
バリアブルノードでは、計算しようとしている枝(バリアブルノードに接続している枝のうちのi番目の枝)に対応するメッセージviが、バリアブルノードに繋がっている残りの枝からのメッセージu1,u2,・・・を、式(1)に示したように加算することによって求められる。
また、チェックノードでは、計算しようとしている枝(チェックノードに接続している枝のうちのj番目の枝)に対応するメッセージujが、式(7)に示したように、チェックノードに繋がっている残りの枝からのメッセージv1,v2,・・・を引数xとする非線形関数φ(x)の演算結果を積算し、その結果得られる積算値を引数xとする逆関数φ-1(x)を演算することによって求められる。
いま、ノードに入力されるデータ(入力前のデータ)を入力データというとともに、ノードから出力されるデータ(出力前のデータ)を出力データということとすると、図27左側のバリアブルノード及びチェックノードでの演算は、図27右側に示す演算と等価である。
すなわち、図27右側では、バリアブルノードにおいて、図27左側のバリアブルノードと同一の演算によって、メッセージviが求められている。また、図27右側では、チェックノードにおいて非線形関数φ(x)の演算を行うのではなく、チェックノードに入力される入力データ(入力前のメッセージv1,v2,・・・)に、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、図27右側では、チェックノードにおいて逆関数φ-1(x)の演算を行うのではなく、チェックノードから出力された出力データ(逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値)に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
図26のメッセージ計算部201では、図27右側に示したようにメッセージviとujを求めるバリアブルノード演算とチェックノード演算が行われる。
ここで、図27右側のバリアブルノードについては、バリアブルノードに入力される入力データと、バリアブルノードから出力された出力データのいずれに対しても、非線形関数φ(x)及び逆関数φ-1(x)の演算は施されない。一方、チェックノードについては、入力データに、非線形関数φ(x)の演算が施され、出力データに、逆関数φ-1(x)の演算が施される。
このため、バリアブルノード演算とチェックノード演算の両方を行う図26のメッセージ計算部201には、非線形関数φ(x)の演算を行う(演算結果を出力する)LUT300及び310と、逆関数φ-1(x)の演算を行う(演算結果を出力する)LUT314とが設けられている。
そして、メッセージ計算部201は、バリアブルノード演算時には、実質的に、バリアブルノードに対する入力データ及び出力データを、LUT300,310、及び314をバイパスさせる構成(後述する図28の構成)となって、図27右側でバリアブルノードについて説明した演算を行う。
また、メッセージ計算部201は、チェックノード演算時には、チェックノードに入力される入力データを、LUT300又は310を経由させるとともに、チェックノードから出力された出力データを、LUT314を経由させる構成(後述する図29の構成)となって、図27右側でチェックノードについて説明した演算を行う。
図28は、図27右側に示したバリアブルノード演算時の図26のメッセージ計算部201の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ301,311、及び316はv端子を選択するが、図28では、図26に図示した構成のうちの、セレクタ301,311、及び316がv端子を選択することによってバリアブルノード演算時に機能しない部分(バリアブルノード演算に関係がない部分)の図示を省略してある。
メッセージ計算部201は、入力ポートP101及びP201それぞれから入力されるメッセージ、さらには、入力ポートPD201から入力されるメッセージを、必要に応じて用いて、式(1)のバリアブルノード演算を行い、その結果得られるメッセージD202を、出力ポートP202から出力する。
すなわち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP201には、メッセージメモリ104から1つずつ読み出された、検査行列の各行に対応するチェックノードからの1回目のメッセージD201(チェックノードメッセージuj)が供給される。
入力ポートP101に供給された受信データD101は、演算器313に供給される。
また、入力ポートP201に供給されたメッセージD201(メッセージuj)は、セレクタ301のv端子に供給され、バリアブルノード演算時にはv端子を選択しているセレクタ301から、メッセージD306として、演算器302に供給される。
そして、演算器302、レジスタ303、セレクタ304、及びレジスタ305では、図23で説明したメッセージ計算部191と同様の処理が行われる。
すなわち、演算器302は、セレクタ301からのメッセージD306(メッセージuj)とレジスタ303に格納されている値D307とを加算することにより、メッセージD306を積算し、その結果得られる積算値を、レジスタ303に再格納する。
そして、検査行列の1列に亘るメッセージD306が1つずつ読み込まれ、レジスタ303に、検査行列の1列に亘る全ての枝からのメッセージD306(メッセージuj)が積算された積算値(j=1からdvまでのΣuj)が格納された場合、セレクタ304は、レジスタ303に格納されている値、すなわち、検査行列の1列に亘る全ての枝からのメッセージD306(メッセージuj)が積算された積算値D307(j=1からdvまでのΣuj)を選択し、レジスタ305に出力して格納させる。
レジスタ305は、格納している値D307を、値D308として、セレクタ304と演算器312に供給する。レジスタ303に1列分のメッセージD306が積算された値が格納される直前までは、セレクタ304は、レジスタ305から供給された値D308を選択し、レジスタ305に出力し再格納させる。すなわち、検査行列の1列に亘る全ての枝からのメッセージD306(メッセージuj)が積算されるまで、レジスタ305は、前回積算された値を、セレクタ304と演算器312に供給する。
一方、レジスタ305から新たな値D308(j=1からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ303に1列分のメッセージD201が積算された積算値(j=1からdvまでのΣuj)が格納された直後、メッセージ計算部201においては、メッセージD201(メッセージuj)と同一のメッセージDD201、すなわち、メッセージメモリ104からの2回目のメッセージujが、入力ポートPD201から1つずつ入力され、そのメッセージDD201が、セレクタ318のm端子に供給される。
また、小FIFOメモリ317は、レジスタ305から新たな値D308(j=1からdvまでのΣuj)が出力されるまでの間、1回目のメッセージD201を遅延し、セレクタ318のf端子に供給する。
ここで、小FIFOメモリ317が記憶することができるメッセージの数(記憶可能個数)がd個であるとすると、小FIFOメモリ317は、上述したように、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していないため、レジスタ305から、検査行列の、ある1列に対応するdv個のメッセージD201が積算された新たな値(積算値)D308(j=1からdvまでのΣuj)が出力されるまでの間、小FIFOメモリ317において、その1列に対応するdv個のメッセージD201を遅延することができないことがある。
すなわち、小FIFOメモリ317が記憶することができるメッセージの数dが、レジスタ305に積算値が格納されるdv個のメッセージD201が入力されるバリアブルノードに対応する検査行列の列の重みdvよりも小である場合には、小FIFOメモリ317では、そのdv個のメッセージD201のうちの、d+1個目のメッセージが記憶されるときに、1個目のメッセージが出力されてしまうため、レジスタ305から、小FIFOメモリ317が記憶可能なメッセージの個数dよりも多いdv個のメッセージD201が積算された新たな値D308(積算値)が出力されるまでの間、そのdv個のメッセージD201すべてを、小FIFOメモリ317に記憶しておくことができない。
そこで、制御部202(図25)は、上述したように、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する列の重みdvが、小FIFOメモリ317が記憶可能なメッセージの数d以下でないときには、メッセージメモリ104からの2回目のメッセージDD201を選択することをセレクタ318に指示する制御信号C204を、メッセージ計算部201に供給する。
メッセージ計算部201において、制御部202からの制御信号C204は、入力ポートP204を介して、セレクタ318に供給される。
セレクタ318は、制御信号C204に従い、端子mに供給される、メッセージメモリ104からの2回目のメッセージDD201を選択して出力する。
一方、制御部202(図25)は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ317が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ317で遅延された1回目のメッセージD201を選択することをセレクタ318に指示する制御信号C204を、メッセージ計算部201に供給する。
メッセージ計算部201において、制御部202からの制御信号C204は、入力ポートP204を介して、セレクタ318に供給される。
セレクタ318は、制御信号C204に従い、端子fに供給される、小FIFOメモリ317で遅延された1回目のメッセージD201を選択して出力する。
ここで、小FIFOメモリ317が記憶することができるメッセージの数dが、レジスタ305に積算値が格納されるdv個のメッセージD201に対応する検査行列の列の重みdvよりも小でない場合には、レジスタ305から、小FIFOメモリ317が記憶可能なメッセージの個数dよりも多くないdv個のメッセージD201が積算された新たな値(積算値)D308が出力されるまでの間、そのdv個のメッセージD201すべてを、小FIFOメモリ317に記憶しておくこと、つまり、dv個のメッセージD201が積算されるまでの間、そのdv個のメッセージD201すべてを遅延することができ、その遅延後のメッセージD201を、dv個のメッセージD201の積算が終了した後に出力することができる。
そこで、制御部202(図25)は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ317が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ317で遅延されたメッセージD201を選択することをセレクタ318に指示する制御信号C204を、メッセージ計算部201のセレクタ318に供給し、これにより、セレクタ318では、小FIFOメモリ317で遅延されたメッセージD201が選択され、セレクタ311に供給される。
セレクタ311は、バリアブルノード演算時には、v端子を選択しており、そのv端子に供給される、セレクタ318からのメッセージ(2回目のメッセージDD201、又は、小FIFOメモリ317で遅延された1回目のメッセージD201)を、メッセージD315として、演算器312に供給する。
演算器312は、レジスタ305から供給された積算値D308から、セレクタ311からのメッセージD315を減算する。すなわち、演算器312では、検査行列の1列に亘る全ての枝からのメッセージD201(メッセージuj)の積算値D308(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージD315を減算して、減算値D316(j=1からdv-1までのΣuj)を求め、演算器313に供給する。
演算器313は、入力ポートP101からの受信データD101と、演算器312からの減算値D316(j=1からdv-1までのΣuj)とを加算し、その結果得られる加算値D317(バリアブルノードメッセージvi)を、セレクタ316のv端子に供給する。
セレクタ316は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器313からの加算値D317を、メッセージD202(メッセージvi)として、出力ポートP202から出力する。
以上のように、セレクタ301及び304がv端子を選択しているメッセージ計算部201では、式(1)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP202から出力される。
図29は、図27右側に示したチェックノード演算時の図26のメッセージ計算部201の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ301,311、及び316はc端子を選択するが、図29では、図26に図示した構成のうちの、セレクタ301,311、及び316がc端子を選択することによってチェックノード演算時に機能しない部分(チェックノード演算に関係がない部分)の図示を省略してある。
チェックノード演算時においては、入力ポートP201には、メッセージメモリ104から1つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviが、順次、メッセージD201として供給される。
入力ポートP201に供給されたメッセージD201(メッセージvi)は、小FIFOメモリ317に供給される。さらに、メッセージD201のうちの最上位ビットを除く下位ビット、つまり、メッセージD201の絶対値D303(|vi|)が、LUT300に供給され、最上位ビット、つまりメッセージD201の符号ビットD304が、EXOR回路306に供給される。
そして、LUT300、セレクタ301、演算器302、レジスタ303、セレクタ304、レジスタ305、EXOR回路306、レジスタ307、セレクタ308、レジスタ309、演算器312、LUT314、EXOR回路315、及びセレクタ316において、図24で説明したメッセージ計算部191と同様の処理が行われる。
すなわち、LUT300は、絶対値D303(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D305(φ(|vi|))を読み出し、セレクタ301のc端子に供給する。
セレクタ301は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT300からの演算結果D305(φ(|vi|))を、演算結果D306(φ(|vi|))として、演算器302に供給する。
演算器302は、演算結果D306(φ(|vi|))とレジスタ303に格納されている値D307とを加算することにより、演算結果D306を積算し、その結果得られる積算値をレジスタ303に再格納する。
検査行列の1行に亘るメッセージD201が1つずつ読み込まれ、レジスタ303に1行分の演算結果D306が積算された積算値が格納された場合、セレクタ304は、レジスタ303に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)から求められたφ(|vi|)が積算された積算値D307(i=1からi=dcまでのΣφ(|vi|))を選択し、レジスタ305に出力して格納させる。レジスタ305は、格納している積算値D307を、値D308として、セレクタ304と演算器312に供給する。
レジスタ303に1行分の演算結果D306が積算された積算値が格納される直前までは、セレクタ304は、レジスタ305から供給された値D308を選択し、レジスタ305に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)から求められたφ(|vi|)が積算されるまで、レジスタ305は、前回積算されたφ(|vi|)の積算値を、セレクタ304と演算器312に供給する。
レジスタ305から新たな値D308(i=1からi=dcまでのΣφ(|vi|))の出力が開始されると、すなわち、レジスタ305に1行分の演算結果D306が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納された直後、メッセージ計算部201において、メッセージD201(メッセージvi)と同一のメッセージDD201、すなわち、メッセージメモリ104からの2回目のメッセージviが、入力ポートPD201から1つずつ入力され、セレクタ318のm端子に供給される。
一方、小FIFOメモリ317は、レジスタ305から新たな値D308(i=1からdcまでのΣφ(|vi|))が出力されるまでの間、メッセージメモリ104からの1回目のメッセージD201を遅延し、セレクタ318のf端子に供給する。
ここで、小FIFOメモリ317が記憶することができるメッセージの数がd個であるとすると、小FIFOメモリ317は、上述したように、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していないため、レジスタ305から、検査行列の、ある1行に対応するdc個のメッセージD201のφ(|vi|)の新たな積算値(i=1からdcまでのΣφ(|vi|))が出力されるまでの間、小FIFOメモリ317において、その1行に対応するdc個のメッセージD201を遅延することができないことがある。
すなわち、小FIFOメモリ317が記憶することができるメッセージの数dが、レジスタ305にφ(|vi|)の積算値が格納されるdc個のメッセージD201が入力されるチェックノードに対応する検査行列の行の重みdcよりも小である場合には、小FIFOメモリ317では、そのdc個のメッセージD201のうちの、d+1個目のメッセージが記憶されるときに、1個目のメッセージが出力されてしまうため、レジスタ305において、小FIFOメモリ317が記憶可能なメッセージの個数dよりも多いdc個のメッセージD201のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD201すべてを、小FIFOメモリ317に記憶しておくことができない。
そこで、制御部202(図25)は、上述したように、メッセージを求めようとしている枝が接続しているチェックノードに対応する行の重みdcが、小FIFOメモリ317が記憶可能なメッセージの数d以下でないときには、メッセージメモリ104からの2回目のメッセージDD201を選択することをセレクタ318に指示する制御信号C204を、メッセージ計算部201に供給する。
メッセージ計算部201において、制御部202からの制御信号C204は、入力ポートP204を介して、セレクタ318に供給される。
セレクタ318は、制御信号C204に従い、端子mに供給される、メッセージメモリ104からの2回目のメッセージDD201を選択して出力する。
一方、制御部202(図25)は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ317が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ317で遅延された1回目のメッセージD201を選択することをセレクタ318に指示する制御信号C204を、メッセージ計算部201に供給する。
メッセージ計算部201において、制御部202からの制御信号C204は、入力ポートP204を介して、セレクタ318に供給される。
セレクタ318は、制御信号C204に従い、端子fに供給される、小FIFOメモリ317で遅延された1回目のメッセージD201のφ(|vi|)を選択して出力する。
ここで、小FIFOメモリ317が記憶することができるメッセージの数dが、レジスタ305に積算値が格納されるdc個のメッセージD201が入力されるチェックノードに対応する検査行列の行の重みdcよりも小でない場合には、レジスタ305から、小FIFOメモリ317が記憶可能なメッセージの個数dよりも多くないdc個のメッセージD201のφ(|vi|)の新たな積算値(i=1からdcまでのΣφ(|vi|))が出力されるまでの間、そのdc個のメッセージD201すべてを、小FIFOメモリ317に記憶しておくこと、つまり、dc個のメッセージD201のφ(|vi|)が積算されるまでの間、そのdc個のメッセージD201すべてを遅延することができ、その遅延後のメッセージD201を、dc個のメッセージD201のφ(|vi|)の積算が終了した後に出力することができる。
そこで、制御部202(図25)は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ317が記憶可能なメッセージの数d以下であるときには、小FIFOメモリ317で遅延されたメッセージD201のφ(|vi|)を選択することをセレクタ318に指示する制御信号C204を、メッセージ計算部201のセレクタ318に供給し、これにより、セレクタ318では、小FIFOメモリ317で遅延された1回目のメッセージD201が選択されて出力される。
セレクタ318が出力するメッセージ(小FIFOメモリ317で遅延された1回目のメッセージD201、又は、2回目のメッセージDD201)のうちの最上位ビットを除く下位ビット、つまり、絶対値D312(|vi|)は、LUT310に供給され、最上位ビット、つまり、符号ビットD313は、EXOR回路315に供給される。
LUT310は、LUT300と同様のLUTで、メッセージの絶対値D312(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D314(φ(|vi|))を読み出し、セレクタ311のc端子に供給する。
セレクタ311は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT310からの演算結果D314(φ(|vi|))を、演算結果D315(φ(|vi|))として、演算器312に供給する。
演算器312は、レジスタ305から供給された値D308から、セレクタ311から供給された値D315を減算し、その減算結果を、減算値D316としてLUT314に供給する。すなわち、演算器312は、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)から求められたφ(|vi|)の積算値D308(i=1からi=dcまでのΣφ(|vi|))から、求めたい枝からのメッセージ(メッセージvi)から求められたφ(|vi|)の値D315を減算して、その減算値(i=1からi=dc-1までのΣφ(|vi|))を減算値D316としてLUT314に供給する。
LUT314は、演算器312からの減算値D316(i=1からi=dc-1までのΣφ(|vi|))を引数として、逆関数φ-1(Σφ(|vi|))の演算を行った演算結果D318(φ-1(Σφ(|vi|)))を出力する。
以上の処理と並行して、EXOR回路306は、レジスタ307に格納されている値D310と符号ビットD304との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D309を、レジスタ307に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された場合、レジスタ307はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納された場合、セレクタ308は、レジスタ307に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された値D310(i=1からi=dcまでのΠsign(vi))を選択し、レジスタ309に出力して格納させる。レジスタ309は、格納している値D311を、セレクタ308とEXOR回路315に供給する。
検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納される直前までは、セレクタ308は、レジスタ309から供給された値D311を選択し、レジスタ309に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD201(メッセージvi)の符号ビットD304が乗算されるまで、レジスタ309は、前回格納した値を、セレクタ308とEXOR回路315に供給する。
一方、レジスタ307に1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された値D310(i=1からi=dcまでのΠsign(vi))が格納されたとき、その値D301がセレクタ308で選択されて、レジスタ309に格納されるとともに、レジスタ305に、上述したように、1行分のメッセージD201のφ(|vi|)を積算した新たな積算値(i=1からi=dcまでのΣφ(|vi|))が格納される。
レジスタ305に新たな積算値(i=1からi=dcまでのΣφ(|vi|))が格納されると、上述したように、セレクタ318が、小FIFOメモリ317で遅延されたメッセージD201、又は2回目のメッセージDD201を選択して出力し、セレクタ318が出力するメッセージのうちの、最上位ビットを除く下位ビット、つまり、絶対値(|vi|)が、LUT310に供給され、最上位ビット、つまり、符号ビットD313が、EXOR回路315に供給される。
EXOR回路315は、レジスタ309に格納されて出力される新たな値D311と、セレクタ318からのメッセージの符号ビットとの排他的論理和を演算することにより、値D311を、セレクタ318からのメッセージの符号ビットD313で除算し、除算結果を除算値D319として出力する。すなわち、EXOR回路315は、検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージviの符号ビットD313(i=dcのsign(vi))で除算して、その除算値(i=1からi=dc-1までのΠsign(vi))を除算値D319として出力する。
そして、メッセージ計算部201では、LUT314から出力された演算結果D318を下位ビットとするとともに、EXOR回路315から出力された除算値D319を最上位ビット(符号ビット)とするビット列D320(メッセージuj)が、セレクタ316のc端子に供給される。
セレクタ316は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D320(メッセージuj)を、メッセージD202として、出力ポートP202から出力する。
以上のように、セレクタ301,311、及び316がc端子を選択しているメッセージ計算部201では、式(7)のチェックノード演算が行われ、その結果得られるメッセージ(チェックノードメッセージ)ujが、出力ポートP202から出力される。
なお、図示しないが、図25の復号装置では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
以上のように、図25の復号装置では、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ317(図26)を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ320(図22)を設ける場合に比較して、復号装置の規模を削減することができる。
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合(記憶可能個数dより大でない場合)には、小FIFOメモリ317の出力を選択して、ノード(バリアブルノード、チェックノード)の演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ320(図22)を有する図21の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図21(及び図8)の復号装置と同様の回数だけ繰り返し復号を行うことができるので(1回の復号に要する時間が図21(及び図8)の復号装置と同様となるので)、復号性能が劣化することを抑制することができる。
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ104から同一のメッセージを2回読み出し、2回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
以上から、図25の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
ここで、小FIFOメモリ317の記憶可能個数dが、例えば、3であり、復号の対象のLDPC符号を定義する検査行列が、例えば、図1に示した、各列の重みdvが3で、且つ、各行の重みが6の行列である場合には、記憶可能個数dである3が、検査行列の列の重みdvである3よりも小でなく、したがって、バリアブルノード演算時には、3個のメッセージD201が積算されるまでの間、小FIFOメモリ317において、その3個のメッセージD201すべてを遅延することができるから、セレクタ318では、端子fに供給される、小FIFOメモリ317で遅延された1回目のメッセージD201が選択される。
また、この場合、記憶可能個数dである3が、検査行列の行の重みdcである6よりも小であり、したがって、チェックノード演算時には、記憶可能個数dである3よりも多い6個のメッセージD201のφ(|vi|)が積算されるまでの間、小FIFOメモリ317において、その6個のメッセージD201すべてを遅延することができないため、セレクタ318では、端子mに供給される、メッセージメモリ104からの2回目のメッセージDD201が選択される。
なお、図25の復号装置では、メッセージ計算部201において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部(演算器302、レジスタ303、セレクタ304、レジスタ305、及び演算器312)が共有化されているので、その共有化の分だけ、復号装置の規模を、より削減することができる。
次に、図30は、本発明を適用した復号装置の第3実施の形態の構成例を示すブロック図である。
なお、図中、図25の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図30の復号装置は、メッセージ計算部201に代えて、メッセージ計算部211が設けられているとともに、制御部202に代えて、制御部212が設けられている他は、図25の復号装置と同様に構成されている。
図30の復号装置では、メッセージ計算部211が、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図30の復号装置では、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部211が、図22のメッセージ計算部191のFIFOメモリ320のように、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを有している。
また、図30の復号装置では、制御部212が、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を行う。
さらに、制御部212は、制御信号C603を、メッセージ計算部211に供給し、その制御信号C603によって、バリアブルノード演算、又はチェックノード演算を行うことを、メッセージ計算部211に指示する。
また、制御部212は、図20のフローチャートで説明したように、セレクタ制御の処理を行い、制御信号C104に相当する制御信号C604を、メッセージ計算部211に供給する。メッセージ計算部211は、制御部212からの制御信号C604に従い、メッセージメモリ104から2回目に読み出されたメッセージを選択的に用いて、バリアブルノード演算やチェックノード演算を行う。
図30の復号装置では、メッセージメモリ104に記憶されているメッセージが1つずつ読み出され、メッセージ計算部211に供給される。メッセージ計算部211は、メッセージメモリ104からのメッセージを用いて演算が行われ、その演算によって求められたメッセージが、メッセージメモリ104に格納される。図30の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
すなわち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる受信データ(対数尤度比)D100が供給され、受信データメモリ105は、その受信データD100を記憶する。
バリアブルノード演算時には、受信データメモリ105は、制御部212から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部211に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部212から供給される制御信号に従い、記憶している同一のメッセージを1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD601として、メッセージ計算部211に供給し、2回目に読み出したメッセージをメッセージDD601として、メッセージ計算部211に供給する。
メッセージ計算部211は、メッセージメモリ104から供給される1回目のメッセージD601、及び受信データメモリ105から供給される受信データD101、さらには、必要に応じて、メッセージメモリ104からの供給される2回目のメッセージDD601を用い、制御部212から供給される制御信号C603及びC604に従って、検査行列に基づき、バリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージを、メッセージD622として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部212から供給される制御信号に従い、メッセージ計算部211から供給されるメッセージD622を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部212から供給される制御信号に従って、記憶している同一のメッセージを1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD601として、メッセージ計算部211に供給し、2回目に読み出したメッセージをメッセージDD601として、メッセージ計算部211に供給する。
メッセージ計算部211は、メッセージメモリ104から供給される1回目のメッセージD601、さらには、必要に応じて、メッセージメモリ104から供給される2回目のメッセージDD601を用い、制御部212からの制御信号C603及びC604に従って、チェックノード演算を行い、そのチェックノード演算によって求められたメッセージを、メッセージD622として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部212から供給される制御信号に従い、メッセージ計算部211から供給されるメッセージD622を記憶する。
ここで、図30のメッセージ計算部211で行われる演算について説明する。
いま、チェックノードに接続している枝のうちのj番目の枝から出力されるメッセージ(データ)として、式u'j=φ(|uj|)×sign(uj)で表されるメッセージu'jを導入すると、式(1)と式(7)は、それぞれ、式(9)と式(10)に書き直すことができる。
ここで、式u'j=φ(|uj|)×sign(uj)を、メッセージujについて書き直すと、式uj=φ-1(|u'j|)×sign(u'j)となる。この式uj=φ-1(|u'j|)×sign(u'j)を、バリアブルノード演算の式(1)に代入することにより、新たなバリアブルノード演算の式としての式(9)を得ることができる。
また、式u'j=φ(|uj|)×sign(uj)に、チェックノード演算の式(7)を代入することにより、新たなチェックノード演算の式としての式(10)を得ることができる。
式(9)のバリアブルノード演算では、入力データ(メッセージ)u'jの絶対値|u'j|を引数とする逆関数φ-1(|u'j|)の演算が行われ、式(10)のチェックノード演算では、入力データviの絶対値|vi|を引数とする非線形関数φ(|vi|)の演算が行われる。ここで、非線形関数φ(x)とその逆関数φ-1(x)とは、x>0において等しい。したがって、式(9)及び式(10)のいずれでも、入力データxの絶対値|x|を引数として、関数φ(x)の演算が行われる。
そして、式(9)では、関数φ(x)の演算結果(φ-1(|u'j|)の演算結果)に入力データu'jの符号(sign(u'j))を考慮した値(φ-1(|u'j|)×sign(u'j))を積算し、その積算値に、受信データu0iを加算して、メッセージviが求められる。
また、式(10)では、関数φ(x)の演算結果(φ(|uj|)の演算結果)を積算し、それとは別に、入力データviの符号ビットの相乗積(Πsign(vi))を求め、関数φ(x)の演算結果の積算値と、符号ビットの相乗積とを乗算して、メッセージu'jが求められる。
図30のメッセージ計算部211では、式(9)のバリアブルノード演算と、式(10)のチェックノード演算とが行われる。
図31は、図30のメッセージ計算部211の構成例を示している。
メッセージ計算部211には、入力ポートP101,P601,PD601,P603,P604と、出力ポートP622が設けられている。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。入力ポートP601には、メッセージメモリ104から2回読み出される同一のメッセージD601及びDD601のうちの1回目に読み出されるメッセージ(1回目のメッセージ)D601が供給(入力)され、入力ポートPD601には、2回目に読み出されるメッセージ(2回目のメッセージ)DD601が供給される。また、入力ポートP603には、制御部212(図30)からの制御信号C603が供給され、入力ポートP604には、制御部212からの制御信号C604が供給される。
メッセージ計算部211は、入力ポートP601から入力される1回目のメッセージD601、さらには、入力ポートPD601から入力される2回目のメッセージDD601や、入力ポートP101から入力されるメッセージ(受信データ)を、必要に応じて用い、入力ポートP603から入力される制御信号C603及びC604に従って、検査行列に基づき、式(9)のバリアブルノード演算又は式(10)のチェックノード演算を行い、その結果得られるメッセージD622を、出力ポートP622から出力する。
ここで、図32を参照して、図31のメッセージ計算部211で行われるバリアブルノード演算とチェックノード演算について説明する。
図32左側は、式(1)のバリアブルノード演算を行うバリアブルノードと、式(7)のチェックノード演算を行うチェックノードとを模式的に示しており、図27右側と同一の図である。
図32左側では、図27右側で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、チェックノードから出力された出力データ(逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値)に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
このメッセージujは、入力データとして、バリアブルノードに入力され、バリアブルノード演算に用いられる。
したがって、図32左側に示したように、チェックノードから出力された出力データxに、逆関数φ-1(x)の演算を施す代わりに、図32右側に示すように、バリアブルノードに入力される入力データxに、逆関数φ-1(x)の演算を施しても、バリアブルノード演算とチェックノード演算を行うことができる。
すなわち、図32右側では、式(9)で説明したように、バリアブルノードに入力される入力データに、逆関数φ-1(x)の演算が施され、バリアブルノードにおいて、その逆関数φ-1(x)の演算結果を積算することにより、メッセージviが求められている。また、図32右側では、式(10)で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算が施され、チェックノードにおいて、その非線形関数φ(x)の演算結果が積算されている。さらに、図32右側では、チェックノードにおいて、非線形関数φ(x)の演算結果を積算して得られる積算値が、(逆関数φ-1(x)の演算が施されずに)そのまま出力データu'jとして出力されている。
図31のメッセージ計算部211では、図32右側に示したようにメッセージviとu'jを求める式(9)のバリアブルノード演算と式(10)のチェックノード演算が行われる。
このように、図31のメッセージ計算部211は、図32右側に示したメッセージviとu'jを求める式(9)のバリアブルノード演算と式(10)のチェックノード演算の両方を行うため、メッセージ計算部211(図31)には、チェックノードに入力される入力データxに対して、逆関数φ-1(x)と同一の演算結果が得られる非線形関数φ(x)の演算結果を出力するとともに、バリアブルノードに入力される入力データxに対して、逆関数φ-1(x)の演算結果を出力するLUT600(及びLUT610)が設けられている。
そして、図31のメッセージ計算部211は、入力ポートP603に供給された制御信号C603に従って、その実質的な構成を変えて、式(9)のバリアブルノード演算と式(10)のチェックノード演算を選択的に行う。
すなわち、メッセージ計算部211(図31)は、セレクタ601,611、及び615を有しており、入力ポートP603に供給された制御信号C603は、セレクタ601,611、及び615に供給される。
セレクタ601,611、及び615は、v端子とc端子とを有し、制御信号C603に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ601,611、及び615は、制御信号C603がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C603がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、図31のメッセージ計算部211では、制御信号C603がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号C603がチェックノード演算を指示しているときには、チェックノード演算が行われる。
すなわち、図33は、図32右側に示したバリアブルノード演算時の図31のメッセージ計算部211の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ601,611、及び615はv端子を選択するが、図33では、図31に図示した構成のうちの、セレクタ601,611、及び615がv端子を選択することによってバリアブルノード演算時に機能しない部分(バリアブルノード演算に関係がない部分)の図示を省略してある。
メッセージ計算部211は、入力ポートP101,P601,PD601それぞれから入力されるメッセージを用いて、式(9)のバリアブルノード演算を行い、その結果得られるメッセージD622を、出力ポートP622から出力する。
すなわち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP601には、メッセージメモリ104から1つずつ読み出された、検査行列の各行に対応するチェックノードからの1回目のメッセージD601(メッセージu'j)が供給される。
入力ポートP101に供給された受信データD101は、演算器613に供給される。
また、入力ポートP601に供給されたメッセージD601(メッセージu'j)のうちの最上位ビットを除く下位ビット、つまり、メッセージD601の絶対値D603(|u'j|)は、LUT600に供給される。
LUT600は、非線形関数φ(x)(及び逆関数φ-1(x))の演算結果を記憶しており、絶対値D603(|u'j|)を引数として、逆関数φ-1(|u'j|)の演算を行った演算結果D605(φ-1(|u'j|))を読み出して出力する。LUT600が出力する演算結果D605(φ-1(|u'j|))は、その最上位ビットに、入力ポートP601に供給されたメッセージD601(メッセージu'j)のうちの最上位ビット、つまりメッセージD601の符号ビットD604(sign(u'j))が付加されることにより、メッセージD606(チェックノードメッセージuj)とされ、セレクタ601のv端子に供給される。
セレクタ601は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージD606(チェックノードメッセージuj)は、メッセージD607として、演算器602に供給される。
演算器602は、セレクタ601からのメッセージD607(メッセージuj)とレジスタ603に格納されている値D608とを加算することにより、メッセージD607を積算し、その結果得られる積算値を、レジスタ603に再格納する。なお、検査行列の1列に亘る全ての枝からの(メッセージu'jから得られた)メッセージD607が積算された場合、レジスタ603はリセットされる。
検査行列の1列に亘るメッセージD601が1つずつ読み込まれ、レジスタ603に1列分のメッセージD607が積算された値が格納された場合、すなわち、レジスタ603に、検査行列の1列に亘る全ての枝からのメッセージD607(メッセージuj)が積算された積算値(j=1からdvまでのΣuj)が格納された場合、セレクタ604は、レジスタ603に格納されている値、すなわち、検査行列の1列に亘る全ての枝からのメッセージD607(メッセージuj)が積算された積算値D608(j=1からdvまでのΣuj)を選択し、レジスタ605に出力して格納させる。
レジスタ605は、格納している値D608を、値D609として、セレクタ604と演算器612に供給する。レジスタ603に1列分のメッセージD607が積算された値が格納される直前までは、セレクタ604は、レジスタ605から供給された値D609を選択し、レジスタ605に出力し再格納させる。すなわち、検査行列の1列に亘る全ての枝からのメッセージD607(メッセージuj)が積算されるまで、レジスタ605は、前回積算された値を、セレクタ604と演算器612に供給する。
一方、入力ポートP601に供給されたメッセージD601(メッセージu'j)は、小FIFOメモリ616にも供給される。
小FIFOメモリ616は、メッセージを遅延するための遅延メモリであるが、検査行列の重み(列の重みdv及び行の重みdc)の最大値よりも少ない数(であって1以上)のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリである。
小FIFOメモリ616は、メッセージメモリ104からの1回目のメッセージD601を遅延し、セレクタ617のf端子に供給する。
セレクタ617は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、小FIFOメモリ616で遅延されたメッセージD601が供給される。また、セレクタ617のm端子には、メッセージメモリ104から端子DD601に供給される2回目のメッセージPD601が供給される。
さらに、セレクタ617には、制御部212(図30)から入力ポートP604に供給された制御信号C604が供給される。
セレクタ617は、制御部212からの制御信号C604に従い、小FIFOメモリ616で遅延された1回目のメッセージD601と、メッセージメモリ104からの2回目のメッセージDD601とのうちの一方を、バリアブルノード演算に用いるメッセージとして選択して出力する。
セレクタ617が出力するメッセージ、すなわち、小FIFOメモリ616で遅延された1回目のメッセージD601、又は、メッセージメモリ104からの2回目のメッセージDD601のうちの最上位ビットを除く下位ビット、つまり、絶対値は、値D613として、LUT610に供給され、最上位ビット、つまり、符号ビットD614は、LUT610の出力D615の符号ビットとされる。
ここで、図30の復号装置において、制御部212は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ616が記憶可能なメッセージの数(記憶可能個数)d以下であるときには、小FIFOメモリ616で遅延された1回目のメッセージD601を選択することをセレクタ617に指示する制御信号C604をメッセージ計算部211の入力ポートP604に供給する。
さらに、制御部212は、バリアブルノードに対応する列の重みdvが、小FIFOメモリ616の記憶可能個数d以下でないときには、メッセージメモリ104からの2回目のメッセージDD601を選択することをセレクタ617に指示する制御信号C604を、メッセージ計算部211の入力ポートP604に供給する。
なお、制御部212は、小FIFOメモリ616で遅延されたメッセージD601を選択することをセレクタ617に指示する制御信号C604を、メッセージ計算部211に供給する場合、つまり、制御信号C604が、メッセージメモリ104から2回目に読み出されたメッセージDD601を選択することをセレクタ617に指示する信号でない場合には、メッセージメモリ104からのメッセージの読み出しについては、メッセージメモリ104からメッセージを1回だけ読み出す読み出し制御を行う。
したがって、制御部212では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ616の記憶可能個数d以下でない場合には、図15で説明した、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ616の記憶可能個数d以下である場合には、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御は行われず、1回だけ読み出す読み出し制御、すなわち、図15のステップS101及びS102のうちの、ステップS101だけが行われる。
レジスタ605において、検査行列の1列に亘る全ての枝からのメッセージD607(メッセージuj)が積算された新たな値(積算値)D609(j=1からdvまでのΣuj)が格納され、その出力が開始されると、すなわち、レジスタ603に1列分のメッセージD607が積算された積算値(j=1からdvまでのΣuj)が格納された直後、LUT600と同一と同一の構成のLUT610が、セレクタ617から出力されるメッセージ(小FIFOメモリ616で遅延された1回目のメッセージD601、又は2回目のメッセージDD601)の絶対値D613(|u'j|)を引数として、逆関数φ(|u'j|)の演算を行った演算結果D615(φ-1(|u'j|))を読み出して出力する。
LUT610が出力する演算結果D615(φ-1(|u'j|))は、その最上位ビットに、セレクタ617から出力されるメッセージ(小FIFOメモリ616で遅延された1回目のメッセージD601、又は2回目のメッセージDD601)(メッセージu'j)のうちの最上位ビット、つまり、符号ビットD614(sign(u'j))が付加されることにより、メッセージD616(チェックノードメッセージuj)とされ、セレクタ611のv端子に供給される。
セレクタ611は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージD616(チェックノードメッセージuj)は、メッセージD617として、演算器612に供給される。
演算器612は、レジスタ605から供給された積算値D609(j=1からdvまでのΣuj)から、セレクタ611からのメッセージD617(j=dvのメッセージuj)を減算する。すなわち、演算器612では、検査行列の1列に亘る全ての枝からのメッセージD607(メッセージuj)の積算値D609(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージD617を減算して、減算値D618(j=1からdv-1までのΣuj)を求め、演算器613に供給する。
演算器613は、入力ポートP101からの受信データD101と、演算器612からの減算値D618(j=1からdv-1までのΣuj)とを加算することにより、メッセージD619(バリアブルノードメッセージvi)を求め、セレクタ615のv端子に供給する。
セレクタ615は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器613からのメッセージD619(バリアブルノードメッセージvi)を、メッセージD622として、出力ポートP622から出力する。
以上のように、セレクタ601,611、及び615がv端子を選択しているメッセージ計算部211では、式(9)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP622から出力される。
次に、図34は、図32右側に示したチェックノード演算時の図31のメッセージ計算部211の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ601,611、及び615はc端子を選択するが、図34では、図31に図示した構成のうちの、セレクタ601,611、及び615がc端子を選択することによってチェックノード演算時に機能しない部分(チェックノード演算に関係がない部分)の図示を省略してある。
チェックノード演算時においては、入力ポートP601には、メッセージメモリ104から1つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviが、順次、メッセージD601として供給される。
入力ポートP601に供給されたメッセージD601(メッセージvi)のうちの最上位ビットを除く下位ビット、つまり、メッセージD601の絶対値D603(|vi|)は、LUT600に供給され、最上位ビット、つまりメッセージD601の符号ビットD604は、EXOR回路606に供給される。
LUT600は、絶対値D603(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D605(φ(|vi|))を読み出し、セレクタ601のc端子に供給する。
セレクタ601は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT600からの演算結果D605(φ(|vi|))を、演算結果D607(φ(|vi|))として、演算器602に供給する。
演算器602は、演算結果D607(φ(|vi|))とレジスタ603に格納されている値D608とを加算することにより、演算結果D607を積算し、その結果得られる積算値をレジスタ603に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD601の絶対値D603(|vi|)に対する演算結果D607(φ(|vi|))が積算された場合、レジスタ603はリセットされる。
検査行列の1行に亘るメッセージD601が1つずつ読み込まれ、レジスタ603に1行分の演算結果D607が積算された積算値が格納された場合、セレクタ604は、レジスタ603に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD601(メッセージvi)から求められたφ(|vi|)が積算された積算値D608(i=1からi=dcまでのΣφ(|vi|))を選択し、レジスタ605に出力して格納させる。レジスタ605は、格納している積算値D608を、値D609として、セレクタ604と演算器612に供給する。
レジスタ603に1行分の演算結果D607が積算された積算値が格納される直前までは、セレクタ604は、レジスタ605から供給された値D609を選択し、レジスタ605に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD601(メッセージvi)から求められたφ(|vi|)が積算されるまで、レジスタ605は、前回積算されたφ(|vi|)の積算値を、セレクタ604と演算器612に供給する。
一方、入力ポートP601に供給されたメッセージD601(メッセージvi)は、小FIFOメモリ616にも供給される。
小FIFOメモリ616は、上述したように、メッセージを遅延するための遅延メモリであるが、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリであり、メッセージメモリ104からの1回目のメッセージD601を遅延し、セレクタ617のf端子に供給する。
上述したように、図30の復号装置において、制御部212は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ616が記憶可能なメッセージの数(記憶可能個数)d以下であるときには、小FIFOメモリ616で遅延された1回目のメッセージD601を選択することをセレクタ617に指示する制御信号C604を、メッセージ計算部211の入力ポートP604を介して、セレクタ617に供給する。
セレクタ617は、制御部212からの制御信号C604に従い、小FIFOメモリ616で遅延された1回目のメッセージD601を選択して出力する。
また、制御部212は、チェックノードに対応する列の重みdcが、小FIFOメモリ616の記憶可能個数d以下でないときには、メッセージメモリ104からの2回目のメッセージDD601を選択することをセレクタ617に指示する制御信号C604を、メッセージ計算部211の入力ポートP604に供給する。
さらに、制御部212では、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の列の重みdvが、小FIFOメモリ616の記憶可能個数d以下でない場合には、図15で説明した、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御が行われ、これにより、メッセージメモリ104から2回目に読み出されたメッセージDD601が、入力ポートPD601を介して、セレクタ617のm端子に供給される。
セレクタ617は、制御部212からの制御信号C604に従い、メッセージメモリ104から入力ポートPD601を介して供給される2回目のメッセージDD601を選択して出力する。
セレクタ617が出力するメッセージ(メッセージvi)、すなわち、小FIFOメモリ616で遅延された1回目のメッセージD601、又は、メッセージメモリ104からの2回目のメッセージDD601のうちの最上位ビットを除く下位ビット、つまり、絶対値は、値D613として、LUT610に供給され、最上位ビット、つまり、符号ビットD614は、EXOR回路614に供給される。
レジスタ605において、新たな値D609(i=1からi=dcまでのΣφ(|vi|))の出力が開始されると、すなわち、レジスタ605に1行分の演算結果D607が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納された直後、LUT610は、セレクタ617から出力されるメッセージ(小FIFOメモリ616で遅延された1回目のメッセージD601、又は2回目のメッセージDD601)の絶対値D613(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D615(φ(|vi|))を読み出し、セレクタ611のc端子に供給する。
セレクタ611は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT610からの演算結果D615(φ(|vi|))を、演算結果D617(φ(|vi|))として、演算器612に供給する。
演算器612は、レジスタ605から供給された値D609から、セレクタ611から供給された値D617を減算し、その減算結果を、減算値D618として出力する。すなわち、演算器612は、検査行列の1行に亘る全ての枝からのメッセージD601(メッセージvi)から求められたφ(|vi|)の積算値D609(i=1からi=dcまでのΣφ(|vi|))から、求めたい枝からのメッセージDD601(メッセージvi)から求められたφ(|vi|)の値D617を減算して、その減算値(i=1からi=dc-1までのΣφ(|vi|))を減算値D618として出力する。
以上の処理と並行して、EXOR回路606は、レジスタ607に格納されている値D611と、1回目のメッセージD601(メッセージvi)の最上位ビットである符号ビットD604との排他的論理和を演算することにより、符号ビットどうしの乗算を行い、乗算結果D610を、レジスタ607に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された場合、レジスタ607はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された乗算結果D610(i=1からdcまでのΠsign(vi))がレジスタ607に格納された場合、セレクタ608は、レジスタ607に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された値D611(i=1からi=dcまでのΠsign(vi))を選択し、レジスタ609に出力して格納させる。レジスタ609は、格納している値D612を、セレクタ608とEXOR回路614に供給する。
検査行列の1行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された乗算結果D610(i=1からdcまでのΠsign(vi))がレジスタ607に格納される直前までは、セレクタ608は、レジスタ609から供給される値D612を選択し、レジスタ609に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD601(メッセージvi)の符号ビットD604が乗算されるまで、レジスタ609は、前回格納した値を、セレクタ608とEXOR回路614に供給する。
一方、レジスタ609から新たな値D612(i=1からi=dcまでのΠsign(vi))がEXOR回路614に供給されたとき、すなわち、レジスタ607に1行に亘る全ての枝からのメッセージD601の符号ビットD604が乗算された新たな値D611(i=1からi=dcまでのΠsign(vi))が格納されたとき、セレクタ608が、その値D611を選択して、レジスタ609に格納させるとともに、レジスタ605には、上述したように、1行分の演算結果D607が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納される。
レジスタ605に1行分の演算結果D607が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納されると、上述したようにして、セレクタ617が出力するメッセージ(メッセージvi)、すなわち、小FIFOメモリ616で遅延された1回目のメッセージD601、又は、メッセージメモリ104からの2回目のメッセージDD601のうちの最上位ビットである符号ビットD614が、EXOR回路614に供給される。
EXOR回路614は、レジスタ609に格納されて出力される新たな値D612と、セレクタ617からのメッセージの符号ビットD614との排他的論理和を演算することにより、値D612を、メッセージu'jを求めようとする枝からのメッセージviの符号ビットD614で除算し、除算結果を除算値D620として出力する。すなわち、EXOR回路614は、検査行列の1行に亘る全ての枝からのメッセージD601の符号ビットD604の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージviの符号ビットD614(i=dcのsign(vi))で除算して、その除算値(i=1からi=dc-1までのΠsign(vi))を除算値D620として出力する。
そして、メッセージ計算部211では、演算器612から出力された減算値D618を下位ビットとするとともに、EXOR回路614から出力された除算値D620を最上位ビット(符号ビット)とするビット列D621(メッセージu'j)が、セレクタ615のc端子に供給される。
セレクタ615は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D621(メッセージu'j)を、メッセージD622として、出力ポートP622から出力する。
以上のように、セレクタ601,611、及び615がc端子を選択しているメッセージ計算部211では、式(10)のチェックノード演算が行われ、その結果得られるメッセージ(メッセージ)u'jが、出力ポートP622から出力される。
なお、図30の復号装置では、復号の最終段において、式(9)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
以上のように、図30の復号装置では、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ616(図31)を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ320(図22)を設ける場合に比較して、復号装置の規模を削減することができる。
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合(記憶可能個数dより大でない場合)には、小FIFOメモリ616の出力を選択して、ノード(バリアブルノード、チェックノード)の演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ320(図22)を有する図21の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図21の復号装置と同様の回数だけ繰り返し復号を行うことができるので(1回の復号に要する時間が図21の復号装置と同様となるので)、復号性能が劣化することを抑制することができる。
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ104から同一のメッセージを2回読み出し、2回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
以上から、図30の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
ここで、小FIFOメモリ616の記憶可能個数dが、例えば、3であり、復号の対象のLDPC符号を定義する検査行列が、例えば、図1に示した、各列の重みdvが3で、且つ、各行の重みが6の行列である場合には、記憶可能個数dである3が、検査行列の列の重みdvである3よりも小でなく、したがって、バリアブルノード演算時には、3個のメッセージD601が積算されるまでの間、小FIFOメモリ616において、その3個のメッセージD601すべてを遅延することができるから、セレクタ617では、端子fに供給される、小FIFOメモリ616で遅延された1回目のメッセージD601が選択される。
また、この場合、記憶可能個数dである3が、検査行列の行の重みdcである6よりも小であり、したがって、チェックノード演算時には、記憶可能個数dである3よりも多い6個のメッセージD601のφ(|vi|)が積算されるまでの間、小FIFOメモリ616において、その6個のメッセージD601すべてを遅延することができないため、セレクタ617では、端子mに供給される、メッセージメモリ104からの2回目のメッセージDD601が選択される。
なお、図30の復号装置では、メッセージ計算部211において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部(LUT600、演算器602、レジスタ603、セレクタ604、レジスタ605、LUT610、及び演算器612)が共有化されているので、その共有化の分だけ、復号装置の規模を、より削減することができる。
また、図30の復号装置のメッセージ計算部211では、ノードに入力される入力データxの絶対値|x|を引数として、同一の演算結果が得られる逆関数φ-1(x)と非線形関数φ(x)の演算をそれぞれ含む式(9)と式(10)にそれぞれ従って、バリアブルノード演算とチェックノード演算が行われる。
したがって、メッセージ計算部211には、図31に示したように、入力ポートP601から供給される1回目のメッセージに対して、逆関数φ-1(x)及び非線形関数φ(x)の演算を行うLUT600と、セレクタ617が出力するメッセージに対して、逆関数φ-1(x)及び非線形関数φ(x)の演算を行うLUT610との2つのLUTがあれば済み、図26に示したように、1回目のメッセージに対して非線形関数φ(x)の演算を行うLUT300、セレクタ318が出力するメッセージに対して非線形関数φ(x)の演算を行うLUT310、及び逆関数φ-1(x)の演算を行うLUT314の3つのLUTを必要とするメッセージ計算部201よりも、規模を削減することができる。
次に、図35は、本発明を適用した復号装置の第4実施の形態の構成例を示すブロック図である。
なお、図中、図25の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。すなわち、図35の復号装置は、メッセージ計算部201に代えて、メッセージ計算部221が設けられているとともに、制御部202に代えて、制御部222が設けられている他は、図25の復号装置と同様に構成されている。
図35の復号装置では、メッセージ計算部221が、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図35の復号装置では、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部221が、図22のメッセージ計算部191のFIFOメモリ320のように、検査行列の重みの最大値に等しい数のメッセージを記憶する遅延メモリではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを有している。
また、図35の復号装置では、制御部222が、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を行う。
さらに、制御部232は、制御信号C703を、メッセージ計算部211に供給し、その制御信号C703によって、バリアブルノード演算、又はチェックノード演算を行うことを、メッセージ計算部221に指示する。
また、制御部222は、図20のフローチャートで説明したように、セレクタ制御の処理を行い、制御信号C104に相当する制御信号C704を、メッセージ計算部221に供給する。メッセージ計算部221は、制御部222からの制御信号C704に従い、メッセージメモリ104から2回目に読み出されたメッセージDD602を選択的に用いて、バリアブルノード演算やチェックノード演算を行う。
図35の復号装置では、メッセージメモリ104に記憶されているメッセージが1つずつ読み出され、メッセージ計算部221に供給される。メッセージ計算部221は、メッセージメモリ104からのメッセージを用いて演算が行われ、その演算によって求められたメッセージが、メッセージメモリ104に格納される。図35の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
すなわち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる受信データ(対数尤度比)D100が供給され、受信データメモリ105は、その受信データD100を記憶する。
バリアブルノード演算時には、受信データメモリ105は、制御部222から供給される制御信号に従って、記憶している受信データを読み出し、受信データD101として、メッセージ計算部221に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部222から供給される制御信号に従い、記憶している同一のメッセージを1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD701として、メッセージ計算部221に供給し、2回目に読み出したメッセージをメッセージDD701として、メッセージ計算部221に供給する。メッセージ計算部221は、メッセージメモリ104から供給される1回目のメッセージD701、及び受信データメモリ105から供給される受信データD101、さらには、メッセージメモリ104から供給される2回目のメッセージDD701を、必要に応じて用い、制御部222から供給される制御信号C703及びC704に従って、検査行列に基づき、バリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージを、メッセージD722として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部222から供給される制御信号に従い、メッセージ計算部221から供給されるメッセージD722を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部222から供給される制御信号に従って、記憶している同一のメッセージを1回、又は2回読み出して、1回目に読み出したメッセージをメッセージD701として、メッセージ計算部221に供給し、2回目に読み出したメッセージをメッセージDD701として、メッセージ計算部221に供給する。
メッセージ計算部221は、メッセージメモリ104から供給される1回目のメッセージD701、さらには、メッセージメモリ104から供給される2回目のメッセージDD701を、必要に応じて用い、制御部222からの制御信号C703及びC704に従って、検査行列に基づき、チェックノード演算を行い、そのチェックノード演算によって求められたメッセージを、メッセージD722として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部222から供給される制御信号に従い、メッセージ計算部221から供給されるメッセージD722を記憶する。
ここで、図35のメッセージ計算部221で行われる演算について説明する。
いま、バリアブルノードに接続している枝のうちのi番目の枝から出力されるメッセージ(データ)として、式v'i=φ(|vi|)×sign(vi)で表されるメッセージv'iを導入すると、式(1)及び式(7)は、式(11)ないし式(13)に書き直すことができる。
ここで、式(1)のバリアブルノード演算は、式(11)及び式(12)の演算に対応し、式(7)のチェックノード演算は、式(13)の演算に対応する。
式(11)及び式(12)のバリアブルノード演算では、バリアブルノードに入力される入力データ(メッセージ)ujを、符号sign(uj)を含めて積算し(Σuj)、さらに、受信データu0iを加算して、その結果得られる加算値vi(=u0i+Σuj)の絶対値|vi|を引数とする非線形関数φ(|vi|)の演算を行うことにより、メッセージv'iが求められる。
また、式(13)のチェックノード演算では、チェックノードに入力される入力データ(メッセージ)v'iの絶対値|v'i|を積算し(Σ|v'i|)、その積算値Σ|v'i|を引数とする逆関数φ-1(Σ|v'i|)の演算を行う一方で、それとは別に、入力データv'iの符号ビットの相乗積(Πsign(v'i))を求め、逆関数φ-1(Σ|v'i|)の演算結果と、入力データv'iの符号ビットの相乗積Πsign(v'i)とを乗算して、メッセージujが求められる。
ここで、上述したように、非線形関数φ(x)とその逆関数φ-1(x)とは、x>0において等しい。したがって、式(11)及び式(12)のバリアブルノード演算と、式(13)のチェックノード演算のいずれでも、出力データxの絶対値|x|を引数として、関数φ(x)(φ-1(x))の演算が行われることになる。
図35のメッセージ計算部221では、以上のような式(11)及び式(12)のバリアブルノード演算と、式(13)のチェックノード演算とが行われる。
図36は、図35のメッセージ計算部221の構成例を示している。
メッセージ計算部221には、入力ポートP101,P701,PD701,P703,P704と、出力ポートP722が設けられている。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。入力ポートP701には、メッセージメモリ104から2回読み出される同一のメッセージD701及びDD701のうちの1回目に読み出されるメッセージ(1回目のメッセージ)D701が供給(入力)され、入力ポートPD701には、2回目に読み出されるメッセージ(2回目のメッセージ)DD701が供給される。また、入力ポートP703とP704には、制御部222(図35)からの制御信号C703とC704が、それぞれ供給される。
メッセージ計算部221は、入力ポートP701から入力される1回目のメッセージD701、入力ポートPD701から入力される2回目のメッセージDD701、入力ポートP101から入力されるメッセージ(受信データ)D101を、必要に応じて用い、入力ポートP703から入力される制御信号C703及びC704に従って、検査行列に基づき、式(11)及び式(12)のバリアブルノード演算、又は式(13)のチェックノード演算を行い、その結果得られるメッセージD722を、出力ポートP722から出力する。
ここで、図37を参照して、図36のメッセージ計算部221で行われるバリアブルノード演算とチェックノード演算について説明する。
図37左側は、式(1)のバリアブルノード演算を行うバリアブルノードと、式(7)のチェックノード演算を行うチェックノードとを模式的に示しており、図27右側と同一の図である。
図37左側では、図27右側で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、チェックノードから出力された出力データ(逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値)に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
図37左側において、バリアブルノードから出力された出力データとしてのメッセージviは、チェックノードに入力される入力データxとして、上述したように、非線形関数φ(x)の演算が施されてから、チェックノードに入力される。
したがって、図37左側に示したように、チェックノードに入力される入力データxに、非線形関数φ(x)の演算を施す代わりに、図37右側に示すように、バリアブルノードから出力された出力データx(バリアブルノードメッセージvi)に、非線形関数φ(x)の演算を施しても、バリアブルノード演算とチェックノード演算を行うことができる。
すなわち、図37右側では、式(11)及び式(12)で説明したように、バリアブルノードにおいて、そのバリアブルノードに入力される入力データujが積算されることにより、メッセージviが求められ、出力データとして出力されている。そして、バリアブルノードから出力された(メッセージvi)に、非線形関数φ(x)の演算が施され、メッセージv'iが求められている。このメッセージv'i(メッセージviに、非線形関数φ(x)の演算を施した演算結果)は、チェックノードに入力され、式(13)で説明したように積算されて、出力データとして出力される。そして、その出力データ(メッセージviに、非線形関数φ(x)の演算を施した演算結果の積算値)に、逆関数φ-1(x)の演算が施されることにより、メッセージujが求められる。
図36のメッセージ計算部221では、図37右側に示したようにメッセージv'iとujを求める式(11)及び式(12)のバリアブルノード演算と式(13)のチェックノード演算が行われる。
このように、図36のメッセージ計算部221は、図37右側に示したメッセージv'iとujを求める式(11)及び式(12)のバリアブルノード演算と式(13)のチェックノード演算の両方を行うため、メッセージ計算部221には、バリアブルノードから出力された出力データxに対して、逆関数φ-1(x)と同一の演算結果が得られる非線形関数φ(x)の演算結果を出力するとともに、チェックノードから出力された出力データxに対して、逆関数φ-1(x)の演算結果を出力するLUT713が設けられている。
そして、図36のメッセージ計算部221は、入力ポートP703に供給される制御信号C703に従って、その実質的な構成を変えて、式(11)及び式(12)のバリアブルノード演算と式(13)のチェックノード演算を選択的に行う。
すなわち、メッセージ計算部221は、セレクタ700,705,712、及び715を有しており、入力ポートP703に供給された制御信号C703は、セレクタ700,705,712、及び715に供給される。
セレクタ700,705,712、及び715は、v端子とc端子とを有し、制御信号C703に従い、v端子又はc端子のうちのいずれかに供給される値を選択して、後段に出力する。すなわち、セレクタ700,705,712、及び715は、制御信号C703がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号C703がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、図36のメッセージ計算部221では、制御信号C703がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号C703がチェックノード演算を指示しているときには、チェックノード演算が行われる。
すなわち、図38は、図37右側に示したバリアブルノード演算時の図36のメッセージ計算部221の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ700,705,712、及び715はv端子を選択するが、図38では、図36に図示した構成のうちの、セレクタ700,705,712、及び715がv端子を選択することによってバリアブルノード演算時に機能しない部分(バリアブルノード演算に関係がない部分)の図示を省略してある。
メッセージ計算部221は、入力ポートP101,P701,PD701それぞれから入力されるメッセージを、必要に応じて用いて、式(11)及び式(12)のバリアブルノード演算を行い、その結果得られるメッセージD722を、出力ポートP722から出力する。
すなわち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP701には、メッセージメモリ104から1つずつ読み出された、検査行列の各行に対応するチェックノードからの1回目のメッセージD701(メッセージuj)が供給される。
入力ポートP101に供給された受信データD101は、演算器711に供給される。
また、入力ポートP701に供給されたメッセージD701(メッセージuj)は、セレクタ700のv端子と、小FIFOメモリ716に供給される。
セレクタ700は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージD701(チェックノードメッセージuj)は、メッセージD705として、演算器701に供給される。
演算器701は、セレクタ700からのメッセージD705(メッセージuj)とレジスタ702に格納されている値D706とを加算することにより、メッセージD705を積算し、その結果得られる積算値を、レジスタ702に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD705(メッセージuj)が積算された場合、レジスタ702はリセットされる。
検査行列の1列に亘るメッセージD701(メッセージuj)が1つずつ読み込まれ、これにより、レジスタ702に1列分のメッセージD705(メッセージuj)が積算された値が格納された場合、すなわち、レジスタ702に、検査行列の1列に亘る全ての枝からのメッセージD705(メッセージuj)が積算された積算値(j=1からdvまでのΣuj)が格納された場合、セレクタ703は、レジスタ702に格納されている値、すなわち、検査行列の1列に亘る全ての枝からのメッセージD705(メッセージuj)が積算された積算値D706(j=1からdvまでのΣuj)を選択し、レジスタ704に出力して格納させる。
レジスタ704は、格納している値D706を、値D707として、セレクタ703と演算器710に供給する。レジスタ702に1列分のメッセージD705(メッセージuj)が積算された値が格納される直前までは、セレクタ703は、レジスタ704から供給された値D707を選択し、レジスタ704に出力し再格納させる。すなわち、検査行列の1列に亘る全ての枝からのメッセージD705(メッセージuj)が積算されるまで、レジスタ704は、前回積算された値を、セレクタ703と演算器710に供給する。
一方、入力ポートP701に供給されたメッセージD701(メッセージuj)は、上述したように、小FIFOメモリ716にも供給される。
小FIFOメモリ716は、メッセージを遅延するための遅延メモリであるが、検査行列の重み(列の重みdv及び行の重みdc)の最大値よりも少ない数(であって1以上)のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリである。
小FIFOメモリ716は、メッセージメモリ104からの1回目のメッセージD701を遅延し、セレクタ717のf端子に供給する。
セレクタ717は、入力端子として、f端子とm端子とを有しており、f端子には、上述したように、K小FIFOメモリ716で遅延されたメッセージD701が供給される。また、セレクタ717のm端子には、メッセージメモリ104から端子PD701に供給される2回目のメッセージDD701が供給される。
さらに、セレクタ717には、制御部222(図35)から入力ポートP704に供給される制御信号C704が供給される。
セレクタ717は、制御部222からの制御信号C704に従い、小FIFOメモリ716で遅延された1回目のメッセージD701と、メッセージメモリ104からの2回目のメッセージDD701とのうちの一方を、バリアブルノード演算に用いるメッセージとして選択して出力する。
セレクタ717が出力するメッセージ、すなわち、小FIFOメモリ716で遅延された1回目のメッセージD701、又は、メッセージメモリ104からの2回目のメッセージDD701は、セレクタ705のv端子に供給される。
ここで、図35の復号装置において、制御部222は、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ716が記憶可能なメッセージの数(記憶可能個数)d以下であるときには、小FIFOメモリ716で遅延された1回目のメッセージD701を選択することをセレクタ717に指示する制御信号C704を、メッセージ計算部211の入力ポートP704に供給する。
さらに、制御部222は、バリアブルノードに対応する列の重みdvが、小FIFOメモリ716の記憶可能個数d以下でないときには、メッセージメモリ104からの2回目のメッセージDD701を選択することをセレクタ717に指示する制御信号C704を、メッセージ計算部211の入力ポートP704に供給する。
なお、制御部222は、小FIFOメモリ716で遅延されたメッセージD701を選択することをセレクタ717に指示する制御信号C704を、メッセージ計算部211に供給する場合、つまり、制御信号C704が、メッセージメモリ104から2回目に読み出されたメッセージDD701を選択することをセレクタ717に指示する信号でない場合には、メッセージメモリ104からのメッセージの読み出しについては、メッセージメモリ104からメッセージを1回だけ読み出す読み出し制御を行う。
したがって、制御部222では、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ716の記憶可能個数d以下でない場合には、図15で説明した、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御が行われるが、メッセージを求めようとしている枝が接続しているバリアブルノードに対応する検査行列の列の重みdvが、小FIFOメモリ716の記憶可能個数d以下である場合には、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御は行われず(行う必要がなく)、1回だけ読み出す読み出し制御、すなわち、図15のステップS101及びS102のうちの、ステップS101だけが行われる。
一方、レジスタ704から新たな値D707(j=1からdvまでのΣuj)の出力が開始されると、すなわち、レジスタ702に1列分のメッセージD705(メッセージuj)が積算された積算値(j=1からdvまでのΣuj)が格納され、その積算値がセレクタ703で選択されて、レジスタ704に格納された直後、上述したようにして、セレクタ717が出力するメッセージ、すなわち、小FIFOメモリ716で遅延された1回目のメッセージメッセージD701(メッセージuj)、又は、2回目のメッセージDD701が、セレクタ705のv端子に供給される。
セレクタ705は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージ(メッセージuj)は、メッセージD713として、演算器710に供給される。
演算器710は、レジスタ704から供給された積算値D707(j=1からdvまでのΣuj)から、セレクタ705からのメッセージD713(メッセージuj)を減算する。すなわち、演算器710では、検査行列の1列に亘る全ての枝からのメッセージD705(メッセージuj)の積算値D707(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージD713を減算して、減算値D714(j=1からdv-1までのΣuj)を求め、演算器711に供給する。
演算器711は、入力ポートP101からの受信データD101と、演算器710からの減算値D714(j=1からdv-1までのΣuj)とを加算することにより、メッセージD715(バリアブルノードメッセージvi)を求めて出力する。
すなわち、以上により、式(11)の演算が行われ、演算器711からバリアブルノードメッセージviが出力される。
演算器711が出力するメッセージD715(メッセージvi)のうちの最上位ビットを除く下位ビット、つまり、メッセージD715の絶対値D716(|vi|)は、セレクタ712のv端子に供給され、最上位ビット、つまりメッセージD715(メッセージvi)の符号ビットD717(sign(vi))は、セレクタ715のv端子に供給される。
セレクタ712は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器711が出力するメッセージD715(メッセージvi)の絶対値D716(|vi|)を、絶対値D718として、LUT713に供給する。
LUT713は、セレクタ712からの絶対値D718(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D719(φ(|vi|))を読み出して出力する。
セレクタ715も、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器711が出力するメッセージD715(メッセージvi)の符号ビットD717(sign(vi))を、符号ビットD721(sign(vi))として出力する。
メッセージ計算部211は、セレクタ715が出力する符号ビットD721(sign(vi))を、LUT713が出力する演算結果D719(φ(|vi|))の符号ビットとして最上位ビットに付加することにより、メッセージD722(メッセージv'i)を得て、出力ポートP722から出力する。
以上により、式(12)の演算が行われ、メッセージv'iが求められる。
以上のように、セレクタ700,705,712、及び715がv端子を選択しているメッセージ計算部221では、式(11)及び式(12)のバリアブルノード演算が行われ、その結果得られるメッセージv'iが、出力ポートP722から出力される。
次に、図39は、図37右側に示したチェックノード演算時の図36のメッセージ計算部221の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ700,705,712、及び715はc端子を選択するが、図39では、図36に図示した構成のうちの、セレクタ700,705,712、及び715がc端子を選択することによってチェックノード演算時に機能しない部分(チェックノード演算に関係がない部分)の図示を省略してある。
チェックノード演算時においては、入力ポートP701には、メッセージメモリ104から1つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviから得られたメッセージ(式(11)及び式(12)のバリアブルノード演算によって求められたメッセージ)v'iが、順次、メッセージD701として供給される。
入力ポートP701に供給されたメッセージD701(メッセージv'i)のうちの最上位ビットを除く下位ビット、つまり、メッセージD701の絶対値D703(|v'i|)は、セレクタ700のc端子に供給され、最上位ビット、つまりメッセージD701の符号ビットD704は、EXOR回路706に供給される。
セレクタ700は、チェックノード演算時にはc端子を選択しており、そのc端子に供給される、メッセージD701の絶対値D703(|v'i|)を、絶対値D705(|v'i|)として、演算器701に供給する。
演算器701は、絶対値D705(|v'i|)とレジスタ702に格納されている値D706とを加算することにより、絶対値D705を積算し、その結果得られる積算値をレジスタ702に再格納する。なお、検査行列の1行に亘る全ての枝からの(メッセージviから得られた)メッセージD701(v'i)の絶対値D705(D703)(|v'i|)が積算された場合、レジスタ702はリセットされる。
検査行列の1行に亘る(メッセージviから得られた)メッセージD701が1つずつ読み込まれ、レジスタ702に1行分の絶対値D705が積算された積算値が格納された場合、セレクタ703は、レジスタ702に格納されている値、すなわち、検査行列の1行に亘る全ての枝からのメッセージD701(メッセージv'i)が積算された積算値D706(i=1からi=dcまでのΣ|v'i|)を選択し、レジスタ704に出力して格納させる。レジスタ704は、格納している積算値D706を、値D707として、セレクタ703と演算器710に供給する。
レジスタ702に1行分の絶対値D705が積算された積算値が格納される直前までは、セレクタ703は、レジスタ704から供給された値D707を選択し、レジスタ704に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD701(メッセージv'i)の絶対値|v'i|が積算されるまで、レジスタ704は、前回積算された絶対値|v'i|の積算値を、セレクタ703と演算器710に供給する。
一方、入力ポートP701に供給されたメッセージD701(メッセージv'i)は、小FIFOメモリ716にも供給される。
小FIFOメモリ716は、上述したように、メッセージを遅延するための遅延メモリであるが、検査行列の重みの最大値よりも少ない数のメッセージを記憶する容量しか有していない、容量の小さいFIFOメモリであり、メッセージメモリ104からの1回目のメッセージD701を遅延し、セレクタ717のf端子に供給する。
ここで、図35の復号装置において、制御部222は、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ716が記憶可能なメッセージの数(記憶可能個数)d以下であるときには、小FIFOメモリ716で遅延された1回目のメッセージD701を選択することをセレクタ717に指示する制御信号C704を、メッセージ計算部221の入力ポートP704を介して、セレクタ717に供給する。
セレクタ717は、制御部222からの制御信号C704に従い、小FIFOメモリ716で遅延された1回目のメッセージD701を選択して出力する。
また、制御部222は、チェックノードに対応する行の重みdcが、小FIFOメモリ716の記憶可能個数d以下でないときには、メッセージメモリ104からの2回目のメッセージDD701を選択することをセレクタ717に指示する制御信号C704を、メッセージ計算部221の入力ポートP704に供給する。
さらに、制御部222では、メッセージを求めようとしている枝が接続しているチェックノードに対応する検査行列の行の重みdcが、小FIFOメモリ716の記憶可能個数d以下でないときには、図15で説明した、メッセージメモリ104から同一のメッセージを2回読み出す読み出し制御が行われ、これにより、メッセージメモリ104から2回目に読み出されたメッセージDD701が、入力ポートPD701を介して、セレクタ717のm端子に供給される。
セレクタ717は、制御部222からの制御信号C704に従い、メッセージメモリ104から入力ポートPD701を介して供給される2回目のメッセージDD701を選択して出力する。
セレクタ717が出力するメッセージ(メッセージv'i)、すなわち、小FIFOメモリ716で遅延された1回目のメッセージD701、又は、メッセージメモリ104からの2回目のメッセージDD701のうちの最上位ビットを除く下位ビット、つまり、絶対値D711(|v'i|)は、セレクタ705のc端子に供給され、最上位ビット、つまり、符号ビットD712(sign(v'i))は、EXOR回路714に供給される。
セレクタ705は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるメッセージ(v'i)の絶対値D711(|v'i|)を、絶対値D713(|v'i|)として、演算器710に供給する。
すなわち、レジスタ704において、新たな値D707(i=1からi=dcまでのΣφ(|v'i|))の出力が開始されると、つまり、レジスタ702に1行分の絶対値D705が積算された新たな積算値(i=1からi=dcまでのΣφ(|v'i|))が格納され、セレクタ703で選択されて、レジスタ704に格納された直後、セレクタ705からは、セレクタ717が出力するメッセージ(メッセージv'i)の絶対値D711(|v'i|)が、絶対値D713(|v'i|)として、演算器710に供給される。
演算器710は、レジスタ704から供給された値D707(Σ|v'i|)から、セレクタ705から供給された値D713(|v'i|)を減算し、その減算結果を、減算値D714として出力する。すなわち、演算器710は、検査行列の1行に亘る全ての枝からのメッセージD701(メッセージv'i)の絶対値|v'i|の積算値D707(i=1からi=dcまでのΣ|v'i|)から、求めたい枝からのメッセージ(i=dcのv'i)の絶対値D713(|v'i|)を減算して、その減算値(i=1からi=dc-1までのΣ|v'i|)を値D714として、セレクタ712のc端子に供給する。
セレクタ712は、チェックノード演算時には、c端子を選択しており、そのc端子に供給される値D714(i=1からi=dc-1までのΣ|v'i|)を、値D718として、LUT713に供給する。
LUT713は、セレクタ712からの値D718(Σ|v'i|)を引数として、逆関数φ-1(Σ|v'i|)の演算を行った演算結果D719(φ-1(Σ|v'i|))を読み出して出力する。
以上の処理と並行して、EXOR回路706は、レジスタ707に格納されている値D709と、1回目のメッセージD701(メッセージv'i)の最上位ビットである符号ビットD704(sign(v'i))との排他的論理和を演算することにより、符号ビットD704どうしの乗算を行い、乗算結果D708を、レジスタ707に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された場合、レジスタ707はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された乗算結果D708(i=1からdcまでのΠsign(v'i))がレジスタ707に格納された場合、セレクタ708は、レジスタ707に格納されている値D709、すなわち、検査行列の1行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された値D709(i=1からi=dcまでのΠsign(v'i))を選択し、レジスタ709に出力して格納させる。レジスタ709は、格納している値D710を、セレクタ708とEXOR回路714に供給する。
検査行列の1行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された乗算結果D708(i=1からdcまでのΠsign(v'i))がレジスタ707に格納される直前までは、セレクタ708は、レジスタ709から供給された値D710を選択し、レジスタ709に出力して再格納させる。すなわち、検査行列の1行に亘る全ての枝からのメッセージD701(メッセージv'i)の符号ビットD704が乗算されるまで、レジスタ709は、前回格納した値を、セレクタ708とEXOR回路714に供給する。
一方、レジスタ709から新たな値D710(i=1からi=dcまでのΠsign(v'i))がEXOR回路714に供給されたとき、すなわち、レジスタ707に1行に亘る全ての枝からのメッセージD701の符号ビットD704が乗算された新たな値D709(i=1からi=dcまでのΠsign(v'i))が格納され、その新たな値D709がセレクタ708で選択されてレジスタ709に格納されたとき、レジスタ704には、上述したように、1行分の絶対値D705(|v'i|)が積算された積算値(i=1からi=dcまでのΣ|v'i|)が格納される。
レジスタ704に1行分の絶対値D705が積算された積算値(i=1からi=dcまでのΣ|v'i|)が格納されると、上述したようにして、セレクタ717が出力するメッセージ(メッセージv'i)、すなわち、小FIFOメモリ716で遅延された1回目のメッセージD701、又は、メッセージメモリ104からの2回目のメッセージDD701の最上位ビットである符号ビットD712(sign(v'i))が、EXOR回路714に供給される。
EXOR回路714は、レジスタ709から供給された新たな値D710と、セレクタ717が出力するメッセージ(v'i)の符号ビットD712との排他的論理和を演算することにより、値D710を、符号ビットD712で除算し、除算結果を除算値D720として、セレクタ715のc端子に供給する。すなわち、EXOR回路714は、検査行列の1行に亘る全ての枝からのメッセージD701の符号ビットD704の乗算値(i=1からi=dcまでのΠsign(v'i))を、求めたい枝からのメッセージv'iの符号ビットD712(i=dcのsign(v'i))で除算して、その除算値(i=1からi=dc-1までのΠsign(v'i))を除算値D720として、セレクタ715のc端子に供給する。
セレクタ715は、チェックノード演算時にはc端子を選択しており、そのc端子に供給される除算値D720(i=1からi=dc-1までのΠsign(v'i))を、符号ビットD721として出力する。
そして、メッセージ計算部221では、以上のようにしてセレクタ715から出力された符号ビットD721(Πsign(v'i))を、LUT713が出力する演算結果D719(φ-1(Σ|v'i|))に符号ビットとして付加(乗算)することにより、式(13)で表されるメッセージ(チェックノードメッセージ)ujを得て、メッセージD722として、出力ポートP722から出力する。
以上のように、セレクタ700,705,712、及び715がc端子を選択しているメッセージ計算部221では、式(13)のチェックノード演算が行われ、その結果得られるメッセージujが、出力ポートP722から出力される。
なお、図35の復号装置では、復号の最終段において、式(11)及び式(12)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
以上のように、図35の復号装置では、遅延メモリとして、検査行列の重みの最大値よりも少ない数のメッセージを記憶する小FIFOメモリ716(図32)を設けるようにしたので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ320(図22)を設ける場合に比較して、復号装置の規模を削減することができる。
さらに、注目ノードに対応する検査行列の重みが、記憶可能個数d以下である場合(記憶可能個数dより大でない場合)には、小FIFOメモリ716の出力を選択して、ノードの演算に用いるので、少なくとも検査行列の重みの最大値に等しい数のメッセージを記憶するFIFOメモリ320(図22)を有する図21の復号装置と同様の時間でメッセージの読み書きを行うことができる。したがって、図21の復号装置と同様の回数だけ繰り返し復号を行うことができるので(1回の復号に要する時間が図21の復号装置と同様となるので)、復号性能が劣化することを抑制することができる。
また、注目ノードに対応する検査行列の重みが、記憶可能個数dより大である場合には、メッセージメモリ104から同一のメッセージを2回読み出し、2回目に読み出されたメッセージを選択して、ノードの演算に用いるので、注目ノードに対応する検査行列の重みが、記憶可能個数dより大であっても、LDPC符号の復号を行うことができる。
以上から、図35の復号装置によれば、規模を削減しつつ、復号性能の劣化を抑制することができる。
ここで、小FIFOメモリ716の記憶可能個数dが、例えば、3であり、復号の対象のLDPC符号を定義する検査行列が、例えば、図1に示した、各列の重みdvが3で、且つ、各行の重みが6の行列である場合には、記憶可能個数dである3が、検査行列の列の重みdvである3よりも小でなく、したがって、バリアブルノード演算時には、3個のメッセージD701が積算されるまでの間、小FIFOメモリ716において、その3個のメッセージD701すべてを遅延することができるから、セレクタ717では、端子fに供給される、小FIFOメモリ716で遅延された1回目のメッセージD701が選択される。
また、この場合、記憶可能個数dである3が、検査行列の行の重みdcである6よりも小であり、したがって、チェックノード演算時には、記憶可能個数dである3よりも多い6個のメッセージD701(メッセージv'i)の絶対値|v'i|が積算されるまでの間、小FIFOメモリ716において、その6個のメッセージD701すべてを遅延することができないため、セレクタ717では、端子mに供給される、メッセージメモリ104からの2回目のメッセージDD701が選択される。
なお、図35の復号装置では、メッセージ計算部221において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部(演算器701、レジスタ702、セレクタ703、レジスタ704、演算器710、及びLUT713)が共有化されているので、その共有化の分だけ、復号装置の規模を、より削減することができる。
また、図35の復号装置のメッセージ計算部221では、ノードから出力された出力データxの絶対値|x|を引数として、同一の演算結果が得られる逆関数φ-1(x)と非線形関数φ(x)の演算をそれぞれ含む式(12)と式(13)をそれぞれ用いたバリアブルノード演算とチェックノード演算が行われる。
したがって、メッセージ計算部221には、図36に示したように、出力データxの絶対値|x|に対して、逆関数φ-1(x)と非線形関数φ(x)の演算を行うLUT713の1つだけあれば済み、図26に示したLUT300,310、及び314の3つのLUTを必要とするメッセージ計算部201、さらには、図31に示したLUT600及び610の2つのLUTを必要とするメッセージ計算部211よりも、規模を削減することができる。
以上のように、図17、図25、図30、及び図35の復号装置では、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリ(図18の小FIFOメモリ161、並びに図19の小FIFOメモリ141及び143、図26の小FIFOメモリ317、図31の小FIFOメモリ616、図36の小FIFOメモリ716)を設けるようにしたので、少なくとも、検査行列の重みの最大値と同一の数のメッセージを記憶する遅延メモリ(例えば、図9のFIFOメモリ155、並びに図10のFIFOメモリ127及び133、図22のFIFOメモリ320)を有する復号装置(図8、図21)に比較して、復号装置の規模を削減することができる。
また、遅延メモリを有しない復号装置(図12)に比較して、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリ等の、少ない規模の増加によって、演算の効率を向上させること、つまり、少なくとも、検査行列の重みの最大値と同一の数のメッセージを記憶する遅延メモリを有する復号装置と同様の回数だけ繰り返し復号を行うことが可能となる。
ここで、以上のように、復号装置に、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを設けることは、LDPC符号の符号長が長く、検査行列の行の重みに対して、列の重みが小である場合において、列の重みの最大値と同一の数(但し、行の重みの最大値より小の数)だけの遅延を行う遅延メモリを採用したときに、特に効果を発揮する。
すなわち、この場合、バリアブルノード演算は、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリで遅延されたメッセージを用いて行われることになるので、検査行列の重みの最大値と同一の数のメッセージを記憶する遅延メモリを有する復号装置と同様の回数だけ繰り返し復号を行うことができ、復号性能が劣化することを、より抑制しつつ、復号装置の規模を、より削減することができる。
また、複数のノードのメッセージを並列で求めるために、複数のメッセージ計算部を設けて、復号装置を構成する場合には、メッセージ計算部の数だけ、遅延メモリが必要となるから、そのような場合も、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリを設けることによる、復号装置の規模の削減の効果は、大となる。
なお、本実施の形態では、検査行列の重みの最大値よりも少ない数のメッセージを記憶する遅延メモリとして、3個のメッセージを記憶する遅延メモリ(例えば、図26の小FIFOメモリ317等)を採用したが、遅延メモリは、3個のメッセージを記憶するメモリに限定されるものではなく、検査行列の重みの最大値よりも少ない数のメッセージを記憶するメモリであれば良い。
また、メッセージメモリ104は、RAM#AとRAM#Bとの2バンクで構成することとしたが、メッセージメモリ104は、3以上のRAMで3バンク以上に構成することが可能である。
次に、制御部202(図25)等が行う図15に示したメッセージメモリ104に対する読み書き制御の処理、及び図20に示したセレクタ制御の処理は、専用のハードウェアにより行うこともできるし、ソフトウェアにより行うこともできる。一連の処理をソフトウェアによって行う場合には、そのソフトウェアを構成するプログラムが、マイクロコンピュータ(いわゆるマイコン)等のコンピュータにインストールされる。
そこで、図40は、上述した一連の処理を実行するプログラムがインストールされるコンピュータの一実施の形態の構成例を示している。
プログラムは、コンピュータに内蔵されている記録媒体としての不揮発性メモリ905やROM903に予め記録しておくことができる。
あるいはまた、プログラムは、フレキシブルディスク、CD-ROM(Compact Disc Read Only Memory),MO(Magneto Optical)ディスク,DVD(Digital Versatile Disc)、磁気ディスク、半導体メモリなどのリムーバブル記録媒体に、一時的あるいは永続的に格納(記録)しておくことができる。
なお、プログラムは、上述したようなリムーバブル記録媒体から、あるいはネットワークを経由してコンピュータにインストールすることができる。
コンピュータは、CPU(Central Processing Unit)902を内蔵している。CPU902には、バス901を介して、入出力インタフェース906が接続されており、CPU902は、ROM(Read Only Memory)903や不揮発性メモリ905にインストールされたプログラムを、RAM(Random Access Memory)904にロードして実行する。これにより、CPU902は、入出力インタフェース906を介して、メッセージメモリ104に対する読み書き制御(図15)や、セレクタ制御(図20)を行う。
ここで、本明細書において、コンピュータに各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいは個別に実行される処理(例えば、並列処理あるいはオブジェクトによる処理)も含むものである。
また、プログラムは、1のコンピュータにより処理されるものであっても良いし、複数のコンピュータによって分散処理されるものであっても良い。
なお、本発明の実施の形態は、上述した実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲において種々の変更が可能である。