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