Используйте прямое исправление ошибок на 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 функционируйте к его состоянию по умолчанию или любому статическому значению 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);

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

Вычислите системный BER

Используйте 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.

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

Больше о задержках

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

Похожие темы