Lab030. Пакетное избыточное кодирование стираний

Исходный профиль и неизменный внутренний транспорт
- Видео: data\raw\lab026_rover_source.mp4
- 63 реальных пар BASE/ROI, 3 fps; BASE 240x135 grayscale JPEG Q23, ROI 320x180 grayscale JPEG Q33.
- Внутренний Lab028 packet не изменён: payload 512 байт, 32-byte header, packet CRC32 и object CRC32.

GF(256) и блочный код
- Примитивный полином: 0x11D (x^8+x^4+x^3+x^2+1).
- Матрица Вандермонда n×k умножается на обратную верхнюю k×k матрицу и становится систематической.
- Любые k доступных строк систематической генераторной матрицы восстанавливают k исходных символов.
- Нулевое дополнение используется только в математике; восстановленный внутренний пакет обрезается по payload_length Lab028 и проходит собственный CRC.

Внешний пакет FEC
- struct: !4sBBHIHHHHHHII
- Размер: 32 байта, network byte order, padding отсутствует.
- Layout: magic[4]@0, version:u8@4, flags:u8@5, header_size:u16@6, block_id:u32@8, symbol_index:u16@12, k:u16@14, r:u16@16, symbol_size:u16@18, data_length:u16@20, reserved16:u16@22, reserved32:u32@24, outer_crc32:u32@28.
- flags bit0: parity. CRC32 вычисляется по заголовку с нулевым outer_crc32 и данным внешнего символа.

Формирование блоков и передача
- Последовательный поток внутренних пакетов BASE→ROI делится на k=8; блок может пересекать границу кадра.
- Сначала передаются systematic symbols, затем parity symbols этого блока; перемежение отсутствует.
- Последний блок содержит 6 исходных пакетов. Для него r_last=max(1, ceil(k_last*r/8)): режимы 8+1, 8+2, 8+4 получают соответственно 1, 2 и 3 parity.
- Режим Без FEC передаёт исходные Lab028 packets без внешней обёртки; остальные режимы используют внешний заголовок.
- FIFO учитывает время генерации кадра, все внешние пакеты, фактический размер и скорость 300 кбит/с. Очередь не сбрасывается на границах кадров.

Скорость, избыточность и очередь
mode | source packets | parity packets | last block k+r | JPEG kbit/s | inner kbit/s | outer kbit/s | overhead | queue mean/max | timeline s
----:|---------------:|---------------:|---------------:|------------:|-------------:|-------------:|---------:|---------------:|----------:
Без FEC | 862 | 0 | none | 157.770 | 168.396 | 168.396 | 6.310% | 13.717/15 | 20.869680
8+1 | 862 | 108 | 6+1 | 157.770 | 168.396 | 202.987 | 22.276% | 15.452/18 | 20.928560
8+2 | 862 | 216 | 6+2 | 157.770 | 168.396 | 226.951 | 30.483% | 17.210/21 | 20.974640
8+4 | 862 | 431 | 6+3 | 157.770 | 168.396 | 274.659 | 42.558% | 20.859/26 | 21.051440

Временная модель
- Экспоненциальные Good/Bad интервалы Lab029B, Bad≈2%, mean Bad 10/50/200/1000 мс, 200 повторов, fixed seeds 300300...300303.
- Пакет теряется при любом пересечении его передачи с Bad.
- FEC исправляет стирания; CRC обнаруживает повреждения, но битовые ошибки отдельно не добавляются.

Функциональные проверки
- PASS gf256_arithmetic: inverse, division, and distributivity passed
- PASS fec_without_loss: systematic 8+4 block is byte-exact without loss
- PASS recover_any_r_erasures: all 549 exact-r erasure combinations recovered
- PASS r_plus_one_not_guaranteed: 8+2 correctly rejected seven available symbols
- PASS restored_inner_packet_and_crc: restored Lab028 packets are byte-exact and CRC-valid
- PASS outer_crc_detection: outer payload bit flip rejected by outer CRC32
- PASS zero_bad_100_percent: all modes restored all 63 frames without Bad
- PASS fixed_seed_reproducibility: identical seed produced identical result fields
- PASS atomic_incomplete_composite: missing ROI fragment prevented atomic publication
- PASS queue_counts_parity: 431 parity packets included in FIFO timing and queue metrics

Результаты Monte Carlo
Bad ms | mode | Bad actual | lost src/parity | recovered pkt | blocks recovered/failed | block recovery | composite | BASE-only/ROI-only | no image mean/p95/max s | delay mean/p95/max s | video kbit/s
------:|-----:|-----------:|----------------:|--------------:|------------------------:|---------------:|----------:|------------------:|-------------------------:|----------------------:|------------:
10 | Без FEC | 2.024% | 8130/0 | 0 | 0/0 | 0.000% | 66.960% | 2341/1207 | 0.814/1.346/3.008 | 0.185/0.203/0.210 | 105.091
10 | 8+1 | 2.038% | 8457/1121 | 2390 | 2390/2725 | 46.725% | 78.873% | 1471/776 | 0.767/1.317/2.360 | 0.231/0.364/0.451 | 123.422
10 | 8+2 | 2.055% | 8451/2229 | 5560 | 4070/1028 | 79.835% | 91.286% | 600/295 | 0.731/1.017/1.798 | 0.260/0.395/0.466 | 142.607
10 | 8+4 | 1.990% | 8364/4311 | 7797 | 4860/144 | 97.122% | 98.698% | 84/36 | 0.710/1.017/1.069 | 0.308/0.410/0.496 | 153.620
50 | Без FEC | 1.914% | 4062/0 | 0 | 0/0 | 0.000% | 91.452% | 529/296 | 0.693/0.998/1.687 | 0.185/0.203/0.210 | 143.553
50 | 8+1 | 1.929% | 4255/562 | 325 | 325/1216 | 21.090% | 91.762% | 542/263 | 0.709/1.004/1.994 | 0.223/0.245/0.451 | 143.615
50 | 8+2 | 1.995% | 4326/1104 | 971 | 658/905 | 42.099% | 93.333% | 423/214 | 0.713/1.010/1.632 | 0.248/0.275/0.465 | 145.767
50 | 8+4 | 2.035% | 4506/2275 | 2062 | 979/520 | 65.310% | 95.532% | 261/141 | 0.749/1.057/1.406 | 0.298/0.339/0.495 | 148.638
200 | Без FEC | 2.117% | 3877/0 | 0 | 0/0 | 0.000% | 96.071% | 146/83 | 0.786/1.325/2.333 | 0.185/0.203/0.210 | 150.881
200 | 8+1 | 2.169% | 3983/513 | 74 | 74/734 | 9.158% | 95.865% | 162/91 | 0.810/1.332/2.334 | 0.221/0.244/0.448 | 150.129
200 | 8+2 | 1.945% | 3573/908 | 144 | 101/602 | 14.367% | 96.302% | 149/80 | 0.837/1.339/2.334 | 0.246/0.275/0.467 | 150.483
200 | 8+4 | 1.940% | 3550/1777 | 375 | 160/522 | 23.460% | 96.310% | 153/90 | 0.900/1.348/2.334 | 0.296/0.337/0.466 | 149.944
1000 | Без FEC | 1.722% | 3014/0 | 0 | 0/0 | 0.000% | 97.976% | 27/10 | 1.403/3.050/4.327 | 0.185/0.203/0.210 | 153.809
1000 | 8+1 | 1.720% | 3003/374 | 13 | 13/423 | 2.982% | 97.921% | 33/13 | 1.437/3.040/4.311 | 0.221/0.244/0.250 | 153.287
1000 | 8+2 | 1.763% | 3079/781 | 25 | 16/427 | 3.612% | 97.833% | 39/15 | 1.466/3.048/4.295 | 0.246/0.275/0.450 | 152.807
1000 | 8+4 | 1.719% | 3004/1509 | 64 | 27/400 | 6.323% | 97.817% | 47/21 | 1.533/3.095/4.275 | 0.296/0.337/0.465 | 152.233

Допущения и ограничения
- Не реализованы перемежение, ARQ, повторные передачи, команды управления, телеметрия и реальный SDR.
- Любое частичное пересечение Bad уничтожает весь внешний или базовый внутренний пакет.
- Принятые systematic packets немедленно поступают reassembler; восстановленные стирания становятся доступны при получении k символов блока.
- Publication delay измеряется от frame_id/3 до атомарной выдачи BASE+ROI.
- Queue length измеряется в моменты генерации пакетов и включает ожидающие и обслуживаемый пакет.
- Окончательный режим FEC автоматически не выбирается.

Артефакты
- CSV: data\processed\lab030\lab030_results.csv
- Composite success: data\processed\lab030\lab030_composite_success.png
- No-image duration: data\processed\lab030\lab030_no_image_duration.png
- Stream rate/overhead: data\processed\lab030\lab030_stream_rate_overhead.png
- Delay/queue: data\processed\lab030\lab030_delay_queue.png
- Mode comparison: data\processed\lab030\lab030_mode_comparison.png
- JPEG, внутренние/внешние packets и бинарные дампы не сохранялись.
