Этот пример генерирует немного коэффициента ошибок по сравнению с кривой Eb/No для ссылки, которая использует 16-QAM модуляцию и уровень 2/3 сверточный код в AWGN.
Установите порядок модуляции и вычислите количество битов на символ.
M = 16; k = log2(M);
Создайте решетку для уровня 2/3 сверточный код. Установите параметры скорости кода и traceback.
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);
Создайте объект коэффициента ошибок. Установите задержку приемника с дважды 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')