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) は、追加の名前と値の引数を指定します。たとえば、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;

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

for ii = 1:length(snr)
    for counter = 1:numframes
        data = randi([0 1],cfgLDPCEnc.NumInformationBits,1,'int8');
        % Transmit and receive with LDPC coding
        encodedData = ldpcEncode(data,cfgLDPCEnc);
        modSignal = pskmod(encodedData,M,InputType='bit');
        [rxsig, noisevar] = awgn(modSignal,snr(ii));
        demodSignal = pskdemod(rxsig,M, ...
            OutputType='approxllr', ...
            NoiseVariance=noisevar);
        rxbits = ldpcDecode(demodSignal,cfgLDPCDec,maxnumiter);
        errStats = ber(data,rxbits);
        % Transmit and receive with no LDPC coding
        noCoding = pskmod(data,M,InputType='bit');
        rxNoCoding = awgn(noCoding,snr(ii));
        rxBitsNoCoding = pskdemod(rxNoCoding,M,OutputType='bit');
        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 = 355
Noncoded: Error rate = 0.08, Number of errors = 384
SNR =  6
   Coded: Error rate = 0.00, Number of errors = 0
Noncoded: Error rate = 0.02, Number of errors = 98
SNR = 20
   Coded: Error rate = 0.00, Number of errors = 0
Noncoded: Error rate = 0.00, Number of errors = 0

LDPC 符号化され、QPSK 変調されたビット ストリームを AWGN チャネル経由で送信します。AWGN を追加した後、受信信号を復調し、関数 ldpcDecode を使用して gpuArray の入力信号を復号化します。確率伝播復号化アルゴリズムおよび正規化 min-sum 復号化アルゴリズムの誤り統計を計算します。GPU 処理の詳細については、GPU を使用したシミュレーションの高速化を参照してください。

LDPC 符号化器構成オブジェクトおよび LDPC 復号化器構成オブジェクトを作成します。シミュレーション変数を定義します。

% Use ldpcQuasiCyclicMatrix to create a parity-check matrix
load("LDPCExamplePrototypeMatrix.mat","P"); % A prototype matrix from the 5G standard
blockSize = 384;
H = ldpcQuasiCyclicMatrix(blockSize, P);
encoderCfg = ldpcEncoderConfig(H);
decoderCfg1 = ldpcDecoderConfig(encoderCfg); % The default algorithm is "bp"
decoderCfg2 = ldpcDecoderConfig(encoderCfg,"norm-min-sum");

M = 4; % Modulation order (QPSK)
snr = [-2 -1.5 -1];
numFramesPerCall = 50;
numCalls = 40;
maxNumIter = 20;
s = rng(1235); % Fix random seed
errRate = zeros(length(snr),2);

各 SNR 設定に対して、確率伝播復号化アルゴリズムおよび正規化 min-sum 復号化アルゴリズムの誤り統計を計算します。

for ii = 1:length(snr)
    ttlErr = [0 0];
    noiseVariance = 1/10^(snr(ii)/10);
    for counter = 1:numCalls
        data = logical(randi([0 1],encoderCfg.NumInformationBits,numFramesPerCall));

        % Transmit and receive LDPC coded signal data
        encData = ldpcEncode(data,encoderCfg);
        modSig = pskmod(encData,M,pi/4,'InputType','bit');
        rxSig = awgn(modSig,snr(ii),'measured');
        demodSig = gpuArray(pskdemod(rxSig,M,pi/4,...
            'OutputType','approxllr','NoiseVariance',noiseVariance));

        % Decode and update number of bit errors

        % Using bp
        rxBits1 = ldpcDecode(demodSig,decoderCfg1,maxNumIter);
        numErr1 = biterr(data,rxBits1);

        % Using norm-min-sum
        rxBits2 = ldpcDecode(demodSig,decoderCfg2,maxNumIter);
        numErr2 = biterr(data,rxBits2);

        ttlErr = ttlErr + [numErr1 numErr2];
    end
    ttlBits = numCalls*numel(rxBits1);
    
    errRate(ii,:) = ttlErr/ttlBits;
end

ビット エラー レートの比較

誤り統計をプロットします。確率伝播アルゴリズムのビット エラー レートは、正規化 min-sum アルゴリズムよりもわずかに低くなることが予想されます。

plot(snr,errRate,'-x')
grid on
legend('bp','norm-min-sum')
xlabel('SNR (dB)')
ylabel('BER')

速度の比較

4 つの場合について実行時間を比較します。既定では、ldpcDecode はすべてのパリティ チェックが満たされた後に復号化を終了します。

% Use belief propagation algorithm on CPU, without multithreading
demodSigCPU = gather(demodSig);
tic
[rxBitsCPU1,actualNumIterCPU1,finalParityChecksCPU1] = ...
    ldpcDecode(demodSigCPU,decoderCfg1,maxNumIter,'Multithreaded',false);
toc
Elapsed time is 5.517192 seconds.
% Use belief propagation algorithm on CPU, with multithreading
tic
[rxBitsCPU2,actualNumIterCPU2,finalParityChecksCPU2] = ...
    ldpcDecode(demodSigCPU,decoderCfg1,maxNumIter);
toc
Elapsed time is 1.020460 seconds.
% Use belief propagation algorithm on GPU
tic
[rxBits1,actualNumIter1,finalParityChecks1] = ...
    ldpcDecode(demodSig,decoderCfg1,maxNumIter);
toc
Elapsed time is 0.451658 seconds.
% Use normalized min-sum algorithm on GPU
tic
[rxBits2,actualNumIter2,finalParityChecks2] = ...
    ldpcDecode(demodSig,decoderCfg2,maxNumIter);
toc
Elapsed time is 0.074360 seconds.

オプションの復号化器出力の確認

SNR が十分高い場合は、通常、確率伝播アルゴリズムよりも正規化 min-sum アルゴリズムの方が少ない反復回数で済むことを確認します。

length(find(actualNumIter2 < actualNumIter1))
ans = 50
length(find(actualNumIter2 == actualNumIter1))
ans = 0

指定した最大反復回数よりも実際に実行された反復回数の方が少ない場合、最終的なパリティ チェックの結果がすべてゼロになることを確認します。

nnz(finalParityChecks1(:,actualNumIter1<maxNumIter))
ans = 0
nnz(finalParityChecks2(:,actualNumIter2<maxNumIter))
ans = 0

乱数発生器の状態を復元します。

rng(s);

入力引数

すべて折りたたむ

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

データ型: double | single

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

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

データ型: double

名前と値の引数

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

例: Termination='max'

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

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

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

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

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

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

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

依存関係

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

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

依存関係

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

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

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

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

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

ヒント

大きなパリティチェック行列では、マルチスレッド実行により、LDPC 復号化の処理時間が大幅に短縮されます。MATLAB のインタープリター型モードが Multithreaded=true の場合、CPU 上で複数のスレッドを使用して復号化アルゴリズムが実行されます。入力 llrgpuArray (Parallel Computing Toolbox) オブジェクトの場合、この名前と値の引数は無視されます。

依存関係

このプロパティを有効にするには、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 で導入

すべて展開する