Эта модель показывает, как сконфигурировать коды Тростника-Solomon (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. Кроме того, период каждой системы координат в модели остается постоянным в 53 секунды, соответствуя шагу расчета 1 секунды при выходе Случайного Целочисленного Генератора. Кроме того, время символа при выходе Энкодера RS уменьшается на коэффициент скорости кода, потому что 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 при выходе декодера. Мы устанавливаем время остановки симуляции к inf, затем симулируем, пока 100 битовых ошибок не собраны из Декодера RS. Отобразите общее количество откорректированных ошибок, 64-QAM BER и BER RS.
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, собирая 1 000 ошибок из блока RS Decoder. Из-за прокалывания, размерности сигнала из энкодера 61 1, а не 63 1 в модели без прокалывания. Создать подсистема Вектора Стираний должна также составлять различия в размере, когда она создает 61 1 вектор стираний. Модель RSCodingErasuresPunctExample показывают здесь.
model_ep = 'RSCodingErasuresPunctExample';
open_system(model_ep);
sim(model_ep)
Сравните BERs для декодирования стираний с и без прокалывания.
BER из 64-QAM Демодулятора немного лучше в проколотом случае, потому что Eb/N0 в демодулятор немного выше. Однако BER из Декодера RS намного хуже в проколотом случае, потому что два прокола уменьшают поддержку с коррекцией ошибок кода одним, оставляя способным откорректировать (только 10-6-2)/2 = 1 ошибка на кодовую комбинацию. Отобразите общее количество откорректированных ошибок, 64-QAM BER и BER RS для кодов 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);
Мы симулируем модель, еще раз собирая 1 000 ошибок из блока RS Decoder. Обратите внимание на то, что размерности сигнала из Энкодера RS 26x1, из-за 35 символов сокращения и 2 символов прокалывания. Еще раз Создать подсистема Вектора Стираний должна также составлять различие в размере, вызванное сокращенным кодом.
sim(model_eps)
Сравните эффективность BER для декодирования со стираниями только, со стираниями и проколами, и со стираниями, проколами и сокращением.
BER из 64-QAM Демодулятора хуже с сокращением, чем это без сокращения. Это вызвано тем, что скорость кода сокращенного кода намного ниже, чем скорость кода несокращенного кода, и поэтому закодированный Eb/N0 в демодулятор хуже с сокращением. Сокращенный код имеет ту же возможность с коррекцией ошибок как несокращенный код для того же Eb/N0, но сокращение деклараций Eb/N0 в форме более высокого BER из Декодера RS с сокращением, чем без. Сравните общее количество откорректированных ошибок, 64-QAM BER и BER RS для кодов 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);