Теория информации
Коды с исправлением ошибок
QR-код на кофейной упаковке можно прочитать даже если он наполовину испачкан кофе - это коды Рида-Соломона. Wi-Fi 6 работает вблизи теоретического предела Шеннона - это LDPC. Voyager 1 передаёт данные с расстояния 23 млрд км при мощности 20 Вт - RS + Golay.
- **QR-коды** используют RS(n,k) с четырьмя уровнями коррекции. Уровень H позволяет восстановить 30% повреждённого кода - именно поэтому компании рисуют логотипы поверх QR.
- **5G NR** использует LDPC для пользовательских данных и polar-коды для управляющих каналов. Polar-коды - первые, теоретически достигающие предела Шеннона.
- **RAID-6** использует RS-коды для защиты от отказа двух дисков одновременно. Это та же математика, что и в космических зондах.
Предварительные знания
Код Хэмминга
Ричард Хэмминг работал на ранних релейных компьютерах Bell Labs в выходные дни, когда никого не было рядом. Ошибки в перфокартах раздражали его - компьютер просто останавливался. В 1950 году он придумал элегантный способ: добавить несколько «проверочных битов», которые позволяют не только обнаружить, но и исправить одну ошибку. Код Хэмминга (7,4) добавляет 3 бита к каждым 4 информационным, позволяя исправить любую одиночную ошибку.
**Код Хэмминга (n,k):** n = 2^r − 1, k = n − r, r проверочных битов. Кодовое расстояние d_min = 3: можно исправить 1 ошибку или обнаружить 2. Скорость R = k/n = (2^r − 1 − r)/(2^r − 1). При r=3: (7,4), R=4/7≈0.57. При r→∞: R→1 (асимптотически оптимально).
| Код Хэмминга | r | n | k | Скорость R |
|---|---|---|---|---|
| (7,4) | 3 | 7 | 4 | 4/7 ≈ 0.57 |
| (15,11) | 4 | 15 | 11 | 11/15 ≈ 0.73 |
| (31,26) | 5 | 31 | 26 | 26/31 ≈ 0.84 |
| (63,57) | 6 | 63 | 57 | 57/63 ≈ 0.90 |
Историческая справка
Ричард Хэмминг придумал свой код в 1947 году в Bell Labs. Говорят, что его мотивировало раздражение: компьютеры выходных дней Bell останавливались на ошибках, и никто не исправлял их до понедельника. В 1950 году он опубликовал статью, и коды Хэмминга стали первыми практическими кодами с исправлением ошибок.
Добавление проверочных битов всегда замедляет передачу
Если канал достаточно шумный, коды с исправлением ошибок повышают эффективную скорость: меньше нужно повторных передач.
Без FEC на шумном канале нужен ARQ (повторные запросы) - каждая ошибка = полная повторная передача блока.
Код Хэмминга (7,4) обнаружил ошибку. Что он может сделать?
Коды Рида-Соломона
Коды Рида-Соломона (1960) работают не с битами, а с символами (байтами или словами). Они основаны на полиномах над конечными полями: сообщение кодируется как полином, а кодовое слово - это значения этого полинома в n точках. При наличии до t ошибок можно восстановить полином по (n-t) точкам. Классика: RS(255,223) из стандарта CD и космических зондов.
**RS(n,k) код:** n символов в кодовом слове, k информационных. Исправляет t = (n-k)/2 ошибок. Кодовое расстояние d_min = n-k+1 (достигает границы Синглтона!). Работает над GF(2^m): RS(255,223) над GF(256), исправляет до 16 байт ошибок.
| Применение | Код | Исправляет |
|---|---|---|
| CD/DVD | RS(255,223) | до 16 байт ошибок |
| QR-код уровень H | RS(255,217) | до 30% повреждений |
| Voyager (1977) | RS(255,223) + Golay | глубокий космос |
| RAID-6 | RS коды | до 2 дисков |
| DSL/ADSL | RS(255,239) | пакетные ошибки |
Историческая справка
Ирвинг Рид и Гюстав Соломон опубликовали свою конструкцию в 1960 году. Зонды Voyager 1 и 2 используют RS-коды с 1977 года для связи с Землёй. QR-коды - прямой потомок этой работы; именно RS позволяет читать частично загрязнённый QR.
RS-коды работают только с байтами
RS-коды работают с любыми символами над конечным полем GF(q). Стандартный выбор q=256 (байты), но возможны другие.
Математика RS - полиномиальное кодирование над GF(q). Выбор q=256 удобен для компьютеров, но не принципиален.
RS(255,223) может исправить до скольких байт ошибок?
LDPC коды
LDPC (Low-Density Parity-Check) коды - матрица проверок чётности, в которой мало единиц. Придуманы Галлагером в 1963 году, забыты на 30 лет (компьютеров не хватало), переоткрыты Маккаем и Нилом в 1995. Ключевой алгоритм декодирования - belief propagation: сообщения передаются по графу Тэннера между «битовыми» и «проверочными» узлами, итерационно уточняя оценки вероятностей.
**LDPC:** H·c = 0 (мод 2), где H - разреженная матрица проверок. Belief propagation декодирует за O(n) операций. Достигает предела Шеннона на ~0.0045 дБ (в 2001). Используется в: Wi-Fi (802.11n/ac/ax), 10G Ethernet, DVB-S2, 5G NR.
| Стандарт | Код | Скорость | Gap до Шеннона |
|---|---|---|---|
| Wi-Fi 6 (802.11ax) | LDPC | 1/2 - 5/6 | < 0.5 дБ |
| DVB-S2 | LDPC + BCH | 1/4 - 9/10 | ~0.5 дБ |
| 5G NR data | LDPC | 1/3 - 8/9 | < 0.3 дБ |
| CCSDS (космос) | LDPC | 1/2 | ~0.5 дБ |
Историческая справка
Роберт Галлагер придумал LDPC в своей PhD диссертации в MIT в 1963 году. Идея была слишком сложна для компьютеров того времени и забыта. В 1995 году Маккай и Нил переоткрыли метод. Gallagher получил медаль IEEE в 2003 за работу 40-летней давности.
LDPC-коды были изобретены в 1990-х
LDPC изобрёл Галлагер в 1963 году, но они были забыты на 30 лет из-за отсутствия вычислительных мощностей.
Belief propagation требует итерационных вычислений. В 1963 году это было нереальным; к 1995 году - рутиной.
Почему LDPC называют «с малой плотностью проверок» (Low-Density)?
Turbo-коды
Turbo-коды (Берру и Гллавьё, 1993) стали сенсацией: первый практический код, подошедший на 0.5 дБ к пределу Шеннона. Идея: два рекурсивных свёрточных кодера (RSC), разделённых перемежителем (interleaver), работают параллельно. Декодирование - итерационный обмен «мягкой» информацией между двумя BCJR-декодерами через общий «турбо» цикл.
**Turbo-код:** Кодовое слово = [u, p1, p2], где u - информация, p1 = RSC1(u), p2 = RSC2(π(u)), π - перемежитель. Декодирование: BCJR1 и BCJR2 итерационно передают L-values (мягкие биты). 5-10 итераций дают хороший результат. Скорость обычно 1/3 или 1/2. Используется в 3G (UMTS), 4G (LTE).
| Код | Предел Шеннона | Декодирование | Применение |
|---|---|---|---|
| Хэмминг (7,4) | ~3 дБ от предела | Алгебраическое | Legacy, DRAM ECC |
| RS(255,223) | ~2 дБ | Алгебраическое | CD, QR, RAID |
| Turbo (R=1/3) | ~0.5 дБ | Итерационное BCJR | 3G, 4G LTE |
| LDPC | ~0.05 дБ | Belief propagation | 5G, Wi-Fi 6, DVB |
| Polar (R=1/2) | →0 дБ | SC / SCL | 5G control |
Историческая справка
На конференции ICC 1993 Клод Берру представил turbo-коды с результатами «слишком хорошими, чтобы быть правдой»: 0.5 дБ от предела Шеннона при BER=10^-5. Сначала аудитория не верила. Коды были внедрены в стандарт UMTS (3G) в 1999 и LTE (4G) в 2008.
Turbo-коды лучше LDPC и используются в 5G
В 5G NR используются LDPC (данные) и polar-коды (управление). Turbo-коды используются в 4G LTE.
LDPC эффективнее при больших блоках данных. Polar-коды теоретически оптимальны и эффективны для коротких блоков управления.
Какой элемент turbo-кода обеспечивает его мощность - разнообразие паттернов ошибок?
Ключевые идеи
- **Хэмминг (7,4):** первый практический FEC-код, исправляет 1 ошибку. Основа для всех последующих разработок.
- **Рид-Соломон:** работает с символами, основан на полиномах над GF(q). CD, QR, RAID-6, космос.
- **LDPC:** разреженные матрицы + belief propagation. Подходит на ~0.05 дБ к пределу Шеннона. Wi-Fi 6, 5G.
- **Turbo-коды:** два RSC-кодера + перемежитель + итерационное BCJR-декодирование. Революция 1993 года. Используются в 4G.
Связанные темы
Коды с исправлением ошибок опираются на теорию каналов и применяются в сжатии:
- Канал связи и пропускная способность — Предел Шеннона - цель, к которой приближаются все эти коды
- Типичные последовательности — AEP используется в доказательстве существования хороших кодов
- Info Theory на собеседовании — Коды Хэмминга - частая тема на системных интервью
Вопросы для размышления
- Почему идею LDPC пришлось «переоткрывать» через 30 лет? Что это говорит о связи математики и вычислительных мощностей?
- QR-коды уровня H позволяют читать 30%-повреждённый QR. Какова цена этого: что меняется по сравнению с уровнем L?
- Turbo-коды и LDPC оба близки к пределу Шеннона. Почему 5G выбрал LDPC вместо turbo?