Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

DVB-S.2 リンク (LDPC 符号化を含む)

この例では、米国の DIRECTV が展開する第 2 世代デジタル ビデオ放送規格 (DVB-S.2) の低密度パリティ チェック (LDPC) 符号の応用について説明します。Communications System object を使用し、LDPC の符号化と復号化を含む送信機と受信機のチェーンをシミュレートします。

はじめに

ブロードキャスティング、双方向サービス、ニュース ギャザリングおよびその他のブロードバンド衛星活用 (DVB-S.2) のための ETSI (欧州電気通信標準化機構) EN 302 307 規格では、最先端の符号化方式を使用してチャネルの容量を高めます [ 1 ]。LDPC (低密度パリティ チェック) 符号と BCH 符号の連結は、この符号化方式の基本です。Gallager が独創性に富んだ博士論文で 1960 年に考案した LDPC 符号では、低複雑性反復復号化アルゴリズムを使用することによって、チャネル容量に近い非常に低いエラー レートを実現できます [ 2 ]。外部の BCH 符号は、LDPC 復号化器によって生成される散発的な誤りを訂正するのに使用されます。

DVB-S.2 のチャネル符号は、同じ伝送条件の DVB-S で著しく容量を増大させます。DVB-S.2 は、伝送モードに応じてシャノン限界から約 0.7 dB ~ 1 dB で疑似エラーフリーの動作 (パケット エラー レート 10^ -7 以下) を提供します。

この例では、DVB-S.2 規格に準じて、BCH 符号化器、LDPC 符号化器、インターリーバー、変調器に加えて、受信機でのこれらの等価回路もシミュレートします。復調器、LDPC 復号化器および BCH 復号化器の出力のエラー レートを収集し、LDPC 復号化器が実行する反復回数の分布を判定し、受信したシンボル コンスタレーションを表示します。この例で使用されているシステムの構造、簡略化、および前提条件の詳細については、DVB-S.2 リンク (Simulink での LDPC 符号化を含む)の例を参照してください。

シングル ストリームの DVB-S2 のリンクに一定の符号化と変調を使用するEnd-to-End DVB-S2 Simulation with RF Impairments and Corrections (Satellite Communications Toolbox)の例を参照してください。

初期化

configureDVBS2Demo.m スクリプトはいくつかのシミュレーション パラメーターを初期化し、構造体 dvb を生成します。この構造体のフィールドは現在のところ DVB-S.2 システムのパラメーターです。DVB-S.2 システムを構成する System object の作成も行います。

subsystemType = '16APSK 2/3'; % Constellation and LDPC code rate
EsNodB        = 9;            % Energy per symbol to noise PSD ratio in dB
numFrames     = 20;           % Number of frames to simulate

% Initialize
configureDVBS2Demo

% Display system parameters
dvb
dvb = 

  struct with fields:

                  CodeRate: '2/3'
                    EsNodB: 9
            ModulationType: '16APSK'
         NumBytesPerPacket: 188
          NumBitsPerPacket: 1504
         BCHCodewordLength: 43200
          BCHMessageLength: 43040
          BCHGeneratorPoly: [1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 ... ] (1x161 double)
          BCHPrimitivePoly: [1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1]
      NumPacketsPerBBFrame: 28
    NumInfoBitsPerCodeword: 42112
                 BitPeriod: 2.3746e-05
        LDPCCodewordLength: 64800
     LDPCParityCheckMatrix: [21600x64800 logical]
         LDPCNumIterations: 50
           InterleaveOrder: [64800x1 double]
             Constellation: [16x1 double]
             SymbolMapping: [12 14 15 13 4 0 8 10 2 6 7 3 11 9 1 5]
               PhaseOffset: [0.7854 0.2618]
             BitsPerSymbol: 4
           ModulationOrder: 16
             SequenceIndex: 2
        NumSymsPerCodeword: 16200
                  NoiseVar: 0.1259
               NoiseVarEst: 0.3227
            RecDelayPreBCH: 43040

この例では次の System object と関数を使用します。

シミュレーション オブジェクト:

enc            - BCH encoder
dec            - BCH decoder
intrlvr        - Block interleaver
deintrlvr      - Block deinterleaver
pskModulator   - PSK modulator
pskDemodulator - PSK demodulator
chan           - AWGN channel

性能測定オブジェクト:

PER       - Packet error rate calculator
BERLDPC   - LDPC decoder output error rate calculator
BERMod    - Demodulator output error rate calculator
constDiag - Scatter plot of channel output
meanCalc  - Average of the noise variance

シミュレーション関数:

dvbsapskmod   - DVBSAPSK modulator
dvbsapskdemod - DVBSAPSK demodulator
ldpcEncode    - LDPC encoder
ldpcDecode    - LDPC decoder

LDPC 符号化器と復号化器の構成オブジェクト

DVB-S.2 規格 [ 1 ] の 5.3.1 項に準じたパリティ チェック行列に基づいて、LDPC 符号化器と復号化器の構成オブジェクトを作成します。

encldpcCfg = ldpcEncoderConfig(dvb.LDPCParityCheckMatrix);
decldpcCfg = ldpcDecoderConfig(dvb.LDPCParityCheckMatrix);

ストリーム処理ループ

コードのこのセクションでは、DVB-S.2 システムの処理ループを呼び出します。このループの主要部分によってデータがフレームごとに処理されます。この際、システム パラメーター dvb.NumPacketsPerBBFrame が BB フレームあたりのデータ パケット数を決定します。for ループの最初の部分によってシステムがシミュレートされます。シミュレーターは BCH 符号化器と LDPC 符号化器を使用し、それぞれ内符号、外符号として各フレームを符号化します。符号化されたビットはインターリーバーを通過します。変調器は、インターリーブされたビットを事前定義されたコンスタレーションのシンボルにマッピングします。変調されたシンボルは、AWGN チャネルを通過します。復調器は、近似対数尤度アルゴリズムを使用して軟判定ビット推定値を取得します。LDPC 復号化器は、デインターリーブされたソフト ビット値を復号化して硬判定を生成します。BCH 復号化器はこれらの硬判定に対して、受信したフレームの最終的な推定値を作成するように動作します。

for ループの 2 番目の部分では、ビット エラー レートや散布図などの性能測定値が収集されます。また、受信した SNR 値の推定も行われます。

bbFrameTx  = false(encbch.MessageLength,1);
numIterVec = zeros(numFrames,1);
falseVec   = false(dvb.NumPacketsPerBBFrame,1);

for frameCnt=1:numFrames

    % Transmitter, channel, and receiver
    bbFrameTx(1:dvb.NumInfoBitsPerCodeword) = ...
        logical(randi([0 1],dvb.NumInfoBitsPerCodeword,1));

    bchEncOut = encbch(bbFrameTx);
    ldpcEncOut = ldpcEncode(bchEncOut,encldpcCfg);
    intrlvrOut = intrlv(ldpcEncOut,dvb.InterleaveOrder);

    if dvb.ModulationOrder == 4 || dvb.ModulationOrder == 8
        modOut = pskModulator(intrlvrOut);
    else
        modOut = dvbsapskmod(intrlvrOut,dvb.ModulationOrder,'s2', ...
            dvb.CodeRate,'InputType','bit','UnitAveragePower',true);
    end

    chanOut = chan(modOut);

    if dvb.ModulationOrder == 4 || dvb.ModulationOrder == 8
        demodOut = pskDemodulator(chanOut);
    else
        demodOut = dvbsapskdemod(chanOut,dvb.ModulationOrder,'s2', ...
            dvb.CodeRate,'OutputType','approxllr','NoiseVar', ...
            dvb.NoiseVar,'UnitAveragePower',true);
    end

    deintrlvrOut = deintrlv(demodOut,dvb.InterleaveOrder);
    % By default, ldpcDecode stops iterating when all parity checks are
    % satisfied, which reduces decoding time
    [ldpcDecOut, numIter] = ldpcDecode(deintrlvrOut,decldpcCfg,dvb.LDPCNumIterations);
    bchDecOut = decbch(ldpcDecOut);
    bbFrameRx = bchDecOut(1:dvb.NumInfoBitsPerCodeword,1);

    % Error statistics
    comparedBits = xor(bbFrameRx,bbFrameTx(1:dvb.NumInfoBitsPerCodeword));
    packetErr    = any(reshape(comparedBits,dvb.NumBitsPerPacket, ...
        dvb.NumPacketsPerBBFrame));
    per = PER(falseVec,packetErr');
    berMod = BERMod(demodOut<0,intrlvrOut);
    berLDPC = BERLDPC(logical(ldpcDecOut),bchEncOut);

    % LDPC decoder iterations
    numIterVec(frameCnt) = numIter;

    % Noise variance estimate
    noiseVar = meanCalc(var(chanOut - modOut));

    % Scatter plot
    constDiag(chanOut);
end

エラー レート測定オブジェクト (hPERhBERMod、および hBERLDPC) を実行すると、測定されたエラー レートの値、エラー数、および送信 (パケットまたはビット) の合計数の更新情報を含む 3 行 1 列のベクトルを出力します。復調器の出力で BER を、LDPC 復号化器の出力で BER を、受信機の入力でエンドツーエンド システムのパケット エラー レートを測定された SNR と共に表示します。復調器の出力には 10% を超えるエラー レートがある一方で、LDPC 復号化器はすべての誤りを収集して誤りのないパケットを提供できます。

fprintf('Measured SNR : %1.2f dB\n',10*log10(1/noiseVar))
fprintf('Modulator BER: %1.2e\n',berMod(1))
fprintf('LDPC BER     : %1.2e\n',berLDPC(1))
fprintf('PER          : %1.2e\n',per(1))
Measured SNR : 8.98 dB
Modulator BER: 8.25e-02
LDPC BER     : 0.00e+00
PER          : 0.00e+00

図は、LDPC 復号化器によって実行される反復回数の分布を示しています。復号化器は、最大反復回数である 50 に到達する前に、誤りを発生させずにすべてのフレームを復号化できました。

distFig = figure;
histogram(numIterVec,1:dvb.LDPCNumIterations-1);
xlabel('Number of iterations'); ylabel('# occurrences'); grid on;
title('Distribution of number of LDPC decoder iterations')

32.4e6 ビットのストリーム処理ループを、いくつかの SNR 値で実行しました。このシミュレーションは時間がかかるため、この例では MAT ファイルに保存されたシミュレーション結果のみを示します。

load berResultsDVBS2Demo.mat cBER_16APSK snrdB_16APSK
berFig = figure;
semilogy(snrdB_16APSK,cBER_16APSK(1,:)); xlim([8 8.9]);
xlabel('SNR (dB)'); ylabel('BER'); grid on

まとめ

この例ではいつくかの System object を利用して、AWGN チャネルでの DVB-S.2 通信システムの一部をシミュレートしました。LDPC 符号化など、DVB-S.2 システムの一部をモデル化する方法を示しました。エラー レート測定 System object で取得した PER 値と BER 値を使用して、システム パフォーマンスを測定しました。

その他の調査

この例の一部を変更すると、さまざなま Es/No の値や LDPC 復号化器の最大反復回数を使用して、異なるサブシステムの種類を試すことができます。この例では、次のサブシステムの種類がサポートされます。

     'QPSK 1/4', 'QPSK 1/3', 'QPSK 2/5', 'QPSK 1/2', 'QPSK 3/5', 'QPSK
     2/3', 'QPSK 3/4', 'QPSK 4/5', 'QPSK 5/6', 'QPSK 8/9', 'QPSK 9/10'
     '8PSK 3/5', '8PSK 4/5', '8PSK 2/3', '8PSK 3/4', '8PSK 5/6', '8PSK
     8/9', '8PSK 9/10'
     '16APSK 2/3', '16APSK 3/4', '16APSK 4/5', '16APSK 5/6', '16APSK
     8/9', '16APSK 9/10'
     '32APSK 3/4', '32APSK 4/5', '32APSK 5/6', '32APSK 8/9', '32APSK
     9/10'

付録

この例では次のスクリプトと補助関数が使用されています。

参考文献

  1. ETSI Standard EN 302 307 V1.1.1: Digital Video Broadcasting (DVB); Second generation framing structure, channel coding and modulation systems for Broadcasting, Interactive Services, News Gathering and other broadband satellite applications (DVB-S2), European Telecommunications Standards Institute, Valbonne, France, 2005-03.

  2. R. G. Gallager, Low-Density Parity-Check Codes, IEEE® Transactions on Information Theory, Vol. 8, No. 1, January 1962, pp. 21-28.

  3. W. E. Ryan, An introduction to LDPC codes, in Coding and Signal Processing for Magnetic Recording Systems (Bane Vasic, ed.), CRC Press, 2004.