メインコンテンツ

ldpcDecode

バイナリ LDPC 符号の復号化

R2021b 以降

説明

[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: [162×648 logical]

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

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

     ParityCheckMatrix: [162×648 logical]
             Algorithm: 'bp'

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

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

M = 64;
maxnumiter = 10;
snr = [0.5 1 1.5 2];
numframes = 20000;

for ii = 1:length(snr)
    data = randi([0 1],cfgLDPCEnc.NumInformationBits,numframes,'int8');

    % Transmit and receive with LDPC coding
    encodedData = ldpcEncode(data,cfgLDPCEnc);
    modSignal = qammod(encodedData,M,InputType='bit');
    [rxsig, noisevar] = awgn(modSignal,snr(ii));
    llrOut = qamdemod(rxsig,M, ...
        OutputType='approxllr', ... % Or use 'llr' for exact but slower LLR calculation
        NoiseVariance=noisevar);
    rxbits = ldpcDecode(llrOut,cfgLDPCDec,maxnumiter);
    fprintf(['SNR = %2.1f\n   Coded: Error rate = %1.6f, ' ...
        'Number of errors = %d\n'], ...
        snr(ii),nnz(data~=rxbits)/numel(data),nnz(data~=rxbits));

    % Transmit and receive with no LDPC coding
    noCoding = qammod(data,M,InputType='bit');
    rxNoCoding = awgn(noCoding,snr(ii));
    rxBitsNoCoding = qamdemod(rxNoCoding,M,OutputType='bit');

    fprintf(['Noncoded: Error rate = %1.6f, ' ...
        'Number of errors = %d\n\n'], ...
        nnz(data~=rxBitsNoCoding)/numel(data),nnz(data~=rxBitsNoCoding))
end
SNR = 0.5
   Coded: Error rate = 0.000441, Number of errors = 4282
Noncoded: Error rate = 0.039045, Number of errors = 379515
SNR = 1.0
   Coded: Error rate = 0.000062, Number of errors = 604
Noncoded: Error rate = 0.032813, Number of errors = 318941
SNR = 1.5
   Coded: Error rate = 0.000003, Number of errors = 27
Noncoded: Error rate = 0.027001, Number of errors = 262450
SNR = 2.0
   Coded: Error rate = 0.000000, Number of errors = 0
Noncoded: Error rate = 0.021778, Number of errors = 211686

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: [162×648 logical]

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

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

     ParityCheckMatrix: [162×648 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

GPU を使用して、LDPC 符号化、PSK 変調、AWGN チャネル モデリング、PSK 復調、LDPC 復号化、およびビット エラー レートの計算を高速化します。この例では、確率伝播復号化アルゴリズムおよび正規化 min-sum 復号化アルゴリズムの誤り統計を計算します。

LDPC 構成オブジェクトの作成

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);

ビット エラー レートの計算

gpuArray (Parallel Computing Toolbox)オブジェクトにランダム ビットを生成し、そのデータを ldpcEncodepskmodawgnpskdemodldpcDecode、および biterr 各関数に順に渡します。各 SNR 設定に対して、確率伝播復号化アルゴリズムおよび正規化 min-sum 復号化アルゴリズムの誤り統計を計算します。

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

        % Transmit and receive LDPC coded signal data
        encData = ldpcEncode(data,encoderCfg);
        modSig = pskmod(encData,M,pi/4,'InputType','bit');
        rxSig = awgn(modSig,snr(ii)); % Signal power = 0 dBW
        demodSig = 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')

Figure contains an axes object. The axes object with xlabel SNR (dB), ylabel BER contains 2 objects of type line. These objects represent bp, norm-min-sum.

速度の比較

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 4.270400 seconds.
% Use belief propagation algorithm on CPU, with multithreading
tic
[rxBitsCPU2,actualNumIterCPU2,finalParityChecksCPU2] = ...
    ldpcDecode(demodSigCPU,decoderCfg1,maxNumIter);
toc
Elapsed time is 1.069500 seconds.
% Use belief propagation algorithm on GPU
tic
[rxBits1,actualNumIter1,finalParityChecks1] = ...
    ldpcDecode(demodSig,decoderCfg1,maxNumIter);
toc
Elapsed time is 2.117112 seconds.
% Use normalized min-sum algorithm on GPU
tic
[rxBits2,actualNumIter2,finalParityChecks2] = ...
    ldpcDecode(demodSig,decoderCfg2,maxNumIter);
toc
Elapsed time is 0.615488 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 の反復が完了したときに復号化を終了します。

CPU 上でのマルチスレッド実行の有効化。logical 1 (true) または logical 0 (false) として指定します。インタープリター モードで MATLAB® を実行し、この引数を true に設定すると、関数は複数のスレッドで復号化アルゴリズムを実行します。この関数は、入力の decodercfg オブジェクトにおいて NumRowsPerLayer = 1 である場合にマルチスレッド実行をオフにします。

ヒント

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

依存関係

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

出力引数

すべて折りたたむ

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

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

データ型: int8 | double | single

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

データ型: double

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

データ型: double

アルゴリズム

すべて折りたたむ

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

参照

[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, 107-112. https://doi.org/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. https://doi.org/10.1109/ISIT.2005.1523374.

拡張機能

すべて展開する

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

バージョン履歴

R2021b で導入

すべて展開する