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