Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ldpcDecode

バイナリ LDPC 符号の復号化

R2021b 以降

説明

関数 ldpcDecode は、4 つのアルゴリズムのうちのいずれかを使用して入力コードワードを復号化します。詳細については、アルゴリズムを参照してください。LDPC 符号は、スパース パリティ チェック行列およびシャノン限界に近いパフォーマンスを達成できる長いブロック長をもつ、線形の誤り制御符号です。

[y,actualnumiter,finalparitychecks] = ldpcDecode(llr,decodercfg,maxnumiter) は、入力 ldpcDecoderConfig 構成オブジェクト decodercfg で指定された LDPC 行列を使用して、入力対数尤度比 (LLR) llr を復号化します。正の LLR は、対応するビットがゼロである可能性が高いことを示します。入力 maxnumiter で指定された反復の最大数以内ですべてのパリティ チェックが満たされると、復号化は終了します。LDPC 符号は、スパース パリティ チェック行列およびシャノン限界に近いパフォーマンスを達成できる長いブロック長をもつ、線形の誤り制御符号です。

[y,actualnumiter,finalparitychecks] = ldpcDecode(llr,decodercfg,maxnumiter,Name,Value) は、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、DecisionType='soft' は、軟判定復号化を指定し、LLR を出力します。

すべて折りたたむ

IEEE® 802.11 で指定された符号化率 3/4 の LDPC 符号を構成するために、プロトタイプ行列とブロック サイズのパラメーターを初期化します。関数 ldpcQuasiCyclicMatrix を使用して、パリティチェック行列を作成します。

P = [
    16 17 22 24  9  3 14 -1  4  2  7 -1 26 -1  2 -1 21 -1  1  0 -1 -1 -1 -1
    25 12 12  3  3 26  6 21 -1 15 22 -1 15 -1  4 -1 -1 16 -1  0  0 -1 -1 -1
    25 18 26 16 22 23  9 -1  0 -1  4 -1  4 -1  8 23 11 -1 -1 -1  0  0 -1 -1
     9  7  0  1 17 -1 -1  7  3 -1  3 23 -1 16 -1 -1 21 -1  0 -1 -1  0  0 -1
    24  5 26  7  1 -1 -1 15 24 15 -1  8 -1 13 -1 13 -1 11 -1 -1 -1 -1  0  0
     2  2 19 14 24  1 15 19 -1 21 -1  2 -1 24 -1  3 -1  2  1 -1 -1 -1 -1  0
    ];
blockSize = 27;
pcmatrix = ldpcQuasiCyclicMatrix(blockSize,P);

LDPC 符号化器と LDPC 復号化器の構成オブジェクトを作成し、それらのプロパティを表示します。

cfgLDPCEnc = ldpcEncoderConfig(pcmatrix)
cfgLDPCEnc = 
  ldpcEncoderConfig with properties:

     ParityCheckMatrix: [162x648 logical]

   Read-only properties:
           BlockLength: 648
    NumInformationBits: 486
    NumParityCheckBits: 162
              CodeRate: 0.7500

cfgLDPCDec = ldpcDecoderConfig(pcmatrix)
cfgLDPCDec = 
  ldpcDecoderConfig with properties:

     ParityCheckMatrix: [162x648 logical]
             Algorithm: 'bp'

   Read-only properties:
           BlockLength: 648
    NumInformationBits: 486
    NumParityCheckBits: 162
              CodeRate: 0.7500

LDPC 符号化され、QPSK 変調されたビット ストリームを AWGN チャネル経由で送信します。信号を復調し、受信コードワードを復号化してから、ビット エラーをカウントします。入れ子の for ループを使用し、複数の SNR 設定、および送信データの LDPC 前方誤り訂正 (FEC) 符号化がある場合とない場合のフレームについて処理します。

M = 4;
maxnumiter = 10;
snr = [3 6 20];
numframes = 10;
qpskmod = comm.PSKModulator(M,'BitInput',true);
qpskmod2 = comm.PSKModulator(M);

ber = comm.ErrorRate;
ber2 = comm.ErrorRate;

for ii = 1:length(snr)
    qpskdemod = comm.PSKDemodulator(M,'BitOutput',true, ...
        'DecisionMethod','Approximate log-likelihood ratio', ...
        'Variance',1/10^(snr(ii)/10));
    qpskdemod2 = comm.PSKDemodulator(M);
    for counter = 1:numframes
        data = randi([0 1],cfgLDPCEnc.NumInformationBits,1,'int8');
        % Transmit and receive with LDPC coding
        encodedData = ldpcEncode(data,cfgLDPCEnc);
        modSignal = qpskmod(encodedData);
        receivedSignal = awgn(modSignal,snr(ii));
        demodSignal = qpskdemod(receivedSignal);
        receivedBits = ldpcDecode(demodSignal,cfgLDPCDec,maxnumiter);
        errStats = ber(data,receivedBits);
        % Transmit and receive with no LDPC coding
        noCoding = qpskmod2(data);
        rxNoCoding = awgn(noCoding,snr(ii));
        rxBitsNoCoding = qpskdemod2(rxNoCoding);
        errStatsNoCoding = ber2(data,int8(rxBitsNoCoding));
    end
    fprintf(['SNR = %2d\n   Coded: Error rate = %1.2f, ' ...
        'Number of errors = %d\n'], ...
        snr(ii),errStats(1),errStats(2))
    fprintf(['Noncoded: Error rate = %1.2f, ' ...
        'Number of errors = %d\n'], ...
        errStatsNoCoding(1),errStatsNoCoding(2))
    reset(ber);
    reset(ber2);
end
SNR =  3
   Coded: Error rate = 0.07, Number of errors = 335
Noncoded: Error rate = 0.15, Number of errors = 714
SNR =  6
   Coded: Error rate = 0.00, Number of errors = 0
Noncoded: Error rate = 0.04, Number of errors = 196
SNR = 20
   Coded: Error rate = 0.00, Number of errors = 0
Noncoded: Error rate = 0.00, Number of errors = 0

入力引数

すべて折りたたむ

対数尤度比。入力 decodercfgBlockLength プロパティと等しい行数をもつ行列として指定します。llr の各列は、1 つのコードワードに対応します。関数は各列を個別に復号化します。正の LLR は、対応するビットがゼロである可能性が高いことを示します。

データ型: single | double

LDPC 復号化器の構成。ldpcDecoderConfig オブジェクトとして指定します。

復号化反復の最大数。正のスカラーとして指定します。

データ型: double

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: Termination='max'

出力形式。以下のいずれかの値として指定します。

  • 'info' — 復号化された情報ビットのみを出力します。関数が出力する行数は、入力 decodercfgNumInformationBits プロパティと同じになります。

  • 'whole' — 情報ビットとパリティチェック ビットを含む、復号化された LDPC コードワード ビットすべてを出力します。関数が出力する行数は、入力 decodercfgBlockLength プロパティと同じになります。

データ型: char | string

LDPC 復号化の判定タイプ。次のいずれかの値として指定します。

  • 'hard' — 硬判定復号化を実行し、復号化されたビットを int8 データ型の値として出力します。

  • 'soft' — 軟判定復号化を実行し、入力と同じデータ型で LLR を出力します。

データ型: char | string

正規化された min-sum 復号化アルゴリズムのスケーリング係数。範囲 (0, 1] のスカラーとして指定します。詳細については、正規化された min-sum 復号化を参照してください。

依存関係

このプロパティを有効にするには、入力 decodercfgAlgorithm プロパティを 'norm-min-sum' に設定します。

データ型: double

min-sum 復号化アルゴリズムのオフセット。スカラーとして指定します。詳細については、オフセット min-sum 復号化を参照してください。

依存関係

このプロパティを有効にするには、入力 decodercfgAlgorithm プロパティを 'offset-min-sum' に設定します。

データ型: double

復号化終了基準。次のいずれかの値として指定します。

  • 'early' — 入力 maxnumiter で指定された反復の最大数以内ですべてのパリティ チェックが満たされると、復号化の反復を終了します。

  • 'max' — 最大数 maxnumiter の反復が完了したときに復号化を終了します。

データ型: char | string

マルチスレッド実行の有効化。logical 1 (true) または logical 0 (false) として指定します。インタープリター モードで MATLAB® を実行し、この引数を true に設定すると、関数は複数のスレッドで復号化アルゴリズムを実行します。

ヒント

大きなパリティチェック行列では、マルチスレッド実行により、LDPC 復号化の処理時間が大幅に短縮されます。

依存関係

このプロパティを有効にするには、MATLAB をインタープリター モードで実行します。

出力引数

すべて折りたたむ

復号化されたコードワード。llr(1:K,:) の復号化されたビットを表す K 行の行列として返されます。K は、入力 decodercfgNumInformationBits プロパティと同じです。復号化操作の場合、llr の各列は 1 つのコードワードに対応します。関数は各列を個別に復号化します。名前と値の引数 'OutputFormat' は、出力に復号化された情報ビットを含める (既定) か、LDPC コードワード ビット全体を含めるかを指定します。名前と値の引数 'DecisionType' は、復号化判定タイプとこの出力のデータ型を指定して判定します。

詳細については、アルゴリズムを参照してください。

データ型: int8 | double | single

復号化の実際の反復回数。行ベクトルとして返されます。コードワードのすべてのパリティ チェックが満たされると、反復の最大数 maxnumiter に達する前でも復号化が停止することがあります。この出力は、関数がコードワードに対して実行した実際の反復回数から成る行ベクトルです。

データ型: double

各コードワードに対する最終パリティ チェック。入力 decodercfgParityCheckBits プロパティと等しい行数をもつ行列として返されます。復号化操作の場合、この出力の各列は、対応するコードワードに対する最終パリティ チェックになります。

データ型: double

アルゴリズム

すべて折りたたむ

以下のメッセージ伝達アルゴリズムのいずれかを使用する LDPC 復号化。

確率伝播復号化

確率伝播アルゴリズムの実装は、Gallager によって提示された復号化アルゴリズムに基づいています [2]。

Block diagram of the belief propagation algorithm.

LDPC 符号化されて送信されたコードワード c = c0、c1、...、cn-1 に対して、LDPC 復号化器への入力は、対数尤度比 (LLR) の値 L(ci)=log(Pr(ci=0|channel output for ci)Pr(ci=1|channel output for ci)) になります。

各反復で、アルゴリズムの主なコンポーネントが以下の式に基づいて更新されます。

L(rji)=2atanh(iVj\itanh(12L(qij))),

L(qij)=L(ci)+jCi\jL(rji) (最初の反復の前に L(qij)=L(ci) として初期化される)、および

L(Qi)=L(ci)+jCiL(rji).

それぞれの反復の最後で、L(Qi) には、送信ビット ci に対する LLR 値の更新された推定値が含まれます。値 L(Qi) は ci の軟判定出力です。L(Qi) < 0 の場合、ci の硬判定出力は 1 です。それ以外の場合、ci の硬判定出力は 0 です。

すべてのパリティ チェックが満たされた場合に停止するように復号化が設定されている場合、アルゴリズムは、各反復の終わりにパリティ チェック式 (H c' = 0) を検証します。すべてのパリティ チェックが満たされた場合、または最大反復回数に到達した場合、復号化は停止します。

インデックス集合 Ci\jVj\i は、パリティ チェック行列 (PCM) に基づいています。インデックス集合 Ci と Vj はそれぞれ、PCM の列 i と行 j のすべての非ゼロ要素に対応します。

次の図は、与えられた PCM の i = 5 と j = 3 に対するインデックス集合の計算を示しています。

Computation of C and V index sets for a given parity-check matrix.

無限数がアルゴリズム式で使用されないように、atanh(1) は 19.07 に、atanh(–1) は –19.07 に設定されます。有限値で演算を行うために、MATLAB は tanh(19.07) に対して 1 を、tanh(-19.07) に対して –1 を返します。

階層的確率伝播復号化

階層的確率伝播アルゴリズムの実装は、Hocevar [3] の II.A 節にある復号化アルゴリズムに基づいています。復号化ループは、PCM の行 (層) のサブセットを反復します。レイヤー内の各行 m と各ビット インデックス j について、実装ではアルゴリズムの主なコンポーネントが以下の式に基づいて更新されます。

(1) L(qmj)=L(qj)Rmj,

(2) Amj=n  N(m)njψ(L(qmn)),

(3) smj=n  N(m)njsign(L(qmn)),

(4) Rmj=smjψ(Amj)、および

(5) L(qj)=L(qmj)+Rmj.

各レイヤーについて、復号化の式 (5) が、現在の LLR 入力 L(qmj) と前のレイヤーの更新 Rmj から得られる結合された入力に対して適用されます。

ノードのサブセットのみがレイヤーで更新されるため、階層的確率伝播アルゴリズムは、確率伝播アルゴリズムと比較して高速です。階層的確率伝播アルゴリズムを使用すれば、確率伝播復号化が達成するのと同じエラー レートを達成するために使用する復号化反復回数が半分で済みます。

正規化された min-sum 復号化

正規化された min-sum 復号化アルゴリズムの実装は、式 (2) を次のように置き換えた階層的確率伝播アルゴリズムに従います。

Amj=minn  N(m)nj(|L(qmn) |α),

ここで、α は、関数 ldpcDecode への入力引数 MinSumScalingFactor で指定される、範囲 (0, 1] のスケーリング係数です。この式は、Chen [4] にある式 (4) を応用したものです。

オフセット min-sum 復号化

オフセット min-sum 復号化アルゴリズムの実装は、式 (2) を次のように置き換えた階層的確率伝播アルゴリズムに従います。

Amj =  max(minn  N(m)nj (|L(qmn)| β), 0),

ここで、β は、0 以上のオフセットで、関数 ldpcDecode への入力引数 MinSumOffset で指定されます。この式は、Chen [4] にある式 (5) を応用したものです。

参照

[1] IEEE Std 802.11™-2020 (Revision of IEEE Std 802.11-2016). "Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications." IEEE Standard for Information technology — Telecommunications and information exchange between systems. Local and metropolitan area networks — Specific requirements.

[2] Gallager, Robert G. Low-Density Parity-Check Codes. Cambridge, MA: MIT Press, 1963.

[3] Hocevar, D.E. "A reduced complexity decoder architecture via layered decoding of LDPC codes." In IEEE Workshop on Signal Processing Systems, 2004. SIPS 2004. doi: 10.1109/SIPS.2004.1363033

[4] Chen, Jinghu, R.M. Tanner, C. Jones, and Yan Li. "Improved min-sum decoding algorithms for irregular LDPC codes." In Proceedings. International Symposium on Information Theory, 2005. ISIT 2005. doi: 10.1109/ISIT.2005.1523374

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2021b で導入