exponenta event banner

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

Создание битов кода CRC и добавление к входным данным

Описание

comm.CRCGenerator Система object™ генерирует кодовые биты циклического избыточного кода (CRC) для каждого входного кадра и добавляет их к кадру. Дополнительные сведения см. в разделе Работа генератора CRC.

Для генерации битов кода CRC для каждого входного кадра и добавления их к кадру:

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

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

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

Создание

Описание

crcgenerator = comm.CRCGenerator создает объект System генератора кода CRC. Этот объект генерирует биты CRC в соответствии с указанным полиномом генератора и добавляет их во входной кадр.

пример

crcgenerator = comm.CRCGenerator(Name,Value) задает свойства, используя одну или несколько пар имя-значение. Например, comm.CRCGenerator('Polynomial','z^16 + z^14 + z + 1') конфигурирует объект CRC generator System для добавления CRC-16 битов контроля циклическим избыточным кодом во входной кадр. Заключите каждое имя свойства в кавычки.

пример

crcgenerator = comm.CRCGenerator(poly,Name,Value) создает объект System генератора кода CRC. Этот объект имеет Polynomial свойство имеет значение polyи другие указанные свойства имеют указанные значения.

Свойства

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

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Генераторный полином для алгоритма CRC, указанный как один из следующих:

  • Вектор многочлена, например 'z^3 + z^2 + 1'.

  • Двоичный вектор строки, который представляет коэффициенты полинома генератора в порядке степени убывания. Длина этого вектора равна (N + 1), где N - степень полинома генератора. Например ,[1 1 0 1] представляет многочлен x3 + z2 + 1.

  • Целочисленный вектор строки, содержащий экспоненты z для ненулевых членов в многочлене в порядке убывания. Например, [3 2 0] представляет многочлен z3 + z2 + 1.

Дополнительные сведения см. в разделе Символьное представление многочленов.

Некоторые обычно используемые генераторные многочлены включают в себя:

Метод CRCПолином генератора
CRC-32'z^32 + z^26 + z^23 + z^22 + z^16 + z^12 + z^11 + z^10 + z^8 + z^7 + z^5 + z^4 + z^2 + z + 1'
CRC-24 'z^24 + z^23 + z^14 + z^12 + z^8 + 1'
CRC-16 'z^16 + z^15 + z^2 + 1'
Реверсированный CRC-16'z^16 + z^14 + z + 1'
CRC-8'z^8 + z^7 + z^6 + z^4 + z^2 + 1'
CRC-4 'z^4 + z^3 + z^2 + z + 1'

Пример: 'z^7 + z^2 + 1', [1 0 0 0 0 1 0 1], и [7 2 0] представляют один и тот же многочлен, p (z) = z 7 + z 2 + 1.

Типы данных: double | char

Начальные состояния внутреннего сдвигового регистра, заданного как двоичный скаляр или двоичный вектор строки длиной, равной степени полинома генератора. Скалярное значение расширяется до вектора строки равной длины до степени полинома генератора.

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

Использовать прямой алгоритм для вычисления контрольной суммы CRC, указанный как false или true.

При установке для этого свойства значения trueобъект использует прямой алгоритм для вычисления контрольной суммы CRC. При установке для этого свойства значения falseобъект использует непрямой алгоритм для вычисления контрольной суммы CRC.

Дополнительные сведения о прямых и непрямых алгоритмах см. в разделе Обнаружение и исправление ошибок.

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

Отражать входные байты, указанные как false или true. Установить для этого свойства значение true чтобы развернуть входной кадр по байтам перед вводом данных в сдвиговый регистр.

При установке для этого свойства значения true, длина входного кадра, деленная на значение ChecksumsPerFrame свойство должно быть целым числом и кратным 8.

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

Отражать контрольные суммы перед окончательным исключающим ИЛИ, указанные как false или true. Установить для этого свойства значение true для разворота контрольных сумм CRC вокруг их центров после полного прохождения входных данных через сдвиговый регистр.

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

Конечный XOR, заданный как двоичный скаляр или двоичный вектор строки длиной, равной степени полинома генератора. Операция XOR выполняется с использованием значения FinalXOR и контрольную сумму CRC перед сравнением с входной контрольной суммой. Скалярное значение расширяется до вектора строки равной длины до степени полинома генератора. Установка 0 эквивалентно отсутствию операции XOR.

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

Количество контрольных сумм, рассчитанных для каждого кадра, указанное как положительное целое число. Дополнительные сведения см. в разделе Работа генератора CRC.

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

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

Описание

пример

codeword = crcgenerator(x) генерирует кодовые биты CRC для каждого входного кадра и добавляет их к кадру.

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

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

Входной сигнал, заданный как двоичный вектор столбца. Длина входного кадра должна быть кратна значению ChecksumsPerFrame собственность. Если входной тип данных является двойным, в качестве двоичного значения используется младший значащий бит. Дополнительные сведения см. в разделе Работа генератора CRC.

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

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

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

Выходной кадр кодового слова, возвращаемый как двоичный вектор столбца, который наследует тип данных входного сигнала. Выходной сигнал содержит входные кадры с добавленными битами кодовой последовательности CRC.

Длина выходного кадра кодового слова составляет m + k * r, где m - размер входного сообщения, k - количество контрольных сумм на входной кадр и r - степень полинома генератора. Дополнительные сведения см. в разделе Работа генератора CRC.

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

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

release(obj)

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

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

Примеры

свернуть все

Создайте контрольную сумму CRC-8 для примера, показанного в разделе 21.3.10.3 802.11™-2016[1], и сравните ее с ожидаемым CRC.

Создайте системный object™ генератора CRC. Чтобы выровнять с вычислением CRC в 802,11-20016, системный object™ устанавливает полином генератора как z8 + z2 + z + 1, начальные состояния как 1, прямой метод и конечный XOR как 1.

crc8 = comm.CRCGenerator('Polynomial','z^8 + z^2 + z + 1', ...
    'InitialConditions',1,'DirectMethod',true,'FinalXOR',1)
crc8 = 
  comm.CRCGenerator with properties:

           Polynomial: 'z^8 + z^2 + z + 1'
    InitialConditions: 1
         DirectMethod: true
    ReflectInputBytes: false
     ReflectChecksums: false
             FinalXOR: 1
    ChecksumsPerFrame: 1

Обработка одного входного кадра в соответствии с примером из стандарта 802.11-2016 в разделе 21.3.10.3. В примере входной битовый поток {m0,... m22} имеет значение {1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1}, и ожидаемая контрольная сумма CRC {c7,... c0} - {0 0 0 1 1 1 0 0}.

x = [1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1]';
expectedChecksum = [0 0 0 1 1 1 0 0]';
checksumLength = length(expectedChecksum);

Сгенерированная контрольная сумма CRC сравнивается с ожидаемой контрольной суммой.

codeword = crc8(x);
checksum = codeword(end-checksumLength+1:end);
isequal(checksum,expectedChecksum)
ans = logical
   1

Ссылки

[1] Стандарт IEEE Std 802.11™-2016 IEEE для информационных технологий - локальные и городские сети - особые требования Часть 11: Спецификации беспроводной локальной сети MAC и PHY.

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

Создайте случайный двоичный вектор.

x = randi([0 1],12,1);

Кодирование кадра входного сообщения с помощью генератора CRC с помощью ChecksumsPerFrame свойство имеет значение 2. Это делит входящий кадр на два подкадра равной длины.

crcgenerator = comm.CRCGenerator([1 0 0 1],'ChecksumsPerFrame',2);
codeword = crcgenerator(x);

Декодируйте кодовое слово и убедитесь в отсутствии ошибок в любом подкадре.

crcdetector = comm.CRCDetector([1 0 0 1],'ChecksumsPerFrame',2);
[~, err] = crcdetector(codeword)
err = 2×1

     0
     0

Ввести ошибку во второй подкадр путем инвертирования последнего элемента подкадра 2. Передайте поврежденное кодовое слово через детектор CRC и убедитесь, что ошибка обнаружена во втором подкадре.

codeword(end) = not(codeword(end));
[~,err] = crcdetector(codeword)
err = 2×1

     0
     1

Используйте код CRC для обнаружения ошибок кадра в шумном сигнале BPSK.

Создайте генератор CRC и пару детекторов, используя стандартный многочлен CRC-4, z4 + z3 + z2 + z + 1.

poly = 'z4+z3+z2+z+1';
crcgenerator = comm.CRCGenerator(poly);
crcdetector = comm.CRCDetector(poly);

Создайте 12-битовые кадры двоичных данных и добавьте биты CRC. На основании степени полинома к каждому кадру добавляется 4 бита. Примените модуляцию BPSK и передайте сигнал через канал AWGN. Демодулируйте и используйте детектор CRC для определения ошибки кадра.

numFrames = 20;
frmError = zeros(numFrames,1);

for k = 1:numFrames
    data = randi([0 1],12,1);                 % Generate binary data
    encData = crcgenerator(data);                   % Append CRC bits
    modData = pskmod(encData,2);              % BPSK modulate
    rxSig = awgn(modData,5);                  % AWGN channel, SNR = 5 dB
    demodData = pskdemod(rxSig,2);            % BPSK demodulate
    [~,frmError(k)] = crcdetector(demodData); % Detect CRC errors
end

Идентифицируют кадры, в которых обнаружены ошибки битов кода CRC.

find(frmError)
ans = 6

Создайте генератор CRC-16-CCITT, как описано в разделе 2.2.7.4 Рекомендации ITU-T X-25 [1], используя входные данные и ожидаемую последовательность проверки кадров (FCS) из примера 2 в Приложении I, I.1.

Создайте ненумерованный кадр ответа подтверждения (UA), где адрес = B и F = 1.

Address = [1 0 0 0 0 0 0 0];
UA = [1 1 0 0 1 1 1 0];
input = [Address UA]';
expectedChecksum = [1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0]'; % Expected FCS
checksumLength = 16;

crcGen = comm.CRCGenerator(...
    'Polynomial','X^16 + X^12 + X^5 + 1',...
    'InitialConditions',1,...
    'DirectMethod',true,...
    'FinalXOR',1);
crcSeq = crcGen(input);
checkSum =  crcSeq(end-checksumLength+1:end);

Сравните вычисленную контрольную сумму с ожидаемой контрольной суммой.

isequal(expectedChecksum,checkSum)
ans = logical
   1

Ссылки

[1] Сектор стандартизации телекоммуникаций ITU. Серия X: Сети передачи данных и связь с открытой системой. Сети передачи данных общего пользования - интерфейсы. 1997

Создайте код CRC-32 для поля FCS для Ethernet, как описано в разделе 3.2.9 стандарта IEEE для Ethernet [1].

rng(1865);  % Seed the random number generator for repeatable results

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

data = randi([0,1],100,1);

Укажите полином, генерирующий CRC-32, используемый для кодирования сообщений Ethernet.

poly = [32,26,23,22,16,12,11,10,8,7,5,4,2,1,0];

Вычислите CRC, следуя шагам, указанным в стандарте, и используя непрямой метод для генерации кода CRC.

dataN = [not(data(1:32));data(33:end)];    % Section 3.2.9 step a) and b)
crcGen1 = comm.CRCGenerator(...
    'Polynomial', poly, ...
    'InitialConditions', 0, ...
    'DirectMethod', false, ...
    'FinalXOR', 1);
seq = crcGen1(dataN);                      % Section 3.2.9 step c), d) and e)
csNondirect = seq(end-31:end);

Вычислите CRC, следуя шагам, указанным в стандарте, и используя прямой метод для генерации кода CRC.

crcGen2 = comm.CRCGenerator(...
    'Polynomial', poly, ...
    'InitialConditions', 1, ...
    'DirectMethod', true, ...
    'FinalXOR', 1);
txSeq = crcGen2(data);
csDirect = txSeq(end-31:end);

Сравните сгенерированные коды CRC с помощью непрямых и прямых методов.

disp([csNondirect';csDirect']);
  Columns 1 through 13

     1     1     1     0     1     1     0     0     1     0     0     1     0
     1     1     1     0     1     1     0     0     1     0     0     1     0

  Columns 14 through 26

     1     0     0     1     0     1     0     1     1     0     0     0     1
     1     0     0     1     0     1     0     1     1     0     0     0     1

  Columns 27 through 32

     1     1     0     0     1     0
     1     1     0     0     1     0
isequal(csNondirect,csDirect)
ans = logical
   1

rng('default');  % Reset the random number generator

Ссылки

[1] Компьютерное общество IEEE. Стандарт IEEE для Ethernet: стандарт 802.3-2012. Нью-Йорк, Нью-Йорк: 2012.

Подробнее

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

Ссылки

[1] Склар, Бернард. Цифровые коммуникации: основы и приложения. Энглвуд Клиффс, Нью-Джерси: Прентис-Холл, 1988.

[2] Уикер, Стивен Б. Системы управления ошибками для цифровой связи и хранения. Река Верхнее Седло, Н.Дж.: Прентис Холл, 1995.

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

.