exponenta event banner

коммуникация. RSDecoder

Декодирование данных с помощью декодера Рида-Соломона

Описание

RSDecoder объект восстанавливает вектор сообщения из вектора кодового слова Рида-Соломона. Для правильного декодирования значения свойств для этого объекта должны соответствовать значениям свойств в соответствующем объекте RS Encoder.

Для декодирования данных с использованием схемы декодирования Рида-Соломона:

  1. Определите и настройте объект-декодер Рида-Соломона. См. раздел Строительство.

  2. Звонить step декодировать данные в соответствии со свойствами comm.RSDecoder. Поведение step относится к каждому объекту на панели инструментов.

Примечание

Начиная с R2016b, вместо использования step для выполнения операции, определенной системным object™, можно вызвать объект с аргументами, как если бы это была функция. Например, y = step(obj,x) и y = obj(x) выполнять эквивалентные операции.

Строительство

dec = comm.RSDecoder создает объект System блочного декодера, dec. Этот объект выполняет декодирование Рида-Соломона (RS).

dec = comm.RSDecoder(N,K) создает объект RS-декодера, dec с CodewordLength свойство имеет значение N и MessageLength свойство имеет значение K.

dec = comm.RSDecoder(N,K,GP) создает объект RS-декодера, dec с CodewordLength свойство имеет значение N, MessageLength свойство имеет значение K, и GeneratorPolynomial свойство имеет значение GP.

dec = comm.RSDecoder(N,K,GP,S) создает объект RS-декодера, dec с CodewordLength свойство имеет значение N, MessageLength свойство имеет значение K, GeneratorPolynomial свойство имеет значение GP, и ShortMessageLength свойство имеет значение S.

dec = comm.RSDecoder(N,K,GP,S,Name,Value) создает объект RS-декодера, dec с CodewordLength свойство имеет значение N, MessageLength свойство имеет значение K, GeneratorPolynomial свойство имеет значение GP, и каждое указанное свойство Name установить в указанное значение Value.

dec = comm.RSDecoder(Name,Value) создает объект RS-декодера, dec, каждое указанное имя свойства имеет указанное значение. Можно указать дополнительные аргументы пары имя-значение в любом порядке как (Name1,Value1,...,NameN,ValueN).

Свойства

Примечание

Длины входных и выходных сигналов перечислены в разделе «Длины входных и выходных сигналов в системных объектах BCH и RS» на comm.BCHDecoder справочная страница.

BitInput

Предположим, что вход - это биты

Укажите, содержит ли вход биты или целые числа. Значение по умолчанию: false.

  • При установке для этого свойства значения false, значение входных данных для запуска объекта должно быть числовым вектором-столбцом целых чисел. При выполнении объекта выводится кодированный вектор вывода данных. Результатом вывода является вектор столбца целых чисел. Каждый символ, который формирует входное сообщение и выходные кодовые слова, является целым числом в диапазоне [0, 2M - 1]. Эти целые числа соответствуют элементу конечного поля Галуа gf(2M). M - степень примитивного многочлена, заданная с помощью PrimitivePolynomialSource и PrimitivePolynomial свойства.

  • При установке для этого свойства значения true, входное значение должно быть числовым вектором-столбцом битов. Результат вывода кодированных данных является вектором столбцов битов.

CodewordLength

Длина кодового слова

Укажите длину кодового слова кода RS в символах как значение скалярного числа с двойной точностью и положительным числом. Значение по умолчанию: 7.

Для полноразмерного кода RS значение этого свойства должно быть 2M - 1, где M - целое число, равное 3 ≤ M ≤ 16.

MessageLength

Длина сообщения

Укажите длину сообщения в символах как положительное целое скалярное значение с двойной точностью. Значение по умолчанию: 3.

ShortMessageLengthSource

Источник короткой длины сообщения

Укажите источник укороченного сообщения как Auto или Property.

  • При установке для этого свойства значения Auto, код RS определяется CodewordLength, MessageLength, GeneratorPolynomial, и PrimitivePolynomial свойства.

    При установке для этого свойства значения Property, необходимо указать ShortMessageLength , которое используется вместе с другими свойствами для определения кода RS. Значение по умолчанию: Auto.

ShortMessageLength

Укороченная длина сообщения

Укажите длину укороченного сообщения в символах в виде положительного целого скаляра с двойной точностью, значение которого должно быть меньше или равно MessageLength. Значение по умолчанию: 3.

Когда ShortMessageLength < MessageLength, код RS укорачивается.

GeneratorPolynomialSource

Источник полинома генератора

Укажите источник полинома генератора как Auto или Property. Значение по умолчанию: Auto.

  • При установке для этого свойства значения Autoобъект автоматически выбирает полином генератора. Объект вычисляет полином генератора на основе значения PrimitivePolynomial собственность.

  • При установке для этого свойства значения Property, необходимо указать полином генератора с помощью GeneratorPolynomial собственность.

GeneratorPolynomial

Полином генератора

Укажите полином генератора для кода RS как вектор целочисленной строки с двойной точностью или как вектор строки поля Галуа. Записи вектора строки поля Галуа должны находиться в диапазоне [0, 2M - 1] и представлять полином генератора в порядке убывания степеней. Каждый коэффициент является элементом поля Галуа gf(2M), представленный в целочисленном формате. Длина полинома генератора должна быть CodewordLengthMessageLength + 1. Значение по умолчанию является результатом rsgenpoly(7,3,[],[],'double'), что соответствует [1 3 1 2 3].

При использовании этого объекта для создания кода необходимо задать для полинома генератора вектор целочисленной строки с двойной точностью.

Это свойство применяется при установке GeneratorPolynomialSource кому Property.

CheckGeneratorPolynomial

Включить проверку полинома генератора

Установить для этого свойства значение true для выполнения проверки полинома генератора. Значение по умолчанию: true.

Эта проверка проверяет, что XCodewordLength + 1 делится на полином генератора, указанный в GeneratorPolynomial собственность. Для кодов с генераторными многочленами высокой степени отключение проверки ускоряет обработку. Рекомендуется выполнить проверку хотя бы один раз, прежде чем устанавливать для этого свойства значение false.

Допустимый полином генератора задаётся (X - αB) × (X - α (B + 1)) ×... × ( X-α (B +CodewordLengthMessageLength - 1)), где α - корень примитивного многочлена, а B - целое число. Если значение B равно 1, можно установить для этого свойства значение false. В противном случае всегда устанавливайте для этого свойства значение true. Для получения дополнительной информации о B см. rsgenpoly страница ссылки на функцию.

Это свойство применяется при установке GeneratorPolynomialSource кому Property.

PrimitivePolynomialSource

Источник примитивного многочлена

Укажите источник полинома примитива как Auto или Property. Значение по умолчанию: Auto.

  • При установке для этого свойства значения Auto, объект использует примитивный многочлен степени M = ceil (Конструктор фиксированных точек) (log2 (CodewordLength + 1)).

  • При установке для этого свойства значения Property, необходимо указать многочлен с помощью PrimitivePolynomial.

PrimitivePolynomial

Примитивный многочлен

Укажите примитивный многочлен, определяющий конечное поле gf(2M), соответствующие целым числам, которые формируют сообщения и кодовые слова. Значение по умолчанию является результатом fliplr(de2bi(primpoly(3))), который является [1 0 1 1] или многочлен x3  + x + 1. Задайте это свойство как двоичный вектор строки с двойной точностью, представляющий примитивный многочлен поверх gf(2) степени М в порядке убывания мощностей.

Это свойство применяется при установке PrimitivePolynomialSource кому Property.

PuncturePatternSource

Источник прокола

Укажите источник образца прокола как None или Property. Значение по умолчанию: None.

  • При установке для этого свойства значения None, объект не применяет проколы к коду.

  • При установке для этого свойства значения Propertyобъект прокалывает код на основе вектора шаблона прокола, указанного в PuncturePattern.

PuncturePattern

Вектор прокола

Укажите шаблон, используемый для прокалывания закодированных данных в виде двоичного вектора-столбца длиной с двойной точностью (CodewordLengthMessageLength). Значение по умолчанию: [ones(2,1); zeros(2,1)]. Нули в векторе шаблона прокола указывают положение символов четности, которые проколоты или исключены из каждого кодового слова.

Это свойство применяется при установке PuncturePatternSource кому Property.

ErasuresInputPort

Включить ввод стираний

Установить для этого свойства значение true задание вектора стираний в качестве входных данных при запуске объекта. Значение по умолчанию: false. Входной сигнал стирания должен быть вектором с двойной точностью или логическим двоичным столбцом, который указывает, какие символы входных кодовых слов нужно стереть. Длина вектора стирания объясняется в характеристиках длины входного и выходного сигналов в системных объектах BCH и RS.

При установке для этого свойства значения false, объект не предполагает стирание.

NumCorrectedErrorsOutputPort

Включить количество исправленных ошибок

Установить для этого свойства значение true для получения количества исправленных ошибок в качестве выходных данных при запуске объекта. Значение по умолчанию: true. Неотрицательное значение в i-м элементе выходного вектора ошибки обозначает количество исправленных ошибок в i-м входном кодовом слове. Значение -1 в i-м элементе выходного вектора ошибки указывает, что произошла ошибка декодирования для этого кодового слова. Ошибка декодирования возникает, когда входное кодовое слово имеет больше ошибок, чем возможность исправления ошибок кода RS.

OutputDataType

Тип данных вывода

Укажите тип выходных данных как Same as input, double, или logical. Значение по умолчанию: Same as input.

Это свойство применяется при установке BitInput кому true.

Методы

шагДекодирование данных с помощью декодера Рида-Соломона
Общие для всех системных объектов
release

Разрешить изменение значения свойства объекта системы

Примеры

свернуть все

Передача кодированного RS 8-DPSK-modulated потока символов через канал AWGN. Затем выполните демодуляцию, декодирование и подсчет ошибок.

    enc = comm.RSEncoder;
    mod = comm.DPSKModulator('BitInput',false);
    chan = comm.AWGNChannel(...
                'NoiseMethod','Signal to noise ratio (SNR)','SNR',10);
    demod = comm.DPSKDemodulator('BitOutput',false);
    hDdecec = comm.RSDecoder;
    errorRate = comm.ErrorRate('ComputationDelay',3);

    for counter = 1:20
      data = randi([0 7], 30, 1);
      encodedData = step(enc, data);
      modSignal = step(mod, encodedData);
      receivedSignal = step(chan, modSignal);
      demodSignal = step(demod, receivedSignal);
      receivedSymbols = step(hDdecec, demodSignal);
      errorStats = step(errorRate, data, receivedSymbols);            
    end      
      
  fprintf('Error rate = %f\nNumber of errors = %d\n', ...
      errorStats(1), errorStats(2))
Error rate = 0.115578
Number of errors = 69

Передача кодированных данных Рида-Соломона с использованием QPSK по каналу AWGN. Демодулировать и декодировать принятый сигнал и собирать статистику ошибок. Вычислите теоретическую частоту битовых ошибок (BER) для кодированных и некодированных данных. Постройте график результатов BER для сравнения производительности.

Определите параметры примера.

rng(1993);     % Seed random number generator for repeatable results
M = 4;         % Modulation order
bps = log2(M); % Bits per symbol
N = 7;         % RS codeword length
K = 5;         % RS message length

Создание модулятора, демодулятора, канала AWGN и объектов частоты ошибок.

pskModulator = comm.PSKModulator('ModulationOrder',M,'BitInput',true);
pskDemodulator = comm.PSKDemodulator('ModulationOrder',M,'BitOutput',true);
awgnChannel = comm.AWGNChannel('BitsPerSymbol',bps);
errorRate = comm.ErrorRate;

Создайте (7,5) пару кодера Рида-Соломона и декодера, которая принимает битовые входы.

rsEncoder = comm.RSEncoder('BitInput',true,'CodewordLength',N,'MessageLength',K);
rsDecoder = comm.RSDecoder('BitInput',true,'CodewordLength',N,'MessageLength',K);

Задайте диапазон значений Eb/N0 и учет усиления кодирования RS. Инициализируйте матрицу статистики ошибок.

ebnoVec = (3:0.5:8)';
ebnoVecCodingGain = ebnoVec + 10*log10(K/N); % Account for RS coding gain
errorStats = zeros(length(ebnoVec),3);

Оцените частоту битовых ошибок для каждого значения Eb/N0. Моделирование выполняется до тех пор, пока не будет обнаружено 100 ошибок или 107 битов. Основная обработка цикла моделирования включает в себя кодирование, модуляцию, демодуляцию и декодирование.

for i = 1:length(ebnoVec)
    awgnChannel.EbNo = ebnoVecCodingGain(i);
    reset(errorRate)
    while errorStats(i,2) < 100 && errorStats(i,3) < 1e7
        data = randi([0 1],1500,1);                % Generate binary data
        encData = rsEncoder(data);                 % RS encode
        modData = pskModulator(encData);           % Modulate
        rxSig = awgnChannel(modData);              % Pass signal through AWGN
        rxData = pskDemodulator(rxSig);            % Demodulate
        decData = rsDecoder(rxData);               % RS decode
        errorStats(i,:) = errorRate(data,decData); % Collect error statistics
    end
end

Подгонка кривой к данным BER с помощью berfit. Создание оценки производительности QPSK с кодированием и без него с использованием bercoding и berawgn функции.

berCurveFit = berfit(ebnoVecCodingGain,errorStats(:,1));
berwCoding = bercoding(ebnoVec,'RS','hard',N,K,'psk',M,'nondiff');
berNoCoding = berawgn(ebnoVec,'psk',M,'nondiff');

Постройте график кодированных данных BER RS, подгонки кривой данных BER, теоретической производительности с кодированием RS и теоретической производительности без кодирования RS. (7,5) Код RS улучшает Eb/N0, необходимую для достижения частоты ошибок 10-2 бит, приблизительно на 1,2 дБ.

semilogy(ebnoVecCodingGain,errorStats(:,1),'b*', ...
ebnoVecCodingGain,berCurveFit,'c-',ebnoVecCodingGain,berwCoding,'r',ebnoVec,berNoCoding)
ylabel('BER')
xlabel('Eb/No (dB)')
legend('RS coded BER','Curve Fit','Theory with coding','Theory no coding')
grid

Figure contains an axes. The axes contains 4 objects of type line. These objects represent RS coded BER, Curve Fit, Theory with coding, Theory no coding.

Передача сокращенного потока символов RS-кодированного 256-QAM-modulated по каналу AWGN. Затем выполните демодуляцию, декодирование и подсчет ошибок.

Задайте параметры кода Рида-Соломона, где N - длина кодового слова, K - номинальная длина сообщения, и S - укороченная длина сообщения. Установите порядок модуляции, Mи количество кадров, L.

N = 255;
K = 239;
S = 188;
M = 256;
L = 50;

Создайте системный объект канала AWGN и системный объект частоты ошибок.

awgnChan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
    'EbNo',15,'BitsPerSymbol',log2(M));
errorRate = comm.ErrorRate('ComputationDelay',3);

Создайте полином генератора Рида-Соломона из стандарта DVB-T.

gp = rsgenpoly(N,K,[],0);

Создайте пару кодера Рида-Соломона и декодера, используя укороченную длину сообщения. Sи многочлен генератора DVB-T, gp.

enc = comm.RSEncoder(N,K,gp,S);
dec = comm.RSDecoder(N,K,gp,S);

Формирование случайных кадров символов, длина которых равна одному блоку сообщения. Кодирование, модуляция, применение AWGN, демодуляция, декодирование и сбор статистики.

for counter = 1:L
    data = randi([0 1],S,log2(M));
    encodedData = step(enc,bi2de(data));
    modSignal = qammod(encodedData,M,'UnitAveragePower',true);
    rxSignal = awgnChan(modSignal);
    demodSignal = qamdemod(rxSignal,M,'UnitAveragePower',true);
    rxBits = dec(demodSignal);
    dataOut = de2bi(rxBits);
    errorStats = errorRate(data(:),dataOut(:));
end

Отображение частоты ошибок и количества ошибок.

fprintf('Error rate = %5.2e\nNumber of errors = %d\n', ...
    errorStats(1), errorStats(2))
Error rate = 2.01e-02
Number of errors = 1509

В этом примере показано, как настроить comm.RSEncoder и comm.RSDecoder Системные объекты для выполнения блочного кодирования Рида-Соломона (RS) со стиранием при моделировании системы связи. Декодеры RS могут исправлять как ошибки, так и стирание. Приемник, который идентифицирует наиболее ненадежные символы в данном кодовом слове, может генерировать стирание. Когда приемник стирает символ, он заменяет его нулем. Затем приемник передает в декодер флаг, указывающий, что символ является стиранием, а не допустимым кодовым символом. Кроме того, кодер может генерировать проколы, для которых конкретные символы четности всегда удаляются из его выходного сигнала. Декодер, который знает шаблон прокола, вставляет нули в позиции прокола и рассматривает эти символы как стирание. Декодер обрабатывает проколы, генерируемые кодером, и стирания, генерируемые приемником, точно так же, когда декодирует символ. Прокалывание также имеет дополнительное преимущество, заключающееся в повышении гибкости кодовой скорости за счет некоторой возможности исправления ошибок. Укороченные коды достигают той же гибкости скорости кодирования без ухудшения характеристик коррекции ошибок, учитывая то же самое отношение входной энергии демодулятора на бит к спектральной плотности мощности шума (Eb/N0). Следует отметить, что прокалывание представляет собой удаление символов четности из кодового слова, а укорочение представляет собой удаление символов сообщения из кодового слова.

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

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

Вспомогательная функция helperRSCodingConfig.m инициализирует параметры моделирования и настраивает comm.AWGNChannel и comm.ErrorRate Системные объекты, используемые для моделирования системы связи. Отношение некодированных Eb/N0 устанавливается равным EbNoUncoded = 15 дБ. Критерии остановки моделирования определяются для остановки моделирования, если происходит 500 ошибок или передается максимум 5e6 бит.

helperRSCodingConfig;

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

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

Создать comm.RSEncoder Системный объект и установка BitInput для указания того, что входы и выходы кодера являются целочисленными символами.

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

Создать comm.RSDecoder Системный объект, соответствующий конфигурации comm.RSEncoder объект.

rsDecoder = comm.RSDecoder(N,K,'BitInput',false);

Установите ErasuresInputPort true, чтобы указать стирание как вход в объект декодера.

rsDecoder.ErasuresInputPort = true;

Установите NumCorrectedErrorsOutputPort значение true, чтобы декодер выводил количество исправленных ошибок. Неотрицательное значение на выходе ошибки обозначает количество исправленных ошибок во входном кодовом слове. Значение -1 в выходных данных ошибки указывает на ошибку декодирования. Ошибка декодирования возникает, когда входное кодовое слово имеет больше ошибок, чем возможность исправления ошибок кода RS.

rsDecoder.NumCorrectedErrorsOutputPort = true;

Запустить цикл обработки потока

Моделирование системы связи для некодированного коэффициента Eb/N0 15 дБ. Некодированный Eb/N0 - это отношение, которое измерялось бы на входе канала, если бы в системе не было кодирования.

Сигнал, поступающий в канал AWGN, является кодированным сигналом, поэтому необходимо преобразовать некодированные значения Eb/N0 так, чтобы они соответствовали соотношению энергии на выходе кодера. Это отношение является кодированным отношением Eb/N0. Если ввести K символов в кодер и получить N выходных символов, то соотношение энергии задается скоростью K/N. Установите EbNo свойство объекта канала AWGN вычисленному кодированному значению Eb/N0.

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

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

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

Символы данных передают одно слово сообщения одновременно. Каждое слово сообщения имеет K символов в диапазоне [0 N].

    data = randi([0 N],K,1);

Закодируйте слово сообщения. Кодированное слово, encDataявляется (N-numPunc) символы длиной.

    encData = rsEncoder(data);

Модулировать кодированные данные и добавлять шум. затем демодулируют выход канала.

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

Используйте функцию helperRSCodingGetErasures.m helper, чтобы найти 6 наименее надежных символов и создать вектор стирания. Длина вектора стирания должна быть равна количеству символов в демодулированном кодовом слове. Единица в i-м элементе вектора стирает i-й символ в кодовом слове. Нули в векторе указывают на отсутствие стираний.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);
    

Декодируйте данные. Накапливайте количество исправленных ошибок с помощью объекта кумулятивной суммы.

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

При вычислении канала и кодированных BER преобразуйте целые числа в биты.

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1),reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1),reshape(de2bi(estData,log2(M))',[],1));
end

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

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0017
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 0
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 882

Можно добавить цикл for вокруг цикла обработки, описанного выше, для выполнения моделирования для набора значений Eb/N0. Моделирование выполнялось в автономном режиме для некодированных значений Eb/N0 в 4:15 дБ, целевого количества ошибок, равного 5000, и максимального количества передач, равного 50e6. Показаны результаты моделирования. ЧАСТОТА ОШИБОК ПО БИТАМ канала хуже, чем теоретическая 64-QAM ЧАСТОТА ОШИБОК ПО БИТАМ, потому что Eb/N0 уменьшен кодовым уровнем.

Резюме

В этом примере использовались несколько объектов системы для моделирования 64-QAM системы связи по каналу AWGN с блочным кодированием RS. Он показал, как настроить RS-декодер для декодирования символов со стиранием. Производительность системы измерялась с использованием канальных и кодированных кривых BER, полученных с использованием объектов системы измерения частоты ошибок.

Вспомогательные функции, используемые в этом примере:

В этом примере показано, как настроить comm.RSEncoder и comm.RSDecoder Системные объекты для выполнения блочного кодирования Рида-Соломона (RS) со стиранием и проколом при моделировании системы связи. Кодер может генерировать проколы для удаления определенных символов четности с его выхода. при наличии шаблона прокола декодер вставляет нули в позиции прокола и рассматривает эти символы как стирание. Декодер обрабатывает проколы, генерируемые кодером, и стирания, генерируемые приемником, точно таким же образом, когда декодирует. Прокалывание имеет дополнительное преимущество, заключающееся в повышении гибкости кодовой скорости за счет некоторой возможности исправления ошибок.

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

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

Вспомогательная функция helperRSCodingConfig.m инициализирует параметры моделирования и настраивает comm.AWGNChannel и comm.ErrorRate Системные объекты, используемые для моделирования системы связи. Коэффициент некодированного Eb/N0, EbNoUncoded имеет значение 15 дБ. Критерии остановки моделирования определяются для остановки моделирования, если возникают 500 ошибки или передается максимум 5 × 106 бит.

helperRSCodingConfig;

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

В этом примере используется тот же (63,53) код RS, работающий со схемой модуляции 64-QAM, которая сконфигурирована для стирания и прокалывания кода. Алгоритм RS декодирует сгенерированные приемником стирания и корректирует сгенерированные кодером проколы. Для каждого кодового слова сумма проколов и стираний не может превышать вдвое способность кода исправлять ошибки.

Создать comm.RSEncoder Системный объект и установка BitInput для указания того, что входы и выходы кодера являются целочисленными символами.

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

Создать comm.RSDecoder Системный объект, соответствующий конфигурации comm.RSEncoder объект. Затем установите ErasuresInputPort true, чтобы указать стирание как вход в объект декодера.

rsDecoder = comm.RSDecoder(N,K,'BitInput',false);
rsDecoder.ErasuresInputPort = true;

Чтобы включить прокалывание кода, установите PuncturePatternSource свойство для 'Property' и установите PuncturePattern к требуемому вектору пункционного шаблона. Один и тот же вектор прокола должен быть указан как в кодере, так и в декодере. В этом примере проколоты два символа из каждого кодового слова. Значения 1 в векторе шаблона прокола указывают незаконченные символы и значения 0 указывают проколотые символы.

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

rsDec.PuncturePatternSource = 'Property';
rsDec.PuncturePattern = rsEnc.PuncturePattern;

Запустить цикл обработки потока

Моделирование системы связи для некодированного коэффициента Eb/N0 15 дБ. Некодированный Eb/N0 - это отношение, которое измерялось бы на входе канала, если бы в системе не было кодирования.

Сигнал, поступающий в канал AWGN, является кодированным сигналом, поэтому необходимо преобразовать некодированные значения Eb/N0 так, чтобы они соответствовали соотношению энергии на выходе кодера. Это отношение является кодированным отношением Eb/N0. При вводе K символы для кодировщика и получения N выходные символы, то соотношение энергии задается K/N ставка. Поскольку длина кодовых слов, генерируемых RS-кодером, уменьшается на количество проколов, указанных в векторе шаблона прокола, значение закодированного отношения Eb/N0 необходимо регулировать для учета этих проколов. В этом примере число выходных символов равно (N - numPuncs) и отношение некодированных Eb/N0 относится к кодированным Eb/N0, как показано ниже. Установите EbNo свойство объекта канала AWGN вычисленному кодированному значению Eb/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)

Символы данных передают одно слово сообщения одновременно. Каждое слово сообщения имеет K символов в [0 N] диапазон.

    data = randi([0 N],K,1);

Закодируйте слово сообщения. Кодированное слово, encDataявляетсяNnumPunc) символы длиной.

    encData = rsEncoder(data);

Модулировать кодированные данные и добавлять шум. затем демодулируют выход канала.

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

Используйте функцию helperRSCodingGetErasures.m helper, чтобы найти 6 наименее надежных символов и создать вектор стирания. Длина вектора стирания должна быть равна количеству символов в демодулированном кодовом слове. Единица в i-м элементе вектора стирает i-й символ в кодовом слове. Нули в векторе указывают на отсутствие стираний.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);
    

Декодируйте данные. Накапливайте количество исправленных ошибок с помощью объекта кумулятивной суммы.

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

При вычислении канала и кодированных BER преобразуйте целые числа в биты.

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1),reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1),reshape(de2bi(estData,log2(M))',[],1));
end

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

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0015
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 0
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 632

Можно добавить цикл for вокруг цикла обработки, описанного выше, для выполнения моделирования для набора значений Eb/N0. Моделирование выполнялось в автономном режиме для некодированных значений Eb/N0 в 4:15 дБ, целевого количества ошибок, равного 5000, и максимального количества передач, равного 50 × 106. Этот показатель сравнивает результаты, достигнутые для

  • Кодирование RS только со стиранием

  • Кодирование RS со стиранием и прокалыванием

  • Теоретический BER для 64-QAM

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

Резюме

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

Вспомогательные функции, используемые в этом примере:

В этом примере показано, как настроить comm.RSEncoder и comm.RSDecoder Системные объекты для выполнения блочного кодирования Рида-Соломона (RS) для сокращения (63,53) кода до (28,18) кода. Представлено моделирование системы связи, состоящей из случайного источника, RS кодера, 64-QAM модулятора, AWGN канала, 64-QAM демодулятора и RS декодера.

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

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

Вспомогательная функция helperRSCodingConfig.m инициализирует параметры моделирования и настраивает comm.AWGNChannel и comm.ErrorRate Системные объекты, используемые для моделирования системы связи. Устанавливается коэффициент uncodedEb/N0 EbNoUncoded = 15 дБ. Критерии остановки моделирования определяются для остановки моделирования, если возникают 500 ошибки или передается максимум 5 × 106 бит.

helperRSCodingConfig;

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

В этом примере используется (63,53) код RS, работающий со схемой модуляции 64-QAM. Операция кодирования RS включает в себя стирание, прокалывание и сокращение кода. В этом примере показано, как сократить код (63,53) до кода (28,18).

Чтобы сократить (63,53) код путем 10 символов в (53,43) код, можно просто ввести 53 и 43 для CodewordLength и MessageLength свойства соответственно (с 2⌈log2 (53 + 1) -1 = 63). Однако для его сокращения путем 35 символов в код (28,18) необходимо явно указать, что символы принадлежат полю Галуа GF (26). В противном случае блоки RS будут предполагать, что код укорачивается от (31,21) кода (так как 2⌈log2 (28 + 1) ⌉ -1 = 31).

Создание пары comm.RSEncoder и comm.RSDecoder Системные объекты так, что они выполняют блочное кодирование с (28,18) кодом, сокращенным от (63,53) кода, который сконфигурирован для ввода и вывода целочисленных символов. Сконфигурируйте декодер для приема входных данных стирания и двух проколов. Для каждого кодового слова на выходе демодулятора 64-QAM приемник определяет шесть наименее надежных символов, используя вспомогательную функцию helperRSCodingGetErasures.m. Индексы, указывающие на местоположение этих ненадежных символов, передаются на вход декодера RS.

N = 63;  % Codeword length
K = 53;  % Message length
S = 18;  % Shortenened message length
numErasures = 6;
numPuncs = 2; 
rsEncoder = comm.RSEncoder(N, K, 'BitInput', false);
rsDecoder = comm.RSDecoder(N, K, 'BitInput', false, 'ErasuresInputPort', true);
rsEncoder.PuncturePatternSource = 'Property';
rsEncoder.PuncturePattern = [ones(N-K-numPuncs,1); zeros(numPuncs,1)];
rsDecoder.PuncturePatternSource = 'Property';
rsDecoder.PuncturePattern = rsEncoder.PuncturePattern;

Установите укороченные значения длины кодового слова и длины сообщения.

rsEncoder.ShortMessageLength = S;
rsDecoder.ShortMessageLength = S;

Укажите поле GF (26) в системных объектах RS-кодера/декодера, установив PrimitivePolynomialSource свойство для "Property' и PrimitivePolynomial свойство для примитивного многочлена 6-й степени.

primPolyDegree = 6;
rsEncoder.PrimitivePolynomialSource = 'Property';
rsEncoder.PrimitivePolynomial = de2bi(primpoly(primPolyDegree,'nodisplay'),'left-msb');

rsDecoder.PrimitivePolynomialSource = 'Property';
rsDecoder.PrimitivePolynomial = de2bi(primpoly(primPolyDegree,'nodisplay'),'left-msb');

Запустить цикл обработки потока

Моделирование системы связи для некодированного коэффициента Eb/N0 15 дБ. Некодированный Eb/N0 - это отношение, которое измерялось бы на входе канала, если бы в системе не было кодирования.

Сигнал, поступающий в канал AWGN, является кодированным сигналом, поэтому необходимо преобразовать некодированные значения Eb/N0 так, чтобы они соответствовали соотношению энергии на выходе кодера. Это отношение является кодированным отношением Eb/N0. При вводе K символы для кодировщика и получения N выходные символы, то соотношение энергии задается K/N ставка. Значение закодированного коэффициента Eb/N0 необходимо скорректировать для учета укороченных и проколотых кодовых слов. Количество выходных символов (N - numPuncs - S) и отношение некодированных Eb/N0 относится к кодированным Eb/N0, как показано ниже. Установите EbNo свойство объекта канала AWGN вычисленному кодированному значению Eb/N0.

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

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

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

Символы данных передают одно слово сообщения одновременно. Каждое слово сообщения имеет K-S символы в [0 (2 ^primPolyDegree) -1] диапазон.

    data = randi([0 2^primPolyDegree-1],S,1);

Закодируйте укороченное слово сообщения. Кодированное слово encData имеет вид (N-numPuncs-S) символы длиной.

    encData = rsEncoder(data);

Модулировать кодированные данные и добавлять шум. затем демодулируют выход канала.

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

Используйте функцию helperRSCodingGetErasures.m helper, чтобы найти 6 наименее надежных символов и создать вектор стирания. Длина вектора стирания должна быть равна количеству символов в демодулированном кодовом слове. Единица в i-м элементе вектора стирает i-й символ в кодовом слове. Нули в векторе указывают на отсутствие стираний.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);    

Декодируйте данные. Накапливайте количество исправленных ошибок с помощью объекта кумулятивной суммы.

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

При вычислении канала и кодированных BER преобразуйте целые числа в биты.

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1), ...
        reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1), ...
        reshape(de2bi(estData,log2(M))',[],1));
end

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

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0036
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 9.6599e-05
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 1436

Можно добавить цикл for вокруг цикла обработки, описанного выше, для выполнения моделирования для набора значений Eb/N0. Моделирование выполнялось в автономном режиме для некодированных значений Eb/N0 в 4:15 дБ, целевого количества ошибок, равного 5000, и максимального количества передач, равного 50 × 106. Этот показатель сравнивает результаты, достигнутые для

  • Кодирование RS только со стиранием

  • Кодирование RS со стиранием и прокалыванием

  • Кодирование RS со стиранием, прокалыванием и дроблением

  • Теоретический BER для 64-QAM

Канал BER с укорочением, потому что кодированный Eb/N0 деградируется. Это ухудшенное кодированное Eb/N0 происходит, потому что скорость кода укороченного кода ниже, чем скорость кода нешортированного кода. Сокращение также приводит к ухудшению кодированного BER, наиболее заметно при более низких значениях Eb/N0.

Резюме

В этом примере использовались несколько объектов системы для моделирования 64-QAM системы связи по каналу AWGN с укороченным блочным кодом RS. Он показал, как настроить декодер RS для сокращения (63,53) кода до (28,18) кода. Производительность системы измерялась с использованием канальных и кодированных кривых BER, полученных с использованием объектов системы измерения частоты ошибок.

Вспомогательные функции, используемые в этом примере:

Алгоритмы

Этот объект реализует алгоритм, входы и выходы, описанные в разделе Алгоритмы декодирования только ошибок BCH и RS.

Ссылки

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

Расширенные возможности

.
Представлен в R2012a