Открыть сервис

Циклический код

Циклический код — это разновидность линейного блокового кода, обладающая свойством цикличности: любой циклический сдвиг кодового слова также является кодовым словом. Циклические коды относятся к классу помехоустойчивых кодов и широко применяются в системах передачи, хранения и обработки цифровой информации для обнаружения и исправления ошибок. Их ключевая особенность — эффективная реализация кодирования и декодирования с помощью сдвиговых регистров и операций над многочленами, что делает их удобными для аппаратной реализации.

История

Теоретические основы циклических кодов были заложены в середине XX века. В 1957 году американский математик Юджин Прайндж (Eugene Prange) впервые описал класс кодов, замкнутых относительно циклического сдвига. В 1960 году американские инженеры Роберт Галлагер (Robert Gallager) и Ирвинг Рид (Irving Reed) независимо друг от друга разработали методы построения циклических кодов на основе неприводимых многочленов. Значительный вклад в теорию внесли советские учёные В. Д. Колесник и Э. Т. Миронов, которые в 1960-х годах предложили эффективные алгоритмы декодирования для циклических кодов, используемых в отечественных системах связи. В 1970-х годах циклические коды стали стандартом для многих промышленных протоколов, включая Ethernet (код CRC-32) и системы спутниковой связи.

Математическое описание

Циклические коды основаны на алгебре многочленов над конечным полем Галуа GF(q), где q — простое число или степень простого числа. Для двоичных кодов q=2. Кодовое слово длины n представляется многочленом степени не выше n-1:

\[ c(x) = c_{n-1}x^{n-1} + c_{n-2}x^{n-2} + \dots + c_1x + c_0, \quad c_i \in \{0,1\} \]

Свойство цикличности означает, что если \(c(x)\) — кодовое слово, то \(x \cdot c(x) \mod (x^n - 1)\) также является кодовым словом. Это эквивалентно сдвигу коэффициентов вправо (или влево) с циклическим переносом.

Порождающий многочлен

Циклический код полностью задаётся порождающим многочленом \(g(x)\) степени \(r = n - k\), где \(k\) — число информационных символов, а \(n\) — длина кода. Многочлен \(g(x)\) является делителем \(x^n - 1\) и имеет степень \(r\). Все кодовые слова образуются как произведения информационного многочлена \(m(x)\) степени не выше \(k-1\) на \(g(x)\):

\[ c(x) = m(x) \cdot g(x) \]

При этом \(g(x)\) должен быть неприводимым (или произведением неприводимых многочленов) для обеспечения минимального расстояния кода.

Проверочный многочлен

Проверочный многочлен \(h(x)\) определяется из соотношения:

\[ g(x) \cdot h(x) = x^n - 1 \]

Степень \(h(x)\) равна \(k\). Условие принадлежности многочлена \(c(x)\) к коду: \(c(x) \cdot h(x) \equiv 0 \mod (x^n - 1)\).

Классификация

Циклические коды делятся на несколько основных типов:

По исправляющей способности

  • Коды с обнаружением ошибок — позволяют только определить факт наличия ошибки, но не её местоположение (например, CRC).
  • Коды с исправлением одиночных ошибок — исправляют одну ошибку в блоке (например, код Хэмминга, который является циклическим при определённых условиях).
  • Коды с исправлением многократных ошибок — исправляют две и более ошибки (коды БЧХ, Рида — Соломона).

По типу многочлена

  • Примитивные кодыпорождающий многочлен является примитивным многочленом над GF(q). Длина такого кода \(n = q^m - 1\).
  • Непримитивные коды — порождающий многочлен не является примитивным, длина кода меньше \(q^m - 1\).

По области применения

  • Систематические коды — информационные символы входят в кодовое слово в явном виде, что упрощает декодирование.
  • Несистематические коды — информационные символы не выделяются явно, все символы кодового слова являются проверочными.

Примеры циклических кодов

Коды CRC (Cyclic Redundancy Check)

CRC — это семейство циклических кодов, предназначенных исключительно для обнаружения ошибок. Наиболее распространённые варианты:

  • CRC-32 (полином 0x04C11DB7) — используется в Ethernet, ZIP, PNG. Длина кода 32 бита, обнаруживает все одиночные, двойные и пакетные ошибки длиной до 32 бит.
  • CRC-16 (полином 0x8005) — применяется в протоколах Modbus, USB. Длина 16 бит.
  • CRC-8 (полином 0x07) — используется в 1-Wire, SMBus.

Коды БЧХ (Боуза — Чоудхури — Хоквингема)

Названы в честь Р. Боуза, Д. Чоудхури и А. Хоквингема (1960). Позволяют задавать минимальное расстояние кода \(d_{\min}\) и исправлять до \(t = \lfloor (d_{\min} - 1)/2 \rfloor\) ошибок. Порождающий многочлен строится как произведение нескольких минимальных многочленов. Пример: код БЧХ(15,7) с \(d_{\min}=5\) исправляет две ошибки.

Коды Рида — Соломона

Частный случай недвоичных циклических кодов БЧХ, работающих над полем GF(q), где q — степень простого числа. Широко применяются в системах хранения данных (CD, DVD, QR-коды), спутниковой связи и цифровом телевидении (DVB). Пример: RS(255,223) — код длиной 255 байт, из которых 223 информационных, исправляет до 16 ошибок.

Применение

Циклические коды нашли применение в самых разных областях цифровой техники:

  • Сети передачи данных — CRC-32 в Ethernet, CRC-16 в HDLC, CRC-8 в CAN-шине.
  • Хранение данныхкоды Рида — Соломона в RAID-массивах, жёстких дисках, оптических носителях.
  • Цифровое телевидение и радиовещание — стандарты DVB-T, DVB-S, ATSC используют коды БЧХ и Рида — Соломона.
  • Космическая связь — коды Рида — Соломона применяются в системах связи с зондами (например, «Вояджер»).
  • Криптография — циклические коды используются в некоторых криптосистемах (например, код Мак-Элиса).

Достоинства и недостатки

Достоинства

  • Простота аппаратной реализации на сдвиговых регистрах.
  • Высокая скорость кодирования и декодирования.
  • Возможность обнаружения пакетных ошибок (для CRC).
  • Хорошая корректирующая способность для кодов БЧХ и Рида — Соломона.

Недостатки

  • Ограниченная длина кода (зависит от степени порождающего многочлена).
  • Для кодов с исправлением ошибок требуется более сложное декодирование (алгоритм Берлекэмпа — Мэсси, алгоритм Питерсона — Горенстейна — Цирлера).
  • Неэффективность при высокой плотности ошибок (требуются более мощные коды, например, турбокоды или LDPC).

Интересные факты

  • Код CRC-32, используемый в Ethernet, был разработан в 1975 году и остаётся стандартом до сих пор.
  • Коды Рида — Соломона используются в системе GPS для коррекции ошибок в навигационных сообщениях.
  • В 1990-х годах советские инженеры разработали циклический код (31,16) с порождающим многочленом \(x^{15} + x^{11} + x^7 + x^5 + 1\) для системы управления космическими аппаратами «Энергия» — «Буран».
  • Теоретическая основа циклических кодов лежит в основе более сложных конструкций, таких как свёрточные коды и турбокоды.

Источники

  • Блейхут Р. Теория и практика кодов, контролирующих ошибки. — М.: Мир, 1986.
  • Колесник В. Д., Миронов Э. Т. Циклические коды. — М.: Связь, 1972.
  • Peterson W. W., Weldon E. J. Error-Correcting Codes. — MIT Press, 1972.
  • MacWilliams F. J., Sloane N. J. A. The Theory of Error-Correcting Codes. — North-Holland, 1977.
  • ГОСТ Р 34.11-2012 (Информационная технология. Криптографическая защита информации. Функция хэширования) — содержит описание CRC как вспомогательного средства.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →