Этот пример расширяет Формирование Пульса Использования на 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);
Используя количество битов на символ (kи количество выборок на символ (sps), преобразовать отношение энергии на бит к спектральной плотности мощности шума (EbNo) к значению SNR для использования awgn функция. При преобразовании в 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
Используйте 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.
Для того же 10 дБ меньше ошибок возникает при использовании FEC и BER улучшается примерно с 2 × 10-3 до 1 × 10-4.
Операция декодирования в этом примере вызывает задержку, которая вызывает запаздывание входного сигнала на выходе декодера. Информация о синхронизации не появляется явно в примере, и продолжительность задержки зависит от конкретных выполняемых операций. Задержки возникают в различных операциях системы связи, включая сверточное декодирование, сверточное перемежение и обратное перемежение, выравнивание и фильтрацию. Информацию о продолжительности задержки, вызванной определенными функциями или операциями, см. в специальной документации по этим функциям или операциям. Дополнительные сведения о задержках см. в разделе Задержки сверточных перемежителей и каналов замирания.