comm.HDLRSDecoder

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

Описание

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

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

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

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

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

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

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

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

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

Создание

Описание

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

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 Использование Системных объектов.

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

Зависимости

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

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

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

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

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

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

Длина сообщения, K, задается как положительное целое число. Область различия CodewordLengthMessageLength должно быть четным целым числом.

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

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

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

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

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

Зависимости

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

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

Описание

пример

[Y,startOut,endOut,validOut,errOut] = RSDec(X,startIn,endIn,validIn) декодирует один символ закодированного сообщения, X, и возвращает декодированный символ Y. The 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

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

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

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

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

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

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

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

расширить все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

release(obj)

расширить все

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

Примеры

свернуть все

Закодируйте и декодируйте сигнал, используя Reed Solomon энкодера и Системных объектов декодера. В этом примере показано, как включить каждый объект в функцию для генерации 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

Вводите ошибки в случайных местах в закодированном сообщении. Рид-Соломон может исправить до (N-K )/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