Кодирование Рида-Соломона с помощью стираний, проколов и укорочения в Simulink

Эта модель показывает, как сконфигурировать коды Рида-Соломона (RS), чтобы выполнить блочное кодирование с помощью стираний, проколов и укорочения.

Декодеры RS могут исправлять как ошибки, так и стирания. Стирания может быть сгенерирована приемником, который идентифицирует наиболее ненадежные символы в данном кодовом слове. Когда приемник стирает символ, он заменяет символ на нуль и передает флаг декодеру, указывающий, что символ является стиранием, а не действительным кодовым символом.

В сложение энкодер может сгенерировать проколы, для которых определенные символы четности всегда удаляются из его выхода. Декодер, который знает шаблон прокола, вставляет нули в положения прокола и рассматривает эти символы как стирания. Декодер обрабатывает сгенерированные энкодером проколы и сгенерированные приемником стирания точно так же, когда он декодируется.

Прокалывание имеет дополнительное преимущество, делая скорость кода бита более гибкой, за счет некоторых возможностей коррекции ошибок. Укороченные коды достигают той же гибкости скорости кода, не ухудшая эффективность коррекции ошибок, учитывая ту же входную Eb/N0 демодулятора. Обратите внимание, что прокалывание является удалением символов четности из кодового слова, а укорочение - удалением символов сообщений из кодового слова.

Декодирование с сгенерированными приемником стираниями

Этот пример показывает (63,53) код RS, работающий совместно со схемой 64-QAM модуляции. Поскольку код может исправить (63-53 )/2 = 5 ошибок, он может альтернативно исправить (63-53) = 10 стираний. Для каждого демодулированного кодового слова приемник определяет шесть наименее надежных символов путем нахождения символов в области принятия решения, которые являются ближайшими к контуру принятия решения. Затем он стирает эти символы. Модель RSCodingErasuresExample показана здесь.

model_e = 'RSCodingErasuresExample';
open_system(model_e);
close_system([model_e,'/Received Signal Scatter Plot'])
close_system([model_e,'/Erased Signal Scatter Plot'])

Симуляция и визуализация только с стираниями

Задайте параметры системной симуляции:

RS_TsUncoded = 1; % Sample time (s)
RS_n = 63; % Codeword length
RS_k = 53; % Message length
RS_MQAM = 64; % QAM order
RS_numBitsPerSymbol = ... % 6 bits per symbol
    log2(RS_MQAM);
RS_sigPower = 42; % Assume points at +/-1, +/-3, +/-5, +/-7
RS_numErasures = 6; % Number of erasures
RS_EbNoUncoded = 15; % In dB

Система моделируется на незакодированной Eb/N0 15 дБ. Однако кодированное Eb/N0 уменьшается из-за избыточных символов, добавленных RS Encoder. Кроме того, период каждой системы координат в модели остается постоянным на 53 секунде, что соответствует шагу расчета 1 секунду на выходе генератора случайных целых чисел. Кроме того, время символа на выходе RS Encoder уменьшается на множитель скорости кода, поскольку 63 символа выводятся за время системы координат 53 секунды. Блок AWGN Channel учитывает это с помощью следующих параметров:

RS_EbNoCoded = RS_EbNoUncoded + 10*log10(RS_k/RS_n);
RS_TsymCoded = RS_TsUncoded * (RS_k/RS_n);

Приемник определяет, какие символы стирать, найдя 64-QAM символы, по кодовому слову, которые наиболее близки к контуру принятия решения. Он удаляет шесть наименее надежных кодовых символов, что все еще позволяет RS-декодеру исправлять (10-6 )/2 = 2 ошибки на кодовое слово.

Запустите симуляцию и отобразите полученные символы и те символы, которые были стерты.

sim(model_e)
open_system([model_e,'/Received Signal Scatter Plot'])
open_system([model_e,'/Erased Signal Scatter Plot'])
%

Эффективность BER только при стирании

Исследуйте эффективность BER на выходе декодера. Мы устанавливаем время остановки симуляции в inf, затем моделируем, пока 100-битные ошибки не будут собраны из RS Decoder. Отображение общего количества исправленных ошибок, 64-QAM BER и RS BER.

fprintf('Total number of corrected errors with\n')
fprintf('erasures: %d\n',totCorrErrors_e(1))
fprintf('64-QAM BER with\n')
fprintf('erasures: %s\n',channelBER_e(1))
fprintf('RS BER with\n')
fprintf('erasures: %s\n',codedBER_e(1))
Total number of corrected errors with
erasures: 6905
64-QAM BER with
erasures: 1.702521e-03
RS BER with
erasures: 2.589668e-06

Симуляция с стираниями и проколами

В дополнение к декодированию стираний, сгенерированных приемником, декодер RS может исправлять пункции, сгенерированные кодером. Алгоритм декодирования идентичен для этих двух случаев, но сумма проколов и стираний в относительных словах не может превысить вдвое возможность исправления ошибок кода. Рассмотрим следующую модель, которая выполняет декодирование как для стираний, так и для проколов.

Один и тот же вектор прокола задан как в блоках энкодера, так и в блоках декодера. В этом примере проколы двух символов из каждого кодового слова. Векторные значения «1» указывают на непункционированные символы, а значения «0» - на проколотые символы. Однако в векторе стирания значения «1» указывают на стертые символы, в то время как значения «0» указывают на неистертые символы.

Некоторые параметры для блока AWGN Channel теперь немного отличаются, потому что длина кодового слова теперь отличается от предыдущего примера. Блок учитывает различие в размере со следующим кодом:

RS_numPuncs = 2;
RS_EbNoCoded = RS_EbNoUncoded + 10*log10(RS_k / (RS_n - RS_numPuncs));
RS_TsymCoded = RS_TsUncoded * (RS_k / (RS_n - RS_numPuncs));

Моделируем модель, RSCodingErasuresPunctExample.mdl, собирая 1000 ошибок из блока RS Decoder. Из-за прокола, размерности сигнала из энкодера являются 61 на 1, а не 63 на 1 в модели без прокола. Подсистема Create Erasures Vector должна также учитывать различия в размере, поскольку она создает вектор стирания 61 на 1. Модель RSCodingErasuresPunctExample показана здесь.

model_ep = 'RSCodingErasuresPunctExample';
open_system(model_ep);

sim(model_ep)

Эффективность BER с помощью стираний и проколов

Сравните BER для декодирования стираний с проколом и без него.

BER из 64-QAM Demodulator немного лучше в проколотом случае, потому что Eb/N0 в демодулятор немного выше. Однако BER из RS-декодера намного хуже в проколе, потому что две проколы уменьшают возможность исправления ошибок кода на единицу, оставляя его в состоянии исправить только (10-6-2 )/2 = 1 ошибку на кодовое слово. Отображение общего количества исправленных ошибок, 64-QAM BER и RS BER для кодов RS с помощью стираний и проколов.

fprintf('Total number of corrected errors with\n')
fprintf('              erasures: %d\n',totCorrErrors_e(1))
fprintf('erasures and punctures: %d\n',totCorrErrors_ep(1))
fprintf('64-QAM BER with\n')
fprintf('              erasures: %s\n',channelBER_e(1))
fprintf('erasures and punctures: %s\n',channelBER_ep(1))
fprintf('RS BER with\n')
fprintf('              erasures: %s\n',codedBER_e(1))
fprintf('erasures and punctures: %s\n',codedBER_ep(1))
Total number of corrected errors with
              erasures: 6905
erasures and punctures: 1960
64-QAM BER with
              erasures: 1.702521e-03
erasures and punctures: 1.475314e-03
RS BER with
              erasures: 2.589668e-06
erasures and punctures: 5.627692e-05

Определение укороченного кода

Укорочение блочного кода удаляет символы из его фрагмента сообщения, где прокалывание удаляет символы из его фрагмента четности. Можно включать как методы с блоками энкодера RS, так и с блоками декодера.

Для примера, чтобы сократить (63,53) код до (53,43) кода, можно просто ввести 63, 53 и 43 для n, k и s соответственно в масках блоков энкодера и декодера. Модель RSCodingErasuresPunctShortExample показана здесь.

model_eps = 'RSCodingErasuresPunctShortExample';
open_system(model_eps);

Симуляция с стираниями, проколами и укорочением

Поскольку укорочение изменяет скорость кода, так же как и прокалывание, параметры AWGN должны быть изменены снова. Блок AWGN Channel учитывает это следующим кодом:

RS_EbNoCoded = RS_EbNoUncoded + ...
    10*log10(RS_s  / (RS_n - RS_k + RS_s - RS_numPuncs));
RS_TsymCoded = RS_TsUncoded * RS_s / (RS_n - RS_k + RS_s - RS_numPuncs);

Моделируем модель, еще раз собирая 1000 ошибок из блока RS Decoder. Обратите внимание, что размерности сигнала из RS Encoder составляют 26x1, из-за 35 символов укорочения и 2 символов прокалывания. Еще раз, подсистема Create Erasures Vector должна также учитывать различие в размере, вызванную укороченным кодом.

sim(model_eps)

Эффективность BER с помощью стираний, проколов и укорочения

Сравните эффективность BER для декодирования только со стираниями, со стираниями и проколами, а также с стираниями, проколами и укорочением.

BER из 64-QAM Demodulator хуже с укорочением, чем без укорочения. Это происходит потому, что скорость кода укороченного кода намного ниже, чем скорость кода некоротированного кода, и поэтому закодированное Eb/N0 в демодулятор хуже с укорочением. Укороченный код имеет ту же возможность исправления ошибок, что и некоротированный код для того же Eb/N0, но уменьшение Eb/N0 проявляется в виде более высокой BER из декодера RS с укорочением, чем без. Сравните общее количество исправленных ошибок, 64-QAM BER и RS BER для кодов RS с стираниями, проколами и укорочением.

fprintf('Total number of corrected errors\n')
fprintf( ...
    '                           erasures: %d\n',totCorrErrors_e(1))
fprintf( ...
    '             erasures and punctures: %d\n',totCorrErrors_ep(1))
fprintf( ...
    'erasures, punctures, and shortening: %d\n',totCorrErrors_eps(1))
fprintf('64-QAM BER with\n')
fprintf('                           erasures: %s\n',channelBER_e(1))
fprintf('             erasures and punctures: %s\n',channelBER_ep(1))
fprintf('erasures, punctures, and shortening: %s\n',channelBER_eps(1))
fprintf('RS BER with\n')
fprintf('                           erasures: %s\n',codedBER_e(1))
fprintf('             erasures and punctures: %s\n',codedBER_ep(1))
fprintf('erasures, punctures, and shortening: %s\n',codedBER_eps(1))
Total number of corrected errors
                           erasures: 6905
             erasures and punctures: 1960
erasures, punctures, and shortening: 3287
64-QAM BER with
                           erasures: 1.702521e-03
             erasures and punctures: 1.475314e-03
erasures, punctures, and shortening: 3.590801e-03
RS BER with
                           erasures: 2.589668e-06
             erasures and punctures: 5.627692e-05
erasures, punctures, and shortening: 9.748840e-05

Дальнейшие исследования

Можно экспериментировать с этими системами, запустив их по циклу Eb/N0 значений и сгенерировав для них BER-кривую. Затем можно сравнить их эффективность с теоретической системой 64-QAM/RS без стираний, проколов или укорочения. Используйте BERTool, чтобы сгенерировать теоретические кривые BER.

close_system(model_e,0);
close_system(model_ep,0);
close_system(model_eps,0);