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

Оцените эффективность скорости битовой ошибки (BER) для декодеров Viterbi с твердым и мягким решениями в 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. Задайте среднюю степень модуля для принимаемого сигнала

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

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

The 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.

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