exponenta event banner

Оценка BER для декодирования Витерби с жестким и мягким решением

Оценка эффективности частоты битовых ошибок (BER) для декодеров Витерби с жестким и мягким решением в AWGN. Сравните производительность с производительностью некодированного канала 64-QAM.

Задайте параметры моделирования.

clear; close all
rng default
M = 64;                 % Modulation order
k = log2(M);            % Bits per symbol
EbNoVec = (4:10)';      % Eb/No values (dB)
numSymPerFrame = 1000;  % Number of QAM symbols per frame

Инициализируйте векторы результатов BER.

berEstSoft = zeros(size(EbNoVec)); 
berEstHard = zeros(size(EbNoVec));

Задайте решетчатую структуру и глубину отслеживания для скорости 1/2, длина ограничения 7, сверточный код.

trellis = poly2trellis(7,[171 133]);
tbl = 32;
rate = 1/2;

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

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

  • Сверточное кодирование данных

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

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

  • Демодулировать принятый сигнал с использованием методов жесткого решения и приблизительного LLR. Укажите среднюю мощность для принимаемого сигнала

  • Витерби декодирует сигналы жесткими и неквантованными методами

  • Вычислить количество битовых ошибок

while цикл продолжает обрабатывать данные до тех пор, пока не будет обнаружено либо 100 ошибок, либо не будет передано 107 битов.

for n = 1:length(EbNoVec)
    % Convert Eb/No to SNR
    snrdB = EbNoVec(n) + 10*log10(k*rate);
    % Noise variance calculation for unity average signal power.
    noiseVar = 10.^(-snrdB/10);
    % Reset the error and bit counters
    [numErrsSoft,numErrsHard,numBits] = deal(0);
    
    while numErrsSoft < 100 && numBits < 1e7
        % Generate binary data and convert to symbols
        dataIn = randi([0 1],numSymPerFrame*k,1);
        
        % Convolutionally encode the data
        dataEnc = convenc(dataIn,trellis);
        
        % QAM modulate
        txSig = qammod(dataEnc,M,'InputType','bit','UnitAveragePower',true);
        
        % Pass through AWGN channel
        rxSig = awgn(txSig,snrdB,'measured');
        
        % Demodulate the noisy signal using hard decision (bit) and
        % soft decision (approximate LLR) approaches.
        rxDataHard = qamdemod(rxSig,M,'OutputType','bit','UnitAveragePower',true);
        rxDataSoft = qamdemod(rxSig,M,'OutputType','approxllr', ...
            'UnitAveragePower',true,'NoiseVariance',noiseVar);
        
        % Viterbi decode the demodulated data
        dataHard = vitdec(rxDataHard,trellis,tbl,'cont','hard');
        dataSoft = vitdec(rxDataSoft,trellis,tbl,'cont','unquant');
        
        % Calculate the number of bit errors in the frame. Adjust for the
        % decoding delay, which is equal to the traceback depth.
        numErrsInFrameHard = biterr(dataIn(1:end-tbl),dataHard(tbl+1:end));
        numErrsInFrameSoft = biterr(dataIn(1:end-tbl),dataSoft(tbl+1:end));
        
        % Increment the error and bit counters
        numErrsHard = numErrsHard + numErrsInFrameHard;
        numErrsSoft = numErrsSoft + numErrsInFrameSoft;
        numBits = numBits + numSymPerFrame*k;

    end
    
    % Estimate the BER for both methods
    berEstSoft(n) = numErrsSoft/numBits;
    berEstHard(n) = numErrsHard/numBits;
end

Постройте график расчетных твердых и мягких данных BER. Постройте график теоретической производительности для некодированного канала 64-QAM.

semilogy(EbNoVec,[berEstSoft berEstHard],'-*')
hold on
semilogy(EbNoVec,berawgn(EbNoVec,'qam',M))
legend('Soft','Hard','Uncoded','location','best')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Soft, Hard, Uncoded.

Как и ожидалось, декодирование с мягким решением дает наилучшие результаты.