Вторая часть кодирования тростника-Solomon – проколы

В этом примере показано, как настроить энкодер/декодер Тростника-Solomon (RS), чтобы использовать проколотые коды. Энкодер может сгенерировать проколы, для которых определенные символы четности всегда удаляются из ее выхода. Декодер, который знает шаблон прокола, вставляет нули в положения прокола и обрабатывает те символы как стирания. Декодер обрабатывает сгенерированные энкодером проколы и сгенерированные получателем стирания точно таким же образом, когда он декодирует. Прокалывание обладает дополнительным преимуществом создания более гибкого уровня кода, за счет некоторой возможности исправления ошибок.

В дополнение к этому примеру пример “Первая часть Кодирования Тростника-Solomon – Стирания” показывают прямоугольную 64-QAM систему связи с (63,53) блочный код RS со стираниями и пример “Часть III Кодирования Тростника-Solomon – Сокращение” показывает блочное кодирование RS с сокращенными кодами.

Введение

Этот пример показывает симуляцию системы связи, состоящей из случайного источника, энкодера RS, прямоугольного 64-QAM модулятора, канала AWGN, прямоугольного 64-QAM демодулятора и декодера RS. Это включает анализ кодирования RS со стираниями и прокалывания путем сравнения производительности частоты ошибок по битам (BER) канала по сравнению с закодированной производительностью BER. Этот пример получает BER Канала путем сравнения входных параметров для прямоугольного модулятора QAM к выходным параметрам от прямоугольного демодулятора QAM. Этот пример получает Закодированный BER путем сравнения входных параметров для энкодера RS к выходным параметрам от декодера RS.

Инициализация

Файл скрипта RSCodingConfigExample конфигурирует прямоугольный 64-QAM модулятор и демодулятор, канал AWGN и объекты системы измерения коэффициента ошибок, раньше симулировал систему связи. Скрипт также устанавливает незакодированное отношение E b/N0 на EbNoUncoded = 15 дБ и устанавливает критерии остановки симуляции путем определения целевого количества ошибок и максимального количества битных передач к 500 и 5×106, соответственно.

RSCodingConfigExample

Конфигурирование энкодера/Декодера RS

Рассмотрите тот же (63,53) код RS, действующий совместно с 64-QAM схемой модуляции, которая использовалась в примере “Первая часть Кодирования Тростника-Solomon − Стирания”, чтобы продемонстрировать, как декодировать стирания. В этом примере показано, как настроить энкодер/декодер RS, чтобы использовать проколотый код. В дополнение к декодированию сгенерированных получателем стираний декодер RS может откорректировать сгенерированные энкодером проколы. Алгоритм декодирования идентичен для этих двух случаев. Для каждой кодовой комбинации сумма проколов и стираний не может превысить дважды поддержку с коррекцией ошибок кода.

N = 63;  % Codeword length
K = 53;  % Message length
numErasures = 6;
rsEncoder = comm.RSEncoder(N,K, 'BitInput', false);
rsDecoder = comm.RSDecoder(N,K, 'BitInput', false, 'ErasuresInputPort', true);

Чтобы включить код, прокалывающий вас, устанавливает PuncturePatternSource свойство к 'Свойству' и набору PuncturePattern свойство к желаемому вектору шаблона прокола. Тот же вектор прокола должен быть задан и в энкодере и в декодере. Этот пример прокалывает два символа от каждой кодовой комбинации. Значения одного в векторе шаблона прокола указывают на непроколотые символы, в то время как значения нуля указывают на проколотые символы.

numPuncs = 2;

rsEncoder.PuncturePatternSource = 'Property';
rsEncoder.PuncturePattern = [ones(N-K-numPuncs,1); zeros(numPuncs,1)];

rsDecoder.PuncturePatternSource = 'Property';
rsDecoder.PuncturePattern = rsEncoder.PuncturePattern;

Потоковый цикл обработки

Симулируйте систему связи для незакодированного отношения E b/N0 15 дБ. Незакодированный E b/N0 является отношением, которое было бы измерено во входе канала, если бы не было никакого кодирования в системе.

Длина кодовых комбинаций, сгенерированных энкодером RS, уменьшается количеством проколов, заданных в векторе шаблона прокола. Поэтому значение закодированного отношения E b/N0 должно быть настроено, чтобы составлять эти проколы. В этом примере незакодированное отношение E b/N0 относится к закодированному E b/N0 как показано ниже. Установите EbNo свойство AWGN образовывает канал объект к вычисленному закодированному значению E b/N0.

EbNoCoded = EbNoUncoded + 10*log10(K/(N - numPuncs));
channel.EbNo = EbNoCoded;

Цикл до симуляции достигает целевого количества ошибок или максимального количества передач.

chanErrorStats = zeros(3,1);
codedErrorStats = zeros(3,1);
correctedErrors = 0;
while (codedErrorStats(2) < targetErrors) && ...
    (codedErrorStats(3) < maxNumTransmissions)

  % Data symbols - transmit 1 message word at a time. Each message word
  % has K symbols in the [0 N] range.
  data = randi([0 N],K,1);

  % Encode the message word. The encoded word encData is N-numPuncs symbols
  % long.
  encData = rsEncoder(data);

  % Modulate encoded data.
  modData = qamModulator(encData);

  % Add noise.
  chanOutput = channel(modData);

  % Demodulate channel output.
  demodData = qamDemodulator(chanOutput);

  % Get erasures vector.
  erasuresVec = RSCodingGetErasuresExample(chanOutput,numErasures);

  % Decode data.
  [estData,errs] = rsDecoder(demodData,erasuresVec);

  % If a decoding error did not occur, accumulate the number of corrected
  % errors using the cumulative sum objet.
  if errs >= 0
    correctedErrors = cumulativeSum(errs);
  end

  % Convert integers to bits and compute the channel BER.
  chanErrorStats(:,1) = ...
    chanBERCalc(intToBit1(encData),intToBit1(demodData));

  % Convert integers to bits and compute the coded BER.
  codedErrorStats(:,1) = ...
    codedBERCalc(intToBit2(data),intToBit2(estData));
end

Объекты измерения коэффициента ошибок, chanBERCalc и codedBERCalc, выведите векторы 3 на 1, содержащие обновления измеренного значения BER, количество ошибок и общее количество битных передач. Отобразите закодированный BER и общее количество ошибок, откорректированных декодером RS.

codedBitErrorRate = codedErrorStats(1)
totalCorrectedErrors = correctedErrors
codedBitErrorRate =

   4.3198e-05


totalCorrectedErrors =

   578

Можно добавить цикл for вокруг цикла обработки выше, чтобы запустить симуляции для набора значений Eb/N0. Симуляции были запущены оффлайн для незакодированных значений Eb/N0 в 4:15 дБ, целевое количество ошибок, равных 5 000, и максимальное количество передач, равных 50×106. Результаты симуляции показывают в следующем рисунке. Для сравнения рисунок также показывает результаты, полученные в примере “Первая часть Кодирования Тростника-Solomon – Стирания”, которые соответствуют системе со стираниями, но никаким прокалыванием.

От кривых заметьте, что BER канала немного лучше в проколотом случае. Причина этого состоит в том, что закодированный E b/N0 немного выше. С другой стороны, закодированный BER хуже в проколотом случае, потому что два прокола уменьшают поддержку с коррекцией ошибок кода одним, оставляя способным откорректировать (только 10-6-2)/2 = 1 ошибка на кодовую комбинацию.

Сводные данные

Пример использовал несколько Системных объектов, чтобы симулировать прямоугольную 64-QAM систему связи по каналу AWGN с блочным кодированием RS. Это показало, как сконфигурировать Системные объекты энкодера/декодера RS, чтобы получить проколотые коды. Производительность системы была измерена с помощью канала, и закодированные кривые BER получили использование объектов системы измерения коэффициента ошибок.

Пример “Часть III Кодирования Тростника-Solomon – Сокращение” показывает, как выполнить блочное кодирование RS с сокращенными кодами.

Приложение

Этот пример использует следующий скрипт и функцию помощника:

Выбранная библиография

[1] Г. К. Кларк младший, Дж. Б. Каин, кодирование с коррекцией ошибок для цифровой связи, Пленум-Пресс, Нью-Йорк, 1981.

Для просмотра документации необходимо авторизоваться на сайте