Используйте прямую коррекцию ошибок для 16-QAM сигнала

Этот пример расширяет пример использования формирования импульсов на 16-QAM сигнале, чтобы показать улучшение эффективности по причине битовой ошибки (BER) при использовании кодирования с прямой коррекцией ошибок (FEC).

Этот пример показывает, как обработать поток двоичных данных с помощью ссылки связи, которая состоит из модулятора основной полосы частот, канала, демодулятора, формирования импульсов, фильтрации приподнятого косинуса и коррекции ошибок.

Создайте среду симуляции

В этом примере, для достижения более точной оценки BER, количество бит для обработки увеличивается со значения, используемого в примере Use Pulse Shaping on 16-QAM Signal. Другие переменные симуляции соответствуют настройкам в этом примере.

Задайте параметры симуляции для схемы 16-QAM модуляции с фильтр приподнятого косинуса и канал AWGN.

M = 16; % Modulation order
k = log2(M); % Number of bits per symbol
numBits = 1e6; % Number of bits to process
sps = 4; % Number of samples per symbol (oversampling factor)
filtlen = 10; % Filter length in symbols
rolloff = 0.25; % Filter rolloff factor

Сгенерируйте случайные данные

Установите rng функция в состоянии по умолчанию или любое статическое начальное значение, так что пример дает повторяемые результаты. Затем используйте randi функция для генерации случайных двоичных данных.

rng default;                     % Use default random number generator
dataIn = randi([0 1],numBits,1); % Generate vector of binary data

Применение сверточной кодировки

Чтобы исправить ошибки, возникающие из шумного канала, примените сверточное кодирование к данным перед передачей и декодирование Viterbi к принятым данным. Декодер использует алгоритм жесткого принятия решений, который означает, что каждый принятый бит данных интерпретируется как 0 или 1.

Задайте сверточный штифт кодирования для кода скорости 2/3 при помощи poly2trellis функция. Заданная шпалера представляет сверточный код, который convenc функция используется для кодирования двоичного вектора, dataIn.

constrlen = [5 4]; % Code constraint length
genpoly = [23 35 0; 0 5 13] % Generator polynomials
genpoly = 2×3

    23    35     0
     0     5    13

tPoly = poly2trellis(constrlen,genpoly);
codeRate = 2/3;

Закодируйте входные данные при помощи tPoly шпалеры.

dataEnc = convenc(dataIn,tPoly);

Модулируйте данные

Измените форму вектора входа на матрицу 4-битных двоичных данных. Затем используйте bi2de функция для преобразования закодированных двоичных данных в целочисленный формат.

dataEncMatrix = reshape(dataEnc, ...
    length(dataEnc)/k,k); % Reshape data into binary 4-tuples
dataSymbolsIn = bi2de(dataEncMatrix); % Convert to integers

Используйте qammod функция для применения 16-QAM модуляции.

dataMod = qammod(dataSymbolsIn,M);

Применение фильтрации приподнятого косинуса

Используйте rcosdesign функция для создания фильтра RRC.

rrcFilter = rcosdesign(rolloff,filtlen,sps);

Используйте upfirdn функция для увеличения сигнала коэффициентом избыточной дискретизации и применения фильтра RRC. The upfirdn функция заполняет усиленный сигнал нулями в конце, чтобы промыть фильтр. Затем функция применяет фильтр.

txSignal = upfirdn(dataMod,rrcFilter,sps,1);

Применение канала AWGN

Использование количества бит на символ (k) и количество выборок на символ (sps), преобразуйте отношение энергии на бит к спектральной плотности степени шума (EbNo) к значению ОСШ для использования awgn функция. При преобразовании Eb/N0 в ОСШ необходимо учитывать количество информационных бит на символ. Без применения FEC каждый символ соответствовал k биты. При применении FEC каждый символ соответствует (k × codeRate) информационные биты. Для передач со скоростью 2/3 кодом и 16-QAM, используемых в этом примере, три символа соответствуют 12 кодированным битам и 8 незакодированным (информационным) битам.

EbNo = 10;
snr = EbNo+10*log10(k*codeRate)-10*log10(sps);

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

rxSignal = awgn(txSignal,snr,'measured');

Прием и демодуляция сигнала

Фильтрация принимаемого сигнала осуществляется с помощью RRC-фильтра. Удалите фрагмент сигнала для расчета задержки фильтра.

rxFiltSignal = upfirdn(rxSignal,rrcFilter,1,sps); % Downsample and filter
rxFiltSignal = rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay

Используйте qamdemod функция для демодуляции принятого фильтрованного сигнала.

dataSymbolsOut = qamdemod(rxFiltSignal,M);

Применить декодирование Viterbi

Используйте de2bi функция для преобразования восстановленных целочисленных символов в двоичные данные.

dataOutMatrix = de2bi(dataSymbolsOut,k);
codedDataOut = dataOutMatrix(:); % Return data in column vector

Используйте vitdec функция, сконфигурированная для жестких решений и непрерывной операции, для декодирования сверточно закодированных данных. Непрерывный режим работы поддерживает внутреннее состояние, когда декодер неоднократно вызывается, например, при приеме систем координат данных, работающих в цикле. Непрерывный режим работы также добавляет системе задержку. Несмотря на то, что этот пример не использует цикл, 'cont'режим используется для иллюстрации того, как компенсировать задержку в этой операции декодирования.

traceBack = 16; % Traceback length for decoding
numCodeWords = floor(length(codedDataOut)*2/3); % Number of complete codewords
dataOut = vitdec(codedDataOut(1:numCodeWords*3/2), ...
           tPoly,traceBack,'cont','hard'); % Decode data

Вычислительная система BER

Используйте biterr функция для вычисления количества ошибок и BER путем сравнения dataIn и dataOut. Задержка, введенная фильтрами RRC передачи и приема, уже учитывается в восстановленных данных, но задержка декодера еще не учитывается. Непрерывный режим работы декодера Viterbi несет задержку с длительностью в битах, равной длине обратного вызова traceBack, умножить количество входа потоков в энкодере. Для скорости кода 2/3, используемой в этом примере, кодер имеет два потока входа, поэтому задержка 2 × traceBack биты. В результате первый 2 × traceBack биты в декодированном векторе, dataOut, являются нулями. При вычислении BER отбрасывайте первый 2 × traceBack биты в dataOut и последний 2 × traceBack биты в исходном векторе, dataIn.

decDelay = 2*traceBack; % Decoder delay, in bits
[numErrors,ber] = ...
   biterr(dataIn(1:end - decDelay),dataOut(decDelay + 1:end));       
fprintf('\nThe bit error rate is %5.2e, based on %d errors.\n', ...
    ber,numErrors)
The bit error rate is 1.00e-04, based on 100 errors.

Для того же Eb/N0 из 10 дБ при использовании FEC происходит меньше ошибок, и BER улучшается с приблизительно 2 × 10-3 до 1 × 10-4.

Подробнее о задержках

Операция декодирования в этом примере несет задержку, которая заставляет выход декодера задерживать вход. Время выполнения не появляется явным образом в примере, и длина задержки зависит от конкретных выполняемых операций. Задержки происходят в различных операциях коммуникационной системы, включая сверточное декодирование, сверточное перемежение и обращенное перемежение, эквализацию и фильтрацию. Чтобы узнать длительность задержки, вызванной определенными функциями или операциями, смотрите конкретную документацию для этих функций или операций. Для получения дополнительной информации о задержках см. «Задержки сверточных перемежителей» и «Замирания каналов».

Похожие темы