Возможно ли выполнить рудиментарную коррекцию ошибок с помощью CRC?

Я знаю, что все намерение использовать CRC - это делать обнаружение ошибок, но я слышал, что кто-то заявляет, что он может использоваться для исправления основной ошибки в дополнение к обнаружению ошибок. Мне было любопытно, если это так, и если да, то насколько это мощно? Я имею в виду, что мы обычно ссылаемся на CRC как способный выполнять обнаружение x-бит, но мне любопытно, может ли он выполнять коррекцию x-бит. Если да, то как это работает? Спасибо.

Ответ 1

Можно выполнить однобитовую коррекцию ошибок с помощью CRC. Предположим, что у одного есть CRC-регистр и есть функции для запуска CRC-алгоритма вперед и назад бит за раз, игнорируя входящие данные

int crc_forward(int old_value, int data_bit)
{
  if (old_value & 0x8000)
    return ((old_value ^ 0x8000) SHL 1) ^ 0x1021 ^ data_bit;
  else
    return (old_value SHL 1) ^ data_bit;
}

int crc_reverse(int old_value)
{
  if (old_value & 1)
    return (old_value SHR 1) ^ 0x8810;
  else
    return old_value SHR 1;
}

Предположим, что у одного есть пакет, который вычисляется так, что инициализация crc до некоторого значения и запуск crc_forward для каждого бита (сначала MSB) должны давать нуль. Если получить значение CRC, отличное от нуля, можно запустить алгоритм в обратном порядке (игнорируя биты данных) до тех пор, пока вычисленное значение CRC равно 1. Это место неправильного бита.

Обратите внимание, что этот подход может быть достаточным для исправления ошибок программного обеспечения в таких вещах, как NAND flash. Чтобы с пользой использовать его для аппаратной коррекции ошибок, нужно было либо уметь откладывать операции чтения до тех пор, пока ECC не может быть обработан, иначе понадобится таблица значений "синдрома" и бит.

Ответ 2

Вы можете выполнить многобитовую коррекцию ошибок с помощью CRC. Глядя на википедию, ссылаясь на работу koopmans, CRC может обнаружить свои ошибки hamming_distance-1. Расстояние от помех зависит от длины полезной нагрузки и используемого полинома CRC. Так, например, многочлен Koopmans от 0xBA0DC66B может обнаруживать до 5 бит ошибки в сообщениях длиной до 16360 бит. Алгоритм, описанный в двух предыдущих сообщениях, может быть увеличен до количества бит по мере необходимости, но время увеличивается экспоненциально с количеством бит для исправления.

  • Вычислить ошибку CRC = CRC_gotten ^ CRC_expected.
  • Просмотрите все возможные 1-битные сообщения (т.е. все 0, 1 и все 0) (есть случаи, которые нужно оценить для сообщений. Примечание: это BITS не BYTES), а бит ошибки - это сообщение, которое генерирует CRC ошибки.
  • Инвертировать обнаруженный бит, чтобы исправить ошибку.

Если вы не можете найти 1 бит, соответствующий CRC ошибки, просмотрите все 2-битные, 3-бит до вашего hamming_distance-1. Обратите внимание, что это происходит медленно, message_length в квадрате для 2 бит, кубирование для 3 бит до пятой мощности для пяти бит.

Ответ 3

Недавно я работал над обнаружением ошибок CRC16 и однократной коррекцией ошибок.

Вот основная идея:

  • Предположим, что у вас есть одна ошибка.
  • Если данные + crc не содержат ошибки, CRC будет 0, иначе это не так.
  • Мы определяем CRC, отправленный как CRC и CRC, полученные как CRCr.
  • Тогда биты ошибки задаются CRCox = CRCs ^ CRCr.
  • Результат включает в себя как ошибки CRC, так и ошибки данных.
  • Посмотрите, какая связь между CRCox и битовой ошибкой.

Это ясно? У меня есть статья об этом. Если вы хотите узнать больше, просто дайте мне знать.