exponenta event banner

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

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

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

M = 16;
k = log2(M);

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

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

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

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

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

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

Смоделируйте ссылку, выполнив следующие действия.

  • Создание двоичных данных.

  • Кодирование данных сверточным кодом со скоростью 2/3.

  • 16-QAM модулировать кодированные данные, конфигурировать входы битов и среднюю мощность блока.

  • Передача сигнала по каналу AWGN.

  • 16-QAM демодулируют выходы битов конфигурации принятого сигнала и среднюю мощность блока.

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

  • Соберите статистику ошибок.

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 = qammod(dataEnc,M, ...
            'InputType','bit','UnitAveragePower',true);
        rxSig = awgn(txSig,snr);
        demodSig = qamdemod(rxSig,M, ...
            'OutputType','bit','UnitAveragePower',true);
        dataOut = vitDecoder(demodSig);
        errorStats(m,:) = errorRate(dataIn,dataOut);
    end
    reset(errorRate)
end

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

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

Постройте график зависимости BER от кривой Eb/No для моделируемых кодированных данных и теоретических некодированных данных. При более высоких значениях Eb/No код исправления ошибок обеспечивает преимущества производительности.

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

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Coded, Uncoded.