Моделируйте сквозную линию связи, использующую 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')