Уровень 2/3 Сверточный код в AWGN

Этот пример генерирует немного коэффициента ошибок по сравнению с кривой Eb/No для ссылки, которая использует 16-QAM модуляцию и уровень 2/3 сверточный код в AWGN.

Установите порядок модуляции и вычислите количество битов на символ.

M = 16;
k = log2(M);

Создайте решетку для уровня 2/3 сверточный код. Установите traceback и параметры уровня кода.

trellis = poly2trellis([5 4],[23 35 0; 0 5 13]);
traceBack = 16;
codeRate = 2/3;

Создайте сверточный энкодер и его эквивалентный Декодер Витерби.

convEncoder = comm.ConvolutionalEncoder('TrellisStructure',trellis);
vitDecoder = comm.ViterbiDecoder('TrellisStructure',trellis, ...
    'InputFormat','Hard','TracebackDepth',traceBack);

Создайте 16-QAM модулятор и пару демодулятора, имеющую битные вводы и выводы. Установите совокупность нормировать на средней степени.

qamModulator = comm.RectangularQAMModulator('BitInput',true,'NormalizationMethod','Average power');
qamDemodulator = comm.RectangularQAMDemodulator('BitOutput',true,'NormalizationMethod','Average power');

Создайте объект коэффициента ошибок. Установите задержку получателя с дважды traceback глубиной, которая является задержкой через декодер.

errorRate = comm.ErrorRate('ReceiveDelay',2*traceBack);

Установите область значений значений Eb/No моделироваться. Инициализируйте матрицу статистики частоты ошибок по битам.

ebnoVec = 0:2:10;
errorStats = zeros(length(ebnoVec),3);

Моделируйте ссылку путем выполнения этих шагов:

  • Сгенерируйте двоичные данные.

  • Закодируйте данные с уровнем 2/3 сверточный код.

  • Модулируйте закодированные данные.

  • Передайте сигнал через канал AWGN.

  • Демодулируйте полученный сигнал.

  • Декодируйте демодулируемый сигнал при помощи Декодера Витерби.

  • Соберите ошибочные статистические данные.

for m = 1:length(ebnoVec)
    snr = ebnoVec(m) + 10*log10(k*codeRate);
    while errorStats(m,2) <= 100 && errorStats(m,3) <= 1e7
        dataIn = randi([0 1],10000,1);
        dataEnc = convEncoder(dataIn);
        txSig = qamModulator(dataEnc);
        rxSig = awgn(txSig,snr);
        demodSig = qamDemodulator(rxSig);
        dataOut = vitDecoder(demodSig);
        errorStats(m,:) = errorRate(dataIn,dataOut);
    end
    reset(errorRate)
end

Вычислите теоретический BER по сравнению с кривой Eb/No для случая без прямого кодирования с коррекцией ошибок.

berUncoded = berawgn(ebnoVec','qam',M);

Постройте BER по сравнению с кривой Eb/No для моделируемых закодированных данных и теоретических незакодированных данных.

semilogy(ebnoVec,[errorStats(:,1) berUncoded])
grid
legend('Coded','Uncoded')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

В выше значениях Eb/No код с коррекцией ошибок предоставляет выигрыши в производительности.