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

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

Описание

Оптимизированная HDL Система HDLRSDecoder object™ восстанавливает вектор сообщения с вектора кодовой комбинации Тростника-Solomon (RS). Для соответствующего декодирования код и полиномиальные значения свойств для этого объекта должны совпадать с теми значениями в соответствующем энкодере.

Восстановить вектор сообщения с вектора кодовой комбинации Тростника-Solomon:

  1. Создайте объект comm.HDLRSDecoder и установите его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Поиск и устранение проблем

  • Каждый входной кадр должен содержать больше, чем символы (N-K)*2 и меньше, чем или точно символы N. Объект выводит сокращенный код, когда количество допустимых выборок данных между startIn и endIn является меньше, чем N. Сокращенный код все еще требует, чтобы циклы N выполнили поиск Цзяня. Если входной сигнал является меньше, чем символы N, оставьте защитный интервал, по крайней мере, N - size неактивными циклами прежде, чем запустить следующий кадр, где size является длиной сообщения.

  • Декодер может работать максимум с четырьмя сообщениями за один раз. Если объект получает запуск пятого сообщения прежде полностью декодировать первое сообщение, объектные выборки данных об отбрасываниях из первого сообщения. Чтобы избежать этой проблемы, увеличьте число неактивных циклов между входными сигналами.

  • Полином генератора не задан явным образом. Однако это задано длиной кодовой комбинации, длиной сообщения и значением B для стартовой экспоненты корней. Чтобы получить значение B от полинома генератора, используйте функцию genpoly2b.

Создание

Синтаксис

RSDec = comm.HDLRSDecoder
RSDec = comm.HDLRSDecoder(Name,Value)
RSDec = comm.HDLRSDecoder(N,K,Name,Value)

Описание

RSDec = comm.HDLRSDecoder создает оптимизированный HDL Системный объект декодера RS, RSDec, который выполняет декодирование Тростника-Solomon.

RSDec = comm.HDLRSDecoder(Name,Value) свойства наборов с помощью одной или нескольких пар "имя-значение". Заключите каждое имя свойства в одинарные кавычки. Например,

comm.HDLRSDecoder('BSource','Property','B',2) 
устанавливает стартовую степень 2 для корней примитивного полинома.

пример

RSDec = comm.HDLRSDecoder(N,K,Name,Value) устанавливает свойство CodewordLength на N, свойство MessageLength к K и другие заданные имена свойства к заданным значениям.

Свойства

развернуть все

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и функция release разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

Стартовая степень для корней примитивного полинома, заданного как положительное целое число.

Зависимости

Объект использует это значение, когда вы устанавливаете BSource на 'Property'.

Источник стартовой степени для корней примитивного полинома, заданного или как 'Property' или как 'Auto'. Когда вы выбираете 'Auto', объект использует B = 1.

Количество символов, N, в кодовой комбинации RS, заданной как положительное целое число. Это значение окружено к 2M–1. M является степенью примитивного полинома, как задано свойствами PrimitivePolynomialSource и PrimitivePolynomial. Различием CodewordLengthMessageLength должно быть ровное целое число.

Если значение этого свойства является меньше, чем 2M–1, объект принимает сокращенный код RS.

Если вы устанавливаете PrimitivePolynomialSource на 'Auto', то CodewordLength должен быть в области значений 3 <CodewordLength216 – 1.

Если вы устанавливаете PrimitivePolynomialSource на 'Property', то CodewordLength должен быть в области значений 3 ≤ CodewordLength ≤ 2M– 1. M должен быть в области значений 3 ≤ M ≤ 16.

Передайте длину, K, заданный как положительное целое число. Различием CodewordLengthMessageLength должно быть ровное целое число.

Когда вы устанавливаете это свойство на true, объект возвращает количество исправленных ошибок. Количество исправленных ошибок не допустимо, когда errOut является true, поскольку было больше ошибок, чем можно было исправить.

Источник примитивного полинома, заданного или как 'Property' или как 'Auto'.

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

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

Примитивный полином, заданный как вектор строки двоичных знаков, который представляет примитивный полином по gf (2) из степени M, в порядке убывания степеней. Полином задает конечное поле gf (2M), соответствующее целым числам, которые формируют сообщения и кодовые комбинации.

Зависимости

Объект использует это значение, когда вы устанавливаете PrimitivePolynomialSource на 'Property'.

Использование

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить алгоритм Системного объекта. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

[Y,startOut,endOut,validOut,errOut] = RSDec(X,startIn,endIn,validIn)
[Y,startOut,endOut,validOut,errOut,numErrors] = RSDec(X,startIn,endIn,validIn)

Описание

пример

[Y,startOut,endOut,validOut,errOut] = RSDec(X,startIn,endIn,validIn) декодирует тот, закодировал символ сообщения, X, и возвращает декодируемый символ Y. start и сигналы end указывают на контуры кадра сообщения. Если errOut является 1 (true), то объект обнаружил некорректируемые ошибки во входном кадре.

[Y,startOut,endOut,validOut,errOut,numErrors] = RSDec(X,startIn,endIn,validIn) декодирует входные данные, и также возвращает количество ошибок, обнаруженных и исправленных. Чтобы использовать этот синтаксис, установите свойство NumErrorsOutputPort на true. Если errOut является 1 (true), то объект обнаружил некорректируемые ошибки в выходном кадре, и numErrors недопустим.

Входные параметры

развернуть все

Данные о входном сигнале и символы четности, один символ за один раз, заданный как беззнаковое целое или fi() с любым масштабированием двоичной точки.

Тип double позволен для симуляции, но не поддержан для генерации HDL-кода.

Типы данных: double | uint8 | uint16 | uint32 | fi

Запустите кадра входных данных, заданного как логический скаляр.

Типы данных: логический

Конец кадра входных данных, заданного как логический скаляр.

Типы данных: логический

Валидность входных данных, заданных как логический скаляр.

Типы данных: логический

Выходные аргументы

развернуть все

Передайте символы данных, возвратил один символ за один раз, как целое число с совпадающим типом данных как входной сигнал, X.

Типы данных: double | uint8 | uint16 | uint32 | fi

Запустите кадра выходных данных, возвращенного как логический скаляр.

Типы данных: логический

Конец кадра выходных данных, возвращенного как логический скаляр.

Типы данных: логический

Валидность выходных данных, возвращенных как логический скаляр.

Типы данных: логический

Некорректируемая ошибка в кадре выходных данных, возвращенном как логический скаляр. Этот сигнал 1 (true), когда кадр сообщения содержит некорректируемые ошибки. В этом случае символы выходных данных повреждаются. Это значение допустимо, когда endOut 1 (true).

Типы данных: логический

Количество ошибок, обнаруженных и исправленных, возвратилось как целое число. Это значение допустимо, когда endOut 1 (true), и errOut 0 (false).

Типы данных: uint8

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

развернуть все

Закодируйте и декодируйте сигнал с помощью Системных объектов энкодера и декодера Рида Соломона. Этот пример показывает, как включать каждый объект в функцию для генерации HDL-кода.

Создайте случайное сообщение, чтобы закодировать. Это сообщение меньше, чем длина кодовой комбинации, чтобы показать, как объекты поддерживают сокращенные коды. Заполните сообщение нулями, чтобы разместить задержку декодера, включая поиск Цзяня.

messageLength = 188;
dataIn = [randi([0,255],1,messageLength,'uint8') zeros(1,1024-messageLength)];

Запишите функцию, которая создает и вызывает Систему HDLRSEncoder object™ с RS (255,239) код. Этот код используется в стандарте IEEE® 802.16 Broadband Wireless Access. B является стартовой степенью корней примитивного полинома. Можно сгенерировать HDL от этой функции.

Примечание: Этот объектный синтаксис запускается только в R2016b или позже. Если вы используете более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом step. Например, замените myObject(x) на step(myObject,x).

function  [dataOut,startOut,endOut,validOut] = HDLRSEnc80216(dataIn,startIn,endIn,validIn)
%HDLRSEnc80216 
% Processes one sample of data using the comm.HDLRSEncoder System object(TM)
% dataIn is a uint8 scalar, representing 8 bits of binary data. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent rsEnc80216;
  if isempty(rsEnc80216)
    rsEnc80216 = comm.HDLRSEncoder(255,239,'BSource','Property','B',0)
  end    
  [dataOut,startOut,endOut,validOut] = rsEnc80216(dataIn,startIn,endIn,validIn);
end


Вызовите функцию, чтобы закодировать сообщение.

for ii = 1:1024
    messageStart = (ii==1);
    messageEnd = (ii==messageLength);
    validIn = (ii<=messageLength);
    [encOut(ii),startOut(ii),endOut(ii),validOut(ii)] = ...
        HDLRSEnc80216(dataIn(ii),messageStart,messageEnd,validIn);
end
rsEnc80216 = 

  comm.HDLRSEncoder with properties:

               CodewordLength: 255
                MessageLength: 239
    PrimitivePolynomialSource: 'Auto'
        PuncturePatternSource: 'None'
                      BSource: 'Property'
                            B: 0

Введите ошибки наугад местоположения в закодированном сообщении. Тростник-Solomon может исправить до (NK)/2 ошибки в каждом символы N. Так, в этом примере возможность исправления ошибок является (255 – 239)/2=8 символами.

numErrors = 8;
loc = randperm(messageLength,numErrors);
% encOut is qualified by validOut, use an offset for injecting errors
vi = find(validOut==true,1);
for i = 1:numErrors
   idx = loc(i)+vi;
   symbol = encOut(idx);
   encOut(idx) = randi([0 255],'uint8');
   fprintf('Symbol(%d): was 0x%x, now 0x%x\n',loc(i),symbol,encOut(idx))
end
Symbol(147): was 0x1f, now 0x82
Symbol(16): was 0x6b, now 0x82
Symbol(173): was 0x3, now 0xd1
Symbol(144): was 0x66, now 0xcb
Symbol(90): was 0x13, now 0xa4
Symbol(80): was 0x5a, now 0x60
Symbol(82): was 0x95, now 0xcf
Symbol(56): was 0xf5, now 0x88

Запишите функцию, которая создает и вызывает Систему HDLRSDecoder object™. Этот объект должен иметь тот же код и полином как энкодер. Можно сгенерировать HDL от этой функции.

function  [dataOut,startOut,endOut,validOut,err] = HDLRSDec80216(dataIn,startIn,endIn,validIn)
%HDLRSDec80216 
% Processes one sample of data using the comm.HDLRSDecoder System object(TM)
% dataIn is a uint8 scalar, representing 8 bits of binary data. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent rsDec80216;
  if isempty(rsDec80216)
    rsDec80216 = comm.HDLRSDecoder(255,239,'BSource','Property','B',0)
  end    
  [dataOut,startOut,endOut,validOut,err] = rsDec80216(dataIn,startIn,endIn,validIn);
end


Вызовите функцию, чтобы обнаружить ошибки в закодированном сообщении.

for ii = 1:1024
 [decOut(ii),decStartOut(ii),decEndOut(ii),decValidOut(ii),decErrOut(ii)] = ...
     HDLRSDec80216(encOut(ii),startOut(ii),endOut(ii),validOut(ii));
end
rsDec80216 = 

  comm.HDLRSDecoder with properties:

               CodewordLength: 255
                MessageLength: 239
    PrimitivePolynomialSource: 'Auto'
                      BSource: 'Property'
                            B: 0
          NumErrorsOutputPort: false

Выберите допустимый декодер вывод и сравните декодируемые символы с исходным сообщением.

decOut = decOut(decValidOut==1);
originalMessage = dataIn(1:messageLength);
if all(originalMessage==decOut)
    fprintf('All %d message symbols were correctly decoded.\n',messageLength)
else
   for jj = 1:messageLength
      if dataIn(jj)~=decOut(jj)
        fprintf('Error in decoded symbol(%d). Original 0x%x, Decoded 0x%x.\n',jj,dataIn(jj),decOut(jj))
      end
   end
end
All 188 message symbols were correctly decoded.

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

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