Код исправления ошибок
В теории кодирования коды Бозе -Чоудхури-Хоквингема ( коды BCH ) образуют класс циклических кодов с исправлением ошибок , которые строятся с использованием полиномов над конечным полем (также называемым полем Галуа ). Коды BCH были изобретены в 1959 году французским математиком Алексисом Хоквингемом и независимо в 1960 году Раджем Чандрой Бозе и Д.К. Рэем-Чоудхури . [1] [2] [3] Название Бозе-Чоудхури-Хоквингем (и аббревиатура BCH ) происходит от начальных букв фамилий изобретателей (ошибочно, в случае Рэя-Чоудхури).
Одной из ключевых особенностей кодов BCH является то, что во время проектирования кода существует точный контроль над количеством ошибок символов, которые можно исправить с помощью кода. В частности, можно разработать двоичные коды BCH, которые могут исправить множественные ошибки битов. Еще одним преимуществом кодов BCH является простота, с которой их можно декодировать, а именно, с помощью алгебраического метода, известного как синдромное декодирование . Это упрощает проектирование декодера для этих кодов, используя небольшое маломощное электронное оборудование.
Коды BCH используются в таких приложениях, как спутниковая связь, [4] проигрыватели компакт-дисков , DVD-диски , дисководы , USB-флеш-накопители , твердотельные накопители , [5] и двумерные штрихкоды .
Определение и иллюстрация
Примитивные узкосмысловые коды BCH
Для заданного простого числа q и степени простого числа q m с положительными целыми числами m и d такими, что d ≤ q m − 1 , примитивный узкосмысловой код БЧХ над конечным полем (или полем Галуа) GF( q ) с длиной кода n = q m − 1 и расстоянием не менее d строится следующим методом.
Пусть α будет примитивным элементом GF ( q m ) . Для любого положительного целого числа i пусть m i ( x ) будет минимальным многочленом с коэффициентами в GF( q ) от α i . Порождающий многочлен кода BCH определяется как наименьшее общее кратное g ( x ) = lcm( m 1 ( x ),…, m d − 1 ( x )) . Видно, что g ( x ) является многочленом с коэффициентами в GF( q ) и делит x n − 1 . Следовательно, полиномиальный код, определяемый g ( x ), является циклическим кодом.
Пример
Пусть q = 2 и m = 4 (следовательно, n = 15 ). Мы рассмотрим различные значения d для GF(16) = GF(2 4 ) на основе редуцирующего многочлена z 4 + z + 1 , используя примитивный элемент α ( z ) = z . Существует четырнадцать минимальных многочленов m i ( x ) с коэффициентами в GF(2), удовлетворяющими
Минимальные многочлены:
Код БЧХ имеет порождающий полином
Он имеет минимальное расстояние Хэмминга не менее 3 и исправляет до одной ошибки. Поскольку полином генератора имеет степень 4, этот код имеет 11 бит данных и 4 бита контрольной суммы. Он также обозначается как: (15, 11) код БЧХ.
Код БЧХ имеет порождающий полином
Он имеет минимальное расстояние Хэмминга не менее 5 и исправляет до двух ошибок. Поскольку полином генератора имеет степень 8, этот код имеет 7 бит данных и 8 бит контрольной суммы. Он также обозначается как: (15, 7) код БЧХ.
Код БЧХ имеет порождающий полином
Он имеет минимальное расстояние Хэмминга не менее 7 и исправляет до трех ошибок. Поскольку полином генератора имеет степень 10, этот код имеет 5 бит данных и 10 бит контрольной суммы. Он также обозначается как: (15, 5) код BCH. (Этот конкретный полином генератора имеет реальное применение в «информации о формате» QR-кода .)
Код БЧХ с и выше имеет порождающий полином
Этот код имеет минимальное расстояние Хэмминга 15 и исправляет 7 ошибок. Он имеет 1 бит данных и 14 бит контрольной суммы. Он также обозначается как: (15, 1) код BCH. Фактически, этот код имеет только два кодовых слова: 0000000000000000 и 111111111111111 (тривиальный код повторения ).
Общие коды BCH
Общие коды БЧХ отличаются от примитивных узкосмысловых кодов БЧХ в двух отношениях.
Во-первых, требование быть примитивным элементом может быть ослаблено. Ослабляя это требование, длина кода изменяется с на порядок элемента
Во-вторых, последовательные корни полинома генератора могут начинаться с вместо
Определение. Зафиксируйте конечное поле, где — степень простого числа. Выберите положительные целые числа, такие, что и — мультипликативный порядок по модулю
Как и прежде, пусть будет примитивным корнем из единицы в и пусть будет минимальным многочленом над для всех.
Порождающий многочлен кода БЧХ определяется как наименьшее общее кратное
Примечание: если как в упрощенном определении, то равно 1, а порядок по модулю равен
Таким образом, упрощенное определение действительно является частным случаем общего.
Особые случаи
- Код БЧХ с узким смыслом называется кодом БЧХ .
- Код BCH с называется примитивным .
Генераторный полином кода БЧХ имеет коэффициенты из
В общем случае циклический код над с генераторным полиномом в качестве называется кодом БЧХ над
Код БЧХ над и генераторный полином с последовательными степенями в качестве корней является одним из типов кода Рида–Соломона , в котором алфавит декодера (синдромы) совпадает с алфавитом канала (данные и генераторный полином), все элементы из . [6] Другой тип кода Рида-Соломона — это исходный вид кода Рида-Соломона , который не является кодом БЧХ.
Характеристики
Генераторный полином кода БЧХ имеет степень не более . Более того, если и , генераторный полином имеет степень не более .
Код BCH имеет минимальное расстояние Хэмминга не менее .
Код BCH является циклическим.
Кодирование
Поскольку любой полином, кратный полиному генератора, является допустимым кодовым словом BCH, кодирование BCH представляет собой просто процесс нахождения некоторого полинома, множителем которого является генератор.
Сам код BCH не предписывает значения коэффициентов полинома; концептуально единственная задача алгоритма декодирования BCH — найти допустимое кодовое слово с минимальным расстоянием Хэмминга до полученного кодового слова. Поэтому код BCH может быть реализован как систематический код или нет, в зависимости от того, как реализатор решит встроить сообщение в закодированный полином.
Несистематическое кодирование: сообщение как фактор
Самый простой способ найти многочлен, кратный генератору, — это вычислить произведение некоторого произвольного многочлена и генератора. В этом случае произвольный многочлен можно выбрать, используя символы сообщения в качестве коэффициентов.
В качестве примера рассмотрим генераторный полином , выбранный для использования в двоичном коде BCH (31, 21), используемом POCSAG и другими. Чтобы закодировать 21-битное сообщение {10110111011111101111101}, мы сначала представим его как полином над :
Затем вычисляем (также по ):
Таким образом, переданное кодовое слово — {1100111010010111101011101110101}.
Приемник может использовать эти биты в качестве коэффициентов и, после исправления ошибок, чтобы гарантировать правильность кодового слова, может пересчитать
Систематическое кодирование: сообщение как префикс
Систематический код — это код, в котором сообщение появляется дословно где-то в кодовом слове. Таким образом, систематическое кодирование BCH включает в себя сначала встраивание полинома сообщения в полином кодового слова, а затем корректировку коэффициентов оставшихся (не являющихся сообщением) членов, чтобы гарантировать, что делится на .
Этот метод кодирования использует тот факт, что вычитание остатка из делимого приводит к кратному делителю. Следовательно, если мы возьмем наш многочлен сообщения, как и прежде, и умножим его на (чтобы «сместить» сообщение с пути остатка), мы можем затем использовать евклидово деление многочленов, чтобы получить:
Здесь мы видим, что является допустимым кодовым словом. Поскольку всегда имеет степень меньше (которая является степенью ), мы можем безопасно вычесть его из , не изменяя никаких коэффициентов сообщения, следовательно, у нас есть наш as
Более того (т. е. с двоичными кодами BCH) этот процесс неотличим от добавления циклического избыточного кода , и если систематический двоичный код BCH используется только для обнаружения ошибок, мы видим, что коды BCH являются всего лишь обобщением математики циклических избыточных кодов .
Преимущество систематического кодирования заключается в том, что получатель может восстановить исходное сообщение, отбросив все после первых коэффициентов, выполнив исправление ошибок.
Расшифровка
Существует множество алгоритмов декодирования кодов BCH. Наиболее распространенные из них следуют этой общей схеме:
- Рассчитаем синдромы s j для полученного вектора
- Определить количество ошибок t и полином локатора ошибок Λ(x) из синдромов
- Вычислите корни полинома местоположения ошибки, чтобы найти местоположение ошибки X i
- Рассчитайте значения ошибок Y i в этих местах ошибок.
- Исправьте ошибки
На некоторых из этих этапов алгоритм декодирования может определить, что полученный вектор имеет слишком много ошибок и не может быть исправлен. Например, если не найдено подходящее значение t , то исправление не удастся. В усеченном (не примитивном) коде местоположение ошибки может быть вне диапазона. Если полученный вектор имеет больше ошибок, чем код может исправить, декодер может неосознанно выдать, по-видимому, действительное сообщение, которое не является тем, которое было отправлено.
Рассчитайте синдромы
Полученный вектор представляет собой сумму правильного кодового слова и неизвестного вектора ошибок. Значения синдрома формируются путем рассмотрения его как полинома и оценки его по формуле Таким образом, синдромы [7]
для того, чтобы
Так как являются нулями, кратными которых , то изучение значений синдрома позволяет выделить вектор ошибки, чтобы можно было приступить к его решению.
Если ошибок нет, то для всех синдромов все равны нулю, то декодирование выполнено.
Рассчитайте полином местоположения ошибки
Если есть ненулевые синдромы, то есть ошибки. Декодер должен выяснить, сколько ошибок и где они находятся.
Если есть одна ошибка, запишите это как где - местоположение ошибки и - ее величина. Тогда первые два синдрома
поэтому вместе они позволяют нам вычислять и предоставлять некоторую информацию о (полностью определяя ее в случае кодов Рида–Соломона).
Если есть две или более ошибок,
Не сразу становится очевидным, как начать решать полученные синдромы для неизвестных и
Первым шагом является поиск, совместимый с вычисленными синдромами и с минимально возможным полиномом локатора:
Три популярных алгоритма для этой задачи:
- Алгоритм Петерсона – Горенштейна – Цирлера
- Алгоритм Берлекэмпа–Мэсси
- Алгоритм Евклида Сугиямы
Алгоритм Петерсона – Горенштейна – Цирлера
Алгоритм Петерсона — это шаг 2 обобщенной процедуры декодирования BCH. Алгоритм Петерсона используется для вычисления коэффициентов полинома локатора ошибок полинома
Теперь процедура алгоритма Петерсона–Горенштейна–Цирлера. [8] Ожидаем, что у нас есть по крайней мере 2 t синдромов s c , …, s c +2 t −1 . Пусть v = t .
- Начните с создания матрицы с элементами, которые являются значениями синдрома.
- Сгенерировать вектор с элементами
- Обозначим неизвестные коэффициенты полинома, которые определяются формулой
- Составляем матричное уравнение
- Если определитель матрицы отличен от нуля, то мы можем найти обратную матрицу и решить ее относительно значений неизвестных величин.
- Если тогда следуй
если затем объявить пустой полином локатора ошибок остановить процедуру Петерсона. конец набор
продолжить с начала декодирования Петерсона, уменьшив - После того, как у вас есть значения , у вас есть полином локатора ошибок.
- Остановить процедуру Петерсона.
Фактор ошибки локатора полинома
Теперь, когда у вас есть полином, его корни можно найти в форме методом грубой силы, например, с помощью алгоритма поиска Чиена . Экспоненциальные степени примитивного элемента дадут позиции, в которых в полученном слове возникают ошибки; отсюда и название полинома «локатор ошибок».
Нули Λ( x ) — это α − i 1 , …, α − i v .
Рассчитать значения ошибок
После того, как места ошибок известны, следующим шагом является определение значений ошибок в этих местах. Затем значения ошибок используются для исправления полученных значений в этих местах для восстановления исходного кодового слова.
Для случая двоичного BCH (со всеми читаемыми символами) это тривиально; просто переверните биты для полученного слова в этих позициях, и у нас будет исправленное кодовое слово. В более общем случае весовые коэффициенты ошибок можно определить, решив линейную систему
алгоритм Форни
Однако существует более эффективный метод, известный как алгоритм Форни .
Позволять
И полином оценки ошибки [9]
Окончательно:
где
Тогда, если бы синдромы можно было объяснить с помощью ошибочного слова, которое могло бы быть ненулевым только на позициях , то значения ошибок были бы
Для узконаправленных кодов БЧХ c = 1, поэтому выражение упрощается до:
Объяснение вычислений алгоритма Форни
Он основан на интерполяции Лагранжа и методах генерации функций .
Рассмотрим и для простоты предположим, что для и для Тогда
Мы хотим вычислить неизвестные и можем упростить контекст, удалив члены. Это приводит к полиному оценки ошибок
Спасибо, что у нас есть
Благодаря (приему интерполяции Лагранжа) сумма вырождается в единственное слагаемое для
Чтобы получить нам просто нужно избавиться от произведения. Мы могли бы вычислить произведение напрямую из уже вычисленных корней , но мы могли бы использовать более простую форму.
Как формальная производная
мы снова получаем только одно слагаемое в
Итак, наконец
Эта формула полезна при вычислении формальной производной формы
выход:
где
Декодирование на основе расширенного алгоритма Евклида
Альтернативный процесс нахождения как полинома Λ, так и полинома локатора ошибок основан на адаптации расширенного алгоритма Евклида Ясуо Сугиямы . [10] Исправление нечитаемых символов также может быть легко включено в алгоритм.
Пусть будут позициями нечитаемых символов. Создадим полином, локализующий эти позиции.
Зададим значения на нечитаемых позициях равными 0 и вычислим синдромы.
Как мы уже определили для формулы Форни, пусть
Давайте запустим расширенный алгоритм Евклида для нахождения наименьшего общего делителя многочленов и
Цель состоит не в том, чтобы найти наименьший общий делитель, а в том, чтобы найти многочлен степени не выше и многочлены такие, что
Низкая степень гарантирует, что они удовлетворяли бы расширенным (по ) определяющим условиям для
Определение и использование вместо в формуле Фурни даст нам значения ошибок.
Главное преимущество алгоритма в том, что он одновременно вычисляет требуемые в формуле Форни значения.
Объяснение процесса декодирования
Цель состоит в том, чтобы найти кодовое слово, которое отличается от полученного слова минимально возможно на читаемых позициях. При выражении полученного слова как суммы ближайшего кодового слова и ошибочного слова, мы пытаемся найти ошибочное слово с минимальным количеством ненулевых символов на читаемых позициях. Синдром ограничивает ошибочное слово условием
Мы могли бы записать эти условия по отдельности или создать полиномиальные
и сравнить коэффициенты около степеней
Предположим, что в позиции есть нечитаемая буква, мы можем заменить набор синдромов набором синдромов, определяемым уравнением. Предположим, что для ошибочного слова все ограничения по исходному набору синдромов выполняются, тогда
Новый набор синдромов ограничивает вектор ошибок
таким же образом, как исходный набор синдромов ограничивал вектор ошибок За исключением координаты , где у нас есть, равной нулю, если Для цели определения позиций ошибок мы могли бы изменить набор синдромов аналогичным образом, чтобы отразить все нечитаемые символы. Это сокращает набор синдромов на
В полиномиальной формулировке замена набора синдромов на набор синдромов приводит к
Поэтому,
После замены на потребовалось бы уравнение для коэффициентов около степеней
Можно было бы рассмотреть поиск ошибочных позиций с точки зрения устранения влияния данных позиций аналогично тому, как это было с нечитаемыми символами. Если мы нашли такие позиции, устранение влияния которых приводит к получению набора синдромов, состоящих из одних нулей, то существует вектор ошибок с ошибками только по этим координатам. Если обозначает полином, устраняющий влияние этих координат, то получаем
В алгоритме Евклида мы пытаемся исправить как можно больше ошибок (на читаемых позициях), поскольку при большем количестве ошибок может быть больше кодовых слов на том же расстоянии от полученного слова. Поэтому, для того, что мы ищем, уравнение должно выполняться для коэффициентов вблизи степеней, начиная с
В формуле Форни можно умножить на скаляр, получив тот же результат.
Может случиться, что алгоритм Евклида найдет степень выше, чем имеющую число различных корней, равное его степени, где формула Форни сможет исправить ошибки во всех его корнях, в любом случае исправление такого количества ошибок может быть рискованным (особенно при отсутствии других ограничений на полученное слово). Обычно после получения более высокой степени мы решаем не исправлять ошибки. Исправление может не удаться в случае, если имеет корни с большей кратностью или число корней меньше его степени. Сбой может быть также обнаружен формулой Форни, возвращающей ошибку за пределами переданного алфавита.
Исправьте ошибки
Используя значения ошибок и местоположение ошибок, исправьте ошибки и сформируйте исправленный кодовый вектор путем вычитания значений ошибок в местах ошибок.
Примеры расшифровки
Декодирование двоичного кода без нечитаемых символов
Рассмотрим код BCH в GF(2 4 ) с и . (Это используется в QR-кодах .) Пусть передаваемое сообщение будет [1 1 0 1 1], или в полиномиальной нотации,
Символы «контрольной суммы» вычисляются путем деления на и взятия остатка, в результате чего получается или [ 1 0 0 0 0 1 0 1 0 0 ]. Они добавляются к сообщению, поэтому переданное кодовое слово равно [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 ].
Теперь представьте, что при передаче произошло две ошибки в битах, поэтому полученное кодовое слово равно [1 0 0 1 1 1 0 0 0 1 1 0 1 0 0]. В полиномиальной записи:
Для исправления ошибок сначала вычислим синдромы. Принимая, что и
Далее, применим процедуру Петерсона, сократив по строкам следующую расширенную матрицу.
Из-за нулевой строки S 3×3 является сингулярным, что неудивительно, поскольку в кодовое слово было внесено всего две ошибки. Однако верхний левый угол матрицы идентичен [ S 2×2 | C 2×1 ] , что приводит к решению
Результирующий полином локатора ошибок имеет нули в и
Показатели степени соответствуют местоположениям ошибок. В этом примере нет необходимости вычислять значения ошибок, поскольку единственное возможное значение равно 1.
Расшифровка с нечитаемыми символами
Предположим тот же сценарий, но полученное слово содержит два нечитаемых символа [ 1 0 0 ? 1 1 ? 0 0 1 1 0 1 0 0 ]. Заменяем нечитаемые символы нулями, создавая полином, отражающий их позиции. Вычисляем синдромы и (Используя логарифмическую нотацию, которая не зависит от изоморфизмов GF(2 4 ). Для проверки вычислений мы можем использовать то же представление для сложения, что и в предыдущем примере. Шестнадцатеричное описание степеней последовательно 1,2,4,8,3,6,C,B,5,A,7,E,F,D,9 со сложением, основанным на побитовом исключающем ИЛИ.)
Давайте сделаем синдром полиномиальным
вычислить
Запустите расширенный алгоритм Евклида:
Мы достигли многочлена степени не выше 3, и так как
мы получаем
Поэтому,
Пусть не волнуйтесь, что найдем методом перебора корень числа Корни равны и (например, после нахождения мы можем разделить на соответствующий моном , и корень полученного монома может быть легко найден).
Позволять
Давайте найдем значения ошибок, используя формулу
где корни Мы получаем
На самом деле, это не должно вызывать удивления.
Таким образом, исправленный код выглядит следующим образом: [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0].
Декодирование с нечитаемыми символами с небольшим количеством ошибок
Покажем поведение алгоритма для случая с малым количеством ошибок. Пусть получено слово [ 1 0 0 ? 1 1 ? 0 0 0 1 0 1 0 0 ].
Снова замените нечитаемые символы нулями, создавая полином, отражающий их позиции.
Вычислите синдромы и
создайте полином синдрома.
Давайте запустим расширенный алгоритм Евклида:
Мы достигли многочлена степени не выше 3, и так как
мы получаем
Поэтому,
Пусть не волнуйтесь, что корень - это
Позволять
Давайте найдем значения ошибок, используя формулу , где — корни многочлена
Мы получаем
Это не должно вызывать удивления.
Таким образом, исправленный код выглядит следующим образом: [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0].
Цитаты
- ^ Рид и Чен 1999, стр. 189
- ^ Хоквенгем 1959
- ^ Бозе и Рэй-Чоудхури 1960
- ^ "Phobos Lander Coding System: Software and Analysis" (PDF) . Архивировано (PDF) из оригинала 2022-10-09 . Получено 25 февраля 2012 .
- ^ Марелли, Алессия; Микелони, Рино (2018). «Коды BCH для твердотельных накопителей». Внутри твердотельных накопителей (SSDS) . Springer Series in Advanced Microelectronics. Том 37. С. 369–406. doi :10.1007/978-981-13-0599-3_11. ISBN 978-981-13-0598-6. Получено 23 сентября 2023 г. .
- ^ Gill nd, стр. 3
- ^ Lidl & Pilz 1999, стр. 229
- ^ Горенштейн, Петерсон и Цирлер, 1960 г.
- ^ Гилл nd, стр. 47
- ^ Ясуо Сугияма, Масао Касахара, Сигейчи Хирасава и Тошихико Намекава. Метод решения ключевого уравнения для декодирования кодов Гоппы. Информация и контроль, 27:87–99, 1975.
Ссылки
Первичные источники
- Хокенгем, А. (сентябрь 1959 г.), «Коды корректоров ошибок», Chiffres (на французском языке), 2 , Париж: 147–156.
- Бозе, Р. К.; Рэй -Чоудхури, Д. К. (март 1960 г.), «О классе двоичных групповых кодов, исправляющих ошибки» (PDF) , Information and Control , 3 (1): 68–79, doi : 10.1016/s0019-9958(60)90287-4, ISSN 0890-5401, архивировано (PDF) из оригинала 09.10.2022 г.
Вторичные источники
- Гилл, Джон (nd), EE387 Notes #7, Handout #28 (PDF) , Стэнфордский университет, стр. 42–45, архивировано (PDF) из оригинала 2022-10-09 , извлечено 21 апреля 2010 г.[ мертвая ссылка ] Заметки по курсу, по всей видимости, переделываются для 2012 года: http://www.stanford.edu/class/ee387/ Архивировано 05.06.2013 на Wayback Machine
- Горенштейн, Дэниел ; Петерсон, У. Уэсли ; Цирлер, Нил (1960), «Коды Бозе-Чоудхури, исправляющие две ошибки, являются квазисовершенными», Информация и управление , 3 (3): 291–294, doi : 10.1016/s0019-9958(60)90877-9
- Лидл, Рудольф; Пильц, Гюнтер (1999), Прикладная абстрактная алгебра (2-е изд.), John Wiley
- Рид, Ирвинг С.; Чен, Сюэминь (1999), Кодирование с контролем ошибок для сетей передачи данных , Бостон, Массачусетс: Kluwer Academic Publishers , ISBN 0-7923-8528-4
Дальнейшее чтение
- Блахут, Ричард Э. (2003), Алгебраические коды для передачи данных (2-е изд.), Cambridge University Press , ISBN 0-521-55374-1
- Гилберт, У. Дж.; Николсон, У. К. (2004), Современная алгебра с приложениями (2-е изд.), Джон Уайли
- Лин, С.; Костелло, Д. (2004), Кодирование с контролем ошибок: основы и применение , Энглвуд Клиффс, Нью-Джерси: Prentice-Hall
- MacWilliams, FJ; Sloane, NJA (1977), Теория кодов, исправляющих ошибки , Нью-Йорк, штат Нью-Йорк: North-Holland Publishing Company
- Рудра, Атри, CSE 545, Коды исправления ошибок: комбинаторика, алгоритмы и приложения, Университет в Буффало, архивировано с оригинала 2012-12-18