В теории кодирования используются коды BCH или Bose – Chaudhuri– Коды Хоквенгема образуют класс циклических кодов с исправлением ошибок, которые построены с использованием полиномов над конечным полем (также называемым Поле Галуа ). Коды BCH были изобретены в 1959 году французским математиком Алексисом Хоквенгемом и независимо в 1960 году Раджем Бозом и Д. К. Рэй-Чаудхури. Название Bose – Chaudhuri – Hocquenghem (и аббревиатура BCH) происходит от инициалов фамилий изобретателей (ошибочно в случае Ray-Chaudhuri).
Одной из ключевых особенностей кодов BCH является то, что во время разработки кода существует точный контроль над количеством ошибок символов, исправляемых кодом. В частности, можно разработать двоичные коды BCH, которые могут исправлять несколько битовых ошибок. Другим преимуществом кодов BCH является легкость, с которой они могут быть декодированы, а именно с помощью алгебраического метода, известного как синдромное декодирование. Это упрощает конструкцию декодера для этих кодов с использованием небольшого маломощного электронного оборудования.
коды BCH используются в таких приложениях, как спутниковая связь, проигрыватели компакт-дисков, DVD, дисководы, твердотельные приводы, квантово-стойкая криптография и двумерные штрих-коды.
Содержание
- 1 Определение и иллюстрация
- 1.1 Примитивные узкосмысловые коды BCH
- 1.2 Общие коды BCH
- 1.3 Особые случаи
- 2 Свойства
- 3 Кодирование
- 3.1 Несистематическое кодирование: сообщение как фактор
- 3.2 Систематическое кодирование: сообщение как префикс
- 4 Декодирование
- 4.1 Вычисление синдромов
- 4.2 Вычисление полинома местоположения ошибки
- 4.2.1 Алгоритм Петерсона – Горенштейна – Цирлера
- 4.3 Фактор полинома локатора ошибок
- 4.4 Вычисление значений ошибок
- 4.4.1 Алгоритм Форни
- 4.4.2 Объяснение вычисления алгоритма Форни
- 4.5 Декодирование на основе расширенного алгоритма Евклида
- 4.5.1 Объяснение процесса декодирования
- 4.6 Исправление ошибок
- 4.7 Примеры расшифровки
- 4.7.1 Декодирование двоичного кода без нечитаемых символов
- 4.7.2 Декодирование с нечитаемыми символами
- 4.7.3 Декодирование с нечитаемыми символами с небольшим количеством ошибок
- 5 Цитаты
- 6 Ссылки
- 6.1 Первичные источники
- 6.2 Вторичные источники
- 7 Дополнительная литература
Определение и иллюстрация
Примитивные узкосмысловые коды BCH
Дано простое число q и степень простого числа q с положительными целыми числами m и d такими, что d ≤ q - 1, примитивный узкосмысловой код BCH над конечным полем (или полем Галуа) GF (q) с длиной кода n = q - 1 и расстоянием не менее d строится следующим методом.
Пусть α будет примитивным элементом GF (q). Для любого натурального числа i пусть m i (x) будет минимальным многочленом с коэффициентами в GF (q) при α. Генераторный полином кода BCH определяется как наименьшее общее кратное g (x) = lcm (m 1 (x),…, m d - 1 (x)). Можно видеть, что g (x) - многочлен с коэффициентами из GF (q) и делит x - 1. Следовательно, полиномиальный код, определяемый g (x), является циклическим кодом.
Пример
Пусть q = 2 и m = 4 (следовательно, n = 15). Мы рассмотрим разные значения d. Для GF (16) = GF (2) на основе многочлена x + x + 1 с первообразным корнем α = x + 0 существуют минимальные многочлены 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 и 1111111111111.
Общие коды BCH
Общие коды BCH отличаются от примитивных кодов BCH с узким смыслом в двух отношениях.
Во-первых, требование, чтобы был примитивным элементом можно расслабить. При ослаблении этого требования длина кода изменяется с на порядок элемента
Во-вторых, последовательные корни порождающего полинома могут начинаться из вместо
Определение. Исправить конечное поле где - степень простого числа. Выберите целые положительные числа так, чтобы и - порядок умножения числа по модулю
Как и раньше, пусть будет примитивом корень -й степени из единицы в и пусть быть минимальным многочленом над из для всех Генераторный полином кода BCH определяется как наименьшее общее кратное
Примечание: если как в упрощенном определении, затем равно 1, и порядок по модулю равно Следовательно, упрощенное определение действительно является частным случаем общего.
Особые случаи
- Код BCH с называется кодом BCH с узким смыслом.
- A Код BCH с называется примитивным.
Генераторный полином кода BCH имеет коэффициенты из В общем, циклический код над с в качестве порождающего полинома, называется кодом BCH над Код BCH над и порождающий полином с последовательными степенями поскольку корни - это один тип кода Рида – Соломона, где алфавит декодера (синдромов) совпадает с алфавитом канала (данные и генераторный полином), все элементы . Другой тип кода Рида-Соломона - это исходный код Рида-Соломона, который не является кодом BCH.
Свойства
Генераторный полином кода BCH имеет степень не выше . Кроме того, если и , порождающий полином имеет степень не более .
Код BCH имеет минимальное расстояние Хэмминга не менее .
Доказательство |
---|
Предположим, что - это кодовое слово, содержащее менее ненулевых членов. Тогда
Напомним, что являются корнями из отсюда . Это означает, что удовлетворяют следующим уравнениям для каждого :
В матричной форме
Определитель этой матрицы равен
Матрица рассматривается как матрица Вандермонда, и ее определитель равен
, который не равен нулю. Отсюда следует, что , следовательно, |
Код BCH является циклическим.
Доказательство |
---|
Полиномиальный код длины является циклическим тогда и только тогда, когда его порождающий полином делит Поскольку является минимальным многочленом с корнями , достаточно проверить, что каждое из является корнем из Это сразу следует из того факта, что по определению является корень -й степени из единицы. |
Кодирование
Поскольку любой многочлен, кратный образующему многочлену, является допустимым кодовым словом BCH, кодирование BCH - это просто процесс поиска некоторого многочлена, в котором генератор является фактором.
Сам код BCH не определяет значения коэффициентов полинома; концептуально, единственная задача алгоритма декодирования BCH - найти допустимое кодовое слово с минимальным расстоянием Хэмминга до полученного кодового слова. Следовательно, код BCH может быть реализован либо как систематический код , либо нет, в зависимости от того, как разработчик решает внедрить сообщение в закодированный полином.
Несистематическое кодирование: сообщение как фактор
Самый простой способ найти многочлен, кратный генератору, - это вычислить произведение некоторого произвольного полинома и генератора. В этом случае произвольный многочлен можно выбрать, используя символы сообщения в качестве коэффициентов.
В качестве примера рассмотрим порождающий полином , выбранный для использования в (31, 21) двоичном коде BCH, используемом POCSAG и другими. Чтобы закодировать 21-битное сообщение {101101110111101111101}, мы сначала представляем его как полином от :
Затем вычислите (также более ):
Таким образом, переданное кодовое слово - {1100111010010111101011101110101}.
Приемник может использовать эти биты в качестве коэффициентов в и после исправления ошибок для проверки правильности кодового слова может повторно вычислить
Систематическая кодировка: сообщение в виде префикса
Систематический код - это код, в котором сообщение дословно отображается где-то внутри кодового слова. Следовательно, систематическое кодирование BCH включает в себя сначала встраивание полинома сообщения в полином кодового слова, а затем настройку коэффициентов оставшихся (не связанных с сообщением) членов, чтобы гарантировать, что делится на .
Этот метод кодирования использует тот факт, что вычитание остатка от делимого дает результат, кратный делителю. Следовательно, если мы возьмем наш многочлен сообщения , как прежде, и умножим его на (чтобы «сдвинуть» сообщение с пути остатка), мы можем затем использовать евклидово деление многочленов, чтобы получить:
Здесь мы видим, что - допустимое кодовое слово. Поскольку всегда имеет степень меньше (которая является степенью из ), мы можем безопасно вычесть его из без изменения каких-либо коэффициентов сообщения, следовательно, мы имеем как
Более (то есть с двоичными кодами BCH), этот процесс неотличим от добавления циклической проверки избыточности, и если систематический двоичный код BCH используется только для целей обнаружения ошибок, мы видим, что коды BCH являются просто обобщением математики циклических проверок избыточности.
Преимущество систематического кодирования состоит в том, что получатель может восстановить исходное сообщение, отбросив все после первого коэффициентов после выполнения исправления ошибок.
Декодирование
Существует множество алгоритмов декодирования кодов BCH. Наиболее распространенные из них следуют этой общей схеме:
- Вычислить синдромы s j для полученного вектора
- Определить количество ошибок t и полином локатора ошибок Λ (x) из синдромы
- Вычислить корни полинома местоположения ошибки, чтобы найти местоположения ошибки X i
- Вычислить значения ошибки Y i в этих местоположениях ошибки
- Исправить ошибки
Во время некоторых из этих шагов алгоритм декодирования может определить, что полученный вектор содержит слишком много ошибок и не может быть исправлен. Например, если подходящее значение t не найдено, коррекция не будет выполнена. В усеченном (не примитивном) коде место ошибки может быть вне допустимого диапазона. Если полученный вектор содержит больше ошибок, чем код может исправить, декодер может неосознанно выдать явно действительное сообщение, отличное от того, которое было отправлено.
Вычислить синдромы
Полученный вектор представляет собой сумму правильного кодового слова и неизвестный вектор ошибок Значения синдрома формируются путем рассмотрения как полинома и его оценки при Таким образом, синдромы
для до
Поскольку - это нули из которых кратно, Таким образом, изучение значений синдрома изолирует вектор ошибок, чтобы можно было приступить к его поиску.
Если ошибки нет, для всех Если все синдромы равны нулю, то декодирование выполнено.
Вычислить многочлен местоположения ошибки
Если есть ненулевые синдромы, значит, есть ошибки. Декодеру необходимо выяснить, сколько ошибок и где они находятся.
Если есть одна ошибка, запишите это как где - местоположение ошибки, а - ее величина. Тогда первые два синдрома:
, поэтому вместе они позволяют нам вычислить и предоставить некоторую информацию о (полностью определяя его в случай кодов Рида – Соломона).
Если есть две или более ошибок,
Не сразу понятно, как начать решение результирующих синдромов для неизвестных и
Первым шагом является поиск, совместимый с вычисленными синдромами и с минимально возможным многочлен локатора:
Два популярных алгоритма для этой задачи:
- алгоритм Петерсона – Горенштейна – Цирлера
- алгоритм Берлекампа – Месси
алгоритм Петерсона – Горенштейна – Цирлера
алгоритм Петерсона - шаг 2 обобщенной процедуры декодирования BCH. Алгоритм Петерсона используется для вычисления коэффициентов полинома локатора ошибок многочлена
Теперь процедура алгоритма Петерсона – Горенштейна – Цирлера. Ожидается, что у нас будет как минимум 2t синдромов s c,…, s c + 2t − 1. Пусть v = t.
- Начните с создания матрицы с элементами, которые являются значениями синдрома
- Сгенерировать вектор с элементами
- Пусть обозначает неизвестные полиномиальные коэффициенты, которые задаются как
- Сформируйте матричное уравнение
- Если определитель матрицы не равно нулю, тогда мы можем фактически найти обратную матрицу и найти значения неизвестного значений.
- Если затем выполните
, если , то объявите пустой полином локатора ошибок, остановите процедуру Петерсона. конечный набор
продолжить с начала декодирования Петерсона, уменьшив - После того, как у вас есть значения , у вас будет многочлен локатора ошибок.
- Остановить процедуру Петерсона.
Факторный полином локатора ошибок
Теперь, когда у вас есть многочлен , его корни можно найти в форме грубой силой для пример с использованием алгоритма поиска Chien. Экспоненциальные степени примитивного элемента дадут позиции, где возникают ошибки в полученном слове; отсюда и название полином «локатора ошибок».
Нули Λ (x) - это α,…, α.
Расчет значений ошибок
После того, как места ошибок известны, следующим шагом будет определение значений ошибок в этих местах. Затем значения ошибок используются для исправления полученных значений в этих местах для восстановления исходного кодового слова.
Для случая двоичного BCH (со всеми читаемыми символами) это тривиально; просто переверните биты принятого слова в эти позиции, и мы получим исправленное кодовое слово. В более общем случае веса ошибок могут быть определены путем решения линейной системы
алгоритм Форни
Однако существует более эффективный метод, известный как алгоритм Форни.
Пусть
И полином вычислителя ошибок
Наконец:
где
Чем, если бы синдромы можно было объяснить словом ошибки, которое может быть ненулевым только на позициях , тогда значения ошибок равны
Для кодов BCH узкого смысла c = 1, поэтому выражение упрощается до:
Объяснение вычисления алгоритма Форни
Он основан на интерполяции Лагранжа и методах производящих функций.
Рассмотрим и для простоты предположим, что для и для Тогда
We want to compute unknowns and we could simplify the context by removing the terms. This leads to the error evaluator polynomial
Thanks to we have
Thanks to (the Lagrange interpolation trick) the sum degenerates to only one summand for
To get we just should get rid of the product. We could compute the product directly from already computed roots of but we could use simpler form.
As formal derivative
we get again only one summand in
So finally
This formula is advantageous when one computes the formal derivative of form
yielding:
where
Decoding based on extended Euclidean algorithm
An alternate process of finding both the polynomial Λ and the error locator polynomial is based on Yasuo Sugiyama's adaptation of the Extended Euclidean algorithm. Correction of unreadable characters could be incorporated to the algorithm easily as well.
Let be positions of unreadable characters. One creates polynomial localising these positions Set values on unreadable positions to 0 and compute the syndromes.
As we уже определили для формулы Форни, пусть
Давайте запустим расширенный алгоритм Евклида для определения наименьшего общего делителя многочлены и Цель состоит не в том, чтобы найти наименьший общий делитель, а в том, чтобы найти многочлен степени не выше и многочлены такой, что Низкая степень гарантирует, что удовлетворяет расширенному (by ), определяющие условия для
Определение и используя вместо в формуле Фурни даст нам значения ошибок.
Основное преимущество алгоритма в том, что он тем временем вычисляет требуется в формуле Форни.
Объяснение процесса декодирования
Цель состоит в том, чтобы найти кодовое слово, которое минимально отличается от принятого слова на читаемых позициях. Выражая полученное слово как сумму ближайшего кодового слова и слова ошибки, мы пытаемся найти слово ошибки с минимальным количеством ненулевых символов на читаемых позициях. Синдром ограничивает слово ошибки условием
Мы могли бы написать эти условия отдельно или мы могли бы создать многочлен
и сравните коэффициенты около степеней с
Предположим, на позиции мы могли бы заменить набор синдромов по набору синдромов определяется уравнением Предположим для слова ошибки все ограничения из исходного набора удерживает синдромов, чем
Новый набор синдромов ограничивает вектор ошибок
точно так же, как исходный набор синдромов ограничивал вектор ошибок За исключением координаты , где an равно нулю, если Для определения местоположения ошибок мы могли бы изменить набор синдромов аналогичным образом, чтобы отразить все нечитаемые символы. Это сокращает набор синдромов на
В полиномиальной формулировке замена синдромов задает по набору синдромов приводит к
Следовательно,
После замены на , потребуется уравнение для коэффициентов около степеней
Можно Рассмотрите возможность поиска ошибочных позиций с точки зрения устранения влияния заданных позиций так же, как и для нечитаемых символов. Если мы нашли такие позиции , устранение их влияния приводит к получению набора синдромов, состоящего из всех нулей, то существует вектор ошибок с ошибками только по этим координатам. Если обозначает многочлен, исключающий влияние этих координат, мы получаем
В алгоритме Евклида мы пытаемся исправить не более ошибок (на читаемых позициях), потому что с большим количеством ошибок может быть больше кодовых слов на том же расстоянии от полученного слова. Следовательно, для , которое мы ищем, уравнение должно выполняться для коэффициентов, близких к степеням, начиная с
В формуле Форни, можно умножить на скаляр, что даст тот же результат.
Может случиться так, что алгоритм Евклида найдет со степенью выше, чем с числом различных корней, равным его степени, где формула Фурни могла бы исправить ошибки в все его корни, в любом случае исправление такого количества ошибок может быть рискованным (особенно без других ограничений на полученное слово). Обычно после получения более высокой степени мы решаем не исправлять ошибки. Исправление может завершиться неудачно, если имеет корни с большей кратностью или число корней меньше его степени. Отказ также может быть обнаружен по формуле Форни, возвращающей ошибку вне переданного алфавита.
Исправьте ошибки
Используя значения ошибок и местоположение ошибки, исправьте ошибки и сформируйте скорректированный кодовый вектор путем вычитания значений ошибок в местах ошибки.
Примеры декодирования
Декодирование двоичного кода без нечитаемых символов
Рассмотрим код BCH в GF (2) с и . (Это используется в 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]. В полиномиальной записи:
Чтобы исправить ошибки, сначала вычислите синдромы. Взяв , мы имеем и Затем примените процедуру Петерсона путем сокращения строк следующей расширенной матрицы.