Lab053: achieve real-time 5 fps software video receiver

This commit is contained in:
LittleSam129
2026-09-09 10:26:55 +03:00
parent cc38900cae
commit 0368c6d3e9
44 changed files with 472121 additions and 0 deletions

View File

@@ -2003,3 +2003,163 @@ Lab052 git add/commit иpush не выполнялись;индекс пуст.
Следующий этап: STOP. Для отдельно согласованной Lab053 исследовать стоимость
настоящих пакетов, общей децимации/FFT/копирования IQ и задержку JPEG-пачки.
Не переходить автоматически к10fps,QPSK,180 МГц,аппаратным500 ксимв/с или RF.
# Запись 042
## Дата
8 сентября 2026 года
## Тема
Lab053 — стоимость настоящих пакетов, конвейер на CPU и пять свежих JPEG в секунду
## Выполнено
Перед изменениями выполнен аудит Lab052 и состояния Git. Повторные шлюзы:
quick_gate — 718 тестов, 20 функциональных проверок, 13 штатных пропусков;
pytest — 718 passed за 79,79 с, одно предупреждение .pytest_cache.
Независимый verifier подтвердил готовность. По явному разрешению пользователя
выборочно добавлены и показаны 27 файлов Lab052; выполнен коммит
`cc38900caea4b310568edc691be7db124503fd21`, `Lab052: suppress false preamble candidates`.
Push не выполнялся. Указание в записи 041 об отсутствии коммита описывает
состояние на момент завершения Lab052; прежняя запись сохранена без изменений.
Lab053 выполнена только программно. Сохранены BPSK 500 ксимв/с, Fs 8 Мвыб/с,
16 отсчётов/символ, PRBS7, PHY/FEC/CRC и профиль C: 128×96 RGB JPEG q25.
Вход — 30 JPEG за 6 с, 5 кадров/с, предел возраста 200 мс. Управление остаётся
за ELRS; в SDR-видеоканал управление не добавлено. RF TX=0, аппаратных
инвентаризаций, запусков и проверок не было. GPU не использована.
Исходный IQ сформирован тем же генератором и сценарием Lab052:
48355328 отсчётов complex64, 386842624 байта, 6,044416 с.
SHA256: `9b4f5469b21985f796a77e22981f93bcd3b7a203b573349e8bdf7ea55891bea0`.
Приёмник получает только последовательные блоки IQ и параметры физического
режима. Границы, число кадров, содержимое JPEG и TX truth не передаются
обнаружителю, строгому декодеру или сборщику. Сверка SHA и модель capture-time
применяются после независимого JPEG verdict. Камера и экран остаются UNKNOWN.
Новый подробный профиль прежнего Lab052: 7,774377 с с измерителями,
240 настоящих и 15 ложных строгих проверок. Настоящий пакет в среднем
17,354 мс, медиана 17,122 мс, p95 19,520 мс; сумма 4,165062 с.
Уточнение старта 1,082006 с, локальный согласованный фильтр 0,779990 с,
timing 0,488404 с, Viterbi 1,367891 с. Общая децимация 1,388460 с.
Исторический чистый baseline Lab052 сохранён отдельно: 7,369795 с,
отношение обработки к IQ 1,219273. Вложенные времена не складываются дважды.
Строгие расчёты перенесены в локальные окна. Исходные тела функций связаны
с частными зависимостями; глобальная подмена режима при работе потоков устранена.
Шаблоны, RRC taps и опорные биты совпадают побитно. Сохранены весь диапазон
уточнения старта, все 1601 timing-offset и прежние правила CFO/фазы/полярности.
Тело кадра вычисляется после допустимого PHY header, затем header проверяется
повторно прежним правилом. Общая децимация и корреляции Lab052 сохранены.
Зеркальное кольцо копирует только новый IQ-блок вместо всего остатка.
Viterbi R=1/2, K=7 с теми же полиномами реализован теми же операциями на CPU
через Numba: без fastmath, изменения порядка сложений, ties и traceback.
Это изменение вычислителя, а не FEC. Набор протокола protocol не менялся.
Numba 0.61.2 и llvmlite 0.44.0 закреплены отдельно и доступны в локальном
`.lab053_cpu_runtime/packages`; системное окружение не изменено. Первое
создание машинного кода 1,221810 с, прогрев выбранного процесса из кеша
0,151137 с — до приёма IQ. Без JIT доступен старый NumPy fallback,
но измеренные целевые показатели к нему не относятся.
Конвейер имеет отдельный источник IQ, RX и сборку/декодирование JPEG.
Внутри RX проверены 1/2/4 работника; следующий блок ожидает завершения
строгих работ текущего окна. Полностью независимые пять вычислительных
стадий не реализованы. Порядок фиксации решений детерминирован; только
успешный PHY/FEC/CRC разрешает пропуск уже принятого кадра.
При 2/4 работниках возникают 28 лишних спекулятивных проверок; устойчивого
выигрыша нет. Выбран один работник. Ограничения очередей: IQ 8 блоков,
кандидаты 4 задания, выход 16 пакетов. Переполнение явно останавливает сессию.
Три полных запуска с реальной подачей IQ по часам дали отношения суммарной
работы стадий к длительности IQ 0,725428 / 0,712269 / 0,731542.
Выбран целиком медианный по времени первый запуск: 4,384788 с работы стадий
на 6,044416 с IQ. Полное настенное время с ожиданием источника 6,074946 с;
оно не выдаётся за время вычислений. Отдельные полные проходы без ожидания:
4,001807 / 4,010478 / 4,114974 с. Медианный второй — 0,663501 с обработки
на секунду IQ. Источник в этом опыте ограничен обратным давлением очереди.
Возраст кадров оценивается только в опыте с подачей IQ по часам.
В выбранном потоке: 240/240 пакетов, 30/30 JPEG SHA MATCH, 255 строгих проверок,
15 ложных, 0 потерь, DISPLAYED=FRESH DISPLAYED=30, FRESH DISPLAY FPS=5.
Возраст минимум/медиана/максимум: 150,298 / 153,996 / 176,062 мс.
По работе стадий свободны 27,46% бюджета секунды; без ожидания — 33,65%.
Это измеренный программный запас, не гарантия жёсткого реального времени ОС.
Варианты 2/4 также приняли всё: отношения 0,732485 / 0,734393,
максимальный возраст 176,126 / 189,207 мс, пять свежих кадров/с.
Настоящий пакет после оптимизации: среднее 7,016 мс, медиана 6,862 мс,
p95 8,292 мс, максимум 12,611 мс. Для 40 пакетов/с требуется около
0,280656 с последовательной работы обработчика; сборка фрагментов добавляет
около 0,001072 с. Это бюджет perf_counter, а не точная метрика загрузки ядра:
Windows thread_time имеет квант учёта 15,625 мс. Process CPU основного запуска
3,234375 с сохранён отдельно. Теперь Viterbi занимает 0,068129 с на весь поток.
Непересекающиеся составляющие 4,384788 с: чтение/подготовка IQ 0,345752 с;
децимация 1,371813 с; грубое обнаружение 0,374433 с; дешёвая проверка 0,428823 с;
настоящие пакеты без Viterbi/CRC 1,614029 с; ложные 0,043819 с;
Viterbi/CRC 0,069909 с; сборка 0,006432 с; JPEG decode 0,006325 с;
проверка свежести 0,000045 с; прочая организация и измерители 0,123409 с.
Главные оставшиеся расходы — общая обработка IQ, timing и локальная фильтрация.
Физическая JPEG-пачка занимает 92,256 мс; медиана от её конца до выдачи пакета
61,284 мс, от выдачи до JPEG 0,309 мс. Lookahead 36,224 мс и пачечная обработка
влияют на задержку существенно сильнее собственно JPEG decoder.
Пик удерживаемого IQ 3177728 байт (3,031 МиБ); кольцо выделяет 6797824 байта
(6,483 МиБ). Основная IQ-очередь достигла 5/8 блоков, кандидаты 1/4;
переполнений всех очередей 0. Инженерная оценка временных массивов с резервами
ограниченных кешей 76252928 байт (72,720 МиБ), не универсальный предел C/LLVM.
Измеренный peak RSS процесса 206778368 байт (197,199 МиБ); эти показатели
не складываются. Для пустого/недоступного источника и переполнения предусмотрены
явные причины отказа, полное ожидание работников и освобождение состояния.
Длинный источник содержит 120 JPEG за 24 с, 192355328 отсчётов /24,044416 с IQ.
Приняты 960/960 пакетов и 120/120 точных JPEG; свежесть 5 кадров/с,
возраст 149,337 / 155,733 / 189,396 мс. Работа 17,861142 с, отношение 0,742840.
Медиана первых/последних 60 кадров 155,662 / 156,001 мс: накопления отставания
не наблюдается. IQ-очередь достигла 7/8, кандидаты 1/4, переполнений 0.
В поздних контрольных точках RSS 197709824–201424896 байт; линейный наклон
около +105078 байт/с. Ограничены рабочие массивы и очереди, но нулевой рост
RSS на бесконечной сессии не доказан. После закрытия IQ и незавершённых работ 0.
Отрицательные результаты сохранены. Локальные окна без остальных изменений
не достигали реального времени. Кольцо без JIT давало средний запас, но
возраст до 222,90 мс. Полный опыт без JIT с подачей по часам остановился
при переполнении: 239 пакетов, 29 JPEG, 3,667 свежих кадров/с, максимум 207,954 мс.
Замедление на 20 мс/блок воспроизвело IQ_QUEUE_OVERFLOW при 8/8 блоках,
явный неполный источник и очистку состояния; короткое время такого отказа
не считается хорошей пропускной способностью полного потока.
Независимые verifier и adversary воспроизвели и проверили исправления:
исключение первого future больше не оставляет остальные работы активными;
fallback-проверка больше не создаёт третьего работника при лимите 2;
пустой и недоступный источник возвращают диагностический отчёт вместо
необработанного исключения. Проверены кольцо на 1,8 млн случайных отсчётов,
реальное переполнение IQ/выхода, слабый VALID возле ложной преамбулы,
изоляция глобального режима и ContextVar. Все воспроизведённые дефекты закрыты.
Эквивалентность на всём потоке для 1/2/4 работников: одинаковые 240 стартов,
концов, timing, полярностей, CRC и байтов, одинаковые 255 строгих кандидатов.
Максимальное расхождение soft 6,715e-7, CFO 5,487e-7 Гц, фазы 4,681e-9 рад;
допуски заданы явно. На 45 слабых сценариях прежний и новый RX приняли 37,
новых потерь 0. Старая запись 20 ксимв/с штатным Lab048: 36/36, CRC PASS,
JPEG 320×240 /8724 байта SHA MATCH, 19 ошибок до FEC, 0 после, 0 байтовых.
Добавлены 50 целевых тестов вычислений, кольца, очередей, порядка и исключений.
Полный pytest: 768 passed за 77,81 с, одно предупреждение .pytest_cache.
Финальный quick_gate PASS: 768 тестов, 26 функциональных проверок,
13 штатных пропусков. git diff --check PASS; новые исходники и отчёт отдельно
проверены на концевые пробелы. Verifier и adversary независимо пересчитали
итоговые JSON, возраст по временным отметкам, выбор целого медианного прохода,
суммы стадий и памяти, проверили SHA кода, ссылки, график и прежний префикс
журнала. Остаточных воспроизведённых дефектов нет; все 20 критериев PASS.
Численные критерии, SHA исходного IQ и отрицательное переполнение проверяются
в data/processed/lab053/acceptance.json; подробности и команды воспроизведения
в docs/lab053_current_state.md. Графики и результаты сохранены локально.
Lab053 git add/commit и push не выполнялись; индекс пуст. RF TX=0.
Следующий этап: STOP, рассмотрение программных результатов ChatGPT.
Не переходить автоматически к 10 fps, QPSK, 180 МГц, новому FEC,
аппаратным 500 ксимв/с или любому RF-эксперименту.