Files
SDR-Rover/docs/lab053_current_state.md

439 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lab053 — стоимость настоящих пакетов и свежесть видео
Дата: 8 сентября 2026 года.
**Программная цель достигнута в выполненных опытах:** BPSK 500 ксимв/с,
8 Мвыб/с, 16 отсчётов/символ, JPEG C 128×96 RGB q25, вход 5 кадров/с.
Получены 240/240 пакетов, 30/30 точных JPEG и **5 свежих кадров/с** при
неизменном пределе возраста 200 мс. RF TX=0, оборудование не запускалось
и не перечислялось. Управление RadioMaster/ELRS/CRSF остаётся отдельным трактом.
## Основание и Git
Перед работой проверены root/main/HEAD/status, diff stat/check, состав Lab052,
отчёт, журнал, индекс, обнаружитель и результаты. Повторены quick_gate:
718 тестов, 20 функциональных проверок, 13 штатных пропусков; отдельный
pytest: 718 passed, 0 failed, 79,79 с. Verifier подтвердил scope.
По прямому разрешению задания в индекс внесены только 27 файлов Lab052:
код, тесты, документация и итоговые JSON/график/текстовые профили. После
показа staged stat/status и проверки cached diff создан коммит:
`cc38900caea4b310568edc691be7db124503fd21`
`Lab052: suppress false preamble candidates`
В коммите 77397 добавленных строк; большие NPZ/NPY, профиль .prof и посторонние
файлы не добавлены. У SVG и двух профилей удалены только концевые пробелы.
Предыдущий HEAD: `9f33607d3ae82992c595de37dd64e99d7e4dea73`.
Lab053 начата от фактического нового HEAD. Push не выполнялся.
## Что именно измерено
Использован **точный источник Lab052**: сохранённая готовность JPEG из
source_fixture.json, seed50050, coded-bit Eb/N0=7 дБ, остаточная расстройка
несущей +10 Гц, фаза 0,73 рад, чередование полярности. Байты JPEG сохранены:
1740–1893 байта. Приёмник получает только последовательные комплексные IQ-блоки.
Ожидаемые границы, количество пакетов, содержимое и номера фрагментов ему не даны.
Генератор один раз записал 48355328 complex64 отсчётов, 386842624 байта,
6,044416 с IQ в игнорируемый Git каталог data/raw/lab053. SHA256:
`9b4f5469b21985f796a77e22981f93bcd3b7a203b573349e8bdf7ea55891bea0`.
Подготовка источника заняла 6,225262 с; это синтез передаваемого сигнала,
а не стоимость приёмника. Конвейер читает файл обычными ограниченными read,
не отображает весь файл в память. Файл и готовность JPEG одинаковы для вариантов.
Два опыта отвечают на разные вопросы и сохранены **отдельными целыми проходами**:
| Опыт | Что измеряет | Итог с одним строгим работником |
|---|---|---:|
| Подача IQ по часам, 30 JPEG/6 с | Фактический возраст и очереди | 30 свежих JPEG, 5,0 кадра/с |
| Сумма измеренной работы стадий в этом опыте | Консервативный бюджет обслуживания без ожидания входа | 4,384788 с /6,044416 = **0,725428** |
| Полное время того же опыта по часам | Включает ожидание входных блоков и завершение потоков | 6,074946 с |
| Воспроизведение без ожидания, с обратным давлением | Реальная пропускная способность всего конвейера | 4,010478 с /6,044416 = **0,663501** |
Сумма работы стадий включает чтение IQ, подготовку кольца, RX, сборку/JPEG decode
и проверку свежести. Стадии перекрываются, поэтому их сумму нельзя объявлять
измеренным полным временем процесса. Напротив, 6,074946 с paced-опыта нельзя
делить на длительность IQ для оценки вычислительной скорости: там есть ожидание
поступления данных. Воспроизведение без ожидания отдельно измеряет elapsed wall time.
Нулевая стоимость RX нигде не подставляется.
В stream.json целиком выбран paced-проход 1 — медианный по сумме работы стадий
из трёх: **0,725428 /0,712269 /0,731542**. Все три дали 240 пакетов, 30 точных
JPEG и 5 свежих кадров/с. Их максимальные возраста:176,062 /168,978 /171,311 мс.
В throughput.json целиком выбран второй проход: ratios0,662067 /0,663501 /0,680789.
Показатели разных проходов не смешаны в одну временную шкалу.
## Новый профиль исходной Lab052
Свежий профиль снят с основного потока после коммита Lab052, без использования
профиля Lab051 в качестве основания оптимизации. Инструментированный проход:
7,774377 с, 240 настоящих и 15 ложных строгих проверок. Средняя настоящая
проверка17,354 мс, медиана17,122 мс,p95=19,520 мс,max26,724 мс.
| Затрата настоящего пакета | Среднее, мс | Сумма для 240 пакетов, с |
|---|---:|---:|
| Уточнение старта | 4,508 | 1,082006 |
| Фильтрация с подготовкой окна | 3,250 | 0,779990 |
| Timing | 2,035 | 0,488404 |
| CFO + фаза/диагностика, без двойного счёта вложенных вызовов | 0,770 | 0,184774 |
| Viterbi | 5,700 | 1,367891 |
| Настоящий пакет целиком | 17,354 | 4,165062 |
40×17,354 мс = **694,177 мс обслуживания в секунду** только на настоящие пакеты.
Ложные проверки занимали около30 мс во всём инструментированном проходе.
Общая децимация —1,388460 с, грубое обнаружение вместе с ней1,804805 с,
дешёвая проверка Lab052 —0,428240 с. Отдельные shared PHY header calls профиля
принадлежат генератору TX; в стоимость RX они не включены.
Историческая чистая база Lab052 остаётся **7,369795 с /6,044416 =1,219273**.
Время инструментированного профиля не подменяет эту базу.
## Реализованные изменения
1. **Локальное уточнение вместо большого общего FFT для редких кандидатов.**
Сохранены исходная опорная преамбула, локальное вычитание среднего и диапазон
±2000 отсчётов. Общая корреляция Lab051 строила большой участок ради множества
ложных кандидатов. После Lab052 такая работа стала дороже короткой локальной
корреляции. Стоимость настоящего уточнения снизилась с4,508 до1,367 мс.
2. **Короткие локальные окна фильтрации.** Общая RRC-фильтрация большого IQ-окна
не выбрана для этой плотности кандидатов. Штатная свёртка выполняется для
preamble/header и затем для тела принятой по заголовку длины. Средние
локальных окон и нулевые края сохранены. Их нельзя без поправки заменить
одним непрерывным фильтром: это меняет численный вход timing/оценки несущей.
3. **Зеркальный кольцевой IQ-буфер.** Ранее дважды копировался почти весь
удерживаемый участок: при добавлении блока и при отбрасывании начала.
Теперь новый блок копируется в две половины кольца, а retained IQ и кандидаты
читают непрерывные views, в том числе через стык. Старый участок не переносится.
Следующая запись начинается после завершения всех jobs текущего блока.
4. **CPU-компиляция циклов soft Viterbi.** NumPy вычисляет те же четыре метрики
ветвей. Numba выполняет переходы и обратный проход по той же решётке,
с тем же порядком сложения, сравнением `one < zero` и выбором ветви0 при tie.
`fastmath=False`, `nogil=True`; старт/финиш0,64 состояния,хвост6 бит.
Код R=1/2,K=7,171/133 octal,soft-decision не изменён. Группировка нескольких
шагов trellis не применена: округлённые равенства могли бы изменить traceback.
5. **Частные зависимости строгого декодера.** `bind()` связывает исходные code
objects функций Lab045/046/043 с отдельным словарём констант и helpers.
Нет exec/eval и подмены функций общих модулей во время обработки. Константы
фиксированы для500ксимв/с, временные метрики кандидата находятся в ContextVar.
Новый strict decoder не зависит от внешнего адаптера режима20ксимв/с.
Обнаружитель Lab052 **не переписан**: прежние coarse/split функции, пороги,
полная ширина группы20480, максимум первым, альтернативы после FAIL и пропуск
физического кадра только после CRC PASS. В основной последовательности снова
1675842 локальных пика,392785 кандидатов первого каскада,388407 дешёвых отказов,
384 группы,243 строгих представителя+12 альтернатив,240true/15false.
Один раз на IQ-блок вычисляются общая децимация с повторным использованием
неизменного FIR-участка, перенос обнаружителя, грубая корреляция и две корреляции
частей Lab052, накопительные энергии. Все кандидаты используют их общие результаты.
Переносы локального строгого окна кешируются по длине; готовые векторы неизменяемы.
## Timing, несущая и этапы заголовка/тела
Lab051 убрала медленную организацию поиска, но **не диапазон1601 смещений**.
Lab053 сохраняет все прежние смещения от−800 до+800; новый узкий timing-gate
не введён. Он не понадобился для выполнения целевого бюджета, а проверка
корреляций частей Lab052 сама по себе не доказывает более узкую ошибку timing.
Декодирование по-прежнему двухэтапное. Сначала преамбула и PHY header; только
после правильного заголовка и проверки длины запрашивается полное окно тела.
Неверный header не вызывает Viterbi. После полного извлечения прежний анализатор
повторно проверяет header, затем выполняет deinterleave,FEC,protocol parser,CRC.
CFO (частотная расстройка), фаза и полярность оцениваются **только по преамбуле**.
Полезные биты тела для оценки не используются. Оценка повторена для полного
окна, поскольку его локальная средняя составляющая отличается от probe.
Результат затем один раз применяется ко всему извлечённому вектору символов.
Слепая подмена этой оценки значениями probe и сужение timing не применены.
Сравнение всех240 принятых пакетов с Lab052, отдельно для1/2/4 работников:
- последовательность всех255 строгих решений и отказов — одинаковая;
- начало/конец, timing, полярность, PHY/CRC и все байты пакетов — одинаковые;
- наибольшая разность CFO: **5,4867626531e−7 Гц**;
- наибольшая разность фазы: **4,6813191101e−9 рад**;
- наибольшая разность soft values: **6,7149294158e−7**.
Последние разряды float не объявлены побитно одинаковыми: другое разбиение
FFT меняет округление. Побитно совпадают результаты FEC/пакеты, timing и verdict.
45 слабых случаев Lab052 дали37/45 у обоих декодеров, без дополнительных потерь;
8 отказов обоих не объявляются успешным декодированием.
## Профиль настоящего пакета после оптимизации
Данные выбранного paced-прохода. Каждая строка — сумма вызовов этой операции
внутри одного настоящего пакета; вложенные затраты вычтены из родительских строк.
Например, CFO отдельно от оставшейся фазовой обработки, Viterbi отдельно от тела.
| Операция | Среднее, мс | Медиана, мс | p95, мс | Максимум, мс |
|---|---:|---:|---:|---:|
| Подготовка IQ views | 0,0032 | 0,0030 | 0,0047 | 0,0076 |
| Перенос частоты и локальная DC | 0,2395 | 0,1955 | 0,3633 | 4,1497 |
| Согласованная RRC-фильтрация | 1,7115 | 1,6345 | 2,2153 | 2,7005 |
| Уточнение кандидата | 1,3675 | 1,3157 | 1,6683 | 2,4152 |
| Timing | 1,7848 | 1,7010 | 2,3002 | 4,2951 |
| Оценка CFO | 0,3591 | 0,3336 | 0,5189 | 0,7358 |
| Фаза/полярность/преамбульная диагностика без CFO | 0,3659 | 0,3321 | 0,5690 | 0,7817 |
| Извлечение/нормировка soft symbols | 0,2762 | 0,2556 | 0,3773 | 0,8008 |
| PHY header, оба вызова | 0,0591 | 0,0545 | 0,0867 | 0,2697 |
| Подготовка тела без Viterbi/header/parser | 0,4588 | 0,4268 | 0,6474 | 1,1569 |
| Viterbi | 0,2839 | 0,2710 | 0,3398 | 0,6717 |
| Protocol/CRC parser | 0,0074 | 0,0072 | 0,0088 | 0,0137 |
| Обработка фрагмента после строгого verdict | 0,0268 | 0,0264 | 0,0419 | 0,0504 |
| Строгий пакет целиком, включая организационные затраты | **7,0164** | **6,8617** | **8,2923** | **12,6110** |
Средняя стоимость с последующей обработкой фрагмента —7,0432 мс. Квантили
строгой обработки и фрагмента не складываются. Для бюджета40 пакетов/с:
**40×7,016407 мс =280,656 мс/с** строгой работы одного работника; с фрагментами
около281,728 мс/с. Длительность по perf_counter включает задержки планирования
ОС и служит бюджетом обслуживания, а не точным числом активных тактов CPU.
Дополнительно записаны process_time и thread_time. Полный CPU процесса в
выбранном paced-опыте3,234375 с. Thread-time на этой Windows квантуется по
15,625 мс: медиана отдельного короткого пакета получается0. Этот счётчик
не используется для заявления «нулевой обработки» или пер-пакетных квантилей.
Сырые измерения оставлены в JSON. Отдельный throughput-проход: CPU4,140625 с,
wall4,010478 с; разные стадии действительно работают одновременно.
## Разбиение полного времени A–J
| Часть выбранного paced-опыта | Время, с |
|---|---:|
| A. Чтение IQ и подготовка входного кольца | 0,345752 |
| B. Общий front-end: децимация | 1,371813 |
| C. Грубое обнаружение без B | 0,374433 |
| D. Дешёвая проверка Lab052 | 0,428823 |
| E. Строгая обработка настоящих пакетов без G | 1,614029 |
| F. Строгая обработка ложных кандидатов | 0,043819 |
| G. Viterbi и protocol/CRC | 0,069909 |
| H. Фрагменты/сборка объекта | 0,006432 |
| I. JPEG decode | 0,006325 |
| J. Проверка свежести после JPEG | 0,000045 |
| Прочая организация, кластеризация и инструментирование | 0,123409 |
| **Сумма** | **4,384788** |
Чтение файла отдельно0,130580 с; подготовка кольца0,215171 с.
Viterbi теперь занимает около1,55% этой суммы. Основные вычислительные затраты —
общая FIR-децимация и timing/RRC/уточнение настоящих пакетов.
## Конвейер, параллелизм и порядок
Конвейер имеет отдельные потоки источника IQ и сборки/JPEG output. Между ними
работает RX с обнаружением и строгим декодированием. При2/4 работниках строгие
представители групп поступают в ограниченный ThreadPool. IQ не копируется
отдельно каждому работнику: им передаётся неизменяемый view общего кольца.
Это не полностью асинхронная пятиступенчатая архитектура: обнаружение следующего
RX-блока ждёт завершения строгих jobs текущего. Такое ограничение сохраняет
политику принятия и безопасное время повторного использования кольца. Источник
и JPEG output в это время могут обрабатывать другие блоки/пакеты.
Результаты строгих jobs применяются в прежнем порядке групп/альтернатив.
Раннее завершение не даёт права изменить accepted_until. Неиспользованные
опережающие результаты отброшены и учтены отдельно; они не становятся пакетами.
Все альтернативы также идут через pool — главный поток не создаёт скрытого
дополнительного строгого работника. После ошибки ожидается завершение всех jobs,
сохраняется первоначальная ошибка, затем освобождаются IQ и счётчики.
| Строгих работников | Полный throughput wall/RF | Paced работа стадий/RF | Fresh FPS | Max age, мс | IQ peak | Candidate peak |
|---:|---:|---:|---:|---:|---:|---:|
| **1, выбран** | **0,663501** | **0,725428** | **5,0** | **176,062** | **5** | **1** |
| 2 | 0,689214 | 0,732485 | 5,0 | 176,126 | 6 | 2 |
| 4 | 0,676192 | 0,734393 | 5,0 | 189,207 | 7 | 2 |
Для2/4:271 опережающая проверка представителя,28 результатов затем пропущены
по уже принятому кадру. Логических строгих проверок всё равно255, из них15false.
Внутриблочного полезного параллелизма мало. Выбран один строгий работник;
дополнительные workers не дали выигрыша в итоговом сравнении. multiprocessing
не применялся. Существующий ObjectAssembler принимает фрагменты по индексам;
отдельный тест подтверждает сборку при обратном порядке. Конвейер дополнительно
сохраняет порядок подачи между изображениями в существующий ImageSink.
## Свежесть и остаточная задержка
INPUT5fps,30 изображений; RECEIVED30, DISPLAYED30, FRESH DISPLAYED30,
FRESH DISPLAY FPS=5. Возраст в выбранном paced-проходе:
**150,298 /153,996 /176,062 мс** (min/median/max).
MAX_VIDEO_AGE остаётся200мс. Три повторения и оба варианта2/4workers уложились.
Восемь физических пакетов занимают92,256 мс IQ на JPEG. Медианное время от
окончания последнего радиопакета JPEG до выдачи RX-пакета —61,284 мс
(диапазон57,438–83,117мс). Последующая выдача JPEG —медиана0,309мс,
max0,643мс. Здесь основной остаток задержки — bounded lookahead и ожидание/
обработка пачки IQ, а не JPEG decode. Lookahead289792 отсчёта=36,224мс,
core-блок65536=8,192мс. Ошибка фактической подачи источником достигала15,830мс.
Запас бюджета по сумме работы стадий —27,46%; по отдельной пропускной
способности —33,65%. Максимальный возраст выбранного короткого опыта имеет
23,94мс до предела. Это наблюдаемый запас на данном компьютере, не гарантия
жёсткого реального времени при произвольной нагрузке ОС.
**Камера и физический экран UNKNOWN.** В неизменном формате фрагмента нет
capture timestamp. Сопоставление с сохранённым временем создания источника
делается после независимых PHY/CRC, сборки и JPEG decode. Оно не влияет на RX
verdict. Получен программный критерий свежести в стенде, а не независимый
аппаратный контроль возраста живой камеры.
## Очереди, память и длинная сессия
Очередь IQ —8 блоков по65536 complex64, предел4МиБ. В выбранном paced-опыте
пик5 блоков=2,5МиБ, в24-секундном —7. В throughput-опыте источник специально
упирается в8 блоков и ждёт; это обратное давление конечного replay.
В paced-опыте источник не замедляет свою временную шкалу: Full вызывает
IQ_QUEUE_OVERFLOW и остановку сессии. Пропущенные участки IQ не склеиваются.
Очередь строгих jobs —4, выбранный пик1; для2/4worker пик2. Вместимость
включает ожидающие и ещё не потреблённые результаты. Полный список дешёвых
кандидатов ограничен размером одного IQ-окна и уничтожается после сканирования.
Очередь выходных пакетов —16; переполнение также видно отдельным счётчиком.
Все штатные итоговые проходы имеют IQ/candidate/output overflow=0.
| Память | Величина |
|---|---:|
| Максимальный полезный retained IQ | 3177728 байт =3,031МиБ |
| Реально выделенные две половины кольца | 6797824 байта =6,483МиБ |
| Оценка временных рабочих буферов, включая кольцо/очереди | 35224064 байта |
| Максимальный резерв кеша16 переносов для допустимых PHY lengths | 36581376 байт |
| Резерв8 переносов обнаружителя | 3398912 байт |
| Резерв констант/решётки | 1048576 байт |
| Рабочие массивы с перечисленными резервами | **76252928 байт =72,720МиБ** |
| Измеренный RSS peak выбранного процесса | **206778368 байт =197,199МиБ** |
| RSS peak длинного опыта | **208031744 байта =198,395МиБ** |
Оценка массивов — инженерный резерв, не универсальная верхняя граница временных
C/SciPy/LLVM-аллокаций. RSS включает весь Python, NumPy/SciPy, Numba/LLVM,
аллокатор и диагностические результаты опыта. Это разные показатели, их нельзя
складывать. Резерв rotation-cache рассчитан для максимального допустимого
кадра285792 отсчёта, а не только для размера основного JPEG-пакета.
Длинный источник:120 изображений,960 физических пакетов,24,044416с IQ,
1538842624байта на диске. Изображения C повторены по содержимому с новыми ID;
радиокадры формируются заново, шум продолжается с тем же воспроизводимым seed.
Все960/960 и120/120 точных JPEG приняты. Fresh FPS=5; возраст
149,337 /155,733 /189,396мс. Работа стадий17,861142с,ratio0,742840.
Медианы первой/второй половины155,662 /156,001мс: накопления задержки не видно.
Retained IQ в контрольных точках2653440байт, candidate jobs после блока0,
очереди не выходят за предел. Поздний RSS197709824–201424896байт, без
монотонного накопления; линейная оценка на последней половине+105078байт/с
на фоне колебаний. Конечный опыт не доказывает абсолютно нулевой долгосрочный
дрейф RSS. Массивы/кеши/очереди RX имеют явные пределы; история строк измерений
принадлежит внешнему эксперименту. После close retained IQ/decimator/ring=0,
pending jobs=0, все потоки завершены.
## Неуспешные варианты и исправления
- Только локальные окна:240/240,30/30, но ratio1,108 и fresh FPS0.
- Добавление кольца без JIT в ранней событийной оценке:ratio0,931,fresh FPS4,5.
- Фактический paced-конвейер без JIT:IQ queue overflow1,239 пакетов,29 JPEG,
fresh FPS3,667. Его ratio не считается результатом полного потока.
- Искусственная задержка20мс на блок:IQ queue peak8,overflow1,явный STOP,
состояние освобождено. Это проверка отказа, не throughput PASS.
- Первый общий runner ошибочно сопоставлял ID JPEG с нуля вместо единицы.
Отрицательные SHA-сравнения были ошибкой внешней диагностики; lookup исправлен
до итоговых paced/throughput серий. Итоговые JSON заново получены целиком.
- Adversary воспроизвёл early exception, при котором ожидание оставшихся futures
прекращалось после второй ошибки. Исправлено ожидание всех jobs с сохранением
первой ошибки; повторный сценарий подтвердил0 активных workers и closed=True.
- Verifier воспроизвёл третье параллельное decode приworkers2. Альтернативы
переведены в тот же пул; прежний вход теперь имеетpeak_active2.
- Missing/empty source раньше теряли отчёт из-за повторного stat или деления
на0 после cleanup. Теперь возвращаются SOURCE_EXCEPTION/EMPTY_IQ_SOURCE,
ratio=None и освобождённое состояние. Оба сценария повторены adversary.
## CPU-зависимости и GPU
GPU=**NOT USED**. После локальных вычислений и CPU-JIT цель выполнена. Общая
децимация остаётся заметной, однако стоимость запусков/переносов GPU для блоков
по64К отсчётов не измерялась; убедительного прогноза полного выигрыша нет.
Не выполнялись GPU-инвентаризация, CUDA-опыты или автоматический multiprocessing.
Numba0.61.2 и llvmlite0.44.0 установлены локально в
`.lab053_cpu_runtime/packages`; системное окружение не изменено.
Пакеты закреплены в requirements-lab053-cpu.txt; SHA wheel-файлов сохранены.
Поддержка Python3.13 и NumPy2.2 указана в
[официальной таблице Numba](https://numba.readthedocs.io/en/stable/user/installing.html).
`nogil` и `fastmath` — параметры
[CPU JIT](https://numba.readthedocs.io/en/0.61.2/user/jit.html).
Первый отдельный прогрев занял1,221810с; прогрев с дисковым кешем выбранного
процесса0,151137с. Он выполнен **до начала приёма IQ**, отдельно от основного
таймера. Импорт библиотек также относится к запуску процесса. Без доступного
Numba предусмотрен прежний NumPy decoder, но целевые результаты требуют CPU-JIT;
их нельзя переносить на fallback без отдельного измерения.
Первоначальная установка pip перенесла каталоги с правами временной папки.
Изменение ACL было отклонено автоматической проверкой и не выполнялось.
Официальные wheel-файлы распакованы обычным sandbox в новый доступный каталог.
Старая локальная попытка установки, wheel и JIT-кеши не добавляются в Git.
## Проверки и воспроизведение
50 целевых тестов проверяют побитную эквивалентность Viterbi на шуме, ties,
больших значениях и допустимых длинах; валидацию входов; timing на всём диапазоне;
CFO/фазу/PHY/CRC, в том числе намеренно испорченную CRC; запрет тела до header;
параллельные verdict, обратный порядок фрагментов, стыки кольца, bounded queues,
реальное переполнение, исключения и предел работников. Оба независимых
проверяющих подтвердили закрытие своих воспроизведённых находок.
Старая15-секундная запись Lab047 обработана штатным Lab048:36/36фрагментов,
CRC PASS,JPEG320×240/8724байта SHA MATCH,19ошибок доFEC,0после,0байтовых.
SHA:`e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a`.
Обработка14,147788с. Код20ксимв/с и весь protocol не изменялись.
Полный pytest: 768 passed за 77,81 с, одно предупреждение о недоступном
`.pytest_cache`; проваленных тестов нет. Численные критерии, SHA исходного IQ
и поведение при принудительном переполнении пересчитываются в acceptance.json.
Финальный quick_gate PASS: 768 тестов, 26 функциональных проверок, 13 штатных
пропусков. Все 20 критериев acceptance PASS; git diff --check PASS, концевых
пробелов в новых исходниках и отчёте нет. Verifier и adversary независимо
пересчитали свежесть, медианный выбор, память и границы отрицательных опытов;
остаточных воспроизведённых дефектов нет. Индекс Git пуст.
```powershell
python -m pip install -r requirements-lab053-cpu.txt
# Команда установки нужна для нового обычного расчётного окружения.
# В текущем workspace пакеты уже доступны в .lab053_cpu_runtime/packages.
python experiments/lab053_viterbi.py
python experiments/lab053_receiver_profile.py --stage profile
python experiments/lab053_receiver_profile.py --stage source
python experiments/lab053_pipeline.py --workers 1 --unpaced --name throughput_1_repeat_1.json
python experiments/lab053_pipeline.py --workers 1 --name paced_1_repeat_1.json
# Аналогично repeat_2/repeat_3; сравнение --workers 2 и --workers 4.
python experiments/lab053_receiver_profile.py --stage source --frames 120
python experiments/lab053_pipeline.py --frames 120 --source data/raw/lab053/source_120.c64 --name long_stream.json
python experiments/lab053_regression.py --stage equivalence
python experiments/lab053_regression.py --stage sensitivity
python experiments/lab053_pipeline.py --numpy-viterbi --name without_jit_paced.json
python experiments/lab053_pipeline.py --processing-delay 0.02 --name overflow_probe.json
python experiments/lab053_receiver_profile.py --stage report
python tools/quick_gate.py
python -m pytest tests/ -q
git diff --check
```
Lab048 воспроизводится командой с --run-saved-capture, исходным
`C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747\rx_stream.cs8`,
его independent_result.json,--tx-image data/processed/lab047/tx_image.jpg
и --output-directory data/processed/lab053/regression20k.
Основные файлы: [профиль/сводка](../experiments/lab053_receiver_profile.py),
[строгие вычисления](../experiments/lab053_packet_processing.py),
[потоковый RX](../experiments/lab053_streaming_receiver.py),
[Viterbi](../experiments/lab053_viterbi.py),
[конвейер](../experiments/lab053_pipeline.py),
[регрессии](../experiments/lab053_regression.py),
[тесты](../tests/test_lab053_packet_pipeline.py),
[основной поток](../data/processed/lab053/stream.json),
[пропускная способность](../data/processed/lab053/throughput.json),
[память](../data/processed/lab053/memory.json),
[критерии](../data/processed/lab053/acceptance.json),
[график](../data/processed/lab053/performance_and_age.png).
Lab053 git add/commit иpush **не выполнялись**. BPSK,Fs,Rs,SPS,PRBS7,PHY,FEC,CRC,
формат фрагментов и candidate policy сохранены. RF TX=0. Следующий этап —
рассмотрение программных результатов ChatGPT. QPSK,180МГц,новый FEC,
аппаратные500ксимв/с и RF не разрешены. **STOP.**