Создание битов кода CRC и добавление к входным данным
comm.CRCGenerator Система object™ генерирует кодовые биты циклического избыточного кода (CRC) для каждого входного кадра и добавляет их к кадру. Дополнительные сведения см. в разделе Работа генератора CRC.
Для генерации битов кода CRC для каждого входного кадра и добавления их к кадру:
Создать comm.CRCGenerator и задайте его свойства.
Вызовите объект с аргументами, как если бы это была функция.
Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.
создает объект System генератора кода CRC. Этот объект генерирует биты CRC в соответствии с указанным полиномом генератора и добавляет их во входной кадр.crcgenerator = comm.CRCGenerator
задает свойства, используя одну или несколько пар имя-значение. Например, crcgenerator = comm.CRCGenerator(Name,Value)comm.CRCGenerator('Polynomial','z^16 + z^14 + z + 1') конфигурирует объект CRC generator System для добавления CRC-16 битов контроля циклическим избыточным кодом во входной кадр. Заключите каждое имя свойства в кавычки.
создает объект System генератора кода CRC. Этот объект имеет crcgenerator = comm.CRCGenerator(poly,Name,Value)Polynomial свойство имеет значение polyи другие указанные свойства имеют указанные значения.
Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.
Если свойство настраивается, его значение можно изменить в любое время.
Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.
Polynomial - Полином генератора'z^16 + z^12 + z^5 + 1' (по умолчанию) | вектор многочленов | вектор двоичной строки | вектор целочисленной строкиГенераторный полином для алгоритма 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
InitialConditions - Начальные состояния внутреннего сдвигового регистра0 (по умолчанию) | 1 | двоичный вектор строкиНачальные состояния внутреннего сдвигового регистра, заданного как двоичный скаляр или двоичный вектор строки длиной, равной степени полинома генератора. Скалярное значение расширяется до вектора строки равной длины до степени полинома генератора.
Типы данных: logical
DirectMethod - Использовать прямой алгоритм для вычисления контрольной суммы CRCfalse (по умолчанию) | trueИспользовать прямой алгоритм для вычисления контрольной суммы CRC, указанный как false или true.
При установке для этого свойства значения trueобъект использует прямой алгоритм для вычисления контрольной суммы CRC. При установке для этого свойства значения falseобъект использует непрямой алгоритм для вычисления контрольной суммы CRC.
Дополнительные сведения о прямых и непрямых алгоритмах см. в разделе Обнаружение и исправление ошибок.
Типы данных: logical
ReflectInputBytes - Отражать входные байтыfalse (по умолчанию) | trueОтражать входные байты, указанные как false или true. Установить для этого свойства значение true чтобы развернуть входной кадр по байтам перед вводом данных в сдвиговый регистр.
При установке для этого свойства значения true, длина входного кадра, деленная на значение ChecksumsPerFrame свойство должно быть целым числом и кратным 8.
Типы данных: logical
ReflectChecksums - Отражение контрольных сумм перед окончательным исключающим ИЛИfalse (по умолчанию) | trueОтражать контрольные суммы перед окончательным исключающим ИЛИ, указанные как false или true. Установить для этого свойства значение true для разворота контрольных сумм CRC вокруг их центров после полного прохождения входных данных через сдвиговый регистр.
Типы данных: logical
FinalXOR - Окончательное исключающее ИЛИКонечный XOR, заданный как двоичный скаляр или двоичный вектор строки длиной, равной степени полинома генератора. Операция XOR выполняется с использованием значения FinalXOR и контрольную сумму CRC перед сравнением с входной контрольной суммой. Скалярное значение расширяется до вектора строки равной длины до степени полинома генератора. Установка 0 эквивалентно отсутствию операции XOR.
Типы данных: logical
ChecksumsPerFrame - Количество контрольных сумм, рассчитанных для каждого кадраКоличество контрольных сумм, рассчитанных для каждого кадра, указанное как положительное целое число. Дополнительные сведения см. в разделе Работа генератора CRC.
Типы данных: double
x - Входной сигналВходной сигнал, заданный как двоичный вектор столбца. Длина входного кадра должна быть кратна значению ChecksumsPerFrame собственность. Если входной тип данных является двойным, в качестве двоичного значения используется младший значащий бит. Дополнительные сведения см. в разделе Работа генератора CRC.
Типы данных: double | logical
codeword - Кадр выходного кодового словаВыходной кадр кодового слова, возвращаемый как двоичный вектор столбца, который наследует тип данных входного сигнала. Выходной сигнал содержит входные кадры с добавленными битами кодовой последовательности CRC.
Длина выходного кадра кодового слова составляет m + k * r, где m - размер входного сообщения, k - количество контрольных сумм на входной кадр и r - степень полинома генератора. Дополнительные сведения см. в разделе Работа генератора CRC.
Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:
release(obj)
Создайте контрольную сумму CRC-8 для примера, показанного в разделе 21.3.10.3 802.11™-2016[1], и сравните ее с ожидаемым CRC.
Создайте системный object™ генератора CRC. Чтобы выровнять с вычислением CRC в 802,11-20016, системный object™ устанавливает полином генератора как 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, + 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.
Циклическое избыточное кодирование (CRC) представляет собой метод кодирования с управлением ошибками для обнаружения ошибок, возникающих при передаче кадра данных. В отличие от блочных или сверточных кодов, коды CRC не имеют встроенной возможности исправления ошибок. Вместо этого, когда система связи обнаруживает ошибку в принятом кодовом слове, приемник запрашивает отправителя повторно передать кодовое слово.
При кодировании CRC передатчик применяет правило к каждому кадру данных для создания дополнительных битов CRC, называемых контрольной суммой или синдромом, и затем добавляет контрольную сумму к кадру данных. После приема переданного кодового слова приемник применяет то же самое правило к принятому кодовому слову. Если итоговая контрольная сумма не равна нулю, произошла ошибка, и передатчик должен повторно отправить кадр данных.
Когда количество контрольных сумм на кадр больше 1, входной кадр данных делится на подкадры, правило применяется к каждому подкадру данных, и отдельные контрольные суммы добавляются к каждому подкадру. Кодовые слова подкадра объединяются для вывода одного кадра.
Описание поддерживаемых алгоритмов CRC см. в разделе Коды проверки циклическим избыточным кодом.
Генератор CRC добавляет контрольные суммы CRC к входному кадру в соответствии с указанным полиномом генератора и количеством контрольных сумм на кадр.
Для конкретного начального состояния внутреннего сдвигового регистра и k контрольных сумм на входной кадр:
Входной сигнал делится на k подкадров одинакового размера.
Каждый из k подкадров имеет префикс с вектором начальных состояний.
Алгоритм CRC применяется к каждому подкадру.
Полученные контрольные суммы добавляются к концу каждого подкадра.
Подкадры объединяются и выводятся как вектор-столбец.
Для сценария, показанного здесь, 10-битный кадр является входным, полином генератора третьей степени вычисляет контрольную сумму CRC, начальное состояние равно 0, и количество контрольных сумм на кадр равно 2.

Входной кадр делится на два подкадра размера 5, и контрольные суммы размера 3 вычисляются и добавляются к каждому подкадру. Начальные состояния не показаны, поскольку начальное состояние [0] не влияет на выходные данные алгоритма CRC. Выходной передаваемый кадр кодового слова имеет размер 5 + 3 + 5 + 3 = 16.
[1] Склар, Бернард. Цифровые коммуникации: основы и приложения. Энглвуд Клиффс, Нью-Джерси: Прентис-Холл, 1988.
[2] Уикер, Стивен Б. Системы управления ошибками для цифровой связи и хранения. Река Верхнее Седло, Н.Дж.: Прентис Холл, 1995.
Примечания и ограничения по использованию:
См. Системные объекты в создании кода MATLAB (кодер MATLAB).
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.