exponenta event banner

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

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

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

Создание структуры моделирования

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

Определите параметры моделирования для схемы модуляции 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

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

Для исправления ошибок, возникающих из шумного канала, применяют сверточное кодирование к данным перед передачей и декодирование Витерби к принятым данным. Декодер использует алгоритм жесткого решения, что означает, что каждый принятый бит данных интерпретируется как 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. upfirdn функция прокладывает повышающий дискретизированный сигнал с нулями в конце для промывки фильтра. Затем функция применяет фильтр.

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

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

Используя количество битов на символ (kи количество выборок на символ (sps), преобразовать отношение энергии на бит к спектральной плотности мощности шума (EbNo) к значению SNR для использования awgn функция. При преобразовании Eb/N0 в SNR необходимо учитывать количество информационных битов на символ. При отсутствии примененного 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);

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

Используйте 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 передачи и приема, уже учтена в восстановленных данных, но задержка декодера еще не учтена. Непрерывный режим работы декодера Витерби несет задержку с длительностью в битах, равной длине трекбэка, 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.

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

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

Связанные темы