comm.RSDecoder

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

Описание

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

Декодировать данные с помощью схемы декодирования Тростника-Solomon:

  1. Задайте и настройте свой объект декодера кода Рида-Соломона. Смотрите Конструкцию.

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

Примечание

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

Конструкция

dec = comm.RSDecoder создает Системный объект блочного декодера, dec. Этот объект выполняет декодирование Тростника-Solomon (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, [], [], 'дважды'), который соответствует [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) (log2 (CodewordLength + 1)).

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

PrimitivePolynomial

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

Задайте примитивный полином, который задает конечное поле gf(2M) соответствие целым числам, которые формируют сообщения и кодовые комбинации. Значением по умолчанию является результат int2bit(primpoly(3), 4)', который является [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. Вход стираний должен быть двойная точность или логический вектор столбца двоичных данных, который указывает который символы входных кодовых комбинаций стереться. Длина вектора стираний объяснена в Длинах Сигнала Ввода и вывода в Системных объектах RS и BCH.

Когда вы устанавливаете это свойство на false, объект не принимает стираний.

NumCorrectedErrorsOutputPort

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

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

OutputDataType

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

Задайте тип выходных данных как Same as input'double', или logical. Значением по умолчанию является Same as input.

Это свойство применяется, когда вы устанавливаете BitInput к true.

Методы

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

Позвольте изменения значения свойства Системного объекта

Примеры

свернуть все

Передайте закодированный RS, 8 DPSK модулировали поток символа через канал 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

Передайте закодированные данные Тростника-Solomon с помощью 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) энкодер Тростника-Solomon и пара декодера, которая принимает битные входные параметры.

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 требуемый достигнуть a 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 object. The axes object 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);

Создайте порождающий полином Тростника-Solomon из стандарта DVB-T.

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

Создайте пару энкодера и декодера Тростника-Solomon использование сокращенной длины сообщения, 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 Системные объекты, чтобы выполнить блочное кодирование Тростника-Solomon (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 свойство к истине, чтобы задать стирания как вход к объекту декодера.

rsDecoder.ErasuresInputPort = true;

Установите NumCorrectedErrorsOutputPort свойство к истине так, чтобы декодер вывел количество откорректированных ошибок. Не отрицательная величина в выводе ошибок обозначает количество откорректированных ошибок во входной кодовой комбинации. Значение –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 Н].

    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 функцию помощника, чтобы найти 6 наименее надежных символов и сгенерировать вектор стираний. Длина вектора стираний должна быть равна количеству символов в демодулируемой кодовой комбинации. Тот в i-ом элементе вектора стирает i-ый символ в кодовой комбинации. Нули в векторе не указывают ни на какие стирания.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);

Декодируйте данные. Регистрируйте количество ошибок, откорректированных декодером RS.

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

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

    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 дБ, целевое количество ошибок, равных 5 000, и максимальное количество передач, равных 50e6. Результаты симуляции показывают. BER канала хуже, чем теоретический 64-QAM BER, потому что Eb/N0 уменьшается скоростью кода.

Сводные данные

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

Помощник функционирует используемый в этом примере:

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

Этот пример показывает симуляцию системы связи, состоящей из случайного источника, энкодера 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 ошибок происходят или максимум 5×106 биты передаются.

helperRSCodingConfig;

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

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

Создайте 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 свойство к истине, чтобы задать стирания как вход к объекту декодера.

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 выведите символы, затем энергетическое отношение дано KN уровень. Поскольку длина кодовых комбинаций, сгенерированных энкодером 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 функцию помощника, чтобы найти 6 наименее надежных символов и сгенерировать вектор стираний. Длина вектора стираний должна быть равна количеству символов в демодулируемой кодовой комбинации. Тот в i-ом элементе вектора стирает i-ый символ в кодовой комбинации. Нули в векторе не указывают ни на какие стирания.

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);

Декодируйте данные. Регистрируйте количество ошибок, откорректированных декодером RS.

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

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

    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 дБ, предназначайтесь для количества ошибок, равных 5 000, и максимальное количество передач, равных 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 Системные объекты, чтобы выполнить блочное кодирование Тростника-Solomon (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 Системные объекты раньше симулировали систему связи. Незакодированный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 функции помощника. Индексы, которые указывают на местоположение этих ненадежных символов, передаются как вход декодеру 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 выведите символы, затем энергетическое отношение дано KN уровень. он значение закодированного 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- numPuncsS) символы долго.

    encData = rsEncoder(data);

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

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

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

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);    

Декодируйте данные. Регистрируйте количество ошибок, откорректированных декодером RS.

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

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

    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 дБ, предназначайтесь для количества ошибок, равных 5 000, и максимальное количество передач, равных 50×106. Этот рисунок сравнивает результаты, достигнутые для

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

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

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

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

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

Сводные данные

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

Помощник функционирует используемый в этом примере:

Алгоритмы

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

Ссылки

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

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

Представленный в R2012a