Files
SDR-Rover/docs/LABS_INDEX.md
2026-09-08 17:29:52 +03:00

357 lines
29 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.
## Правило хранения данных
Большие записи IQ, потоки `cs8`, бинарные объекты и другие аппаратные исходные
данные остаются во внешних каталогах. В `data/processed` хранятся только
небольшие обработанные результаты или навигационные README. Пустые и
фиктивные файлы результатов не создаются.