Оцените производительность частоты ошибок по битам (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));
Установите структуру решетки и traceback глубину для уровня 1/2
, продолжительность ограничения 7
, сверточный код.
trellis = poly2trellis(7,[171 133]); tbl = 32; rate = 1/2;
Основные циклы обработки выполняют эти шаги:
Сгенерируйте двоичные данные
Convolutionally кодируют данные
Примените модуляцию QAM к символам данных. Задайте модульную среднюю степень для переданного сигнала
Передайте модулируемый сигнал через канал AWGN
Демодулируйте полученный сигнал с помощью трудного решения и аппроксимируйте методы LLR. Задайте модульную среднюю степень для полученного сигнала
Viterbi декодируют сигналы, использующие трудно и неквантованные методы
Вычислите количество битовых ошибок
while
цикл продолжает обрабатывать данные, пока с или 100 ошибками не сталкиваются или биты передаются.
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')
Как ожидалось мягкое декодирование решения приводит к лучшим результатам.