Lab050: model fresh-frame SDR video stream

This commit is contained in:
LittleSam129
2026-09-08 14:15:36 +03:00
parent cdf5396e80
commit 60691a09f1
9 changed files with 1769 additions and 12 deletions

View File

@@ -1641,3 +1641,116 @@ Git add/commit/push/pull/fetch не выполнялись.
и проверкой выполнимости 5 кадров/с. Сопряжение CRSF и его сценарии отказов
требуют отдельной постановки и уточнения аппаратуры. Нового RF, QPSK,
CRSF/ELRS-протокола, перекодирования JPEG или переноса на 180 МГц здесь нет.
# Запись 039
## Дата
8 сентября 2026 года.
## Тема
Lab050: потоковая архитектура JPEG, ограничение возраста и блочный IQ-приём.
## Выполнено
По явному заданию проверены HEAD, status, diff/stat/check и staged scope Lab049.
Создан коммит cdf5396e807b83f82a264632dc46f71428fcd616 с сообщением
Lab049: define ELRS control and SDR video architecture. Вошли 12 файлов:
код, тесты, документы, журнал, индекс и указатель README. Сгенерированные данные,
настройки окружения и посторонние локальные файлы не добавлялись. Push не выполнялся.
Lab050 начата от нового HEAD и оставлена без staging/commit.
Аудит Lab034–037 подтвердил возможность переиспользовать существующий
protocol/video_frame_scheduler.py: активное изображение завершается,
ожидающее заменяется самым свежим, перед началом прогнозируется завершение.
Добавлены готовность JPEG отдельно от времени съёмки, произвольный MAX_VIDEO_AGE,
прогноз задержки после RF и счётчик максимальной ожидающей очереди.
Пять прежних политик сохраняют поведение на проверенном сценарии видео+CONTROL.
В самой Lab050 SDR-очередь содержит только VIDEO; управление ELRS отдельно.
Verifier/adversary воспроизвели ошибку первой реализации: позднее завершение
кодирования старого снимка вытесняло более свежий, либо возвращало старый снимок
после опустошения очереди. Исправлено сравнением времени съёмки и ID с сохранением
самого свежего виденного значения. Две регрессии и повторная независимая проверка PASS.
Из data/raw/lab011_scene.jpg созданы четыре фиксированных профиля:
A 320×240 RGB q35 — 8724 байта; B 160×120 RGB q35 — 2771;
C 128×96 RGB q25 — 1740; D 160×120 grayscale q30 — 2028.
Первый A совпал с SHA Lab047. По 30 детерминированных сдвигов фото, не съёмка камеры;
размеры соответственно 8724–9250, 2771–3031, 1740–1893, 2028–2233 байта.
PSNR относительно несжатого изображения того же профиля:
28,12 / 28,11 / 27,17 / 30,15 dB. Это не оценка пригодности для управления.
Нынешний пакет несёт 244 байта JPEG и занимает 5766 символьных интервалов.
Точный предел Jmax=244*floor(Rs/(5766*fps)) включает фрагментацию, добивку,
FEC, PHY header, преамбулу, защитные интервалы и фильтр.
На 500/800/1000 ксимв/с для 5 кадров/с предел 4148/6588/8296 байт;
для 10 — 1952/3172/4148 байт. BPSK, FEC R=1/2 K=7, CRC и форматы сохранены.
QPSK, новый кодек и 12+3 стирающий FEC не вводились.
Выполнены 240 событийных сценариев: четыре профиля, вход 3/5/10 кадров/с,
Rs=200/400/500/800/1000 ксимв/с при Fs=8 Мвыб/с, предел возраста
200/333/500/1000 мс. Ожидающая очередь не превышает один снимок.
Сохраняются capture/encode/queue/TX/RX/complete/decode/display timestamps;
не выполненные стадии имеют null. FPS внутри окна и после опустошения разделены.
Идеальная модель C/500k/5fps/200ms передаёт и показывает 30/30 за 6 с,
без удалений, FRESH DISPLAY FPS=5, возраст min/median/max
92,563 / 92,590 / 92,629 мс. Это модель нулевой стоимости RX и экрана.
При C/200k, камере 10 кадров/с и возрасте 333 мс передано 14, заменено 16;
внутри 3 с показано 13, FRESH DISPLAY FPS=4,333, ещё один после окна.
При возрасте 200 мс все 30 отклонены: радио само требует 230,64 мс.
Добавлен StreamingReceiver.push_iq_block с выдачей пакетов до finish.
Корреляция и строгий PHY/FEC/CRC взяты из Lab048; в старый декодер добавлен
необязательный IQ-reader без изменения поведения по умолчанию.
Буфер удерживает блоки, левый запас и максимальный допустимый PHY-кадр;
TX-границы, payload, ожидаемые ID и число кадров RX не получает.
Децимация поиска 20/10/8/5/4 сохраняет две выборки/символ, порог Lab047
0.030964473262429237 не меняется. Адаптер последовательный, live-драйвер не подключён.
На каждой скорости выполнен шумный опыт трёх JPEG C, 24 RF-пакета:
единый coded-bit Eb/N0=7 dB, seed=50050, CFO +10 Гц, фаза 0,73 рад, смена полярности.
Все пять опытов дали 24/24 пакета и 3/3 точных JPEG до finish.
Большой IQ-файл не создавался; SHA проверялся после независимого CRC/сборки.
Обработка заняла 35,12417 / 59,47086 / 55,15755 / 60,95497 / 55,92195 с
при IQ 0,792483 / 0,401868 / 0,323745 / 0,206561 / 0,167499 с.
Отношения 44,32166 / 147,98602 / 170,37365 / 295,09484 / 333,86514:
приёмник не успевает в реальном времени. На 500k строгая обработка 54,586 с
против 0,492 с грубого поиска, 2374 кандидата и 24 принятых пакета.
После исправления вызовов API packet в модели итоговая матрица пересчитана
через --reuse-benchmarks; пять тяжёлых замеров сохранены без повторения.
Пик удерживаемых IQ 2,13–6,51 МиБ; расчёт массивов с запасом 47,5–143,4 МиБ,
не RSS процесса. Предел IQ-буфера не зависит от длительности сессии.
История событий симулятора хранится для отчёта и не выдаётся за постоянную
память бесконечной камеры. Потери блоков/переполнение live-драйвера не реализованы.
При подстановке измеренной стоимости RX все 30 кадров C/5fps отклоняются до TX,
FRESH DISPLAY FPS=0 для всех проверенных пределов возраста.
Условный вариант: JPEG ≤1952 байт, 500 ксимв/с, MAX_VIDEO_AGE=200 мс.
При стоимости RX-пакета ≤16 мс модель даёт 5 кадров/с и возраст около 192,5 мс;
это требует примерно 144-кратного ускорения данного замера.
Для 10 кадров/с нужны ≤12 мс и примерно 192-кратное ускорение; возраст около 160,5 мс,
29 показов в первые 3 с (9,667 кадра/с), ещё один после окна, интервалы около 10 кадров/с.
Ускорения не достигнуты и не обещаются. Обе цели без QPSK — CONDITIONAL;
нынешний RX — NO по реальному времени. Камера, экран, jitter и запас ещё не измерены.
Добавлены experiments/lab050_video_stream.py, lab050_streaming_receiver.py,
tests/test_lab050_video_stream.py, docs/lab050_current_state.md и локальные
результаты data/processed/lab050. Обновлён LABS_INDEX. Модули аварии,
управления и сеансов не менялись; при потере ELRS видео не продлевает движение.
44 целевых теста PASS. Verifier независимо проверил границы JPEG, 60 сценариев
очереди, 32 прогноза RX, исходные IQ-числа и все итоговые временные отметки JSON.
Adversary подтвердил устранение найденной регрессии свежести.
quick_gate PASS: 650 тестов и 14 функциональных проверок.
pytest: 650 passed за 78,73 с, одно предупреждение о доступе к .pytest_cache.
git diff --check PASS. RF TX=0, оборудование не запускалось.
Lab050 git add/commit и push/pull/fetch не выполнялись.
Следующий этап: STOP. Рекомендуемый Lab051 — программное профилирование
и ускорение строгой проверки ложных кандидатов на C/500k с сохранением
независимости RX и FEC/CRC. До доказанной скорости и свежести не выполнять
RF, QPSK, новый видеокодек или перенос SDR на 180 МГц.