В этом примере показано, как выполнить циклическую проверку избыточности (CRC) для бит числа. CRC используются для обнаружения ошибок в передаче данных в цифровых системах. При отправке части данных к нему присоединяется краткое значение проверки. Контрольное значение получается путем полиномиального деления с битами в данных. Когда данные получены, полиномиальное деление повторяется, и результат сравнивается с контрольным значением. Если результаты отличаются, данные были повреждены во время передачи.
Начните с 16-битного двоичного числа, которое является сообщением, которое должно быть передано:
1101100111011010
Чтобы получить значение проверки, разделите это число на полином . Можно представлять этот полином с его коэффициентами: 1111
.
Деление выполняется шагами, и после каждого шага полиномиальное деление выравнивается с самым левым 1 в числе. Потому что результат деления на четыре термина полином имеет три бита (в общем деление на полином длины задает контрольное значение длины ), добавьте номер с помощью 000
чтобы вычислить оставшуюся часть. На каждом этапе результат использует бит XOR четырех битов, на которых выполняется работа, и все другие биты остаются неизменными.
Первое деление
1101100111011010 000 1111 ---------------- 0010100111011010 000
Каждое последующее деление действует на результат предыдущего шага, поэтому второе деление является
0010100111011010 000 1111 ---------------- 0001010111011010 000
Деление завершается, когда дивиденды все нули. Полное деление, включая два вышеуказанных шага,
1101100111011010 000 1111 0010100111011010 000 1111 0001010111011010 000 1111 0000101111011010 000 1111 0000010011011010 000 1111 0000001101011010 000 1111 0000000010011010 000 1111 0000000001101010 000 1111 0000000000010010 000 1111 0000000000001100 000 1111 0000000000000011 000 11 11 0000000000000000 110
Оставшиеся биты, 110
, являются значением проверки для этого сообщения.
В MATLAB ® можно выполнить ту же операцию, чтобы получить значение проверки с помощью битовых операций. Во-первых, задайте переменные для сообщения и полиномиального делителя. Используйте беззнаковые 32-битные целые числа, чтобы дополнительные биты были доступны для остальных.
message = 0b1101100111011010u32; messageLength = 16; divisor = 0b1111u32; divisorDegree = 3;
Затем инициализируйте полиномиальный делитель. Использование dec2bin
для отображения бит результата.
divisor = bitshift(divisor,messageLength-divisorDegree-1); dec2bin(divisor)
ans = '1111000000000000'
Теперь сдвиньте делитель и сообщение так, чтобы у них было правильное количество бит (16 битов для сообщения и 3 бита для остатка).
divisor = bitshift(divisor,divisorDegree); remainder = bitshift(message,divisorDegree); dec2bin(divisor)
ans = '1111000000000000000'
dec2bin(remainder)
ans = '1101100111011010000'
Выполните шаги деления CRC с помощью for
цикл. The for
цикл всегда совершенствует один бит каждый шаг, поэтому включите проверку, чтобы увидеть, является ли текущая цифра 1. Если текущая цифра равна 1, выполняется шаг деления; в противном случае цикл продвигается бит и продолжается.
for k = 1:messageLength if bitget(remainder,messageLength+divisorDegree) remainder = bitxor(remainder,divisor); end remainder = bitshift(remainder,1); end
Переместите биты остатка вправо, чтобы получить значение проверки для операции.
CRC_check_value = bitshift(remainder,-messageLength); dec2bin(CRC_check_value)
ans = '110'
Можно использовать значение проверки для проверки целостности сообщения путем повторения той же операции деления. Однако вместо использования оставшейся части 000
чтобы начать, используйте значение проверки 110
. Если сообщение не содержит ошибок, то результат деления будет равен нулю.
Сбросьте оставшуюся переменную и добавьте значение проверки CRC к оставшимся битам с помощью битовой функции OR. Внесите ошибку в сообщение, развернув одно из бита значений с bitset
.
remainder = bitshift(message,divisorDegree); remainder = bitor(remainder,CRC_check_value); remainder = bitset(remainder,6); dec2bin(remainder)
ans = '1101100111011110110'
Выполните операцию деления CRC и затем проверьте, является ли результат нулем.
for k = 1:messageLength if bitget(remainder,messageLength+divisorDegree) remainder = bitxor(remainder,divisor); end remainder = bitshift(remainder,1); end if remainder == 0 disp('Message is error free.') else disp('Message contains errors.') end
Message contains errors.
[1] Склар, Бернард. Цифровые коммуникации: основы и приложения. Englewood Cliffs, Нью-Джерси: Prentice Hall, 1988.
[2] Wicker, Stephen B. Системы управления ошибками для цифровой связи и хранения данных. Upper Saddle River, NJ: Prentice Hall, 1995.