DVB-S.2 ссылка, включая кодирование LDPC

Этот пример показывает применение кодов проверки четности низкой плотности (LDPC) в стандарте цифрового видеовещания второй генерации (DVB-S.2), который развертывается DIRECTV в Соединенных Штатах. Пример использует коммуникационную систему объекты, чтобы симулировать цепь передатчика-приемника, которая включает в себя кодирование и декодирование LDPC.

Введение

Стандарт ETSI (European Telecommunications Standard Institute) EN 302 307 для вещания, интерактивных услуг, сбора новостей и других широкополосных спутниковых приложений (DVB-S.2) [1] использует современную схему кодирования для увеличения пропускной способности канала. Конкатенация кодов LDPC (Low-Density Parity-Check) и BCH является базисом этой схемы кодирования. Коды LDPC, изобретенные Галлагером в его исходной докторской диссертации в 1960 году, могут достичь чрезвычайно низких частот ошибок вблизи пропускной способности канала с помощью алгоритма итерационного декодирования с низкой сложностью [2]. Внешние коды BCH используются для исправления спорадических ошибок, допущенных декодером LDPC.

Коды канала для DVB-S.2 обеспечивают значительный коэффициент усиления по сравнению с DVB-S при тех же условиях передачи. В зависимости от режима передачи, DVB-S.2 обеспечивает операцию Quasi-Error-Free (вероятность ошибки пакета ниже 10 ^ -7) на уровне около 0,7 дБ до 1 дБ от предела Шеннона.

Этот пример моделирует энкодер BCH, энкодера LDPC, перемежитель, модулятор, а также их аналоги в приемник, согласно стандарту DVB-S.2. Пример собирает частоту ошибок на выходах демодулятора, декодера LDPC и декодера BCH, определяет распределение количества итераций, выполненных декодером LDPC, и показывает принятое созвездие символов. Для получения дополнительной информации о структуре системы, упрощениях и допущениях смотрите DVB-S.2 Link, включая кодирование LDPC в примере Simulink.

Инициализация

Скрипт configureDVBS2Demo.m инициализирует некоторые параметры симуляции и генерирует структуру, dvb. Поля этой структуры являются параметрами действующей DVB-S.2 системы. Также создаются системные объекты, составляющие DVB-S.2 систему.

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: [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

В примере используются эти системные объекты и функции.

Объекты симуляции:

enc            - BCH encoder
dec            - BCH decoder
LDPCEnc        - LDPC encoder
LDPCDec        - LDPC 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

LDPC- Энкодера и декодер

Создайте энкодер и декодер Системные объекты и установите матрицу проверки четности в соответствии с разделом 5.3.1 DVB-S.2 стандарта [1]. Вы устанавливаете IterationTerminationCondition свойство к 'Parity check satisfied' остановить итерации декодера, когда все проверки четности удовлетворены, что уменьшает время декодирования. Установите MaximumIterationCount свойство 50, чтобы ограничить количество итераций симуляции. Установите NumIterationsOutputPort true, чтобы вывести количество итераций, выполненных для каждого кодового слова.

encldpc = comm.LDPCEncoder(dvb.LDPCParityCheckMatrix);

decldpc = comm.LDPCDecoder(dvb.LDPCParityCheckMatrix, ...
    'IterationTerminationCondition','Parity check satisfied', ...
    'MaximumIterationCount',dvb.LDPCNumIterations, ...
    'NumIterationsOutputPort',true);

Цикл обработки потока

Этот раздел кода вызывает цикл обработки для DVB-S.2 системы. Основной цикл обрабатывает данные кадр за кадром, где системный параметр dvb.NumPacketsPerBBFrame определяет количество пакетов данных на каждую систему координат BB. Первая часть цикла for моделирует систему. Симулятор кодирует каждую систему координат, используя BCH и LDPC энкодеры в качестве внутреннего и внешнего кодов, соответственно. Закодированные биты проходят через перемежитель. Модулятор преобразует перемеженные биты в символы из предопределенного созвездия. Модулированные символы проходят через канал AWGN. Демодулятор использует приблизительный алгоритм логарифмической правдоподобности, чтобы получить мягкие битовые оценки. Декодер LDPC декодирует перемеженные значения мягких бит и генерирует жесткие решения. Декодер BCH работает над этими жесткими решениями, чтобы создать окончательную оценку принятой системы координат.

Вторая часть цикла for собирает эффективность измерения, такие как вероятность битовой ошибки и графика поля точек. Это также оценивает полученное значение ОСШ.

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 = encldpc(bchEncOut);
    % Block Interleaver
    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

    % Block Deinterleaver
    deintrlvrOut = deintrlv(demodOut,dvb.InterleaveOrder);
    [ldpcDecOut, numIter] = decldpc(deintrlvrOut);
    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(ldpcDecOut,bchEncOut);

    % LDPC decoder iterations
    numIterVec(frameCnt) = numIter;

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

    % Scatter plot
    constDiag(chanOut);
end

Выполнение объектов измерения частоты ошибок (hPER, hBERMod, и hBERLDPC), выводит вектор 3 на 1, содержащий обновления измеренного значения частоты ошибок, количества ошибок и общего количества передач (пакетов или бит). Отобразите BER на выходе демодулятора, BER на выходе декодера LDPC и частоту ошибок пакета сквозной системы вместе с измеренным ОСШ на входе приемника. В то время как выходные данные демодулятора представляют частоту ошибок более 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:decldpc.MaximumIterationCount-1);
xlabel('Number of iterations'); ylabel('# occurrences'); grid on;
title('Distribution of number of LDPC decoder iterations')

Мы запустили цикл обработки потока для 32.4e6 бит для нескольких значений ОСШ. Поскольку эта симуляция занимает много времени, в этом примере мы предоставляем только результат симуляции, сохраненной в 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

Сводные данные

Этот пример использовал несколько системных объектов, чтобы симулировать часть DVB-S.2 системы связи по каналу AWGN. Он показал, как смоделировать несколько частей DVB-S.2 системы, таких как кодирование LDPC. Производительность системы измеряли с использованием значений 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: цифровое видеовещание (DVB); Структура системы координат второй генерации, системы кодирования и модуляции каналов для вещания, интерактивных услуг, сбора новостей и других широкополосных спутниковых приложений (DVB-S2), Европейский институт телекоммуникационных стандартов, Вальбонна, Франция, 2005-03.

  2. Р. Г. Галлагер, Коды проверки четности низкой плотности, Транзакции IEEE ® по теории информации, том 8, № 1, январь 1962, стр. 21-28.

  3. W. E. Ryan, Введение к кодам LDPC, в Coding and Signal Processing for Magnetic Recording Systems (Bane Vasic, ed.), CRC Press, 2004.