また、前記メッセージ計算手段には、
バリアブルノードの演算を行うバリアブルノード計算手段(例えば、図12のバリアブルノード計算器172)と、
チェックノードの演算を行うチェックノード計算手段(例えば、図12のチェックノード計算器173)と
を設けることができる。
前記メッセージ計算手段には、バリアブルノードから出力された出力データxに対して、逆関数φ-1(x)=2tanh-1(e-x)と同一の演算結果が得られる非線形関数φ(x)=-ln(tanh(x/2))の演算結果を出力するとともに、チェックノードから出力された出力データxに対して、前記逆関数φ-1(x)の演算結果を出力するLUT(Look Up Table)(例えば、図32のLUT713)を設けることができる。
以下、本発明を適用した具体的な実施の形態について、図面を参照しながら詳細に説明する。
図12は、本発明を適用した復号装置の第1実施の形態の構成例を示すブロック図である。
なお、図中、図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のバリアブルノード計算器173に供給する。
また、バリアブルノード演算時には、メッセージメモリ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それぞれから入力されるメッセージを用いて、式(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それぞれから入力されるメッセージを用いて、式(7)のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP112から出力する。
即ち、入力ポートP111には、メッセージメモリ104から読み出されたメッセージD104(バリアブルノードメッセージuj)が供給される。
そして、チェックノード計算器173では、検査行列の各列に対応するバリアブルノードからのメッセージD104(メッセージvi)が入力ポートP111から1つずつ入力され、その最上位ビットを除く下位ビット、つまり、メッセージD104の絶対値D122(|vi|)が、LUT121に供給されるとともに、最上位ビット、つまりメッセージD104の符号ビットD121が、EXOR回路129に供給される。
LUT121は、絶対値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は、演算器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の符号ビットD121(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の復号装置は、あるノードからの出力メッセージを求めるのに、図8の復号装置の1.5倍程度の時間を要し、その分だけ高速に動作することが要求される(高速な動作クロックを必要とする)。
しかしながら、特に、ノードすべてについて、出力メッセージを求める演算を同時(並列)に行うフルパラレルの復号(full parallel decoding)を行う復号装置や、1つでもなくすべてでもないp個のノードについて、出力メッセージを求める演算を同時に行う一部並列の復号(例えば、特許文献1に記載の復号)を行う復号装置を、遅延メモリを設けて構成した場合には、多数の遅延メモリが必要となり、装置全体の規模に大きく影響する。
かかる復号装置において、図12の復号装置のように、メッセージメモリ104から同一の入力メッセージを2回読み出して、出力メッセージを求めることにより、遅延メモリを不要とする構成を採用することにより、復号装置において多少の高速な動作が要求されることにはなるが、その代償として、極めて大きな装置規模の削減の効果を得ることができる。
なお、本明細書では、説明を簡単にするために、フルシリアルの復号装置を説明するが、図12の復号装置を含め、以下説明する復号装置の構成や処理の方法は、フルパラレルの復号を行う復号装置や、一部並列の復号を行う復号装置に適用することができ、そのような復号装置に適用した場合に、特に大きな装置規模の削減の効果を得ることができる。
ところで、図12の復号装置では、出力メッセージを求める手段としてのメッセージ計算部171を、バリアブルノード演算を行うバリアブルノード計算器172と、チェックノード演算を行うチェックノード計算器173とで構成するようにしたが、出力メッセージを求める手段は、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有化して構成し、バリアブルノード演算とチェックノード演算とを、選択的に行うようにすることができる。
そこで、次に、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有化し、かつ、遅延メモリを設けずに構成された復号装置について説明するが、その前段階の準備として、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部が共有化され、かつ、遅延メモリが設けられた復号装置について説明する。
即ち、図17は、そのような復号装置の構成例を示すブロック図である。
なお、図中、図8の復号装置と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。即ち、図17の復号装置は、メッセージ計算部101に代えてメッセージ計算部191が設けられているとともに、制御部106に代えて制御部192が設けられている他は、図8の復号装置と同様に構成されている。
図17の復号装置は、図8の復号装置と同様に、フルシリアルの復号を繰り返し行う。
図17の復号装置では、メッセージメモリ104からメッセージ計算部191に、入力メッセージが1つずつ読み出され、メッセージ計算部191において、その入力メッセージを用いて、所望の枝に対応する出力メッセージが計算される。そして、その計算によって求められた出力メッセージが、メッセージメモリ104に格納されていく。図17の復号装置では、以上の処理が繰り返し行われ、いわゆる繰り返し復号が行われる。
即ち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(または1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を記憶する。
バリアブルノード演算時には、受信データメモリ105は、制御部192から供給される制御信号にしたがって、記憶している受信データを読み出し、受信データD101として、メッセージ計算部191に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部192から供給される制御信号にしたがって、記憶しているメッセージD201を読み出し、メッセージ計算部191に供給する。さらに、バリアブルノード演算時には、制御部192は、制御信号D203として、バリアブルノード演算を指示する制御信号を、メッセージ計算部191に供給する。
メッセージ計算部191は、メッセージメモリ104から供給される入力メッセージD201と受信データメモリ105から供給される受信データD101を用い、制御部192からの制御信号D203にしたがって、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られた出力メッセージ(バリアブルノードメッセージ)viを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、以上のようにしてメッセージ計算部191から供給されるメッセージD202を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部192から供給される制御信号にしたがって、記憶しているバリアブルノードメッセージviを、入力メッセージD201として読み出し、メッセージ計算部191に供給する。
さらに、チェックノード演算時には、制御部192は、制御信号D203として、チェックノード演算を指示する制御信号を、メッセージ計算部191に供給する。
メッセージ計算部191は、メッセージメモリ104から供給される入力メッセージD201を用い、制御部192からの制御信号D203にしたがって、式(7)のチェックノード演算を行い、そのチェックノード演算にって求められた出力メッセージ(チェックノードメッセージ)ujを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、以上のようにしてメッセージ計算部191から供給されるメッセージD202を記憶する。
メッセージメモリ104が記憶したメッセージ計算部191からのチェックノードメッセージujとしてのメッセージD202は、次のバリアブルノード演算時に、メッセージD201として読み出され、メッセージ計算部191に供給される。
次に、図18は、図17のメッセージ計算部191の構成例を示している。
メッセージ計算部191は、外部からメッセージ(データ)が供給(入力)される入力ポートとして、2つの入力ポートP101とP201を有し、外部にメッセージを供給(出力)するポートとして、1の出力ポートP202を有している。さらに、メッセージ計算部191は、外部から制御信号が供給(入力)される入力ポートとして、1つの入力ポートP203を有している。
メッセージ計算部191は、入力ポートP201から入力されるメッセージ、さらには、必要に応じて、入力ポートP101から入力されるメッセージ(受信データ)を用い、入力ポートP203から入力される制御信号D203にしたがって、式(1)のバリアブルノード演算または式(7)のチェックノード演算を選択的に行い、その結果得られるメッセージを、出力ポートP202から出力する。
即ち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP201には、メッセージメモリ104から読み出されたメッセージD201(チェックノードメッセージujまたはバリアブルノードメッセージvi)が供給される。さらに、入力ポートP203には、制御部192からの制御信号D203が供給される。
そして、入力ポートP101に供給された受信データD101は、演算器313に供給され、入力ポートP201に供給されたメッセージD201は、セレクタ301のv端子に供給される。さらに、入力ポートP201に供給されたメッセージD201のうちの最上位ビットを除く下位ビット、即ち、メッセージD201の絶対値は、値D303として、LUT300に供給され、メッセージD201のうちの最上位ビット、即ち、メッセージD201の符号ビットは、値D304として、EXOR回路306とFIFOメモリ320に供給される。
また、入力ポートP203に供給された制御信号D203は、セレクタ301および316に供給される。
セレクタ301および316は、v端子とc端子とを有し、制御信号D203にしたがい、v端子またはc端子のうちのいずれかに供給される値を選択して、後段に出力する。即ち、セレクタ301および316は、制御信号D203がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号D203がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、メッセージ計算部191は、バリアブルノード演算時には、実質的に、図19に示す構成となって、バリアブルノード演算を行い、チェックノード演算時には、実質的に、図20に示す構成となって、チェックノード演算を行う。
即ち、図19は、バリアブルノード演算時のメッセージ計算部191の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ301および316はv端子を選択するが、図19では、図18に図示した構成のうちの、セレクタ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列に亘るメッセージD306が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から出力される。
図20は、チェックノード演算時の図18のメッセージ計算部191の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ301および316はc端子を選択するが、図20では、図18に図示した構成のうちの、セレクタ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であり、絶対値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であり、演算器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に供給されるまでの間、符号ビット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から出力される。
なお、図示しないが、図17の復号装置では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
図17の復号装置によれば、メッセージメモリ104と、メッセージ計算部191のFIFOメモリ320の容量さえ足りれば、様々な検査行列のLDPC符号を復号することができる。
また、図17の復号装置のメッセージ計算部191(図18)では、図19と図20とを比較して分かるように、値の積算を行って積算値を出力する演算器302およびレジスタ303、積算値から、ある値を減算して減算値を出力するセレクタ304、レジスタ305、および演算器312、並びに値を遅延する遅延メモリとしてのFIFOメモリ320が、バリアブルノード演算とチェックノード演算とで共有されているので、例えば、図8の復号装置のように、独立のバリアブルノード計算器102とチェックノード計算器103とを有するメッセージ計算部101よりも回路規模を小さくすることができる。
次に、図21は、本発明を適用した復号装置の第2実施の形態の構成例を示すブロック図である。なお、図中、図17の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。即ち、図21の復号装置は、メッセージ計算部191に代えて、メッセージ計算部201が設けられているとともに、制御部192に代えて、制御部202が設けられている他は、図17の復号装置と同様に構成されている。
図21の復号装置では、メッセージ計算部201が、図17の復号装置のメッセージ計算部191と同様に、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図21の復号装置は、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部201が、遅延メモリ(図18のメッセージ計算部191のFIFOメモリ320に相当するメモリ)を設けずに構成されている。
図21の復号装置では、メッセージメモリ104からメッセージ計算部201に、入力メッセージが1つずつ読み出され、メッセージ計算部201において、その入力メッセージを用いて、所望の枝に対応する出力メッセージが計算される。そして、その計算によって求められた出力メッセージが、メッセージメモリ104に格納されていく。図21の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
即ち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(または1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を格納(記憶)する。
バリアブルノード演算時には、受信データメモリ105は、制御部202から供給される制御信号にしたがって、記憶している受信データを読み出し、受信データD101として、メッセージ計算部201に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部202から供給される制御信号にしたがい、記憶している同一のメッセージを2回読み出して、1回目に読み出したメッセージをメッセージD201として、メッセージ計算部201に供給し、2回目に読み出したメッセージをメッセージDD201として、メッセージ計算部201に供給する。メッセージ計算部201は、メッセージメモリ104から供給されるメッセージD201とDD201、および受信データメモリ105から供給される受信データD101を用い、制御部202から供給される制御信号D203が表すバリアブルノード演算の指示にしたがって、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ(バリアブルノードメッセージ)viを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部202から供給される制御信号にしたがい、メッセージ計算部201から供給されるメッセージD202(バリアブルノードメッセージvi)を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部202から供給される制御信号にしたがって、記憶している同一のメッセージ(バリアブルノードメッセージvi)を2回読み出して、1回目に読み出したメッセージをメッセージD201として、メッセージ計算部201に供給し、2回目に読み出したメッセージをメッセージDD201として、メッセージ計算部201に供給する。
メッセージ計算部201は、メッセージメモリ104から供給されるメッセージD201とDD201を用い、制御部202からの制御信号D203が表すチェックノード演算の指示にしたがって、式(7)のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ(チェックノードメッセージ)ujを、メッセージD202として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部202から供給される制御信号にしたがい、メッセージ計算部201から供給されるメッセージD202(チェックノードメッセージuj)を記憶する。
メッセージメモリ104が記憶したメッセージ計算部201からのメッセージD202、即ち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD201およびDD201として読み出され、メッセージ計算部201に供給される。
図22は、図21のメッセージ計算部201の構成例を示している。
なお、図中、図18のメッセージ計算部191と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
メッセージ計算部201は、データを遅延するための遅延メモリ(図18のメッセージ計算部191に設けられているFIFOメモリ320)を設けずに構成されている。
その代わり、メッセージ計算部201は、外部からメッセージ(データ)が供給(入力)される入力ポートとして、入力ポートP101およびP201の他に、入力ポートPD201を有しているとともに、LUT310およびセレクタ311を有している。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。また、入力ポートP201には、メッセージメモリ104から2回読み出される同一のメッセージD201およびDD201のうちの1回目に読み出されるメッセージ(以下、適宜、1回目のメッセージともいう)D201が供給(入力)され、入力ポートPD201には、2回目に読み出されるメッセージ(以下、適宜、2回目のメッセージともいう)DD201が供給される。
メッセージ計算部201は、入力ポートP201から入力される1回目のメッセージD201と、入力ポートPD201から入力される2回目のメッセージDD201、さらには、必要に応じて、入力ポートP101から入力されるメッセージ(受信データ)を用い、入力ポートP203から入力される制御信号D203にしたがって、式(1)のバリアブルノード演算または式(7)のチェックノード演算を行い、その結果得られるメッセージを、出力ポートP202から出力する。
即ち、入力ポートP101に供給された受信データD101は、演算器313に供給され、入力ポートP201に供給された1回目のメッセージD201は、セレクタ301のv端子に供給される。
さらに、入力ポートP201に供給された1回目のメッセージD201のうちの最上位ビットを除く下位ビット、即ち、メッセージD201の絶対値は、値D303として、LUT300に供給され、1回目のメッセージD201のうちの最上位ビット、即ち、メッセージD201の符号ビットは、値D304として、EXOR回路306に供給される。
また、入力ポートPD201に供給された2回目のメッセージDD201は、セレクタ311のv端子に供給される。さらに、入力ポートPD201に供給された2回目のメッセージDD201のうちの最上位ビットを除く下位ビット、即ち、メッセージDD201の絶対値は、値D312として、LUT310に供給され、2回目のメッセージDD201のうちの最上位ビット、即ち、メッセージDD201の符号ビットは、値D313として、EXOR回路306に供給される。
また、入力ポートP203に供給された制御信号D203は、セレクタ301,311、および316に供給される。
セレクタ301,311、および316は、v端子とc端子とを有し、制御信号D203にしたがい、v端子またはc端子のうちのいずれかに供給される値を選択して、後段に出力する。即ち、セレクタ301,311、および316は、制御信号D203がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号D203がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、図22のメッセージ計算部201では、制御信号D203がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号D203がチェックノード演算を指示しているときには、チェックノード演算が行われる。
ここで、図23を参照して、図22のメッセージ計算部201で行われるバリアブルノード演算とチェックノード演算について説明する。
図23左側は、式(1)のバリアブルノード演算を行うバリアブルノードと、式(7)のチェックノード演算を行うチェックノードとを模式的に示している。
バリアブルノードでは、計算しようとしている枝(バリアブルノードに接続している枝のうちのi番目の枝)に対応するメッセージviが、バリアブルノードに繋がっている残りの枝からのメッセージu1,u2,・・・を、式(1)に示したように加算することによって求められる。
また、チェックノードでは、計算しようとしている枝(チェックノードに接続している枝のうちのj番目の枝)に対応するメッセージujが、式(7)に示したように、チェックノードに繋がっている残りの枝からのメッセージv1,v2,・・・を引数xとする非線形関数φ(x)の演算結果を積算し、その結果得られる積算値を引数xとする逆関数φ-1(x)を演算することによって求められる。
いま、ノードに入力されるデータ(入力前のデータ)を入力データというとともに、ノードから出力されるデータ(出力前のデータ)を出力データということとすると、図23左側のバリアブルノードおよびチェックノードでの演算は、図23右側に示す演算と等価である。
即ち、図23右側では、バリアブルノードにおいて、図23左側のバリアブルノードと同一の演算によって、メッセージviが求められている。また、図23右側では、チェックノードにおいて非線形関数φ(x)の演算を行うのではなく、チェックノードに入力される入力データ(入力前のメッセージv1,v2,・・・)に、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、図23右側では、チェックノードにおいて逆関数φ-1(x)の演算を行うのではなく、チェックノードから出力された出力データ(逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値)に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
図22のメッセージ計算部201では、図23右側に示したようにメッセージviとujを求めるバリアブルノード演算とチェックノード演算が行われる。
ここで、図23右側のバリアブルノードについては、バリアブルノードに入力される入力データと、バリアブルノードから出力された出力データのいずれに対しても、非線形関数φ(x)および逆関数φ-1(x)の演算は施されない。一方、チェックノードについては、入力データに、非線形関数φ(x)の演算が施され、出力データに、逆関数φ-1(x)の演算が施される。
このため、バリアブルノード演算とチェックノード演算の両方を行う図22のメッセージ計算部201には、非線形関数φ(x)の演算を行う(演算結果を出力する)LUT300および310と、逆関数φ-1(x)の演算を行う(演算結果を出力する)LUT314とが設けられている。
そして、メッセージ計算部201は、バリアブルノード演算時には、実質的に、バリアブルノードに対する入力データおよび出力データを、LUT300,310、および314をバイパスさせる構成(後述する図24の構成)となって、図23右側でバリアブルノードについて説明した演算を行う。
また、メッセージ計算部201は、チェックノード演算時には、チェックノードに入力される入力データを、LUT300または310を経由させるとともに、チェックノードから出力された出力データを、LUT314を経由させる構成(後述する図25の構成)となって、図23右側でチェックノードについて説明した演算を行う。
図24は、図23右側に示したバリアブルノード演算時の図22のメッセージ計算部201の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ301,311、および316はv端子を選択するが、図24では、図22に図示した構成のうちの、セレクタ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では、図19で説明したメッセージ計算部191と同様の処理が行われる。
即ち、演算器302は、セレクタ301からのメッセージD306(メッセージuj)とレジスタ303に格納されている値D307とを加算することにより、メッセージD306を積算し、その結果得られる積算値を、レジスタ303に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD306が積算された場合、レジスタ303はリセットされる。
検査行列の1列に亘るメッセージD306が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に供給する。
一方、レジスタ305から新たな値D308(j=1からdVまでのΣuj)の出力が開始されると、即ち、レジスタ303に1列分のメッセージD201が積算された積算値(j=1からdVまでのΣuj)が格納された直後、メッセージ計算部201においては、メッセージD201(メッセージuj)と同一のメッセージDD201、即ち、メッセージメモリ104からの2回目のメッセージujが、入力ポートPD201から1つずつ入力され、そのメッセージDD201が、セレクタ311のv端子に供給される。
セレクタ311は、バリアブルノード演算時には、v端子を選択しており、そのv端子に供給されるメッセージ(2回目のメッセージuj)DD201を、演算器312に供給する。
演算器312は、レジスタ305から供給された積算値D308から、入力ポートPD201からセレクタ311を介して供給されたメッセージDD201を減算する。即ち、演算器312では、検査行列の1列に亘る全ての枝からのメッセージD201(メッセージuj)の積算値D308(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージDD201を減算して、減算値(j=1からdv−1までのΣuj)を求め、演算器313に供給する。
演算器313は、入力ポートP101からの受信データD101と、演算器312からの減算値(j=1からdv−1までのΣuj)とを加算し、その結果得られる加算値D317(バリアブルノードメッセージvi)を、セレクタ316のv端子に供給する。
セレクタ316は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器313からの加算値D317を、メッセージD202(メッセージvi)として、出力ポートP202から出力する。
以上のように、セレクタ301および304がv端子を選択しているメッセージ計算部201では、式(1)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP202から出力される。
図25は、図23右側に示したチェックノード演算時の図22のメッセージ計算部201の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ301,311、および316はc端子を選択するが、図25では、図22に図示した構成のうちの、セレクタ301,311、および316がc端子を選択することによってチェックノード演算時に機能しない部分(チェックノード演算に関係がない部分)の図示を省略してある。
チェックノード演算時においては、入力ポートP201には、メッセージメモリ104から1つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviが、順次、メッセージD201として供給される。
そして、LUT300、セレクタ301、演算器302、レジスタ303、セレクタ304、レジスタ305、EXOR回路306、レジスタ307、セレクタ308、レジスタ309、演算器312、LUT314、およびEXOR回路315において、図20で説明したメッセージ計算部191と同様の処理が行われる。
即ち、入力ポートP201に供給されたメッセージD201(メッセージuj)のうちの最上位ビットを除く下位ビット、つまり、メッセージD201の絶対値D303(|vi|)は、LUT300に供給され、最上位ビット、つまりメッセージD201の符号ビットD304は、EXOR回路306に供給される。
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の絶対値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に供給する。
一方、レジスタ305から新たな値D308(i=1からi=dcまでのΣφ(|vi|))の出力が開始されると、即ち、レジスタ305に1行分の演算結果D306が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納された直後、メッセージ計算部201において、メッセージD201(メッセージvi)と同一のメッセージDD201、即ち、メッセージメモリ104からの2回目のメッセージviが、入力ポートPD201から1つずつ入力され、そのメッセージDD201のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD201の絶対値D312(|vi|)が、LUT310に供給されるとともに、最上位ビット、つまりメッセージDD201の符号ビットD313が、EXOR回路315に供給される。
LUT310は、LUT300と同様のLUTで、メッセージDD201の絶対値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|))から、求めたい枝からのメッセージDD201(メッセージ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に供給する。
一方、レジスタ309から新たな値D311(i=1からi=dcまでのΠsign(vi))がEXOR回路315に供給されたとき、即ち、レジスタ307に1行に亘る全ての枝からのメッセージD201の符号ビットD304が乗算された値D310(i=1からi=dcまでのΠsign(vi))が格納されたとき、レジスタ305には、上述したように、1行分の演算結果D306が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納される。
レジスタ305に1行分の演算結果D306が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納されると、上述したように、メッセージ計算部201において、メッセージD201(メッセージvi)と同一のメッセージDD201、即ち、メッセージメモリ104からの2回目のメッセージviが、入力ポートPD201から1つずつ入力され、そのメッセージDD201のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD201の絶対値(|vi|)が、LUT310に供給されるとともに、最上位ビット、つまりメッセージDD201の符号ビットD313が、EXOR回路315に供給される。
EXOR回路315は、レジスタ309から供給された値D311と、入力ポートPD201からのメッセージDD201の符号ビットとの排他的論理和を演算することにより、値D311を、メッセージDD201の符号ビットで除算し、除算結果を除算値D319として出力する。即ち、EXOR回路315は、検査行列の1行に亘る全ての枝からのメッセージD201の符号ビットD304の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージviとしてのメッセージDD201の符号ビットD304(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、および304がc端子を選択しているメッセージ計算部201では、式(7)のチェックノード演算が行われ、その結果得られるメッセージ(チェックノードメッセージ)ujが、出力ポートP202から出力される。
なお、図示しないが、図21の復号装置では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
また、図21の復号装置において、制御部202は、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を行う。
また、図21の復号装置のメッセージメモリ104に対するメッセージの読み書きのタイミングも、図12の復号装置について説明した図16の場合と同様であり、図21の復号装置についても、多少の高速動作が必要となるが、遅延メモリを設ける必要がない分、装置規模を低減することができる。さらに、図21の復号装置では、メッセージ計算部201において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部(演算器302、レジスタ303、セレクタ304、レジスタ305、および演算器312)が共有化されているので、その共有化の分だけ、図12の復号装置よりも規模を削減することができる。
次に、図26は、本発明を適用した復号装置の第3実施の形態の構成例を示すブロック図である。なお、図中、図21の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。即ち、図26の復号装置は、メッセージ計算部201に代えて、メッセージ計算部211が設けられているとともに、制御部202に代えて、制御部212が設けられている他は、図21の復号装置と同様に構成されている。
図26の復号装置では、メッセージ計算部211が、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっており、さらに、遅延メモリを設けずに構成されている。
図26の復号装置では、メッセージメモリ104に記憶されているメッセージが1つずつ読み出され、メッセージ計算部211に供給される。メッセージ計算部211は、メッセージメモリ104からのメッセージを用いて演算が行われ、その演算によって求められたメッセージが、メッセージメモリ104に格納される。図26の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
即ち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(または1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を記憶する。
バリアブルノード演算時には、受信データメモリ105は、制御部212から供給される制御信号にしたがって、記憶している受信データを読み出し、受信データD101として、メッセージ計算部211に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部212から供給される制御信号にしたがい、記憶している同一のメッセージを2回読み出して、1回目に読み出したメッセージをメッセージD601として、メッセージ計算部211に供給し、2回目に読み出したメッセージをメッセージDD601として、メッセージ計算部211に供給する。さらに、制御部212が、バリアブルノード演算を指示する制御信号D603を、メッセージ計算部211に供給する。メッセージ計算部211は、メッセージメモリ104から供給されるメッセージD601とDD601、および受信データメモリ105から供給される受信データD101を用い、制御部212から供給される制御信号D603にしたがって、バリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージを、メッセージD622として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部212から供給される制御信号にしたがい、メッセージ計算部211から供給されるメッセージD622を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部212から供給される制御信号にしたがって、記憶している同一のメッセージを2回読み出して、1回目に読み出したメッセージをメッセージD601として、メッセージ計算部211に供給し、2回目に読み出したメッセージをメッセージDD601として、メッセージ計算部211に供給する。さらに、制御部212が、チェックノード演算を指示する制御信号D603を、メッセージ計算部211に供給する。
メッセージ計算部211は、メッセージメモリ104から供給されるメッセージD601とDD601を用い、制御部212からの制御信号D603にしたがって、チェックノード演算を行い、そのチェックノード演算によって求められたメッセージを、メッセージD622として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部212から供給される制御信号にしたがい、メッセージ計算部211から供給されるメッセージD622を記憶する。
ここで、図26のメッセージ計算部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が求められる。
図26のメッセージ計算部211では、式(9)のバリアブルノード演算と、式(10)のチェックノード演算とが行われる。
図27は、図26のメッセージ計算部211の構成例を示している。
メッセージ計算部211は、図22のメッセージ計算部201と同様に、遅延メモリを設けずに構成されている。また、メッセージ計算部211には、入力ポートP101,P601,PD601,P603と、出力ポートP622が設けられている。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。入力ポートP601には、メッセージメモリ104から2回読み出される同一のメッセージD601およびDD601のうちの1回目に読み出されるメッセージ(1回目のメッセージ)D601が供給(入力)され、入力ポートPD601には、2回目に読み出されるメッセージ(2回目のメッセージ)DD601が供給される。また、入力ポートP603には、制御部212(図26)からの制御信号D603が供給される。
メッセージ計算部211は、入力ポートP601から入力される1回目のメッセージD601と、入力ポートPD601から入力される2回目のメッセージDD601、さらには、必要に応じて、入力ポートP101から入力されるメッセージ(受信データ)を用い、入力ポートP603から入力される制御信号D603にしたがって、式(9)のバリアブルノード演算または式(10)のチェックノード演算を行い、その結果得られるメッセージD622を、出力ポートP622から出力する。
ここで、図28を参照して、図27のメッセージ計算部211で行われるバリアブルノード演算とチェックノード演算について説明する。
図28左側は、式(1)のバリアブルノード演算を行うバリアブルノードと、式(7)のチェックノード演算を行うチェックノードとを模式的に示しており、図23右側と同一の図である。
図28左側では、図23右側で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、チェックノードから出力された出力データ(逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値)に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
このメッセージujは、入力データとして、バリアブルノードに入力され、バリアブルノード演算に用いられる。
従って、図28左側に示したように、チェックノードから出力された出力データxに、逆関数φ-1(x)の演算を施す代わりに、図28右側に示すように、バリアブルノードに入力される入力データxに、逆関数φ-1(x)の演算を施しても、バリアブルノード演算とチェックノード演算を行うことができる。
即ち、図28右側では、式(9)で説明したように、バリアブルノードに入力される入力データに、逆関数φ-1(x)の演算が施され、バリアブルノードにおいて、その逆関数φ-1(x)の演算結果を積算することにより、メッセージviが求められている。また、図28右側では、式(10)で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算が施され、チェックノードにおいて、その非線形関数φ(x)の演算結果が積算されている。さらに、図28右側では、チェックノードにおいて、非線形関数φ(x)の演算結果を積算して得られる積算値が、(逆関数φ-1(x)の演算が施されずに)そのまま出力データu'jとして出力されている。
図27のメッセージ計算部211では、図28右側に示したようにメッセージviとu'jを求める式(9)のバリアブルノード演算と式(10)のチェックノード演算が行われる。
このように、メッセージ計算部211は、図28右側に示したメッセージviとu'jを求める式(9)のバリアブルノード演算と式(10)のチェックノード演算の両方を行うため、メッセージ計算部211(図27)には、チェックノードに入力される入力データxに対して、逆関数φ-1(x)と同一の演算結果が得られる非線形関数φ(x)の演算結果を出力するとともに、バリアブルノードに入力される入力データxに対して、逆関数φ-1(x)の演算結果を出力するLUT600(およびLUT610)が設けられている。
そして、メッセージ計算部211は、入力ポートP603に供給された制御信号D603にしたがって、その実質的な構成を変えて、式(9)のバリアブルノード演算と式(10)のチェックノード演算を選択的に行う。
即ち、メッセージ計算部211(図27)は、セレクタ601,611、および615を有しており、入力ポートP603に供給された制御信号D603は、セレクタ601,611、および615に供給される。
セレクタ601,611、および615は、v端子とc端子とを有し、制御信号D603にしたがい、v端子またはc端子のうちのいずれかに供給される値を選択して、後段に出力する。即ち、セレクタ601,611、および615は、制御信号D603がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号D603がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、図27のメッセージ計算部211では、制御信号D603がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号D603がチェックノード演算を指示しているときには、チェックノード演算が行われる。
即ち、図29は、図28右側に示したバリアブルノード演算時の図27のメッセージ計算部211の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ601,611、および615はv端子を選択するが、図29では、図27に図示した構成のうちの、セレクタ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は、絶対値D603(|u'j|)を引数として、逆関数φ(|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列に亘るメッセージD607が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に供給する。
一方、レジスタ605から新たな値D609(j=1からdVまでのΣuj)の出力が開始されると、即ち、レジスタ603に1列分のメッセージD607が積算された積算値(j=1からdVまでのΣuj)が格納された直後、メッセージ計算部211においては、メッセージD601(メッセージu'j)と同一のメッセージDD601、即ち、メッセージメモリ104からの2回目のメッセージu'jが、入力ポートPD601から1つずつ入力され、そのメッセージDD601(メッセージu'j)のうちの最上位ビットを除く下位ビット、つまり、メッセージDD601の絶対値D613(|u'j|)が、LUT610に供給される。
LUT610は、絶対値D613(|u'j|)を引数として、逆関数φ(|u'j|)の演算を行った演算結果D615(φ-1(|u'j|))を読み出して出力する。LUT600が出力する演算結果D605(φ-1(|u'j|))は、その最上位ビットに、入力ポートPD601に供給されたメッセージDD601(メッセージu'j)のうちの最上位ビット、つまりメッセージDD601の符号ビットD304(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から出力される。
次に、図30は、図28右側に示したチェックノード演算時の図27のメッセージ計算部211の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ601,611、および615はc端子を選択するが、図30では、図27に図示した構成のうちの、セレクタ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に供給する。
一方、レジスタ605から新たな値D609(i=1からi=dcまでのΣφ(|vi|))の出力が開始されると、即ち、レジスタ605に1行分の演算結果D607が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納された直後、メッセージ計算部211において、メッセージD601(メッセージvi)と同一のメッセージDD601、即ち、メッセージメモリ104からの2回目のメッセージvi(1回目のメッセージviと同一のメッセージ)が、入力ポートPD601から1つずつ入力され、そのメッセージDD601のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD601の絶対値D613(|vi|)が、LUT610に供給されるとともに、最上位ビット、つまりメッセージDD601の符号ビットD614が、EXOR回路614に供給される。
LUT610は、メッセージ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))が格納されたとき、レジスタ605には、上述したように、1行分の演算結果D607が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納される。
レジスタ605に1行分の演算結果D607が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納されると、上述したように、メッセージ計算部211において、メッセージD601(メッセージvi)と同一のメッセージDD601、即ち、メッセージメモリ104からの2回目のメッセージviが、入力ポートPD601から1つずつ入力され、そのメッセージDD601のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD601の絶対値(|vi|)が、LUT610に供給されるとともに、最上位ビット、つまりメッセージDD601の符号ビットD614が、EXOR回路614に供給される。
EXOR回路614は、レジスタ609から供給された値D612と、入力ポートPD601からのメッセージDD601の符号ビットとの排他的論理和を演算することにより、値D612を、メッセージDD601の符号ビットで除算し、除算結果を除算値D620として出力する。即ち、EXOR回路614は、検査行列の1行に亘る全ての枝からのメッセージD601の符号ビットD604の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージviとしてのメッセージDD601の符号ビット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から出力される。
なお、図26の復号装置では、復号の最終段において、式(9)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
また、図26の復号装置において、制御部212は、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を行う。
さらに、図26の復号装置のメッセージメモリ104に対するメッセージの読み書きのタイミングも、図12の復号装置について説明した図16の場合と同様であり、図26の復号装置についても、多少の高速動作が必要となるが、遅延メモリを設ける必要がない分、装置規模を低減することができる。さらに、図26の復号装置では、メッセージ計算部211において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部(LUT600、演算器602、レジスタ603、セレクタ604、レジスタ605、LUT610、および演算器612)が共有化されているので、その共有化の分だけ、図12の復号装置よりも規模を削減することができる。
また、図26の復号装置のメッセージ計算部211では、ノードに入力される入力データxの絶対値|x|を引数として、同一の演算結果が得られる逆関数φ-1(x)と非線形関数φ(x)の演算をそれぞれ含む式(9)と式(10)にそれぞれしたがって、バリアブルノード演算とチェックノード演算が行われる。
従って、メッセージ計算部211には、図27に示したように、入力ポートP601から供給される1回目のメッセージに対して、逆関数φ-1(x)および非線形関数φ(x)の演算を行うLUT600と、入力ポートPD601から供給される2回目のメッセージに対して、逆関数φ-1(x)および非線形関数φ(x)の演算を行うLUT610との2つのLUTがあれば済み、図22に示したように、1回目のメッセージに対して非線形関数φ(x)の演算を行うLUT300、2回目のメッセージに対して非線形関数φ(x)の演算を行うLUT310、および逆関数φ-1(x)の演算を行うLUT314の3つのLUTを必要とするメッセージ計算部201よりも、規模を削減することができる。
次に、図31は、本発明を適用した復号装置の第4実施の形態の構成例を示すブロック図である。なお、図中、図21の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。即ち、図31の復号装置は、メッセージ計算部201に代えて、メッセージ計算部221が設けられているとともに、制御部202に代えて、制御部222が設けられている他は、図21の復号装置と同様に構成されている。
図31の復号装置では、メッセージ計算部221が、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっており、さらに、遅延メモリを設けずに構成されている。
図31の復号装置では、メッセージメモリ104に記憶されているメッセージが1つずつ読み出され、メッセージ計算部221に供給される。メッセージ計算部221は、メッセージメモリ104からのメッセージを用いて演算が行われ、その演算によって求められたメッセージが、メッセージメモリ104に格納される。図31の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
即ち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(または1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を記憶する。
バリアブルノード演算時には、受信データメモリ105は、制御部222から供給される制御信号にしたがって、記憶している受信データを読み出し、受信データD101として、メッセージ計算部221に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部222から供給される制御信号にしたがい、記憶している同一のメッセージを2回読み出して、1回目に読み出したメッセージをメッセージD701として、メッセージ計算部221に供給し、2回目に読み出したメッセージをメッセージDD701として、メッセージ計算部221に供給する。さらに、制御部222が、バリアブルノード演算を指示する制御信号D703を、メッセージ計算部221に供給する。メッセージ計算部221は、メッセージメモリ104から供給されるメッセージD701とDD701、および受信データメモリ105から供給される受信データD101を用い、制御部222から供給される制御信号D703にしたがって、バリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージを、メッセージD722として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部222から供給される制御信号にしたがい、メッセージ計算部221から供給されるメッセージD722を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部222から供給される制御信号にしたがって、記憶している同一のメッセージを2回読み出して、1回目に読み出したメッセージをメッセージD701として、メッセージ計算部221に供給し、2回目に読み出したメッセージをメッセージDD701として、メッセージ計算部221に供給する。さらに、制御部222が、チェックノード演算を指示する制御信号D703を、メッセージ計算部221に供給する。
メッセージ計算部221は、メッセージメモリ104から供給されるメッセージD701とDD701を用い、制御部222からの制御信号D703にしたがって、チェックノード演算を行い、そのチェックノード演算によって求められたメッセージを、メッセージD722として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部222から供給される制御信号にしたがい、メッセージ計算部221から供給されるメッセージD722を記憶する。
ここで、図31のメッセージ計算部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))の演算が行われることになる。
図31のメッセージ計算部221では、以上のような式(11)および式(12)のバリアブルノード演算と、式(13)のチェックノード演算とが行われる。
図32は、図31のメッセージ計算部221の構成例を示している。
メッセージ計算部221は、図22のメッセージ計算部201と同様に、遅延メモリを設けずに構成されている。また、メッセージ計算部221には、入力ポートP101,P701,PD701,P703と、出力ポートP722が設けられている。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。入力ポートP701には、メッセージメモリ104から2回読み出される同一のメッセージD701およびDD701のうちの1回目に読み出されるメッセージ(1回目のメッセージ)D701が供給(入力)され、入力ポートPD701には、2回目に読み出されるメッセージ(2回目のメッセージ)DD701が供給される。また、入力ポートP703には、制御部222(図31)からの制御信号D703が供給される。
メッセージ計算部221は、入力ポートP701から入力される1回目のメッセージD701と、入力ポートPD701から入力される2回目のメッセージDD701、さらには、必要に応じて、入力ポートP101から入力されるメッセージ(受信データ)D101を用い、入力ポートP703から入力される制御信号D703にしたがって、式(11)および式(12)のバリアブルノード演算、または式(13)のチェックノード演算を行い、その結果得られるメッセージD722を、出力ポートP722から出力する。
ここで、図33を参照して、図32のメッセージ計算部221で行われるバリアブルノード演算とチェックノード演算について説明する。
図33左側は、式(1)のバリアブルノード演算を行うバリアブルノードと、式(7)のチェックノード演算を行うチェックノードとを模式的に示しており、図23右側と同一の図である。
図33左側では、図23右側で説明したように、チェックノードに入力される入力データに、非線形関数φ(x)の演算を施してから、その演算結果が、チェックノードに入力され、チェックノードにおいて、非線形関数φ(x)の演算結果が積算されている。さらに、チェックノードから出力された出力データ(逆関数φ-1(x)の演算が施される前の、非線形関数φ(x)の演算結果の積算値)に、逆関数φ-1(x)の演算が施され、これにより、メッセージujが求められている。
上述したように、図33左側において、バリアブルノードから出力された出力データとしてのメッセージviは、チェックノードに入力される入力データxとして、非線形関数φ(x)の演算が施されてから、チェックノードに入力される。
従って、図33左側に示したように、チェックノードに入力される入力データxに、非線形関数φ(x)の演算を施す代わりに、図33右側に示すように、バリアブルノードから出力された出力データx(バリアブルノードメッセージvi)に、非線形関数φ(x)の演算を施しても、バリアブルノード演算とチェックノード演算を行うことができる。
即ち、図33右側では、式(11)および式(12)で説明したように、バリアブルノードにおいて、そのバリアブルノードに入力される入力データujが積算されることにより、メッセージviが求められ、出力データとして出力されている。そして、バリアブルノードから出力された(メッセージvi)に、非線形関数φ(x)の演算が施され、メッセージv'iが求められている。このメッセージv'i(メッセージviに、非線形関数φ(x)の演算を施した演算結果)は、チェックノードに入力され、式(13)で説明したように積算されて、出力データとして出力される。そして、その出力データ(メッセージviに、非線形関数φ(x)の演算を施した演算結果の積算値)に、逆関数φ-1(x)の演算が施されることにより、メッセージujが求められる。
図32のメッセージ計算部221では、図33右側に示したようにメッセージv'iとujを求める式(11)および式(12)のバリアブルノード演算と式(13)のチェックノード演算が行われる。
このように、メッセージ計算部221は、図33右側に示したメッセージv'iとujを求める式(11)および式(12)のバリアブルノード演算と式(13)のチェックノード演算の両方を行うため、メッセージ計算部221には、バリアブルノードから出力された出力データxに対して、逆関数φ-1(x)と同一の演算結果が得られる非線形関数φ(x)の演算結果を出力するとともに、チェックノードから出力された出力データxに対して、逆関数φ-1(x)の演算結果を出力するLUT713が設けられている。
そして、メッセージ計算部221は、入力ポートP703に供給された制御信号D703にしたがって、その実質的な構成を変えて、式(11)および式(12)のバリアブルノード演算と式(13)のチェックノード演算を選択的に行う。
即ち、メッセージ計算部221は、セレクタ700,705,712、および715を有しており、入力ポートP703に供給された制御信号D703は、セレクタ700,705,712、および715に供給される。
セレクタ700,705,712、および715は、v端子とc端子とを有し、制御信号D703にしたがい、v端子またはc端子のうちのいずれかに供給される値を選択して、後段に出力する。即ち、セレクタ700,705,712、および715は、制御信号D703がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号D703がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、図32のメッセージ計算部221では、制御信号D703がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号D703がチェックノード演算を指示しているときには、チェックノード演算が行われる。
即ち、図34は、図33右側に示したバリアブルノード演算時の図32のメッセージ計算部221の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ700,705,712、および715はv端子を選択するが、図34では、図32に図示した構成のうちの、セレクタ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端子に供給される。
セレクタ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に供給する。
一方、レジスタ704から新たな値D707(j=1からdVまでのΣuj)の出力が開始されると、即ち、レジスタ702に1列分のメッセージD705(メッセージuj)が積算された積算値(j=1からdVまでのΣuj)が格納された直後、メッセージ計算部221においては、メッセージD701(メッセージuj)と同一のメッセージDD701、即ち、メッセージメモリ104からの2回目のメッセージujが、入力ポートPD701から1つずつ入力され、そのメッセージDD701(メッセージuj)が、セレクタ705のv端子に供給される。
セレクタ705は、上述したように、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給されたメッセージDD701(チェックノードメッセージ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から出力される。
次に、図35は、図33右側に示したチェックノード演算時の図32のメッセージ計算部221の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ700,705,712、および715はc端子を選択するが、図35では、図32に図示した構成のうちの、セレクタ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に供給する。
一方、レジスタ704から新たな値D707(i=1からi=dcまでのΣ|v'i|)の出力が開始されると、即ち、レジスタ704に1行分の絶対値D705(|v'i|)が積算された積算値(i=1からi=dcまでのΣ|v'i|)が格納された直後、メッセージ計算部221において、メッセージD701(メッセージv'i)と同一のメッセージDD701、即ち、メッセージメモリ104からの2回目のメッセージv'i(1回目のメッセージv'iと同一のメッセージ)が、入力ポートPD701から1つずつ入力され、そのメッセージDD701(v'i)のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD701の絶対値D711(|v'i|)が、セレクタ705のc端子に供給されるとともに、最上位ビット、つまりメッセージDD701(v'i)の符号ビットD712(sign(v'i))が、EXOR回路714に供給される。
セレクタ705は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるメッセージDD701(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|)から、求めたい枝からのメッセージDD701(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に格納されている値、即ち、検査行列の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))が格納されたとき、レジスタ704には、上述したように、1行分の絶対値D705(|v'i|)が積算された積算値(i=1からi=dcまでのΣ|v'i|)が格納される。
レジスタ704に1行分の絶対値D705が積算された積算値(i=1からi=dcまでのΣ|v'i|)が格納されると、上述したように、メッセージ計算部221において、メッセージD701(メッセージv'i)と同一のメッセージDD701、即ち、メッセージメモリ104からの2回目のメッセージv'iが、入力ポートPD701から1つずつ入力され、そのメッセージDD701のうちのその最上位ビットを除く下位ビット、つまり、メッセージDD701の絶対値(|v'i|)が、セレクタ705のc端子に供給されるとともに、最上位ビット、つまりメッセージDD701の符号ビットD712(sign(v'i))が、EXOR回路714に供給される。
EXOR回路714は、レジスタ709から供給された値D710と、入力ポートPD701からのメッセージDD701の符号ビットD712との排他的論理和を演算することにより、値D710を、メッセージDD701の符号ビットD712で除算し、除算結果を除算値D720として、セレクタ715のc端子に供給する。即ち、EXOR回路714は、検査行列の1行に亘る全ての枝からのメッセージD701の符号ビットD704の乗算値(i=1からi=dcまでのΠsign(v'i))を、求めたい枝からのメッセージv'iとしてのメッセージDD701の符号ビット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から出力される。
なお、図31の復号装置では、復号の最終段において、式(11)および式(12)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
また、図31の復号装置において、制御部222は、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を行う。
さらに、図31の復号装置のメッセージメモリ104に対するメッセージの読み書きのタイミングも、図12の復号装置について説明した図16の場合と同様であり、図31の復号装置についても、多少の高速動作が必要となるが、遅延メモリを設ける必要がない分、装置規模を低減することができる。さらに、図31の復号装置では、メッセージ計算部221において、バリアブルノードの演算を行う回路と、チェックノードの演算を行う回路との一部(演算器701、レジスタ702、セレクタ703、レジスタ704、演算器710、およびLUT713)が共有化されているので、その共有化の分だけ、図12の復号装置よりも規模を削減することができる。
また、図31の復号装置のメッセージ計算部221では、ノードから出力された出力データxの絶対値|x|を引数として、同一の演算結果が得られる逆関数φ-1(x)と非線形関数φ(x)の演算をそれぞれ含む式(12)と式(13)をそれぞれ用いたバリアブルノード演算とチェックノード演算が行われる。
従って、メッセージ計算部221には、図32に示したように、出力データxの絶対値|x|に対して、逆関数φ-1(x)と非線形関数φ(x)の演算を行うLUT713の1つだけあれば済み、図22に示したLUT300,310、および314の3つのLUTを必要とするメッセージ計算部201、さらには、図27に示したLUT600および610の2つのLUTを必要とするメッセージ計算部211よりも、規模を削減することができる。
次に、図36は、本発明を適用した復号装置の第5実施の形態の構成例を示すブロック図である。なお、図中、図21の復号装置の場合と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。即ち、図36の復号装置は、メッセージ計算部201に代えて、メッセージ計算部231が設けられているとともに、制御部202に代えて、制御部232が設けられている他は、図21の復号装置と同様に構成されている。
図36の復号装置では、メッセージ計算部231が、図21の復号装置のメッセージ計算部201と同様に、バリアブルノード演算を行う回路と、チェックノード演算を行う回路との一部を共有する構成となっている。さらに、図36の復号装置は、バリアブルノード演算とチェックノード演算とを行うメッセージ計算部231が、遅延メモリを設けずに構成されている。
図36の復号装置では、メッセージメモリ104からメッセージ計算部231に、入力メッセージが1つずつ読み出され、メッセージ計算部231において、その入力メッセージを用いて、所望の枝に対応する出力メッセージが計算される。そして、その計算によって求められた出力メッセージが、メッセージメモリ104に格納されていく。図36の復号装置では、以上の処理が繰り返し行われ、フルシリアルの繰り返し復号が行われる。
即ち、受信データメモリ105には、送信されてきたLDPC符号を受信することにより得られる、符号の0(または1)らしさを表す対数尤度比である受信データ(LDPC符号)D100が供給され、受信データメモリ105は、その受信データD100を格納(記憶)する。
バリアブルノード演算時には、受信データメモリ105は、制御部232から供給される制御信号にしたがって、記憶している受信データを読み出し、受信データD101として、メッセージ計算部231に供給する。
また、バリアブルノード演算時には、メッセージメモリ104は、制御部232から供給される制御信号にしたがい、記憶している同一のメッセージを2回読み出して、1回目に読み出したメッセージをメッセージD801として、メッセージ計算部231に供給し、2回目に読み出したメッセージもメッセージD801として、メッセージ計算部231に供給する。メッセージ計算部231は、メッセージメモリ104から2回供給されるメッセージD801、および受信データメモリ105から供給される受信データD101を用い、制御部232から供給される制御信号D203にしたがって、式(1)のバリアブルノード演算を行い、そのバリアブルノード演算の結果得られたメッセージ(バリアブルノードメッセージ)viを、メッセージD802として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部232から供給される制御信号にしたがい、メッセージ計算部231から供給されるメッセージD802(バリアブルノードメッセージvi)を記憶する。
一方、チェックノード演算時には、メッセージメモリ104は、制御部232から供給される制御信号にしたがって、記憶している同一のメッセージ(バリアブルノードメッセージvi)を2回読み出して、1回目に読み出したメッセージをメッセージD801として、メッセージ計算部231に供給し、2回目に読み出したメッセージもメッセージD801として、メッセージ計算部231に供給する。
メッセージ計算部231は、メッセージメモリ104から2回供給されるメッセージD801を用い、制御部232からの制御信号D203にしたがって、式(7)のチェックノード演算を行い、そのチェックノード演算によって求められたメッセージ(チェックノードメッセージ)ujを、メッセージD802として、メッセージメモリ104に供給する。
そして、メッセージメモリ104は、制御部232から供給される制御信号にしたがい、メッセージ計算部231から供給されるメッセージD802(チェックノードメッセージuj)を記憶する。
メッセージメモリ104が記憶したメッセージ計算部231からのメッセージD802、即ち、チェックノードメッセージujは、次のバリアブルノード演算時に、メッセージD801として2回読み出され、メッセージ計算部231に供給される。
図37は、図36のメッセージ計算部231の構成例を示している。
なお、図中、図22のメッセージ計算部201と対応する部分については、同一の符号を付してあり、以下では、その説明は、適宜省略する。
メッセージ計算部231は、図22のメッセージ計算部201と同様に、遅延メモリを設けずに構成されている。
また、図22のメッセージ計算部201は、入力ポートP101およびP203の他に、外部から1回目のメッセージが供給(入力)される入力ポートP201と、2回目のメッセージが供給される入力ポートPD201を有していたが、メッセージ計算部231では、その2つの入力ポートP201とPD201に代えて、1つの入力ポートP801が設けられており、1回目のメッセージおよび2回目のメッセージのいずれも、入力ポートP801から入力されるようになっている。
入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給(入力)される。また、入力ポートP801には、メッセージメモリ104から2回読み出される同一のメッセージD801(1回目のメッセージと2回目のメッセージ)が供給される。
メッセージ計算部231は、入力ポートP801から入力される1回目のメッセージD801と2回目のメッセージD801、さらには、必要に応じて、入力ポートP101から入力されるメッセージ(受信データ)を用い、入力ポートP203から入力される制御信号D203にしたがって、式(1)のバリアブルノード演算または式(7)のチェックノード演算を行い、その結果得られるメッセージD802を、出力ポートP802から出力する。
即ち、入力ポートP101に供給された受信データD101は、演算器313に供給され、入力ポートP801に供給された1回目のメッセージD801は、セレクタ301のv端子に供給される。
さらに、入力ポートP801に供給された1回目のメッセージD801のうちの最上位ビットを除く下位ビット、即ち、メッセージD801の絶対値は、値D303として、LUT300に供給され、1回目のメッセージD801のうちの最上位ビット、即ち、メッセージD801の符号ビットは、値D304として、EXOR回路306に供給されるとともに、値D313として、EXOR回路315に供給される。
また、入力ポートPD801に供給された2回目のメッセージD801も、1回目のメッセージD801と同様に、メッセージ計算部231の各部に供給される。即ち、入力ポートP801に供給された2回目のメッセージD801は、セレクタ301のv端子に供給される。さらに、入力ポートP801に供給された2回目のメッセージD801の絶対値は、値D303として、LUT300に供給され、2回目のメッセージD801の符号ビットは、値D304として、EXOR回路306に供給されるとともに、値D313として、EXOR回路315に供給される。
また、入力ポートP203に供給された制御信号D203は、セレクタ301および316に供給される。
セレクタ301および316は、v端子とc端子とを有し、制御信号D203にしたがい、v端子またはc端子のうちのいずれかに供給される値を選択して、後段に出力する。即ち、セレクタ301および316は、制御信号D203がバリアブルノード演算を指示する制御信号である場合には、v端子に供給される値を選択して後段に出力し、制御信号D203がチェックノード演算を指示する制御信号である場合には、c端子に供給される値を選択して後段に出力する。
その結果、図37のメッセージ計算部231では、図22のメッセージ計算部201と同様に、制御信号D203がバリアブルノード演算を指示しているときには、バリアブルノード演算が行われ、制御信号D203がチェックノード演算を指示しているときには、チェックノード演算が行われる。
図38は、バリアブルノード演算時の図37のメッセージ計算部231の実質的な構成例を示している。
なお、上述したように、バリアブルノード演算時には、セレクタ301および316はv端子を選択するが、図38では、図37に図示した構成のうちの、セレクタ301および316がv端子を選択することによってバリアブルノード演算時に機能しない部分(バリアブルノード演算に関係がない部分)の図示を省略してある。
メッセージ計算部231は、入力ポートP101,P801それぞれから入力されるメッセージを用いて、式(1)のバリアブルノード演算を行い、その結果得られるメッセージD802を、出力ポートP802から出力する。
即ち、入力ポートP101には、受信データメモリ105から読み出された受信データD101が供給される。また、入力ポートP801には、メッセージメモリ104から1つずつ読み出された、検査行列の各行に対応するチェックノードからの1回目のメッセージD801(チェックノードメッセージuj)が供給される。
入力ポートP101に供給された受信データD101は、演算器313に供給される。
また、入力ポートP801に供給されたメッセージD801(メッセージuj)は、セレクタ301のv端子に供給され、バリアブルノード演算時にはv端子を選択しているセレクタ301から、メッセージD306として、演算器302(と演算器312)に供給される。
演算器302は、セレクタ301からのメッセージD306(メッセージuj)とレジスタ303に格納されている値D307とを加算することにより、メッセージD306を積算し、その結果得られる積算値を、レジスタ303に再格納する。なお、検査行列の1列に亘る全ての枝からのメッセージD306が積算された場合、レジスタ303はリセットされる。
検査行列の1列に亘るメッセージD801が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に供給する。
一方、レジスタ305から新たな値D308(j=1からdVまでのΣuj)の出力が開始されると、即ち、レジスタ303に1列分のメッセージD801(uj)が積算された積算値(j=1からdVまでのΣuj)が格納された直後、メッセージ計算部231においては、メッセージD801(メッセージuj)と同一のメッセージD801、即ち、メッセージメモリ104からの2回目のメッセージujが、入力ポートP801から1つずつ入力され、そのメッセージD801が、セレクタ301のv端子に供給される。
セレクタ301は、上述したように、v端子を選択しており、そのv端子に供給されるメッセージ(2回目のメッセージuj)D801を、メッセージD315として、演算器312に供給する(とともに、メッセージD306として演算器302に供給する)。
演算器312は、レジスタ305から供給された積算値D308から、入力ポートP801からセレクタ301を介して供給されたメッセージD315を減算する。即ち、演算器312では、検査行列の1列に亘る全ての枝からのメッセージD801(メッセージuj)の積算値D308(j=1からdvまでのΣuj)から、求めたい枝からのメッセージuj(j=dvのuj)としてのメッセージD315を減算して、減算値(j=1からdv−1までのΣuj)を求め、演算器313に供給する。
演算器313は、入力ポートP101からの受信データD101と、演算器312からの減算値(j=1からdv−1までのΣuj)とを加算し、その結果得られる加算値D317を、セレクタ316のv端子に供給する。
セレクタ316は、バリアブルノード演算時にはv端子を選択しており、そのv端子に供給される演算器313からの加算値D317を、メッセージD802(メッセージvi)として、出力ポートP802から出力する。
以上のように、セレクタ301および304がv端子を選択しているメッセージ計算部231では、式(1)のバリアブルノード演算が行われ、その結果得られるメッセージ(バリアブルノードメッセージ)viが、出力ポートP802から出力される。
図39は、チェックノード演算時の図37のメッセージ計算部231の実質的な構成例を示している。
なお、上述したように、チェックノード演算時には、セレクタ301および316はc端子を選択するが、図39では、図37に図示した構成のうちの、セレクタ301および316がc端子を選択することによってチェックノード演算時に機能しない部分(チェックノード演算に関係がない部分)の図示を省略してある。
チェックノード演算時においては、入力ポートP801には、メッセージメモリ104から1つずつ読み出された、検査行列の各列に対応するバリアブルノードからのバリアブルノードメッセージviが、順次、メッセージD801として供給される。
入力ポートP801に供給されたメッセージD801(メッセージuj)のうちの最上位ビットを除く下位ビット、つまり、メッセージD801の絶対値D303(|vi|)は、LUT300に供給され、最上位ビット、つまりメッセージD801の符号ビットは、符号ビットD304として、EXOR回路306に供給される(とともに、値D313として、EXOR回路315に供給される)。
LUT300は、絶対値D303(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D305(φ(|vi|))を読み出し、セレクタ301のc端子に供給する。
セレクタ301は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT300からの演算結果D305(φ(|vi|))を、演算結果D306(φ(|vi|))として、演算器302に供給する(とともに、演算結果D315(φ(|vi|))として、演算器312に供給する)。
演算器302は、演算結果D306(φ(|vi|))とレジスタ303に格納されている値D307とを加算することにより、演算結果D306を積算し、その結果得られる積算値をレジスタ303に再格納する。なお、検査行列の1行に亘る全ての枝からのメッセージD801の絶対値D303(|vi|)に対する演算結果D306(φ(|vi|))が積算された場合、レジスタ303はリセットされる。
検査行列の1行に亘るメッセージD801が1つずつ読み込まれ、レジスタ303に1行分の演算結果D306が積算された積算値が格納された場合、セレクタ304は、レジスタ303に格納されている値、即ち、検査行列の1行に亘る全ての枝からのメッセージD801(メッセージvi)から求められたφ(|vi|)が積算された積算値D307(i=1からi=dcまでのΣφ(|vi|))を選択し、レジスタ305に出力して格納させる。レジスタ305は、格納している積算値D307を、値D308として、セレクタ304と演算器312に供給する。
レジスタ303に1行分の演算結果D306が積算された積算値が格納される直前までは、セレクタ304は、レジスタ305から供給された値D308を選択し、レジスタ305に出力して再格納させる。即ち、検査行列の1行に亘る全ての枝からのメッセージD801(メッセージvi)から求められたφ(|vi|)が積算されるまで、レジスタ305は、前回積算されたφ(|vi|)の積算値を、セレクタ304と演算器312に供給する。
一方、レジスタ305から新たな値D308(i=1からi=dcまでのΣφ(|vi|))の出力が開始されると、即ち、レジスタ305に1行分の演算結果D306が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納された直後、メッセージ計算部231において、メッセージメモリ104からの2回目のメッセージD801(vi)が、入力ポートP801から1つずつ入力され、そのメッセージD801の絶対値D303(|vi|)が、LUT300に供給され、メッセージD801の符号ビットが、符号ビットD313として、EXOR回路315に供給される(とともに、符号ビットD304として、EXOR回路315に供給される)。
LUT300は、メッセージD801の絶対値D303(|vi|)を引数として、非線形関数φ(|vi|)の演算を行った演算結果D305(φ(|vi|))を読み出し、セレクタ301のc端子に供給する。
セレクタ301は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるLUT300からの演算結果D305(φ(|vi|))を、演算結果D315(φ(|vi|))として、演算器312に供給する(とともに、演算結果D306として、演算器302に供給する)。
演算器312は、レジスタ305から供給された値D308から、セレクタ301から供給された値D315を減算し、その減算結果を、減算値D316としてLUT314に供給する。即ち、演算器312は、検査行列の1行に亘る全ての枝からのメッセージD801(メッセージvi)から求められたφ(|vi|)の積算値D308(i=1からi=dcまでのΣφ(|vi|))から、求めたい枝からのメッセージD801(メッセージ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行に亘る全ての枝からのメッセージD801の符号ビットD304が乗算された場合、レジスタ307はリセットされる。
検査行列の1行に亘る全ての枝からのメッセージD801の符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納された場合、セレクタ308は、レジスタ307に格納されている値、即ち、検査行列の1行に亘る全ての枝からのメッセージD801の符号ビットD304が乗算された値D310(i=1からi=dcまでのΠsign(vi))を選択し、レジスタ309に出力して格納させる。レジスタ309は、格納している値D311を、セレクタ308とEXOR回路315に供給する。
検査行列の1行に亘る全ての枝からのメッセージD801の符号ビットD304が乗算された乗算結果D309(i=1からdcまでのΠsign(vi))がレジスタ307に格納される直前までは、セレクタ308は、レジスタ309から供給された値D311を選択し、レジスタ309に出力して再格納させる。即ち、検査行列の1行に亘る全ての枝からのメッセージD801(メッセージvi)の符号ビットD304が乗算されるまで、レジスタ309は、前回格納した値を、セレクタ308とEXOR回路315に供給する。
一方、レジスタ309から新たな値D311(i=1からi=dcまでのΠsign(vi))がEXOR回路315に供給されたとき、即ち、レジスタ307に1行に亘る全ての枝からのメッセージD801の符号ビットD304が乗算された値D310(i=1からi=dcまでのΠsign(vi))が格納されたとき、レジスタ305には、上述したように、1行分の演算結果D306(φ(|vi|))が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納される。
レジスタ305に1行分の演算結果D306(φ(|vi|))が積算された積算値(i=1からi=dcまでのΣφ(|vi|))が格納されると、上述したように、メッセージ計算部231において、メッセージメモリ104からの2回目のメッセージD801(vi)が、入力ポートP801から1つずつ入力され、その2回目のメッセージD801のD303絶対値(|vi|)が、LUT300に供給され、2回目のメッセージD801の符号ビットが、符号ビットD313として、EXOR回路315に供給される(とともに、符号ビットD304として、EXOR回路306に供給される)。
EXOR回路315は、レジスタ309から供給された値D311と、入力ポートP801からの2回目のメッセージD801の符号ビットD313との排他的論理和を演算することにより、値D311を、符号ビットD313で除算し、除算結果を除算値D319として出力する。即ち、EXOR回路315は、検査行列の1行に亘る全ての枝からのメッセージD801の符号ビットD304の乗算値(i=1からi=dcまでのΠsign(vi))を、求めたい枝からのメッセージviの符号ビットD313(i=dcのsign(vi))で除算して、その除算値(i=1からi=dc−1までのΠsign(vi))を除算値D319として出力する。
そして、メッセージ計算部231では、LUT314から出力された演算結果D318を下位ビットとするとともに、EXOR回路315から出力された除算値D319を最上位ビット(符号ビット)とするビット列D320(メッセージuj)が、セレクタ316のc端子に供給される。
セレクタ316は、チェックノード演算時にはc端子を選択しており、そのc端子に供給されるビット列D320(メッセージuj)を、メッセージD802(メッセージvi)として、出力ポートP802から出力する。
以上のように、セレクタ301および316がc端子を選択しているメッセージ計算部231では、式(7)のチェックノード演算が行われ、その結果得られるメッセージ(チェックノードメッセージ)ujが、出力ポートP802から出力される。
なお、図示しないが、図36の復号装置では、復号の最終段において、式(1)のバリアブルノード演算の代わりに、式(5)の演算が行われ、その演算結果が、最終的な復号結果として出力される。
また、図36の復号装置において、制御部232は、メッセージメモリ104に対するメッセージ(データ)の読み書き制御として、図15のフローチャートで説明したように、図12の復号装置の制御部174と同様の読み書き制御を行う。
但し、図36の復号装置のメッセージメモリ104に対するメッセージの読み書きのタイミングは、メッセージ計算部231が、メッセージメモリ104からのメッセージを入力する入力ポートとして、1つの入力ポートP801しか有しないために、図12の復号装置について説明した図16の場合と異なる。
即ち、図40は、図36の復号装置のメッセージメモリ104に対するメッセージの読み書きのタイミングを示すタイミングチャートである。
図40のタイミングチャートは、図16のタイミングチャートと同様に、メッセージメモリ104を構成するRAM#AとRAM#Bのそれぞれに対する読み書きのタイミングを表している。
図40においては、まず最初に、あるノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの1回目の読み出しが行われる(R1(node#1))。その読み出しの終了後、ノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの2回目の読み出しが行われる(R2(node#1))。このとき、図16では、次のノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの1回目の読み出しが行われる(R1(node#2))が、図36の復号装置のメッセージ計算部231は、(メッセージメモリ104からのメッセージを入力する入力ポートとして)1つの入力ポートP801しか有しないため、図40では、次のノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの1回目の読み出し(R1(node#2))は、まだ行われない。
ノードnode#1からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの2回目の読み出しが終了し、メッセージ計算部231において、ノードnode#1からの出力メッセージが求められると、そのノードnode#1からの出力メッセージがRAM#Aに書き込まれる(W(node#1))のと同時に、ノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの1回目の読み出しが行われる(R1(node#2))。
ノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの1回目の読み出しが終了すると、続けて、ノードnode#2からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Bからの1回目の読み出しが行われ(R2(node#2))、メッセージ計算部231において、ノードnode#2からの出力メッセージが求められる、そして、ノードnode#2からの出力メッセージが求められると、そのノードnode#2からの出力メッセージがRAM#Bに書き込まれる(W(node#2))のと同時に、次のノードnode#3からの出力メッセージを求めるのに必要な入力メッセージの、RAM#Aからの1回目の読み出しが行われる(R1(node#3))。
以下、同様にして、メッセージメモリ104を構成するRAM#AとRAM#Bのそれぞれに対するメッセージの読み書きが行われていく。
図16と図40とを比較してわかるように、図36の復号装置では、出力メッセージを求めるのに、図16の場合よりも時間を要することになるが、それでも、遅延メモリなしで復号を行うことができるので、復号装置の規模を削減することができる。
なお、メッセージ計算部231(図37)のように、メッセージメモリ104からの入力メッセージが入力される入力ポートを1ポートとする構成は、図12のメッセージ計算部171のバリアブルノード計算器172(図13)およびチェックノード計算器173(図14)や、図22のメッセージ計算部201、図27のメッセージ計算部211、図32のメッセージ計算部221でも採用することが可能である。
また、メッセージメモリ104は、RAM#AとRAM#Bとの2バンクで構成する他、3以上のRAMで3バンク以上に構成することも可能である。
次に、制御部174(図12)等が行う図15に示したメッセージメモリ104に対する読み書き制御の処理は、専用のハードウェアにより行うこともできるし、ソフトウェアにより行うこともできる。一連の処理をソフトウェアによって行う場合には、そのソフトウェアを構成するプログラムが、マイクロコンピュータ(いわゆるマイコン)等のコンピュータにインストールされる。
そこで、図41は、上述した一連の処理を実行するプログラムがインストールされるコンピュータの一実施の形態の構成例を示している。
プログラムは、コンピュータに内蔵されている記録媒体としての不揮発性メモリ905やROM903に予め記録しておくことができる。
あるいはまた、プログラムは、フレキシブルディスク、CD-ROM(Compact Disc Read Only Memory),MO(Magneto Optical)ディスク,DVD(Digital Versatile Disc)、磁気ディスク、半導体メモリなどのリムーバブル記録媒体に、一時的あるいは永続的に格納(記録)しておくことができる。
なお、プログラムは、上述したようなリムーバブル記録媒体911から、あるいはネットワークを経由してコンピュータにインストールすることができる。
コンピュータは、CPU(Central Processing Unit)902を内蔵している。CPU902には、バス901を介して、入出力インタフェース906が接続されており、CPU902は、ROM(Read Only Memory)903や不揮発性メモリ905にインストールされたプログラムを、RAM(Random Access Memory)904にロードして実行する。これにより、CPU902は、入出力インタフェース906を介して、メッセージメモリ104に対する読み書き制御を行う。
ここで、本明細書において、コンピュータに各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいは個別に実行される処理(例えば、並列処理あるいはオブジェクトによる処理)も含むものである。
また、プログラムは、1のコンピュータにより処理されるものであっても良いし、複数のコンピュータによって分散処理されるものであっても良い。
なお、本発明の実施の形態は、上述した実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲において種々の変更が可能である。
104 メッセージメモリ, 105 受信データメモリ, 121 LUT, 122 演算器, 123 レジスタ, 124 セレクタ, 125 レジスタ, 126 演算器, 128 LUT, 129 EXOR回路, 130 レジスタ, 131 セレクタ, 132 レジスタ, 134 EXOR回路, 135 LUT, 151 演算器, 152 レジスタ, 153 セレクタ, 154 レジスタ, 156,157 演算器, 171 メッセージ計算部, 172 バリアブルノード計算器, 173 チェックノード計算器, 174 制御部, 191 メッセージ計算部, 192 制御部, 201 メッセージ計算部, 202 制御部, 211 メッセージ計算部, 212 制御部, 221 メッセージ計算部, 222 制御部, 231 メッセージ計算部, 232 制御部, 300 LUT, 301 セレクタ, 302 演算器, 303 レジスタ, 304 セレクタ, 305 レジスタ, 306 EXOR回路, 307 レジスタ, 308 セレクタ, 309 レジスタ, 310 LUT, 311 セレクタ, 312,313 演算器, 214 LUT, 315 EXOR回路, 316 セレクタ, 320 FIFOメモリ, 600 LUT, 601 セレクタ, 602 演算器, 603 レジスタ, 604 セレクタ, 605 レジスタ, 606 EXOR回路, 607 レジスタ, 608 セレクタ, 609 レジスタ, 610 LUT, 611 セレクタ, 612,613 演算器, 614 EXOR回路, 615 セレクタ, 700 セレクタ, 701 演算器, 702 レジスタ, 703 セレクタ, 704 レジスタ, 705 セレクタ, 706 EXOR回路, 707 レジスタ, 708 セレクタ, 709 レジスタ, 710,711 演算器, 712 セレクタ, 713 LUT, 714 EXOR回路, 715 セレクタ, 901 バス, 902 CPU, 903 ROM, 904 RAM, 905 不揮発性メモリ, 906 入出力インタフェース