stringtranslate.com

Код BCH

В теории кодирования коды Бозе -Чаудхури-Хоквенгема ( коды BCH ) образуют класс циклических кодов с исправлением ошибок , которые строятся с использованием полиномов над конечным полем (также называемым полем Галуа ). Коды BCH были изобретены в 1959 году французским математиком Алексисом Хоквенгемом и независимо в 1960 году Раджем Чандрой Бозе и Д.К. Рэем-Чаудхури . [1] [2] [3] Название Bose-Chaudhuri-Hocquenghem (и аббревиатура BCH ) происходит от инициалов фамилий изобретателей (ошибочно, в случае Рэя-Чаудхури).

Одной из ключевых особенностей кодов BCH является то, что во время разработки кода осуществляется точный контроль количества ошибок символов, исправляемых кодом. В частности, можно разработать двоичные коды BCH, которые смогут исправлять множественные битовые ошибки. Еще одним преимуществом кодов BCH является простота их декодирования, а именно с помощью алгебраического метода, известного как синдромное декодирование . Это упрощает конструкцию декодера этих кодов за счет использования небольшого электронного оборудования малой мощности.

Коды BCH используются в таких приложениях, как спутниковая связь, [4] проигрыватели компакт-дисков , DVD- диски , дисководы , USB-накопители , твердотельные накопители , [5] квантово-устойчивая криптография [6] и двумерные штрих-коды .

Определение и иллюстрация

Примитивные узкосмысловые коды BCH

Учитывая простое число q и степень простого числа q m с целыми положительными числами m и d такие, что dq m − 1 , примитивный код BCH в узком смысле над конечным полем (или полем Галуа) 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) , удовлетворяющими

Минимальные полиномы:

Код BCH с полиномом генератора

Он имеет минимальное расстояние Хэмминга не менее 3 и исправляет до одной ошибки. Поскольку полином генератора имеет степень 4, этот код имеет 11 бит данных и 4 бита контрольной суммы.

Код BCH с полиномом генератора

Он имеет минимальное расстояние Хэмминга не менее 5 и исправляет до двух ошибок. Поскольку полином генератора имеет степень 8, этот код имеет 7 бит данных и 8 бит контрольной суммы.

Код BCH с полиномом генератора

Он имеет минимальное расстояние Хэмминга не менее 7 и исправляет до трех ошибок. Поскольку полином генератора имеет степень 10, этот код имеет 5 бит данных и 10 бит контрольной суммы. (Этот конкретный полином-генератор имеет реальное применение в шаблонах формата QR-кода .)

Код BCH с и выше имеет полином генератора

Этот код имеет минимальное расстояние Хэмминга 15 и исправляет 7 ошибок. Он имеет 1 бит данных и 14 бит контрольной суммы. На самом деле в этом коде всего два кодовых слова: 000000000000000 и 111111111111111.

Общие коды BCH

Общие коды BCH отличаются от примитивных кодов BCH узкого смысла в двух отношениях.

Во-первых, можно ослабить требование быть примитивным элементом . Ослабляя это требование, длина кода изменяется с на порядок элемента

Во-вторых, последовательные корни полинома генератора могут идти из вместо

Определение. Зафиксируйте конечное поле, где – степень простого числа. Выберите положительные целые числа такие, что и является мультипликативным порядком по модулю

Как и раньше, пусть – примитивный корень степени из единицы и пусть – минимальный полином для всех . Генераторный полином кода BCH определяется как наименьшее общее кратное

Примечание: если как в упрощенном определении, то равно 1, а порядок по модулю равен . Следовательно, упрощенное определение действительно является частным случаем общего.

Особые случаи

Полином - генератор кода BCH имеет коэффициенты из _ _ _ Алфавит декодера (синдромы) такой же, как алфавит канала (полиномы данных и генератора), все элементы . [7] Другой тип кода Рида-Соломона — это исходный код Рида-Соломона , который не является кодом BCH.

Характеристики

Генераторный полином кода BCH имеет степень не более . Более того, если и , то порождающий полином имеет степень не более .

Код BCH имеет минимальное расстояние Хэмминга не менее .

Код BCH является циклическим.

Кодирование

Поскольку любой полином, кратный полиному-генератору, является допустимым кодовым словом BCH, кодирование BCH — это просто процесс поиска некоторого полинома, в котором генератор является фактором.

Сам код BCH не предписывает значение коэффициентов полинома; концептуально, единственной задачей алгоритма декодирования BCH является поиск допустимого кодового слова с минимальным расстоянием Хэмминга до полученного кодового слова. Следовательно, код BCH может быть реализован либо как систематический код , либо нет, в зависимости от того, как разработчик решит встроить сообщение в закодированный полином.

Несистематическое кодирование: сообщение как фактор

Самый простой способ найти многочлен, кратный генератору, — это вычислить произведение произвольного многочлена и генератора. В этом случае произвольный полином можно выбрать, используя в качестве коэффициентов символы сообщения.

В качестве примера рассмотрим полином генератора , выбранный для использования в двоичном коде BCH (31, 21), используемом POCSAG и другими. Чтобы закодировать 21-битное сообщение {101101110111101111101}, мы сначала представляем его как полином по :

Затем вычислите (также более ):

Таким образом, передаваемое кодовое слово — {1100111010010111101011101110101}.

Приемник может использовать эти биты в качестве коэффициентов и после исправления ошибок, чтобы гарантировать правильность кодового слова, может пересчитать

Систематическое кодирование: сообщение в виде префикса.

Систематический код — это код, в котором сообщение появляется дословно где-то внутри кодового слова. Таким образом, систематическое кодирование BCH включает в себя сначала встраивание полинома сообщения в полином кодового слова, а затем корректировку коэффициентов остальных (не-сообщений) терминов, чтобы гарантировать, что он делится на .

Этот метод кодирования использует тот факт, что вычитание остатка из делимого приводит к кратному делителю. Следовательно, если мы возьмем наш полином сообщения, как и раньше, и умножим его на (чтобы «сдвинуть» сообщение с пути остатка), мы можем затем использовать евклидово деление полиномов, чтобы получить:

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

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

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

Декодирование

Существует множество алгоритмов декодирования кодов BCH. Наиболее распространенные из них следуют этой общей схеме:

  1. Вычислить синдромы s j для полученного вектора
  2. Определить количество ошибок t и полином локатора ошибок Λ(x) по синдромам
  3. Вычислите корни полинома местоположения ошибки, чтобы найти места ошибок X i
  4. Рассчитайте значения ошибок Y i в этих местах ошибок.
  5. Исправьте ошибки

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

Рассчитаем синдромы

Полученный вектор представляет собой сумму правильного кодового слова и неизвестного вектора ошибок. Значения синдрома формируются путем рассмотрения как полинома и его оценки при Таким образом, синдромы имеют вид [8]

для того, чтобы

Поскольку нули которого кратны, изучение значений синдрома, таким образом, изолирует вектор ошибки, и можно приступить к его решению.

Если ошибки нет, для всех. Если все синдромы нулевые, то декодирование завершено.

Вычислите полином местоположения ошибки

Если есть ненулевые синдромы, то есть ошибки. Декодеру необходимо выяснить, сколько ошибок и где они находятся.

Если есть одна ошибка, запишите ее местонахождение и величину. Тогда первые два синдрома

поэтому вместе они позволяют нам рассчитать и предоставить некоторую информацию (полностью определяющую ее в случае кодов Рида – Соломона).

Если есть две и более ошибки,

Не сразу понятно, как приступить к решению полученных синдромов для неизвестных и

Первым шагом является поиск, совместимый с вычисленными синдромами и с минимально возможным полиномом локатора:

Три популярных алгоритма для этой задачи:

  1. Алгоритм Петерсона – Горенштейна – Цирлера
  2. Алгоритм Берлекэмпа – Мэсси
  3. Алгоритм Евклида Сугиямы

Алгоритм Петерсона – Горенштейна – Цирлера

Алгоритм Петерсона — это второй шаг обобщенной процедуры декодирования BCH. Алгоритм Петерсона используется для расчета полиномиальных коэффициентов локатора ошибок полинома .

Теперь процедура алгоритма Петерсона-Горенштейна-Цирлера. [9] Ожидаем, что у нас есть как минимум 2 t синдромов s c , …, s c +2 t −1 . Пусть v  =  т .

  1. Начните с создания матрицы с элементами, которые являются значениями синдрома.
  2. Создать вектор с элементами
  3. Обозначим неизвестные коэффициенты полинома, которые имеют вид
  4. Составьте матричное уравнение
  5. Если определитель матрицы ненулевой, то мы действительно можем найти обратную матрицу и найти значения неизвестных значений.
  6. Если тогда следовать
     если затем объявить пустой полином локатора ошибок остановить процедуру Петерсона. конец набор
    продолжайте декодирование Петерсона с начала, уменьшая
  7. После того, как у вас есть значения , у вас есть полином локатора ошибок.
  8. Остановите процедуру Петерсона.

Полином локатора факторной ошибки

Теперь, когда у вас есть многочлен, его корни можно найти в форме перебором, например, с помощью алгоритма поиска Чиена . Экспоненциальные степени примитивного элемента будут определять позиции, в которых в полученном слове возникают ошибки; отсюда и название полинома «локатор ошибок».

Нулями Λ( x ) являются α - i 1 , …, α - i v .

Рассчитать значения ошибок

Как только места ошибок станут известны, следующим шагом будет определение значений ошибок в этих местах. Значения ошибок затем используются для исправления полученных значений в этих местах для восстановления исходного кодового слова.

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

Алгоритм Форни

Однако существует более эффективный метод, известный как алгоритм Форни .

Позволять

И полином оценки ошибок [10]

Окончательно:

где

Тогда, если бы синдромы можно было объяснить словом ошибки, которое могло бы быть ненулевым только в позициях , тогда значения ошибок были бы

Для кодов BCH с узким смыслом c = 1, поэтому выражение упрощается до:

Объяснение вычислений алгоритма Форни

Он основан на интерполяции Лагранжа и методах производящих функций .

Рассмотрим и для простоты предположим для и для Тогда

Мы хотим вычислить неизвестные , и мы могли бы упростить контекст, удалив термины. Это приводит к полиному оценки ошибок

Благодаря тому, что у нас есть

Благодаря (приему интерполяции Лагранжа) сумма вырождается только до одного слагаемого для

Чтобы получить, нам просто нужно избавиться от продукта. Мы могли бы вычислить произведение непосредственно из уже вычисленных корней, но могли бы использовать более простую форму.

Как формальная производная

мы снова получаем только одно слагаемое

Итак, наконец

Эта формула удобна при вычислении формальной производной формы

урожайность:

где

Декодирование на основе расширенного алгоритма Евклида

Альтернативный процесс нахождения как полинома Λ, так и полинома локатора ошибок основан на адаптации Ясуо Сугиямы расширенного алгоритма Евклида . [11] Исправление нечитаемых символов также можно легко включить в алгоритм.

Пусть это позиции нечитаемых символов. Создается полином, локализующий эти позиции. Устанавливают значения в нечитаемых позициях на 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].

Цитаты

  1. ^ Рид и Чен 1999, стр. 189
  2. ^ Хоквенгем, 1959 г.
  3. ^ Бозе и Рэй-Чаудхури 1960
  4. ^ «Система кодирования посадочного модуля Фобоса: программное обеспечение и анализ» (PDF) . Архивировано (PDF) из оригинала 9 октября 2022 г. Проверено 25 февраля 2012 г.
  5. ^ Марелли, Алессия; Микелони, Рино (2018). «Коды BCH для твердотельных накопителей». Внутри твердотельных накопителей (SSDS) . Серия Springer в области передовой микроэлектроники. Том. 37. С. 369–406. дои : 10.1007/978-981-13-0599-3_11. ISBN 978-981-13-0598-6. Проверено 23 сентября 2023 г.
  6. ^ http://pqc-hqc.org/doc/hqc-specification_2020-05-29.pdf [ пустой URL-адрес PDF ]
  7. ^ Гилл н.д., с. 3
  8. ^ Лидл и Пилц 1999, стр. 229
  9. ^ Горенштейн, Петерсон и Цирлер, 1960 г.
  10. ^ Гилл н.д., с. 47
  11. ^ Ясуо Сугияма, Масао Касахара, Сигейчи Хирасава и Тошихико Намекава. Метод решения ключевого уравнения для декодирования кодов Гоппы. Информация и контроль, 27:87–99, 1975.

Рекомендации

Основные источники

Вторичные источники

дальнейшее чтение