group-FEC 16+2: стирающее восстановление кадров без обратного канала (§10 п.6)
Групповой FEC над GF(256), RAID-6-стиль: 16 кадров данных + P(⊕) + Q(Σgⁱ·dᵢ)
закрывают до 2 стёртых кадров на группу. Потеря (пропуск seq или битый CRC) —
это стирание с известной позицией, поэтому 2 паритета оптимальны (overhead 12.5%,
~99% передач 10 МБ байт-в-байт при PER 0.26%).
- src/group_fec.{c,h}: GF(256) polynom 0x11d, gf_encode/gf_recover + self-test
(make gftest, нативный cc). Восстановление 1 стирания через P или Q, 2 — P+Q.
- transmitter.c: флаг -G, вынесен tx_frame(); копит группу, шлёт k данных +
P/Q с флагами в hdr[11]. Мета паритета: k′ + длина хвостового кадра.
- receiver.c: групповой ассемблер в потоке C, автодетект по hdr[11], финализация
группы на смене базы seq и на выходе потока. Счётчики Rec/GrpF в статистике.
- hdr[11] (был резерв): bit7 режим, bit6 паритет, bit5 Q, bits4-0 idx. RS/CRC
слой прозрачен — геометрия кадра не тронута, PHY-бенчмарк не требуется.
- test_file_link.sh: GROUPFEC=1 по умолчанию (TX -G, RX автодетект).
README §12.7 + перенумерация роадмапа — отдельным коммитом после верификации.
This commit is contained in:
@@ -18,7 +18,11 @@ TXGAIN="${TXGAIN:--30}" # OTA: переопредели, напр. TXGAIN=-2
|
||||
FEC="${FEC:-rs8}" # rs8 | none — фаза 3.2 гоняет сначала none, потом rs8
|
||||
PAUSE="${PAUSE:-3000}" # пауза TX между кадрами, мкс. Рабочая точка 3-стадийного
|
||||
# RX (§12.6): чисто, ~120 КБ/с. Ниже ~2500 — Overrun на ядре 0
|
||||
TIMEOUT=$(( SIZE_KB / 80 + 20 )) # ~120 КБ/с на -p 3000 + запас (см. §12.6)
|
||||
GROUPFEC="${GROUPFEC:-1}" # 1 = групповой стирающий FEC 16+2 (§12.7): TX шлёт -G,
|
||||
# RX автодетектит по hdr[11]. 0 = legacy (потери = дыры)
|
||||
[ "$GROUPFEC" = 1 ] && GFLAG="-G" || GFLAG=""
|
||||
# Group-FEC: +12.5% overhead → ~107 КБ/с (SIZE_KB/85); legacy — ~120 (SIZE_KB/95)
|
||||
if [ "$GROUPFEC" = 1 ]; then TIMEOUT=$(( SIZE_KB / 85 + 20 )); else TIMEOUT=$(( SIZE_KB / 95 + 20 )); fi
|
||||
|
||||
if command -v sshpass >/dev/null; then
|
||||
SSH=(sshpass -p "$PLUTO_PASS" ssh -o StrictHostKeyChecking=no)
|
||||
@@ -48,7 +52,7 @@ sleep 3 # дать RX прогреться до старта TX
|
||||
echo "=== [4/5] Передача с Pluto A ==="
|
||||
"${SSH[@]}" "root@$A" \
|
||||
"cat /tmp/link_test.bin | /tmp/transmitter -f $FREQ -r $RATE -b $BW \
|
||||
-g $TXGAIN -p $PAUSE -c $FEC -u local: 2>/tmp/tx.log"
|
||||
-g $TXGAIN -p $PAUSE -c $FEC $GFLAG -u local: 2>/tmp/tx.log"
|
||||
sleep 3 # дохлебать хвост эфира
|
||||
"${SSH[@]}" "root@$B" "killall receiver 2>/dev/null || true"
|
||||
wait "$RX_PID" 2>/dev/null || true
|
||||
|
||||
Reference in New Issue
Block a user