Professional Documents
Culture Documents
Tik Lab4
Tik Lab4
Лабораторна робота № 4
з курсу «Теорії інформації кодування»
на тему «Дослідження властивостей та основних
характеристик кодів Хеммінга»
Виконала студентка
Групи ДА-02
Лесечко О.Р
Київ 2022
Мета роботи: дослідження алгоритмів побудови кодів Хеммінга та
іх
можливостей виявлення та корекції помилок при використанні в
інформаційних технологіях.
Хід роботи:
1. Ознайомитися з методикою ефективного кодування
Хаффмана.
Коди Хеммінга — сімейство лінійних кодів, які забезпечують
виявлення та корекцію помилок і узагальнюють код Хеммінга(7,4)
винайдений у 1950 році Річардом Хеммінгом. Коди Хеммінга
забезпечують виявлення двобічних помилок і виправлення
однобітних помилок.
Коди Хеммінга - одні з найпоширеніших систематичних кодів, які
виправляють помилки. До кодів Хеммінга належать коди з
мінімальною відстанню dmjn = 3, що виправляють всі поодинокі
помилки. Формування r перевірних елементів у комбінаціях цих
кодів обчислюють за k інформаційними елементами. Таким чином,
довжина кодової комбінації n = k + r. Перевірними елементами є
лінійні комбінації інформаційних елементів, тобто зважені суми
інформаційних елементів з ваговими коефіцієнтами 1 та 0.
Одним з найважливіших завдань побудови завадостійких кодів із
заданими характеристиками є встановлення співвідношення між
його здатністю виявляти або виправляти помилки і надмірністю.
Існують граничні оцінки, які пов’язують dmin, n і k. Далі будемо
використовувати межу Хеммінга для двійкових кодів, яка близька до
оптимальної для високошвидкісних кодів.
2. Розробити алгоритми кодування текстових повідомлень з
використанням коду Хеммінга з мінімальною кодовою
відстанню
dmin = 3 і dmin = 4.
Кодування для dmin = 3.
1. Створимо масив бітів розміру M = N + R, де N - довжина
вихідного повідомлення, R - число контрольних розрядів, яке
задовольняє .
2. Розрахуємо значення контрольних розрядів, для створеного
масиву бітів.
3. Перенесемо інформаційні біти в створений масив.
Кодування для dmin = 4.
1. Створимо масив бітів розміру M = N + R + 1, де N - довжина
вихідного повідомлення, R - число контрольних розрядів, яке
задовольняє 1 .
2. Розрахуємо значення контрольних розрядів та помістимо їх в
створений масив.
3. Перенесемо інформаційні біти в створений масив.
4. Додаємо ще один контрольний біт в початок, який визначає
парність усього коду. Якщо сума по модулю усіх біт = 0, то цей
контрольний розряд набуває значення 0 та навпаки.
3. Розробити алгоритми декодування текстових повідомлень з
використанням коду Хеммінга з мінімальною кодовою відстанню
dmin = 3 і dmin =4.
Декодування dmin = 3.
1. Перерахуємо значення контрольних розрядів. Якщо
обраховане значення співпадає зі значеннями закодованими в
повідомленні, то повідомлення вірне.
2. Якщо значення відрізняються, можемо локалізувати помилку,
додавши значення контрольних бітів, які відрізняються, це і буде
індексом шуканого елементу.
3. Якщо був знайдений пошкоджений біт, інвертуємо його
значення.
Декодування dmin = 4.
1. Перерахуємо значення контрольних розрядів. Якщо
обраховане значення співпадає зі значеннями закодованими в
повідомленні, то повідомлення вірне.
2. Перевіримо парність всього коду, крім нульового контрольного
розряду. Якщо співпадають, то маємо дві помилки.
3. Якщо не співпадає, то маємо 1 помилку, яку можемо виправити.
def hamming_encode(bit_arr):
if len(bit_arr) < 120:
return bit_arr
encoded_arr = encode(bit_arr, 7)
encoded_arr.insert(0, reduce(lambda x, y: x ^ y, encoded_arr))
return encoded_arr
def encode(bit_arr, max_pow):
for i in range(max_pow):
bit_arr.insert(2 ** i - 1, 0)
# print(bit_arr)
step = 2
for i in [2 ** j - 1 for j in range(0, max_pow)]:
parity_check_bit_list = []
parity_bit_index = i
while i < len(bit_arr):
parity_check_bit_list.extend(val for val in bit_arr[i:i +
step // 2])
i += step
parity = reduce(lambda x, y: x ^ y, parity_check_bit_list)
bit_arr[parity_bit_index] = parity
step *= 2
# print(bit_arr)
return bit_arr
def hamming_decode(bit_arr):
if len(bit_arr) < 128:
print('EOF')
return bit_arr
hamming_coded_arr = bit_arr[1:]
parity_bit = bit_arr[0]
decoded_arr, error = decode(hamming_coded_arr[:], 7)
parity = reduce(lambda x, y: x ^ y, hamming_coded_arr)
if error is not None and parity == parity_bit:
print("\n\n More then 1 error\n\n")
return None
return decoded_arr
def main():
in_f = "text.txt"
out_f = "out.txt"
while True:
print('\n1. Encode\n2. Decode\n3. Encode and decode\n4. Out\n')
op = input('Choose a func: ')
if op == '1':
mis_num = int(input("How many mistakes: "))
encode_file(in_f, mis_num)
elif op == '2':
decode_file(in_f, out_f)
elif op == "3":
mis_num = int(input("How many mistakes: "))
encode_file(in_f, mis_num)
decode_file(in_f, out_f)
elif op == '4':
break
if __name__ == '__main__':
main()
3:
4:
5:
Висновки: в ході виконання лабораторної роботи було розглянуто
побудову та застосування контрольованих і керованих кодів
Хемінга, приктично розв’язано приклади та розрахунки.