Files
SDR-Rover/docs/LABS_INDEX.md

498 lines
43 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.
# Указатель лабораторных работ
Этот файл показывает, где находятся код, проверки, документы и данные
лабораторных работ. Он не заменяет отчёты и не дублирует большие IQ-записи.
Пути к внешним аппаратным данным приведены только там, где они уже зафиксированы
в документации проекта и существуют на текущем компьютере.
## Lab043
- **Цель:** воспроизводимый BPSK-канал HackRF -> HackRF с общей опорой,
независимой кадровой синхронизацией и измерением параметров радиотракта.
- **Статус:** рабочая точка BPSK и общий опорный генератор подтверждены;
дополнительные аппаратные ветви использовались для диагностики усиления,
непрерывности и асимметрии сигнала.
- **Основной эксперимент:**
[`experiments/lab043_hackrf_bpsk.py`](../experiments/lab043_hackrf_bpsk.py).
- **Основные проверки:**
[`tests/test_lab043_hackrf_bpsk.py`](../tests/test_lab043_hackrf_bpsk.py).
Дополнительные проверки находятся в файлах `tests/test_lab043_*.py`.
- **Документ состояния:**
[`docs/lab043_current_state.md`](lab043_current_state.md).
- **Обработанные данные:** каталоги
[`data/processed/lab043_diagnostics`](../data/processed/lab043_diagnostics),
[`lab043_hackrf_compare`](../data/processed/lab043_hackrf_compare),
[`lab043_hackrf_continuity`](../data/processed/lab043_hackrf_continuity),
[`lab043_hackrf_counter`](../data/processed/lab043_hackrf_counter) и
[`lab043_hackrf_gain_ladder`](../data/processed/lab043_hackrf_gain_ladder).
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab043_raw\`.
- **Журнал:** отдельной записи с темой Lab043 нет. Переход к Lab043 указан в
записи 020, а подтверждённая рабочая точка Lab043 используется и упоминается
в записях 021-024
([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab044
- **Цель:** передача произвольного протокольного пакета через реальный
BPSK-канал HackRF с независимым решением CRC.
- **Статус:** один аппаратный запуск, `RESULT C`; преамбула и PHY sync
восстановлены, пакет не дошёл до проверки CRC.
- **Основной эксперимент:**
[`experiments/lab044_hackrf_bpsk_packet.py`](../experiments/lab044_hackrf_bpsk_packet.py).
- **Основные проверки:**
[`tests/test_lab044_hackrf_bpsk_packet.py`](../tests/test_lab044_hackrf_bpsk_packet.py).
- **Документ состояния:**
[`docs/lab044_current_state.md`](lab044_current_state.md).
- **Обработанные данные:** отдельные результаты не сохранялись; каталог
[`data/processed/lab044`](../data/processed/lab044) содержит только
навигационный README.
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab044_raw\20260831_140142_bpsk_packet\`.
- **Журнал:** подготовка в записи 021, аппаратный результат в записи 022
([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab045
- **Цель:** защищённый BPSK-кадр со свёрточным FEC R=1/2, K=7, перемежением,
мягким декодером Витерби, защищённым PHY-заголовком и CRC.
- **Статус:** аппаратный `RESULT A`; исправление реальных ошибок FEC доказано,
CRC пройден, полезная нагрузка восстановлена без ошибок.
- **Основной эксперимент:**
[`experiments/lab045_hackrf_bpsk_fec.py`](../experiments/lab045_hackrf_bpsk_fec.py).
- **Основные проверки:**
[`tests/test_lab045_hackrf_bpsk_fec.py`](../tests/test_lab045_hackrf_bpsk_fec.py).
- **Документ состояния:**
[`docs/lab045_current_state.md`](lab045_current_state.md).
- **Обработанные данные:** отдельные результаты не сохранялись; каталог
[`data/processed/lab045`](../data/processed/lab045) содержит только
навигационный README.
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab045_raw\20260901_103434_bpsk_fec\`.
- **Журнал:** программная подготовка в записи 023, аппаратный результат в
записи 024 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046
- **Цель:** фрагментация произвольного бинарного объекта, передача его
несколькими независимо защищёнными кадрами Lab045 и аварийно-безопасная
сборка объекта.
- **Статус:** программная проверка завершена успешно; RF не запускался.
- **Основной эксперимент:**
[`experiments/lab046_bpsk_object_transport.py`](../experiments/lab046_bpsk_object_transport.py).
- **Основные проверки:**
[`tests/test_lab046_bpsk_object_transport.py`](../tests/test_lab046_bpsk_object_transport.py).
- **Документ состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md).
- **Обработанные данные:** отдельного каталога в `data/processed` нет.
- **Внешние аппаратные данные:** отсутствуют, поскольку этап программный.
- **Журнал:** запись 025 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046A
- **Цель:** независимый поиск и приём нескольких кадров объекта в одном
непрерывном нормированном потоке мягких BPSK-значений.
- **Статус:** программная проверка завершена успешно; работа с IQ и
аппаратная проверка на этом этапе не выполнялись.
- **Основной эксперимент:** отдельного `lab046a_*.py` нет; реализация находится
в [`experiments/lab046_bpsk_object_transport.py`](../experiments/lab046_bpsk_object_transport.py).
- **Основные проверки:** отдельного `test_lab046a_*.py` нет; сценарии находятся
в [`tests/test_lab046_bpsk_object_transport.py`](../tests/test_lab046_bpsk_object_transport.py).
- **Документ состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md).
- **Обработанные данные:** отдельного каталога в `data/processed` нет.
- **Внешние аппаратные данные:** отсутствуют, поскольку этап программный.
- **Журнал:** запись 026 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046B
- **Цель:** поиск и приём нескольких полных кадров Lab045 в одном непрерывном
сыром IQ-потоке без использования границ кадров передатчика.
- **Статус:** программная проверка завершена успешно; RF не запускался.
- **Основной эксперимент:**
[`experiments/lab046b_continuous_iq.py`](../experiments/lab046b_continuous_iq.py).
- **Основные проверки:**
[`tests/test_lab046b_continuous_iq.py`](../tests/test_lab046b_continuous_iq.py).
- **Документ состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md).
- **Обработанные данные:** отдельного каталога в `data/processed` нет.
- **Внешние аппаратные данные:** отсутствуют, поскольку этап программный.
- **Журнал:** запись 027 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046C
- **Цель:** непрерывная аппаратная передача объекта 16 КиБ последовательностью
защищённых BPSK-кадров и независимое восстановление объекта из IQ-записи.
- **Статус:** полный аппаратный результат на 1400 МГц равен `RESULT A`:
принято 68/68 кадров, объект восстановлен без ошибок. Первый полный опыт на
1080 МГц сохраняется отдельно как исторический `RESULT C`.
- **Основной аппаратный эксперимент:**
[`experiments/lab046c_hackrf_bpsk_object.py`](../experiments/lab046c_hackrf_bpsk_object.py).
- **Автономная обработка сохранённых записей:**
[`experiments/lab046c_offline_recovery.py`](../experiments/lab046c_offline_recovery.py).
- **Основные проверки:**
[`tests/test_lab046c_hackrf_bpsk_object.py`](../tests/test_lab046c_hackrf_bpsk_object.py)
и
[`tests/test_lab046c_offline_recovery.py`](../tests/test_lab046c_offline_recovery.py).
- **Документы состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md) и отдельный отчёт
о короткой записи 1400 МГц
[`docs/lab046c_1400mhz_offline_reprocessing.md`](lab046c_1400mhz_offline_reprocessing.md).
- **Обработанные данные:** локально присутствуют каталоги
`data/processed/lab046c_offline_recovery` и
`data/processed/lab046c_1400mhz_offline`; в текущем состоянии Git их файлы
не отслеживаются.
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab046_raw\20260901_145339_bpsk_object\`,
`C:\Users\user\Documents\SDR_Rover_RF_Check\20260901_172749_1400MHz\` и
`C:\Users\user\Documents\SDR_Rover_Lab046_raw\20260902_151819_1400MHz_full\`.
- **Журнал:** записи 028-032 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab047
- **Цель:** передача настоящего JPEG как обычного двоичного объекта через уже
проверенный транспорт Lab046 и восстановление файла с проверкой SHA-256 и
декодирования изображения.
- **Статус:** завершена успешно. В одном непрерывном аппаратном сеансе при
1400 МГц передан настоящий JPEG: 36/36 кадров, 19 ошибок кодированных бит до
FEC, 0 ошибок после FEC, CRC PASS/FAIL 36/0. Объект собран полностью,
SHA-256 совпал, Pillow декодирует JPEG RGB 320 x 240, ошибок байтов и битов
нет. `REAL RF JPEG TRANSPORT = PASS`.
- **Основной эксперимент:**
[`experiments/lab047_jpeg_object_transport.py`](../experiments/lab047_jpeg_object_transport.py).
- **Основные проверки:**
[`tests/test_lab047_jpeg_object_transport.py`](../tests/test_lab047_jpeg_object_transport.py).
- **Документ состояния:**
[`docs/lab047_current_state.md`](lab047_current_state.md).
- **Обработанные данные:** малые демонстрационные JPEG и отчёты находятся в
[`data/processed/lab047`](../data/processed/lab047). Большие потоки `cs8` и
сырые IQ там не хранятся.
- **Внешние аппаратные данные:** исходная RX-запись и результаты находятся в
`C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747`; большие
потоки `cs8` и сырые IQ в Git не добавляются.
- **История приёма:** первоначальная обработка остановилась до PHY/FEC/CRC по
`MAX_CANDIDATES_REACHED`. После исправления последовательной обработки один
полный автономный анализ исходной записи восстановил JPEG точно; порог
`0.030964473262429237` не менялся, второй RF-сеанс не выполнялся.
- **Журнал:** записи 033-034 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab048
- **Цель:** профилирование и ускорение доказанного автономного BPSK-приёмника
без изменения детектора, PHY, FEC, CRC и порога.
- **Статус:** завершена успешно только на сохранённой RX-записи Lab047;
обработка ускорена с 37,423910 до 13,966058 с, в 2,679633 раза. Для 15,0 с
эфира отношение времени обработки равно 0,931071:
`REAL-TIME CAPABLE = YES`.
- **Результат:** сохранены 36/36 кадров, FEC PASS 36/36, CRC PASS/FAIL 36/0,
полный JPEG, точный SHA-256, 0 ошибочных байтов и битов. Порог
`0.030964473262429237` не изменён.
- **Ограничение:** приблизительный пик памяти остаётся около 1,44 ГиБ из-за
16-миллионного блока грубого поиска; запас реального времени около 1,03 с.
- **Основной эксперимент:**
[`experiments/lab048_receiver_performance.py`](../experiments/lab048_receiver_performance.py).
- **Проверки:**
[`tests/test_lab048_receiver_performance.py`](../tests/test_lab048_receiver_performance.py).
- **Документ состояния:**
[`docs/lab048_current_state.md`](lab048_current_state.md).
- **Обработанные данные:** машинный результат и восстановленный JPEG находятся
в [`data/processed/lab048`](../data/processed/lab048).
- **RF:** новый радиосеанс не выполнялся, `RF TX = 0`.
- **Журнал:** запись 035 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab049
- **Актуальная архитектура:** RadioMaster + штатные ELRS TX/RX, CRSF к контроллеру
ровера; независимый SDR для видео и объёмных данных. Будущий SDR около 180 МГц,
лабораторная база 1400 МГц. Это не перенос штатного ELRS на 180 МГц.
- **Аудит CRSF/ELRS:** официальный релиз 4.1.0, размеры OTA 8/13 байт,
реальные интервалы и доли телеметрии; ELRS недостаточно для JPEG >3 кадра/с.
- **Бюджет SDR:** RC/критическая телеметрия в отдельном ELRS не вычитаются.
20/50/100/200 ксимв/с дают в идеале 0,09635 / 0,24088 / 0,48175 / 0,96350 JPEG/с.
Для 3/5/10 требуются минимум 622,728 / 1037,880 / 2075,760 ксимв/с
по фактическому текущему PHY. 3 — промежуточный уровень; цель >3, ориентиры 5 и 10.
- **Задача предыдущего опыта:** 20/50/100/200 ксимв/с при Fs=8 Мвыб/с,
полный независимый IQ-приём и исторический стресс-тест общего канала.
- **Актуальный результат:** идеал — 36/36 во всех режимах. Шум Eb/N0=7 dB, CFO +10 Гц:
20 — 6/36, FAIL; 50/100/200 — точный JPEG 36/36, CRC 36/0, PARTIAL.
- **Полный приёмник Lab048:** processing/IQ 16,60454 / 1,35433 / 3,60210 / 7,31872;
ни один режим не успевает в реальном времени в шумном сценарии.
- **Исторические задержки общего канала:** блокировка 288,30 / 115,32 / 57,66 / 28,83 мс. Доставка EMERGENCY
в худшей фазе включает ещё один кадр; даже на 200 она требует почти 57,66 мс.
- **Исторический стресс-тест:** CONTROL 20 Гц и TELEMETRY 10 Гц в 30 полных
кадрах/с оставляли VIDEO только на 200. Это не целевая CRSF/ELRS-архитектура.
- **Диагностический PHY-кандидат:** 50 ксимв/с, 160 выборок/символ —
наименьшая вычислительная перегрузка среди точных шумных проходов. RF не разрешён.
- **Код:** [расчётчик ELRS/SDR](../experiments/lab049_crsf_elrs_budget.py),
[Lab049 IQ](../experiments/lab049_bpsk_symbol_rate.py),
[независимый IQ-адаптер](../experiments/lab049_independent_iq.py).
- **Тесты:** [35 расчётных](../tests/test_lab049_crsf_elrs_budget.py),
[исходные](../tests/test_lab049_bpsk_symbol_rate.py),
[регрессии IQ](../tests/test_lab049_independent_iq.py).
- **Отчёт:** [архитектура CRSF/ELRS](lab049_crsf_elrs_architecture.md),
[новый бюджет JSON](../data/processed/lab049/crsf_elrs_budget.json),
[состояние](lab049_current_state.md), [аудит](lab049_audit.md),
[JSON](../data/processed/lab049/result.json).
- **История:** [старый frame-aligned результат](../data/processed/lab049/frame_aligned_result.json)
не измерял полный независимый поиск. Журнал: записи 036–038.
- **Безопасность:** свойства Lab038–041 сохраняются; сопряжение CRSF ещё не проверено.
Видео не разрешает движение при потере ELRS. Модули protocol и прежние тесты сохранены.
- **Далее:** программный Lab050 — профиль RX, поток видео и ограничение возраста очереди.
- **RF:** RF TX = 0, STOP.
## Lab050
- **Цель:** последовательность JPEG через отдельный SDR-транспорт, ограничение
возраста изображения и блочный независимый IQ-приём. Управление ELRS отдельно.
- **База:** Lab049 закреплена коммитом
`cdf5396e807b83f82a264632dc46f71428fcd616`; Lab050 не добавлена в индекс и не коммитилась.
- **Переиспользовано:** планировщик Lab035 с LATEST_ONLY и завершением активного
изображения. Добавлены готовность JPEG отдельно от съёмки, произвольный предел
возраста и прогноз RX. Поздно готовый старый снимок не вытесняет свежий.
- **Профили:** A 320×240 RGB q35 — 8724 байта; B 160×120 RGB q35 — 2771;
C 128×96 RGB q25 — 1740; D 160×120 grayscale q30 — 2028. По 30
детерминированных сдвигов исходного фото; это не видео камеры.
- **Матрица:** 240 сценариев, вход 3/5/10 кадров/с, Rs=200/400/500/800/1000 ксимв/с,
MAX_VIDEO_AGE=200/333/500/1000 мс. Ожидающая очередь ≤1.
- **Идеальная модель:** C/500k — 5 или 10 свежих кадров/с, возраст около 92,6 мс.
При камере 10 и Rs=200k, возрасте 333 мс: 14 передач, 16 замен, 4,333 свежих
кадра/с внутри окна и один дополнительный после него.
- **Потоковый RX:** 24/24 RF-пакета и 3/3 точных JPEG до `finish` на каждой скорости;
IQ-память ограничена. В шумном опыте processing/RF = 44,322 / 147,986 /
170,374 / 295,095 / 333,865. Реального времени нет.
- **Память:** удерживаемые IQ 2,13–6,51 МиБ; расчёт массивов 47,5–143,4 МиБ,
не измеренный RSS. Состояние RX не растёт вместе с длиной сессии.
- **Достижимость:** 5/10 кадров/с без QPSK — CONDITIONAL. C≤1952 байт,
500 ксимв/с, стоимость RX-пакета ≤16/12 мс для модели возраста 200 мс;
требуется ещё примерно 144/192-кратное ускорение относительно этого замера.
- **Код:** [видеомодель](../experiments/lab050_video_stream.py),
[потоковый RX](../experiments/lab050_streaming_receiver.py).
- **Проверки:** [44 теста Lab050](../tests/test_lab050_video_stream.py),
quick_gate — 650 тестов и 14 функциональных проверок; независимые verifier/adversary.
- **Отчёт:** [состояние](lab050_current_state.md),
[JSON](../data/processed/lab050/result.json),
[замеры RX](../data/processed/lab050/receiver_benchmarks.json). Журнал: запись 039.
- **Далее:** Lab051 — профиль и ускорение строгой обработки ложных кандидатов.
- **RF:** RF TX = 0. Lab050 commit/push не выполнялись. STOP.
## Lab051
- **Цель:** алгоритмически ускорить независимый блочный RX на 500 ксимв/с,
16 отсчётов/символ, Fs=8 Мвыб/с; проверить 5 свежих JPEG C в секунду.
- **База:** Lab050 закреплена разрешённым коммитом
`60691a09f193f36983c7174c5252ed0897c559e9`.
- **Профиль:** главная стоимость Lab050 — fallback timing, 41,833 с на ложных
кандидатах. Полный диапазон 1601 смещения сохранён и вычисляется через FFT
и накопленные энергии, с исходным выбором на неразделимых пиках.
- **Изменения:** общий front-end, точное повторное использование децимации,
кэш результатов уточнённого окна, короткий probe до PHY PASS, предвычисленные
метрики прежнего Viterbi. Порог, PHY/FEC/CRC и protocol не менялись.
- **Короткий контроль:** 24/24 пакета, 3/3 точных JPEG; медиана трёх повторов
1,144176 с вместо исторических 55,157553 с. Processing/RF=3,534193.
- **Основной поток:** 30 JPEG за 6 с, 240/240 пакетов, SHA MATCH 30/30.
Обработка 6,044416 с IQ заняла 38,630132 с, processing/RF=6,391045.
При MAX_VIDEO_AGE=200 мс все 30 JPEG просрочены; FRESH DISPLAY FPS=0.
Цель реального времени не достигнута, включая минимальную свежесть >0.
- **Память:** пик удерживаемого IQ 3,031 МиБ, RSS процесса в опыте измерен.
Тест 33,55 с не показывает роста IQ/кэша с длительностью. Это не готовая live-
очередь: непрерывный источник потребовал бы около 2,09 ГБ внешнего backlog.
- **Регрессия:** сохранённая Lab047-запись 20 ксимв/с штатным Lab048:
36/36, CRC PASS, JPEG SHA MATCH; 19 ошибок до FEC и 0 после.
- **Код:** [приёмник](../experiments/lab051_streaming_receiver.py),
[профилировщик](../experiments/lab051_receiver_profile.py),
[полный поток](../experiments/lab051_receiver_performance.py),
[38 тестов](../tests/test_lab051_streaming_receiver.py).
- **Отчёт:** [состояние](lab051_current_state.md),
[измеренный поток](../data/processed/lab051/stream.json). Журнал: запись 040.
- **Далее:** отдельное программное исследование стоимости уникальных фоновых
кандидатов в полном потоке 5 кадров/с с тем же PHY/FEC/CRC.
- **RF / Git:** RF TX=0; Lab051 git add/commit и push не выполнялись. STOP.
## Lab052
- **Цель:** снизить число ложных строгих проверок на 500 ксимв/с при сохранении
BPSK, PRBS7, PHY/FEC/CRC, фрагментации и всех принимаемых настоящих пакетов.
- **База:** Lab051 закреплена разрешённым коммитом
`9f33607d3ae82992c595de37dd64e99d7e4dea73`; 13 файлов, без push.
- **Профиль:** 1675842 локальных пика, 392785 кандидатов первого каскада;
прежний RX выполнил 147005 строгих проверок: 146765 ложных и 240 истинных.
Исторические 147082 Lab051 означали все кандидаты, а не только ложные.
- **Алгоритм:** общий дешёвый расчёт корреляций двух половин преамбулы,
локальная нормировка каждой половины; ограниченная полная ширина группы
20480 отсчётов, максимум первым, альтернативы сохраняются после FAIL.
Первый порог прежний; VALID только после штатного PHY/FEC/CRC.
- **Отвергнутый вариант:** безусловное подавление соседних меньших пиков
теряло слабый пакет рядом с сильной ложной преамбулой. Контрпример adversary
исправлен и закреплён тестами, включая границы блоков и плохую CRC.
- **Кандидаты:** 388407 отклонены дешёво, 384 группы, 243 представителя +12
альтернативных строгих проверок; 15 ложных, 240 настоящих, 0 потерь.
Сокращение ложных строгих проверок 9784,33×. Все 240 уникальных стартов совпали.
- **Полный поток:** C/5 JPEG в секунду, 30 изображений, 240/240 пакетов,
30/30 JPEG SHA MATCH. Медианный полный проход 7,369795 с /6,044416 с IQ
=1,219273. Возраст 234,520/834,077/1549,595 мс, все 30 просрочены,
**FRESH DISPLAY FPS=0; REAL-TIME CAPABLE=NO**.
- **Остаточная нагрузка:** настоящие пакеты 3,996005 с, общая децимация/
корреляция 1,790240 с. Все ложные проверки вместе лишь 28,884 мс.
- **Память:** удерживаемый IQ 3,031 МиБ, инженерная оценка массивов 136,161 МиБ,
измеренный process RSS peak 160,984 МиБ. Шумовой тест 16,78 с не накапливает
IQ/кандидатов; внешний live-backlog остаётся нереализованным.
- **Регрессии:** 37/45 слабых сценариев у обоих приёмников, 0 дополнительных
потерь. Старая запись 20 ксимв/с: 36/36, CRC PASS, JPEG SHA MATCH.
- **Код:** [обнаружитель](../experiments/lab052_candidate_detection.py),
[опыты](../experiments/lab052_detector_study.py),
[статистика](../experiments/lab052_detection_statistics.py),
[30 тестов](../tests/test_lab052_candidate_detection.py).
- **Отчёт:** [состояние](lab052_current_state.md),
[основной поток](../data/processed/lab052/stream.json). Журнал: запись 041.
- **Далее:** отдельное исследование истинных пакетов, общей обработки IQ и
задержки JPEG-пачки; текущий этап завершить на программных результатах.
- **RF / Git:** RF TX=0; Lab052 git add/commit и push не выполнялись. STOP.
## Lab053 — стоимость настоящих пакетов и потоковая обработка на CPU
- **Режим:** BPSK 500 ксимв/с, Fs 8 Мвыб/с, 16 отсчётов/символ;
JPEG C (128×96 RGB, q25), 5 кадров/с, предел возраста 200 мс.
- **База:** Lab052 закреплена коммитом
`cc38900caea4b310568edc691be7db124503fd21` — 27 файлов, без push.
- **Изменения:** локальные окна строгих расчётов, кольцевой IQ-буфер,
неизменный алгоритм Viterbi с CPU JIT, раздельные стадии ввода/RX/JPEG.
Общие децимация и корреляции сохранены; все 1601 timing-offset проверяются.
PHY/FEC/CRC, пороги и порядок кандидатов Lab052 не изменены.
- **Стоимость пакета:** среднее 7,016 мс, медиана 6,862 мс, p95 8,292 мс;
40 пакетов/с требуют около 0,281 с работы обработчика на секунду потока.
- **Производительность:** 4,384788 с суммарной работы стадий на 6,044416 с IQ,
отношение 0,725428. Отдельный полный проход без ожидания источника:
4,010478 с, отношение 0,663501. Прогрев JIT выполнен до приёма IQ.
- **Свежесть:** 240/240 пакетов, 30/30 точных JPEG, 5 свежих кадров/с;
возраст 150,298 / 153,996 / 176,062 мс. Три полных прохода прошли критерии.
Проверены 1/2/4 работника; выбран один, дополнительные не дали выигрыша.
- **Очереди и память:** IQ максимум 5/8 блоков, строгие задания 1/4;
переполнений нет. IQ 3,031 МиБ, выделенное кольцо 6,483 МиБ,
инженерная оценка рабочих массивов с резервами 72,720 МиБ,
измеренный пик RSS процесса 197,199 МиБ. Это разные показатели памяти.
- **Длинный поток:** 24,044416 с IQ, 960/960 пакетов, 120/120 точных JPEG,
5 свежих кадров/с, максимальный возраст 189,396 мс, отношение 0,742840;
IQ максимум 7/8, состояние ограничено, после закрытия очищено.
- **Регрессии:** те же 240 решений и 255 строгих кандидатов при 1/2/4 работниках;
37/45 слабых случаев у обоих приёмников, без новых потерь.
Старая запись 20 ксимв/с: 36/36, CRC и SHA PASS.
- **Проверки:** 50 новых тестов; полный pytest 768 passed;
quick_gate 768 тестов /26 функциональных /13 штатных пропусков, PASS.
Verifier и adversary подтвердили результаты. Отрицательные опыты
без JIT и с замедлением ввода фиксируют переполнение и прекращение потока.
- **Отчёт:** [состояние](lab053_current_state.md),
[критерии](../data/processed/lab053/acceptance.json),
[основной поток](../data/processed/lab053/stream.json),
[графики](../data/processed/lab053/performance_and_age.png). Журнал: запись 042.
- **Границы результата:** программная подача IQ по часам; камера, экран и
аппаратный приём не проверены. GPU не использована, RF TX=0.
- **Далее:** рассмотрение результатов ChatGPT. Lab053 git add/commit и push
не выполнялись. STOP.
## Lab055 — энергетический аудит сохранённых Lab047 и Lab054
- **Режим:** только файлы, RF TX=0; HackRF не запускался, Lab054 NOT_A сохранён.
- **Результат:** цифровая мощность активного TX практически одинакова
(1950,308/1950,598 код²), согласованная компонента RX в модели уменьшилась
на15,413дБ. Фон в одинаковой полосе675кГц сопоставим. Выходная RF-мощность
без калибровки неизвестна; одинаковый TX VGA не является её измерением.
- **Границы:** условная потеря13,98дБ из-за скорости требует постоянных
принятой мощности и N0; эти условия не подтверждены. Остаток модели
содержит шум и искажения. Описан только план кабельного измерения.
- **Проверки:**9 целевых тестов; pytest823 passed; quick_gate823/28/13 PASS;
verifier без остаточных находок. Исходные IQ и результаты неизменны.
- **Отчёт:** [состояние](lab055_current_state.md),
[итоговый расчёт](../data/processed/lab055/energy_audit_v2.json), журнал046.
- **Далее:** STOP. Отдельное согласование измерительной схемы и допустимой
частоты; усилитель не назначен, Git add/commit/push/pull/fetch не выполнялись.
## Lab056 — подготовка одного эфирного ABAB, 20 и 500 ксимв/с
- **База:** Lab055 зафиксирована коммитом
`5add95ecb8865f59075bbbced08d97b183fb3b48`, только её семь файлов; без push.
- **Подготовлено:** один PRBS7/BPSK/RRC TX-файл ABAB, 1,323568 с;
Fs 8 Мвыб/с, цифровая несущая +50 кГц. RMS A/B 44,004413/44,001925 код,
разница мощности −0,000491 дБ; клиппинг 0. RX планируется на 3 с.
- **Проверено программно:** известные разницы усиления 0 и −6,020600 дБ
восстановлены с ошибкой менее 0,3 дБ в обеих парах. Анализируются отдельно
принятая мощность, фон, коэффициент передачи, остаток, спектр и энергия символа.
- **Проверки:** 34 целевых теста; quick_gate 857/30/13 PASS,
pytest 857 passed, 0 failed; verifier без остаточных находок; diff check PASS.
- **Граница:** пользователь выбрал эфир; частота/полоса и геометрия пока
не согласованы. 1400 МГц для излучения не используется. Общий такт проверен
только mock-вызовами; аппаратный preflight NOT_PERFORMED. RF TX=0.
Эфирный результат будет характеризовать весь путь с антеннами и распространением.
- **Отчёт:** [состояние](lab056_current_state.md),
[подготовка TX](../data/processed/lab056/preparation.json),
[сводка проверок](../data/processed/lab056/acceptance.json), журнал 047.
- **Далее:** STOP и отдельное разрешение на согласованный RF-сеанс.
Lab056 не коммитилась, push не выполнялся; Lab054 NOT_A сохранён.
- **Корректировка, запись 048:** кабельный контроль отложен из-за отсутствия
SMA-переходника; принят контролируемый OTA. RF_FREQ задаёт пользователь,
страна и границы диапазона не запрашиваются. Конкретная частота пока UNKNOWN.
Добавлен отдельный RX-only preflight с STOP перед разрешением TX, проверки
клиппинга до/после передачи, вывод комплексного h и повторов A2/A1, B2/B1.
TX и прежние результаты сохранены. 44 целевых теста; quick_gate 867/30/13
PASS, pytest 867 passed; verifier без находок. Аппаратных команд нет, RF TX=0.
[Сводка корректировки](../data/processed/lab056/ota_correction.json).
- **Аппаратный preflight, запись 049:** пользователь задал 1400000000 Гц
только для Lab056, OTA LOS примерно 3–5 м. Common clock PASS: оба reg29
0x26, SLAVE CLKIN DETECTED. RX-only 800 000 отсчётов/0,1 с, overruns 0,
клиппинг 0, RMS 2,203153 код. CLKOUT выключены, процессы CLEAR, RF TX=0.
[Отчёт preflight](lab056_rx_preflight.md). STOP до отдельного разрешения TX.
- **Единственный ABAB, запись 050:** после отдельного разрешения один TX
1,323568 с и RX 3 с; 4/4 сегмента, ошибка согласования начал ≤1 отсчёта,
клиппинг/overruns/underruns 0. X=+0,108895 дБ, Y=−0,163042 дБ,
Z=−13,870505 дБ. Повтор мощности A2/A1 −0,482024 дБ, B2/B1 −0,512676 дБ;
повтор коэффициента передачи примерно −0,18 дБ у обоих режимов.
Прежний провал 15,41 дБ в этой OTA-сессии не воспроизвёлся; собственные
потери HackRF не изолированы. Verifier подтвердил сырые данные и расчёты.
[RF-отчёт](lab056_rf_result.md), [сводка](../data/processed/lab056/rf_result.json),
[график](../data/processed/lab056/rf_overview.png). Выполненных TX 1, сейчас
RF TX=0, повторов нет. STOP, Lab056 не коммитилась, push не выполнялся.
## Правило хранения данных
Большие записи IQ, потоки `cs8`, бинарные объекты и другие аппаратные исходные
данные остаются во внешних каталогах. В `data/processed` хранятся только
небольшие обработанные результаты или навигационные README. Пустые и
фиктивные файлы результатов не создаются.
## Lab057 — OFFLINE-диагностика ошибок символов и заголовка Lab054
- **Запись 051; только сохранённые данные, RF TX=0.** Полный независимый baseline
воспроизвёл 100 прежних кандидатов, 100 PHY_HEADER_MAGIC_MISMATCH, FEC/CRC
NOT_REACHED и 0/16 пакетов. Штатные PHY/RRC/FEC/CRC не изменялись.
- **Пять фиксированных вариантов:** S0; D0 — фаза по TRAIN; D1 — нулевой
остаточный CFO; D2 — CFO по TRAIN; D3 — дополнительно локальный timing.
Ошибки VALIDATION: 3494/3775/3355/3440/3466 из 9216. Header/CRC: у всех 0/16.
D1 улучшает VALIDATION против S0 на 1,5082 п.п., массовые ошибки сохраняются.
Единственная первопричина не установлена; PA не назначается.
- **Контроли:** TX054 16/16, RX047 36/36 во всех вариантах; фон 0/16.
Утечка DC из VALIDATION в оценивание TRAIN устранена и независимо проверена.
19 новых тестов; pytest 886 passed, quick_gate 886/31/13 PASS.
- [Постановка и ограничения](lab057_current_state.md), [итоговый отчёт](lab057_offline_result.md),
[CSV](../data/processed/lab057/frame_results.csv), [JSON](../data/processed/lab057/summary.json),
[график](../data/processed/lab057/comparison.png), [проверки](../data/processed/lab057/acceptance.json).
- **STOP:** исторический Lab054 NOT_A, 0/16 сохранён. Lab057 не коммитилась,
push не выполнялся; следующий OFFLINE-анализ Lab056 требует отдельного согласования.
## Lab058 — качество символов сохранённого ABAB Lab056
- **Запись 052; только сохранённые файлы, RF TX=0.** Lab057 зафиксирована коммитом
`5773136ebfa8bafdffc344462d0ce6b56838d3af`; Lab058 не закоммичена.
- **Oracle A/B:** BER 0%/3,4959%, EVM 0,3174/0,8453, matched/residual
9,9685/1,4648 дБ. Энергия символа B/A из Lab056 −13,870505 дБ.
- **Receiver-like A/B:** BER 0,0178%/52,4169%; B оценивает CFO примерно +4,7 Гц,
тогда как oracle получает значение около нуля. Carrier synchronization — отдельный
подтверждённый практический предел текущего receiver.
- **Диагностика тракта:** eye opening 1,9979/1,9935; ISI ratio −33,3195/−30,1006 дБ;
H(f) ripple p95−p05 0,4067/5,4714 дБ. OTA не разделяет TX, канал и RX; group-delay
variation не объявлена устойчивой.
- **Контроли:** TX BER 0/0; synthetic AWGN движет EVM в ожидаемую сторону при одинаковой
noise PSD; background BER около 50%. Итог `MIXED`; Lab054 остаётся NOT_A, 0/16.
- [Постановка](lab058_current_state.md), [отчёт](lab058_offline_result.md),
[JSON](../data/processed/lab058/summary.json),
[CSV](../data/processed/lab058/segment_metrics.csv),
[H(f)](../data/processed/lab058/channel_transfer.png). STOP; push не выполнялся.