comm.RSDecoder

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

Описание

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

Чтобы декодировать данные с помощью схемы декодирования Рида-Соломона:

  1. Определите и настройте свой объект декодера кода Рида-Соломона. См. «Конструкция».

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

Примечание

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

Конструкция

dec = comm.RSDecoder создает блочный декодер Системный объект, 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 (Fixed-Point Designer) (лог2 (CodewordLength + 1)).

  • Когда вы устанавливаете это свойство на Propertyнеобходимо задать полином, используя PrimitivePolynomial.

PrimitivePolynomial

Примитивный полином

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

Это свойство применяется при установке 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 с кодированием BER путем сравнения входов для RS энкодера с выходами от RS декодера.

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

Функция helperRSCodingConfig.m helper инициализирует параметры симуляции и конфигурирует 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 helper. Индексы, которые указывают на местоположение этих ненадежных символов, передаются как вход в RS-декодер. Декодер RS обрабатывает эти символы как стирания, приводя к возможности коррекции ошибок (10-6 )/2 = 2 ошибки на кодовое слово.

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

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. Результаты симуляции показаны. BER канала хуже, чем BER теоретического 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 канала путем сравнения входов для модулятора QAM с выходами от демодулятора QAM. Этот пример получает Закодированный BER путем сравнения входов для RS- энкодера, чтобы выходы от RS-декодера.

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

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

helperRSCodingConfig;

Сконфигурируйте RS-энкодер/декодер

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

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

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, is (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 с кодированием BER путем сравнения входов для RS энкодера с выходами от RS декодера. Проколы - это удаление символов четности из кодового слова, а укорачивание - это удаление символов сообщений из кодового слова. Прокалывание имеет преимущество сделать скорость кода более гибкой, за счет некоторых возможностей коррекции ошибок. Укороченные коды достигают той же гибкости скорости кода, не ухудшая эффективность коррекции ошибок для того же входа демодулятора Eb/N0.

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

Функция helperRSCodingConfig.m helper инициализирует параметры симуляции и конфигурирует comm.AWGNChannel и comm.ErrorRate Системные объекты, используемые для симуляции коммуникационной системы. НезакодированныйEb/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 свойства, соответственно (с 2log2(53+1)-1=63). Однако, чтобы сократить его путем 35 символов до кода (28,18), необходимо явным образом указать, что символы принадлежат полю Галуа GF (26). В противном случае блоки RS будут принимать, что код укорочен от (31,21) кода ( поскольку2log2(28+1)-1=31).

Создайте пару comm.RSEncoder и comm.RSDecoder Системные объекты так, чтобы они выполняли блок кодирование с (28,18) кодом, укороченным из (63,53) кода, который сконфигурирован для ввода и вывода целочисленных символов. Сконфигурируйте декодер, чтобы принять вход стирания и два прокола. Для каждого кодового слова на выходе демодулятора 64-QAM приемник определяет шесть наименее надежных символов с помощью функции helperRSCodingGetErasures.m helper. Индексы, которые указывают на местоположение этих ненадежных символов, передаются как вход в 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 encoder/decoder System путем установки 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] Clark, George C., and J. Bibb Cain. Кодирование с исправлением ошибок для цифровых коммуникаций. Приложения теории связи. Нью-Йорк: Пленум Пресс, 1981.

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

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