Естественные науки

Линейный блочный код, коды Хеминга, Порождающая матрица и Проверочная матрица.

Объясните пожалуйста как создается проверочная матрица :)

К примеру задача:

Переданы три сообщения, закодированные словами a1 a2 a3 a4 a5 a6 a7 в алфавите
B = {0,1}. Символы a5 a6 a7 являются проверочными и вычисляются по формулам
a5 = a2 + a3 + a4
a6 = a1 + a3 + a4
a7 = a1 + a2 + a4
Известно, что при передаче
сообщений полученные слова могли быть искажены одиночными ошибками.
a) Задайте проверочную матрицу H
b) Для каждого из трех полученных слов 0010100, 0011110,1100110 определите
передано ли оно с искажением. Для искаженного слова укажите номер
разряда, в котором произошла одиночная ошибка.

Мое решение:

Я получил порождающую матрицу следующего вида:

1 0 0 0 | 0 1 1
0 1 0 0 | 1 0 1
0 0 1 0 | 1 1 0
0 0 0 1 | 1 1 1

Затем по формуле проверочной матрицы:

Проверочная матрица в систематическом виде строится на основе матрицы G(n,k), а именно:

H(n, k) = |R*(k,r), I(k)|

I(k) - единичная матрица
R*(k,r) - матрица в транспонированном виде из G(n,k)

У меня получилась такая проверочная матрица:

0 1 1 1 | 1 0 0
1 0 1 1 | 0 1 0
1 1 0 1 | 0 0 1

умножаю на требуемы сообщения получил:

(0010100) H* = (0, 1, 0) - 2 позиция
(0011110) H* = (1, 1, 1) - 7 позиция
(1100110) H* = (0, 0, 0) - сообщение верно

НО В ОТВЕТЕ:

проверочная матрица имеет вид:

0 0 0 1 1 1 1
0 1 1 0 0 1 1
1 0 1 0 1 0 1

как я заметил по виду она такая же но просто упорядоченная по столбцам следовательно при умножении сообщений я получаю совершенно другие синдромы:

(0010100) H* = (1, 1, 0) - 6 позиция
(0011110) H* = (1, 0, 0) - 4 позиция
(1100110) H* = (0, 0, 0) - сообщение верно

ВОПРОС:

Объясните пожалуйста почему матрица имеет именно такой вид? у меня уже истерика)
Я не особый спец по этому вопросу, особенно в теории, но решение задачи о поиске позиции ошибки могу дать:
Значит код Хэмминга, общий вид (n,k), где k- количество информационных символов, n - всех.
Общая суть - согнать воедино 2 кода антипода: с проверкой на четность и с повторением. Первый быстро обнаруживает факт ошибки, но не находит ее. Второй исправляет любое число ошибок, но затратен по времени.

В примере, так понимаю, классический код (7,4). Ещё понадобится разница k'=n-k (в примере k'=3)
Теперь необходимо строить проверочную и кодирующую матрицы. Начинают с проверочной H, но нам потребуется транспонированная к ней. Строится так: внизу единичная матрица размерности k' *k', строки сверху заполняются с расчетом, что не должно быть повторяющихся. И нулевую тоже не следует писать. Это задается рандомно и не суть как, лишь бы выполнялись эти условия.

Кодирующая матрица G строится просто. Все внимание на схему!! ! Здесь нижние индексы обозначают количество строк и столбцов у матриц. a - исходное слово из к символов, с - слово из n символов (наше a с k' дополнительными ), c' - слово с с одной ошибкой. Как получается Ht и G - также описал выше и на схеме.



Так вот, три строки снизу на картинке - процесс кодирования и декодирования с исправлением одной ошибки, возникаемой при шумах.
На сколько я понимаю, в твоем случае 1й шаг уже сделан и получено сообщение c либо c' (я не знаю на данный момент, содержит ли оно ошибку) .

Теперь иду на шаг 3) и умножаю c' *Ht. (помним, что все операции по mod 2!) В результате получу вектор 1*k'. Если все элементы вектора нули, то ошибки не было. Иначе смотрим в матрицу Ht и ищем, в какую строку входит наш вектор.
Номер строки, в которую он входит - номер позиции ошибки в слове c'

Собственно все.
Единственное что. Все эти операции я проделывал полностью по алгоритму, т. е. исходил из слова a. Хотя думаю, что и при заданном слове c' рассуждения аналогичны, просто мне не пришлось с помощью G добавлять эти k' дополнительных символа.

Итак, у тебя дано слово, например последнее, c'=1100110. Достроишь матрицу Ht(7*3). В произведении получится строка st(1*3)
Ищешь st(1*3) в Ht(7*3), номер строки, куда входит - номер позиции ошибки в c'.
Удачи!
ШК
Шайнур Каримолдина(Утупова)
11 152
Лучший ответ
Здравствуйте! Можете пожалуйста объяснить как в блочном кодировании сообщение переводится в блочный код
Вектор сообщенияКодовое слово
000 000000
100 110100
010 011010
110 101110
001 101001
101 011101
011 110011
111 000111