Оцените производительность BER турбокода в AWGN

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

Инициализируйте симуляцию

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

rng(10,'twister');
M = 16; % Modulation order
bps = log2(M); % Bits per symbol
EbNo = (2:0.5:4);
pktLen = 500;

Инициализируйте вектор частоты ошибок по битам.

ber = zeros(size(EbNo));

Создайте Системные объекты для турбо пары энкодера и декодера, где interleaver индексы предоставляются как входные параметры.

turboEnc = comm.TurboEncoder('InterleaverIndicesSource','Input port');

turboDec = comm.TurboDecoder('InterleaverIndicesSource','Input port', ...
    'NumIterations',4);

Создайте Системный объект канала AWGN, и коэффициент ошибок противостоят Системному объекту.

awgnChannel = comm.AWGNChannel('NoiseMethod','Variance','Variance',1);
errorRate = comm.ErrorRate;

Используйте пакетную длину и турбо настройки энкодера, чтобы определить фактический переданный битрейт. Объекты турбокодирования инициализируются, чтобы использовать rate-1/2 решетку в их составляющих сверточных кодах, приводящих к турбо энкодеру выход с 2 потоками бита четности, (в дополнение к систематическому потоку) и 12 битов хвоста для входного пакета. 12 битов хвоста происходят из-за заданной продолжительности ограничения 4 на составляющий энкодер, который приводит к 3-битным выходным параметрам на поток для в общей сложности 4 потоков (S1 P1 S2 P2).

    rate = pktLen/(3*pktLen+4*3);

Основной цикл обработки

Цикл обработки выполняет следующие шаги:

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

  • Сгенерируйте случайные interleaver индексы

  • Турбо кодирует данные

  • Примените 16-QAM модуляцию

  • Передайте модулируемый сигнал через канал AWGN

  • Демодулируйте сигнал с шумом с помощью алгоритма LLR

  • Турбо декодирует данные

  • Вычислите ошибочную статистику

 for k = 1:length(EbNo)

Инициализируйте ошибочный вектор статистики, отношение сигнал-шум и шумовое отклонение. Обновите значение отклонения шума Системного объекта канала AWGN.

    errorStats = zeros(1,3);
    EsNo = EbNo(k) + 10*log10(bps);       
    snrdB = EsNo + 10*log10(rate); % in dB
    noiseVar = 1./(10.^(snrdB/10));  
    awgnChannel.Variance = noiseVar;

    while errorStats(2) < 100 && errorStats(3) < 1e7
        % Generate random binary data
        data = randi([0 1],pktLen,1);
        % Interleaver indices
        intrlvrInd = randperm(pktLen);
        % Turbo encode the data
        encodedData = turboEnc(data,intrlvrInd);
        % Modulate the encoded data
        modSignal = qammod(encodedData,M,'InputType','bit','UnitAveragePower',true);
        % Pass the signal through the AWGN channel
        rxSignal = awgnChannel(modSignal);
        % Demodulate the received signal
        demodSignal = qamdemod(rxSignal,M,'UnitAveragePower',true,'OutputType','llr','NoiseVariance',noiseVar);
        % Turbo decode the demodulated signal. Because the bit mapping from the
        % demodulator is opposite that expected by the turbo decoder, the
        % decoder input must use the inverse of demodulated signal.
        rxBits = turboDec(-demodSignal,intrlvrInd);
        % Calculate the error statistics
        errorStats = errorRate(data,rxBits);
    end
    % Save the BER data and reset the bit error rate object
     ber(k) = errorStats(1);
     reset(errorRate)
end

Постройте частоту ошибок по битам и сравните ее с незакодированной частотой ошибок по битам.

semilogy(EbNo,ber,'-o')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
uncodedBER = berawgn(EbNo,'qam',M); % Estimate of uncoded BER
hold on
semilogy(EbNo,uncodedBER)
legend('Turbo','Uncoded','location','sw')

Смотрите также

|