exponenta event banner

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

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

Вычислить значение чека вручную

Начните с 16-разрядного двоичного числа, представляющего собой передаваемое сообщение:

1101100111011010

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

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

См. также

|

Связанные темы