Практикум на ЭВМ (317)/2013/Коды БЧХ
Материал из MachineLearning.
(→Формулировка задания) |
|||
Строка 11: | Строка 11: | ||
== Необходимая теория == | == Необходимая теория == | ||
- | === Кодирование с помощью (n,k,d)- | + | === Задача помехоустойчивого кодирования === |
+ | |||
+ | Рассмотрим задачу передачи потока битовой информации по каналу с шумом с возможностью автоматического исправления ошибок, допущенных при передаче. При ''блоковом'' кодировании входящий поток информации разбивается на блоки фиксированной длины <tex>k</tex>. Обозначим один такой блок через <tex>u\in\{0,1\}^k</tex>. Предполагается, что во входном потоке данных, вообще говоря, нет избыточности. Поэтому для реализации схемы, способной исправлять ошибки, необходимо закодировать блок <tex>u</tex> в некоторое кодовое слово большей длины путем добавления избыточности в передаваемые данные. Обозначим кодовое слово через <tex>v\in\{0,1\}^n</tex>, <tex>n>k</tex>. Для кодирования всевозможных блоков <tex>u</tex> необходимо использовать <tex>2^k</tex> кодовых слов длины <tex>n</tex>. Определим минимальное расстояние кода <tex>d</tex> как минимальное хэммингово расстояние для всех различных пар кодовых слов. Назовём множество <tex>2^k</tex> кодовых слов длины <tex>n</tex> с минимальным расстоянием <tex>d</tex> ''(n,k,d)-блоковым кодом'', а величину <tex>r=k/n</tex> — ''скоростью кода''. При передаче по каналу с шумом кодовое слово <tex>v</tex> превращается в принятое слово <tex>w</tex>, которое, вообще говоря, отличается от <tex>v</tex>. Далее алгоритм декодирования пытается восстановить переданное слово <tex>v</tex> путем поиска среди всевозможных кодовых слов ближайшего к <tex>w</tex>. Обозначим результат работы алгоритма декодирования через <tex>\hat{v}</tex>. На последнем этапе декодированное слово <tex>\hat{v}</tex> переводится в декодированное слово исходного сообщения <tex>\hat{u}</tex>. Очевидно, что (n,k,d)-блоковый код способен обнаруживать до <tex>d-1</tex> ошибки и исправлять до <tex>[(d-1)/2]</tex> ошибок. | ||
+ | |||
+ | === Кодирование с помощью (n,k,d)-линейного циклического блокового кода === | ||
+ | |||
+ | Множество <tex>\{0,1\}^N</tex> с операциями суммы и произведения по модулю 2 образует линейное пространство над конечным полем из двух элементов <tex>\{0,1\}</tex>. (N,K)-блоковый код называется ''линейным'', если множество его кодовых слов образует линейное подпространство размерности <tex>K</tex> общего линейного пространства <tex>\{0,1\}^N</tex>. Одним из способов задания <tex>K</tex>-мерного линейного подпространства является рассмотрение множества решений следующей системы линейных уравнений: | ||
+ | :<tex>Hx=0</tex>, | ||
+ | где <tex>H\in\{0,1\}^{(N-K){\times}N}</tex> — матрица ранга <tex>N-K</tex>. Такая матрица называется ''проверочной матрицей'' кода, т.к. с её помощью можно проверить, является ли слово <tex>x</tex> кодовым словом путём проверки соотношения <tex>Hx=0</tex> (здесь и далее все операции проводятся по модулю 2). | ||
+ | |||
+ | Рассмотрим задачу кодирования слов исходного сообщения <tex>t</tex> в кодовые слова <tex>x</tex> (N,K)-линейного блокового кода, задаваемого проверочной матрицей <tex>H</tex>. Для этого необходимо найти базис <tex>K</tex>-мерного линейного подпространства <tex>g_1,\dots,g_K\in\{0,1\}^N</tex>. Тогда, рассматривая базисные вектора как столбцы общей матрицы <tex>G\in\{0,1\}^{N{\times}K}</tex>, операция кодирования может быть представлена как <tex>x=Gt</tex>. Матрица <tex>G</tex> называется ''порождающей матрицей'' кода. Кодирование называется ''систематическим'', если все биты слова <tex>t</tex> копируются в некоторые биты кодового слова <tex>x</tex>, т.е. в матрице G некоторое подмножество строк образует единичную матрицу размера <tex>K{\times}K</tex>. При систематическом кодировании обратный процесс преобразования из декодированного кодового слова <tex>\hat{x}</tex> в декодированное слово сообщения <tex>\hat{t}</tex> становится тривиальным. | ||
+ | |||
+ | Одним из способов построения порождающей матрицы кода по заданной проверочной матрице является преобразование проверочной матрицы к каноническому ступенчатому виду. Такое преобразование всегда может быть сделано с помощью гауссовских исключений. С точностью до перестановки столбцов канонический ступенчатый вид матрицы <tex>H</tex> эквивалентен её представлению в виде <tex>\begin{bmatrix} I_{N-K} & P\end{bmatrix}</tex>, где <tex>I_{N-K}</tex> — единичная матрица размера <tex>(N-K)\times(N-K)</tex>. Тогда в качестве порождающей матрицы, обеспечивающей систематическое кодирование, можно выбрать матрицу | ||
+ | :<tex>G = \begin{bmatrix}P\\ I_K\end{bmatrix}</tex>. | ||
+ | Действительно, в этом случае <tex>HGt = (P+P)t = 0</tex>. | ||
=== Коды БЧХ: кодирование и декодирование === | === Коды БЧХ: кодирование и декодирование === |
Версия 16:26, 8 мая 2013
Формулировка задания находится в стадии разработки. Убедительная просьба не приступать к выполнению задания до тех пор, пока это предупреждение не будет удалено. |
Содержание |
Начало выполнения задания: 8 мая 2013 г.
Срок сдачи: 20 мая 2013 г. (понедельник), 23:59.
Программная среда для выполнения задания — MATLAB. Неэффективная реализация кода может негативно отразиться на оценке.
Необходимая теория
Задача помехоустойчивого кодирования
Рассмотрим задачу передачи потока битовой информации по каналу с шумом с возможностью автоматического исправления ошибок, допущенных при передаче. При блоковом кодировании входящий поток информации разбивается на блоки фиксированной длины . Обозначим один такой блок через . Предполагается, что во входном потоке данных, вообще говоря, нет избыточности. Поэтому для реализации схемы, способной исправлять ошибки, необходимо закодировать блок в некоторое кодовое слово большей длины путем добавления избыточности в передаваемые данные. Обозначим кодовое слово через , . Для кодирования всевозможных блоков необходимо использовать кодовых слов длины . Определим минимальное расстояние кода как минимальное хэммингово расстояние для всех различных пар кодовых слов. Назовём множество кодовых слов длины с минимальным расстоянием (n,k,d)-блоковым кодом, а величину — скоростью кода. При передаче по каналу с шумом кодовое слово превращается в принятое слово , которое, вообще говоря, отличается от . Далее алгоритм декодирования пытается восстановить переданное слово путем поиска среди всевозможных кодовых слов ближайшего к . Обозначим результат работы алгоритма декодирования через . На последнем этапе декодированное слово переводится в декодированное слово исходного сообщения . Очевидно, что (n,k,d)-блоковый код способен обнаруживать до ошибки и исправлять до ошибок.
Кодирование с помощью (n,k,d)-линейного циклического блокового кода
Множество с операциями суммы и произведения по модулю 2 образует линейное пространство над конечным полем из двух элементов . (N,K)-блоковый код называется линейным, если множество его кодовых слов образует линейное подпространство размерности общего линейного пространства . Одним из способов задания -мерного линейного подпространства является рассмотрение множества решений следующей системы линейных уравнений:
- ,
где — матрица ранга . Такая матрица называется проверочной матрицей кода, т.к. с её помощью можно проверить, является ли слово кодовым словом путём проверки соотношения (здесь и далее все операции проводятся по модулю 2).
Рассмотрим задачу кодирования слов исходного сообщения в кодовые слова (N,K)-линейного блокового кода, задаваемого проверочной матрицей . Для этого необходимо найти базис -мерного линейного подпространства . Тогда, рассматривая базисные вектора как столбцы общей матрицы , операция кодирования может быть представлена как . Матрица называется порождающей матрицей кода. Кодирование называется систематическим, если все биты слова копируются в некоторые биты кодового слова , т.е. в матрице G некоторое подмножество строк образует единичную матрицу размера . При систематическом кодировании обратный процесс преобразования из декодированного кодового слова в декодированное слово сообщения становится тривиальным.
Одним из способов построения порождающей матрицы кода по заданной проверочной матрице является преобразование проверочной матрицы к каноническому ступенчатому виду. Такое преобразование всегда может быть сделано с помощью гауссовских исключений. С точностью до перестановки столбцов канонический ступенчатый вид матрицы эквивалентен её представлению в виде , где — единичная матрица размера . Тогда в качестве порождающей матрицы, обеспечивающей систематическое кодирование, можно выбрать матрицу
- .
Действительно, в этом случае .
Коды БЧХ: кодирование и декодирование
Укороченные коды
Формулировка задания
В задании выдается список всех примитивных многочленов степени для поля для всех .
- Реализовать основные операции в поле : сложение, умножение, деление, решение СЛАУ, поиск примитивных элементов, вычисление значения многочлена из для заданного элемента поля. Реализовать поиск минимального многочлена из для заданного набора корней из поля двумя способами: с помощью решения СЛАУ и с помощью построения циклотомических классов смежности. Провести временные замеры скорости работы для этих двух способов.
- Реализовать процедуру систематического кодирования для циклического кода, заданного своим порождающим многочленом;
- Реализовать процедуру построения порождающего многочлена для БЧХ-кода при заданных и ;
- Построить графики зависимости скорости БЧХ-кода от минимального кодового расстояния для различных значений . Какие значения следует выбирать на практике для заданного ?
- Реализовать процедуру вычисления истинного минимального расстояния циклического кода, заданного своим порождающим многочленом, путем полного перебора по всем кодовым словам. Привести пример БЧХ-кода, для которого истинное минимальное расстояние больше, чем величина , задаваемая при построении порождающего многочлена;
- Реализовать процедуру декодирования БЧХ-кода с помощью метода PGZ. Провести замеры времени работы реализованного алгоритма декодирования;
- [Бонус] Реализовать процедуру декодирования БЧХ-кода с помощью алгоритма Берлекемпа-Мэсси (BMA). Провести сравнение методов BMA и PGZ по времени работы;
- С помощью метода стат. испытаний реализовать процедуру оценки доли правильно раскодированных сообщений, доли ошибочно раскодированных сообщений и доли отказов от декодирования для БЧХ-кода. С помощью этой процедуры убедиться в том, что БЧХ-код действительно позволяет гарантированно исправить до ошибок. Может ли БЧХ-код исправить больше, чем ошибок? Как ведут себя характеристики кода при числе ошибок, превышающем ?
- Составить отчет в формате PDF обо всех проведенных исследованиях.
Рекомендации по выполнению задания
Оформление задания
Выполненное задание с отчетом и всеми исходными кодами необходимо прислать преподавателю. Большая просьба строго следовать указанным ниже прототипам реализуемых функций.
Построение матрицы соответствия между десятичным и степенным представлением для всех элементов поля |
---|
pm = gf_gen_pow_matrix(pp) |
ВХОД |
pp — примитивный многочлен в поле степени , десятичное число; |
ВЫХОД |
pm — матрица соответствия между десятичным представлением и степенным представлением по стандартному примитивному элементу , матрица размера , в которой в первой колонке в позиции стоит степень , а во второй колонке в позиции стоит значение . |
Суммирование в |
---|
res = gf_sum(X, Y) — поэлементное суммирование двух матриц |
res = gf_sum(X, [], dim) — суммирование по заданной размерности |
ВХОД |
X, Y — матрица из элементов поля , каждый элемент представляет собой десятичное число, двоичная запись которого соответствует коэффициентам полинома над полем , первый разряд соответствует старшей степени полинома; |
dim — (необязательный параметр) номер размерности для суммирования, по умолчанию = 1; |
ВЫХОД |
res — результат суммирования. |
Умножение/деление в поле |
---|
res = gf_prod(X, Y, pm) — поэлементное умножение двух матриц |
res = gf_divide(X, Y, pm) — поэлементное деление двух матриц |
ВХОД |
X, Y — матрица из элементов поля ; |
pm — матрица соответствия между десятичным и степенным представлением в поле ; |
ВЫХОД |
res — результат операции, при делении на ноль соответствующий элемент равен NaN. |
Решение СЛАУ в поле методом Гаусса |
---|
x = gf_linsolve(A, b, pm) |
ВХОД |
A — квадратная матрица из элементов поля ; |
b — вектор-столбец из элементов поля ; |
pm — матрица соответствия между десятичным и степенным представлением в поле ; |
ВЫХОД |
x — решение СЛАУ, вектор-столбец из элементов поля, в случае вырожденности равен NaN. |
Поиск всех примитивных элементов поля |
---|
alpha = gf_primel(pm) |
ВХОД |
pm — матрица соответствия между десятичным и степенным представлением в поле ; |
ВЫХОД |
alpha — найденные примитивные элементы, вектор-столбец десятичных чисел. |
Поиск минимального полинома в с заданным набором корней из |
---|
[p, x_coset] = gf_minpoly(x, pm, method) |
ВХОД |
x — вектор-столбец из элементов поля ; |
pm — матрица соответствия между десятичным и степенным представлением в поле ; |
method — (необязательный параметр) метод поиска, строка, возможные значения 'ls' (с помощью решения СЛАУ) и 'cosets' (с помощью построения циклотомических классов смежности), по умолчанию = 'cosets'; |
ВЫХОД |
p — найденный полином, десятичное число; |
x_coset — все корни минимального полинома (x + все смежные с x элементы), вектор-столбец из элементов поля . |
Значение полинома из на элементе из |
---|
res = gf_polyval(p, X, pm) |
ВХОД |
p — полином из , вектор-столбец коэффициентов, начиная со старшей степени; |
X — матрица из элементов поля ; |
pm — матрица соответствия между десятичным и степенным представлением в поле ; |
ВЫХОД |
res — значение полинома для всех элементов X. |
Систематическое кодирование циклическим кодом с заданным порождающим многочленом |
---|
V = cyclic_coding(U, g, n) |
ВХОД |
U — исходные сообщения для кодирования, вектор-столбец десятичных чисел; |
g — порождающий полином кода, десятичное число; |
n — длина кода, десятичное число; |
ВЫХОД |
V — закодированные сообщения, вектор-столбец десятичных чисел. |
Поиск порождающего многочлена для БЧХ-кода с максимизацией |
---|
[g, R, pm] = bch_genpoly(n, d) |
ВХОД |
n — длина кода, число вида ; |
d — минимальное расстояние кода, число; |
ВЫХОД |
g — порождающий полином кода, число; |
R — нули кода, вектор-столбец чисел; |
pm — матрица соответствия между десятичным и степенным представлением в поле . |
Декодирование БЧХ-кода |
---|
V = bch_decoding(W, R, pm, method) |
ВХОД |
W — набор принятых сообщений, вектор-столбец элементов из ; |
R — нули кода, вектор-столбец элементов из ; |
pm — матрица соответствия между десятичным и степенным представлением в поле ; |
method — (необязательный параметр) метод декодирования, строка, возможные значения 'pgz' и 'bma', по умолчанию = 'pgz'; |
ВЫХОД |
V — декодированные сообщения, вектор-столбец чисел, в случае отказа от декодирования соответствующий элемент равен NaN. |
Вычисление минимального расстояния циклического кода путем полного перебора |
---|
d = cyclic_dist(g, n) |
ВХОД |
g — порождающий многочлен кода, десятичное число; |
n — длина кода, число вида ; |
ВЫХОД |
d — минимальное расстояние кода, число. |