Этот пример расширяет Импульс Использования, Формирующий на 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
функционируйте к его состоянию по умолчанию или любому статическому значению seed, так, чтобы пример привел к повторяемым результатам. Затем используйте 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. 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
функция, сконфигурированная для трудных решений и непрерывного режима работы, чтобы декодировать convolutionally закодированные данные. Непрерывный режим работы обеспечивает внутреннее состояние, когда декодер неоднократно вызывается, такой, принимая кадры данных, действующих в цикле. Непрерывный режим работы также добавляет задержку с системой. Несмотря на то, что этот пример не использует цикл, '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 длине, 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.
Операция декодирования в этом примере подвергается задержке, которая заставляет выход декодера изолировать вход. Время выполнения не появляется явным образом в примере, и длина задержки зависит от определенных выполняемых операций. Задержки происходят в различных операциях системы связи, включая сверточное декодирование, сверточное перемежение и устранение чередования, эквализацию и фильтрацию. Чтобы узнать длительность задержки, вызванной определенными функциями или операциями, см. определенную документацию для тех функций или операций. Для получения дополнительной информации о задержках смотрите Задержки Сверточного Interleavers и Исчезающих Каналов.