exponenta event banner

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

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

Описание

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

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

  1. Создать comm.HDLRSDecoder и задайте его свойства.

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

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

Поиск неисправностей

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

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

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

Создание

Описание

RSDec = comm.HDLRSDecoder создает системный объект RS-декодера, оптимизированный для HDL, 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 ≤ CodewordLength2M– 1. M должен находиться в диапазоне 3 ≤ M ≤ 16.

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

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

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

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

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

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

Зависимости

Объект использует это значение при установке PrimitivePolynomialSource кому 'Property'.

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

Описание

пример

[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

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

Типы данных: 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

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

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

release(obj)

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

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

Примеры

свернуть все

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

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

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

Запись функции, создающей и вызывающей HDLRSEncoder Системный object™ с кодом RS (255 239). Этот код используется в стандарте широкополосного беспроводного доступа IEEE ® 802.16.B - начальная степень корней примитивного многочлена. Из этой функции можно создать ЛПВП.

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

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