comm.HDLRSEncoder

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

Описание

Оптимизированный HDL- HDLRSEncoder System object™ создает код Рида-Соломона (RS) с заданными вами длинами сообщений и кодовых слов.

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

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

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

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

Создание

Описание

RSEnc = comm.HDLRSEncoder создает HDL-оптимизированный блочный энкодер Системный объект, RSEnc, который выполняет кодирование Рида-Соломона в потоковом режиме для HDL.

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

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

пример

RSEnc = comm.HDLRSEncoder(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 должно быть четным целым числом.

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

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

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

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

Зависимости

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

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

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

Зависимости

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

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

Описание

пример

[Y,startOut,endOut,validOut] = RSEnc(X,startIn,endIn,validIn) кодирует один вход сообщения, X, и возвращает один символ закодированных данных, Y. The start и end сигналы указывают на систему координат контуров сообщения. Объект возвращает связанные символы четности в конце каждой системы координат сообщения.

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

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

Входные данные сообщения, по одному символу за раз, заданные как беззнаковое целое число или fi() с любым двоичным масштабированием точек. Размер слова каждого символа должен быть ceil (log2 (CodewordLength+1)).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем 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