Выполните циклическую проверку избыточности

В этом примере показано, как выполнить циклическую проверку избыточности (CRC) для бит числа. CRC используются для обнаружения ошибок в передаче данных в цифровых системах. При отправке части данных к нему присоединяется краткое значение проверки. Контрольное значение получается путем полиномиального деления с битами в данных. Когда данные получены, полиномиальное деление повторяется, и результат сравнивается с контрольным значением. Если результаты отличаются, данные были повреждены во время передачи.

Вычислим значение проверки вручную

Начните с 16-битного двоичного числа, которое является сообщением, которое должно быть передано:

1101100111011010

Чтобы получить значение проверки, разделите это число на полином x3+x2+x+1. Можно представлять этот полином с его коэффициентами: 1111.

Деление выполняется шагами, и после каждого шага полиномиальное деление выравнивается с самым левым 1 в числе. Потому что результат деления на четыре термина полином имеет три бита (в общем деление на полином длины n+1 задает контрольное значение длины n), добавьте номер с помощью 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.

См. также

|

Похожие темы