В этой модели показано, как настроить коды Рида-Соломона (RS) для выполнения блочного кодирования со стиранием, проколами и укорочением.
Декодеры RS могут исправлять как ошибки, так и стирание. Стирание может генерироваться приемником, который идентифицирует наиболее ненадежные символы в данном кодовом слове. Когда приемник стирает символ, он заменяет символ нулем и передает флаг декодеру, указывающий, что символ является стиранием, а не допустимым кодовым символом.
Кроме того, кодер может генерировать проколы, для которых конкретные символы четности всегда удаляются из его выходного сигнала. Декодер, который знает шаблон прокола, вставляет нули в позиции прокола и рассматривает эти символы как стирание. Декодер обрабатывает проколы, генерируемые кодером, и стирания, генерируемые приемником, точно таким же образом, когда декодирует.
Прокалывание имеет дополнительное преимущество, заключающееся в том, что скорость кодирования становится более гибкой за счет некоторой возможности исправления ошибок. Укороченные коды обеспечивают одинаковую гибкость скорости кодирования без ухудшения характеристик коррекции ошибок при тех же входных Eb/N0 демодулятора. Следует отметить, что прокалывание представляет собой удаление символов четности из кодового слова, а укорочение представляет собой удаление символов сообщения из кодового слова.
В этом примере показан (63,53) код RS, работающий совместно со схемой модуляции 64-QAM. Так как код может исправлять (63-53 )/2 = 5 ошибок, он может исправлять (63-53) = 10 стираний. Для каждого демодулированного кодового слова приемник определяет шесть наименее надежных символов путем нахождения символов в области принятия решения, которые являются ближайшими к границе принятия решения. Затем он стирает эти символы. Здесь показана модель RSCodingEraselExample.
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. Кроме того, период каждого кадра в модели остается постоянным в течение 53 секунд, что соответствует времени выборки в 1 секунду на выходе генератора случайных чисел. Кроме того, время символа на выходе RS кодера уменьшается на коэффициент кодовой скорости, поскольку 63 символа выводятся в течение времени кадра 53 секунды. Блок канала AWGN учитывает это, используя следующие параметры:
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 на выходе декодера. Мы устанавливаем время остановки моделирования на inf, а затем имитируем до тех пор, пока 100 битовых ошибок не будут собраны из RS-декодера. Отображение общего количества исправленных ошибок, 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 теперь немного отличаются, потому что длина кодового слова теперь отличается от предыдущего примера. Блок учитывает разницу в размерах следующим кодом:
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));
Мы моделируем модель, RSCodingErasedPunctExample.mdl, собирая 1000 ошибок из блока RS-декодера. Из-за прокалывания размеры сигнала из кодера 61 на 1, а не 63 на 1 в модели без прокалывания. Подсистема Create Erasures Vector также должна учитывать различия в размерах при создании вектора стирания 61 на 1. Здесь показана модель RSCodingErasingPunctExample.
model_ep = 'RSCodingErasuresPunctExample';
open_system(model_ep);

sim(model_ep)
Сравните BER для декодирования стираний с прокалыванием и без него.
BER из 64-QAM демодулятора немного лучше в проколотом случае, потому что 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 соответственно в масках блоков кодера и декодера. Здесь показана модель RSCodingErasingPunctShortExample.
model_eps = 'RSCodingErasuresPunctShortExample';
open_system(model_eps);

Поскольку укорочение изменяет скорость кода так же, как и прокалывание, параметры AWGN должны быть снова изменены. Блок канала AWGN имеет для этого следующий код:
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-декодера. Следует отметить, что размеры сигнала из кодера RS составляют 26x1 из-за 35 символов укорочения и 2 символов прокалывания. Кроме того, подсистема Create Erasures Vector также должна учитывать разницу в размерах, вызванную укороченным кодом.
sim(model_eps)
Сравните производительность BER для декодирования только со стиранием, со стиранием и проколами, а также со стиранием, проколами и укорочением.
BER из 64-QAM демодулятора хуже с укорочением, чем без укорочения. Это происходит потому, что кодовая скорость укороченного кода намного ниже, чем кодовая скорость укороченного кода, и поэтому кодированный 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);