В этом примере показано, как выполнить циклический избыточный контроль (CRC) для битов числа. CRC используются для обнаружения ошибок при передаче данных в цифровых системах. При отправке части данных к ней присоединяется значение короткого чека. Проверочное значение получается многочленовым делением с битами в данных. При получении данных полиномиальное деление повторяется, и результат сравнивается со значением проверки. Если результаты отличаются, то данные были повреждены во время передачи.
Начните с 16-разрядного двоичного числа, представляющего собой передаваемое сообщение:
1101100111011010
Чтобы получить проверочное значение, разделите это число на многочлен x + 1. Можно представить этот многочлен с его коэффициентами:1111.
Деление выполняется поэтапно, и после каждого шага делитель многочлена выравнивается с самым левым 1 в числе. Поскольку результат деления на четыре члена многочлена имеет три бита (в общем деление на многочлен длины 1 дает проверочное значение n), добавьте число с000 для вычисления остатка. На каждом этапе результат использует побитовое исключающее ИЛИ из четырех обрабатываемых битов, и все остальные биты остаются неизменными.
Первый дивизион -
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 цикл. 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 к битам остатка, используя побитовое ИЛИ. Введите ошибку в сообщение, изменив одно из значений бита на 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] Склар, Бернард. Цифровые коммуникации: основы и приложения. Энглвуд Клиффс, Нью-Джерси: Прентис Холл, 1988.
[2] Уикер, Стивен Б. Системы управления ошибками для цифровой связи и хранения. Река Верхнее Седло, Нью-Джерси: Прентис Холл, 1995.