216 KiB
Инженерный журнал SDR Rover Link
Назначение журнала
Этот файл содержит хронологию разработки проекта SDR Rover Link.
В журнале фиксируются:
- выполненные работы;
- полученные результаты;
- обнаруженные ошибки;
- принятые технические решения;
- результаты экспериментов;
- планы следующего этапа.
Записи не следует удалять. Если решение изменилось, необходимо добавить новую запись и объяснить причину изменения.
Запись 001
Дата
10 июля 2026 года
Тема
Создание структуры проекта и локального Git-репозитория.
Выполнено
- Проверена установленная версия Git:
git version 2.51.1.windows.1
Запись 002
Дата
27 июля 2026 года
Тема
Завершение Lab028: пакетирование синхронного BASE + ROI.
Выполнено
- Реализован фиксированный бинарный заголовок размером 32 байта.
- Добавлены packet CRC32 для заголовка и payload и object CRC32 для полного JPEG.
- Исследованы размеры payload 64, 128, 256, 512 и 1024 байта.
- Размер payload 512 байт принят как рабочий кандидат.
- Окончательный выбор размера пакета перенесён в Lab029.
Запись 003
Дата
27 июля 2026 года
Тема
Завершение Lab029: моделирование потерь и ошибок видеопакетов.
Выполнено
- Исследованы независимые потери пакетов и независимые битовые ошибки.
- Проверены короткие, средние и длинные серии потерь по модели Gilbert–Elliott.
- Выполнено сравнение payload 256, 512 и 1024 байта.
- Подтверждены packet CRC32, изоляция соседних кадров и атомарная сборка BASE + ROI.
- Зафиксировано ограничение пакетной временной шкалы Lab029.
- Сравнение помех одинаковой физической длительности перенесено в Lab029B.
Запись 004
Дата
27 июля 2026 года
Тема
Завершение Lab029B: временная модель серийных потерь.
Выполнено
- Помехи смоделированы на непрерывной временной шкале.
- Контрольная скорость передачи установлена равной 300 кбит/с.
- Исследованы средние длительности Bad 10, 50, 200 и 1000 мс.
- Payload 512 байт выбран для дальнейшей разработки.
- Payload 1024 байта оставлен резервным вариантом.
- Подтверждено, что без исправления ошибок возможны длительные прерывания видеопотока.
Запись 005
Дата
29 июля 2026 года
Тема
Завершение Lab030: блочное исправление стираний.
Выполнено
- Реализовано блочное исправление стираний над GF(256).
- Проверены режимы без исправления, 8+1, 8+2 и 8+4.
- Режим 8+2 выбран основным рабочим режимом.
- Режим 8+4 оставлен контрольным.
- Подтверждено, что без перемежения продолжительные серии потерь не исправляются.
- Следующая лабораторная посвящена перемежению пакетов.
Запись 006
Дата
29 июля 2026 года
Тема
Завершение Lab031: перемежение блоков исправления ошибок.
Выполнено
- Исследовано перемежение блоков исправления ошибок.
- Проверены глубины D=1, 2, 4 и 8.
- Подтверждено, что глубокое перемежение повышает задержку сильнее, чем полезность для операторского видеопотока.
- D=1 оставлен основным режимом.
- D=2 сохранён как резервный вариант.
- D=4 и D=8 исключены из основной линии разработки.
- Следующая лабораторная подбирает размер блока и количество проверочных пакетов.
Запись 007
Дата
29 июля 2026 года
Тема
Завершение Lab032: параметры блочного исправления потерянных пакетов.
Выполнено
- Исследованы параметры блочного исправления потерянных пакетов.
- Сравнивались режимы без исправления, 4+1, 8+2, 12+3, 6+2, 8+3, 4+2 и 8+4.
- Режим 12+3 выбран основным.
- Его транспортный поток составляет 226,951 кбит/с.
- Запас до контрольных 300 кбит/с составляет 73,049 кбит/с.
- Режим 8+4 оставлен усиленным экспериментальным вариантом.
- Режим 8+3 не принят из-за отсутствия устойчивого преимущества.
- Подтверждено, что продолжительные помехи нельзя компенсировать только увеличением числа проверочных пакетов.
- Следующий этап посвящён совместной передаче команд, телеметрии и видео с приоритетным обслуживанием.
Запись 008
Дата
3 августа 2026 года
Тема
Завершение Lab033: общий пакет канала и приоритетное обслуживание.
Выполнено
- Добавлен общий 32-байтный заголовок канала для команд, телеметрии и видео.
- Общая предложенная нагрузка составляет 258,214 кбит/с.
- Подтверждено, что FIFO не обеспечивает требуемую задержку команд.
- Выбран строгий приоритет с заменой устаревших состояний.
- Аварийная команда имеет наивысший приоритет.
- Скорость 260 кбит/с практически полностью загружена.
- При 230 кбит/с видеоданные накапливаются и устаревают.
- Итоговое восстановление всех кадров после освобождения очереди не означает работу видео в реальном времени.
- Расчёты и графики выполнены с Matplotlib 3.11.1.
- Следующий этап посвящён отбрасыванию устаревших видеокадров.
Запись 009
Дата
3 августа 2026 года
Тема
Завершение Lab034: реактивное отбрасывание устаревших видеокадров.
Выполнено
- Сравнены непрерывные FEC-блоки и блоки, выровненные по составным кадрам.
- Выравнивание увеличивает видеопоток на 5,975 кбит/с, или на 2,633%.
- При 300 кбит/с удаление кадров не требуется.
- При 260 кбит/с ограничения 1000 и 1500 мс не срабатывают, а ограничение 500 мс уже чрезмерно.
- При 230 кбит/с реактивное удаление устаревших кадров уменьшает очередь, но резко снижает частоту обновления.
- Ограничение 500 мс оставляет только 3 из 63 кадров.
- Ограничение 1500 мс оставляет 27 из 63 кадров.
- Подтверждено, что короткая очередь сама по себе не означает свежее изображение.
- Текущая реактивная политика не принята.
- Следующий этап посвящён упреждающему допуску кадров и обслуживанию видео целыми кадрами.
Запись 010
Дата
3 августа 2026 года
Тема
Завершение Lab035: упреждающий допуск и обслуживание видео целыми составными кадрами.
Выполнено
- Lab035 исследует упреждающий допуск и обслуживание видео целыми составными кадрами.
- Начатый кадр всегда передаётся полностью.
- Команды и телеметрия могут передаваться между его пакетами.
- Реактивное удаление Lab034 окончательно не принято.
- Основная политика — хранение только самого свежего не начатого кадра.
- При 230 кбит/с опубликовано 56 из 63 кадров с частотой около 2,6 кадра/с.
- Бесполезно переданных видеобайтов нет.
- Очередь из двух кадров увеличивает возраст изображения.
- Прогноз 1000 мс не дал преимущества над более простой политикой.
- Прогноз 500 мс чрезмерно снижает частоту обновления.
- Следующая лабораторная проверяет долговременную устойчивость и изменение пропускной способности канала.
Запись 011
Дата
3 августа 2026 года
Тема
Завершение Lab036: долговременная устойчивость видеопланировщика при изменении пропускной способности.
Выполнено
- Lab036 проверяет видеопланировщик на протяжении 600 секунд.
- Расчётный рост очереди без удаления совпал с моделью.
- При 230 кбит/с очередь без удаления выросла до 4139 пакетов.
- 95-й процентиль возраста изображения достиг 74,6 секунды.
- Плавное поступление сильно устаревших кадров непригодно для управления.
- Политика хранения только самого свежего не начатого кадра ограничивает очередь.
- При 230 кбит/с она обеспечила около 2,615 кадра/с.
- После восстановления скорости возраст изображения снизился ниже 500 мс за 0,077 секунды.
- Политика двух ожидающих кадров оставлена резервной.
- Следующая лабораторная объединяет планировщик с моделью ошибок радиоканала и защитой команд управления.
Запись 012
Дата
4 августа 2026 года
Тема
Завершение Lab037: полный транспорт с серийными потерями и повторением критических команд.
Выполнено
- Lab037 объединяет видеопоток, обычные и аварийные команды, телеметрию и временные серийные потери пакетов.
- Близкие повторные копии команд часто попадают в один и тот же интервал помехи.
- Повторение Lab037 лишь умеренно уменьшило долю недоставленных управляющих состояний.
- Максимальный промежуток без свежей команды остался более одной секунды.
- Своевременная доставка аварийной команды по радиоканалу не гарантируется.
- Для безопасного поведения при потере связи требуется локальный сторожевой таймер на ровере.
- Следующий этап исследует сторожевой таймер, временно разнесённую аварийную команду и подтверждение получения.
Запись 013
Дата
4 августа 2026 года
Тема
Завершение Lab038: локальный сторожевой таймер и подтверждаемая аварийная команда.
Выполнено
- Lab038 исследует локальный сторожевой таймер, разнесённую аварийную команду и подтверждение получения.
- Три инварианта безопасности не нарушены ни разу.
- Подтверждение не является условием выполнения аварийной остановки.
- Режим с подтверждением сохранил итоговую доставку аварийной команды 99,694%.
- Среднее число аварийных копий уменьшилось с 11 до 1,071.
- Дополнительная нагрузка подтверждаемого режима составляет около 0,0093 кбит/с.
- Дополнительное повторение обычных команд не принято как основной режим.
- Порог 100 мс вызывает слишком частые безопасные остановки.
- Порог 500 мс допускает слишком большой путь до реакции.
- Для следующей проверки принята двухступенчатая логика: предварительная реакция после 150 мс и обязательная остановка после 250 мс.
Запись 014
Дата
5 августа 2026 года
Тема
Завершение Lab039: двухступенчатая безопасная реакция и оценка пути до остановки.
Выполнено
- Lab039 реализует состояния NORMAL, STAGE1_DECELERATION, STAGE2_BRAKING и EMERGENCY_LATCHED.
- Используется точное событийное интегрирование движения.
- Аналитические значения совпали с моделью с нулевой ошибкой.
- Максимальный полный путь составил 13,9642 м.
- При 25 км/ч и номинальном профиле политика 150/250 мс дала полный путь около 9,5388 м.
- Основную часть пути составляет торможение после реакции.
- Пара 150/250 мс сохраняется как предварительный кандидат, но окончательно не утверждается.
- Фактические замедления должны быть измерены на реальном ровере.
- Локальный сторожевой таймер сохранил безопасную реакцию в опытах, где аварийная команда не была доставлена.
- Следующий этап исследует постоянное аварийное намерение наземной станции и безопасное разрешение повторного движения.
Запись 015
Дата
5 августа 2026 года
Тема
Завершение Lab040: постоянное аварийное намерение и безопасное повторное разрешение движения.
Выполнено
- Lab040 реализует постоянное аварийное намерение наземной станции.
- Ограниченное окно повторения 500 мс признано небезопасным.
- При полностью потерянной аварийной передаче ограниченный режим допускал последующее возобновление движения.
- В одном из тяжёлых условий путь после такого восстановления достигал в среднем около 490 м при 25 км/ч.
- Постоянное аварийное намерение исключило положительные задания скорости и небезопасные возобновления движения.
- Подтверждение аварийной команды не снимает аварийное намерение.
- Сброс принимается только после остановки, при свежей связи и корректных идентификаторах.
- Подтверждение сброса не восстанавливает старую команду движения.
- Движение требует новой явной команды оператора.
- Следующий этап посвящён сеансам связи, перезапускам устройств и защите от пакетов предыдущего сеанса.
Запись 016
Дата
5 августа 2026 года
Тема
Завершение Lab041: сеансы связи, безопасный запуск и защита от пакетов предыдущего сеанса.
Выполнено
- Lab041 вводит идентификаторы сеанса станции, запуска ровера и периода управления.
- Одного номера сообщения недостаточно после перезапуска.
- В основном режиме все 2807 введённых старых пакетов были отклонены.
- Ошибочно принятых старых пакетов не было.
- Исходный режим без идентификаторов принял все старые пакеты.
- После перезапуска движение запрещено до нового согласования, подтверждения разрешения и новой команды оператора.
- Аварийное намерение наземной станции сохраняется после перезапуска.
- Неоднозначная разность номеров 2^31 отклоняется.
- Следующий этап посвящён криптографической проверке подлинности управляющих сообщений и защите от намеренной подделки.
Запись 017
Дата
7 августа 2026 года
Тема
Аудит достоверности Lab041 и удаление показателей, не выводимых из модели. Начало этапа стабилизации после Lab041.
Причина записи
Запись 016 не отменяется, но нуждается в уточнении. Машинный аудит репозитория показал, что часть числовых результатов Lab041 не выводилась ни из модели этой лабораторной, ни из указанного источника. Согласно правилу журнала прежняя запись сохранена, а изменение зафиксировано отдельно.
Что обнаружено
- В функции
simulate_trialдоли публикации видео, доставки телеметрии и доставки управления, а также базовая длина очереди задавались вписанными таблицами, а не вычислялись. - Значение доли видео 0,910 для канала 260 кбит/с не соответствовало заявленному источнику: Lab040 даёт 0,9603, Lab037 — разброс 0,9026...0,9174.
- Базовая длина очереди 31 для того же канала не соответствовала Lab040, где получено 36...38 пакетов.
- Коэффициенты влияния нагрузки 0,15, 0,10 и 0,05 не выводились ни из какой модели.
- Параметры торможения были зашиты литералами
0.250и делителем6.0без связи с профилемnominalLab039, откуда они происходят. - Пять из четырнадцати инвариантов безопасности не измерялись: два вычислялись выражением с умножением на ноль, один был литеральным нулём, ещё два опирались на поля, которые никогда не заполнялись. Проверка
validate_outputsподтверждала эти константы, то есть проверяла тождество. - Формулировка «все 2807 введённых старых пакетов были отклонены» описывает перебор таблицы сценариев, а не измеренную вероятность отклонения. Число раскладывается как семь сценариев на 401 повтор.
Выполнено
- Из Lab041 удалены четыре показателя: доли доставки видео, телеметрии и управления и максимальная длина очереди. Они относятся к Lab037 и Lab040 и в Lab041 не моделируются.
- Удалён график
lab041_traffic_impact.png, потерявший основание. Осталось семь графиков. - Удалены поля
negative_speed_casesиspeed_limit_exceeded_cases, которые никогда не вычислялись, и тождественные проверки вvalidate_outputs. - Параметры торможения связаны с профилем
nominalLab039 через именованные константыLAB039_NOMINAL_STAGE2_MPS2иLAB039_STAGE2_THRESHOLD_SECONDS; горизонт незащищённого движения выделен как явно принятое допущение. - Перенесённые величины
VIDEO_OFFERED_LOAD_KBPSиTELEMETRY_OFFERED_LOAD_KBPSснабжены указанием источника: Lab038, поляvideo_load_kbpsиtelemetry_load_kbps. - Секция инвариантов переписана: девять свойств, следующих из архитектуры, снабжены ссылками на подтверждающие функциональные проверки; пять свойств, которые матрица не может измерить, вынесены в отдельный раздел со ссылками на проверки 04, 06, 07, 10, 16 и 19.
- В отчёт добавлено разграничение того, что моделируется розыгрышем, что задано архитектурой и что не моделируется вовсе.
- Проверка 04 расширена отрицательной скоростью и границей 15 м/с, поэтому соответствующее свойство теперь подтверждается реально, а не константой.
- Оценка пути после перезапуска помечена как расчёт по замкнутой формуле, одинаковый во всех повторах, а не как результат розыгрыша.
Результат
- Lab041 перезапущена полностью: 180 сочетаний, 24 из 24 функциональных проверок пройдены, пять CSV и семь PNG.
- Сверка с прежними файлами показала, что удалено ровно шесть столбцов, а все сохранённые значения совпали до последнего знака. Расхождений в общих столбцах ноль.
- Научные выводы Lab041 не изменились. Максимальный путь после перезапуска остался 9,7737 м, постоянная нагрузка управления 10,88000 кбит/с, полный предложенный поток 262,076 кбит/с.
- Выводы Записи 016 о сеансах, безопасном запуске и отклонении старых пакетов остаются в силе. Уточняется их основание: доказательством служат 24 функциональные проверки, работающие с настоящими автоматами, а не счётчики матрицы из 180 сочетаний.
Следующий этап
Криптографическая аутентификация отложена. Сначала выполняется этап стабилизации: быстрые тесты protocol/ вместо единственной точки входа через лабораторную, разделение быстрых проверок и экспериментов, воспроизводимое описание окружения.
Запись 018
Дата
10 августа 2026 года
Тема
Выбор радиочастотной архитектуры: рабочий диапазон, скачки по частоте и меры против подавления.
Исходные данные
- Устройство опрошено напрямую:
Analog Devices PlutoSDR Rev.C (Z7010-AD9361). Приёмник перестраивается от 70 МГц до 6 ГГц, передатчик от 46,9 МГц. Минимальная частота дискретизации 2 083 333 Гц. - Ограничений по разрешённым частотам у проекта нет.
- Усилителя мощности нет, покупка отложена до первых испытаний.
Отвергнутые варианты и причины
Выбор редкой фиксированной частоты. Рассматривался как защита от подавления. Отклонён: одиночная несущая в пустом эфире обнаруживается сканирующим приёмником тривиально. Уязвимость создаёт не значение частоты, а её неизменность.
Скачки по всему диапазону 70 МГц – 6 ГГц. Теоретически требуют от заградительной помехи на 42 дБ больше мощности, но выигрыш недостижим. Отношение крайних частот 86:1, одна антенна такой полосы не перекрывает; разброс потерь на 10 км составляет 39 дБ, проектировать пришлось бы по худшему краю; выше примерно 1 ГГц дифракция исчезает и для наземного ровера без прямой видимости эти каналы мертвы. Кроме того, подавление направлено на диапазон, в котором связь действительно работает, а не на тот, который способно настроить оборудование.
Диапазоны 330–433 МГц. Отклонены как плотно занятые и общеизвестные.
Принято
Рабочий диапазон 200–250 МГц. Обоснование: четвертьволновая антенна 33 см пригодна для установки на ровер, дифракция ещё эффективна, участок заметно свободнее любительского 144 МГц и УКВ выше 300 МГц. Потери на 10 км составляют около 99,5 дБ.
Совокупность мер против подавления:
- Скачки по частоте в пределах 200–250 МГц. Требуют от заградительной помехи на 22 дБ больше мощности при неизменной антенне и механике ровера.
- Направленная антенна наземной станции. Даёт 10–20 дБ усиления и пространственно подавляет помеху, приходящую с иного направления.
- Расширение спектра для команд управления. Поток команд составляет 10,88 кбит/с, поэтому расширение для него реализуемо в узкой полосе, в отличие от видеопотока.
Видео остаётся некритичным классом: при подавлении управление сохраняется в узкой полосе, а ровер переходит к безопасному поведению по уже реализованной логике.
Запрещённые участки
- 108–137 МГц — авиационная связь.
- 243 МГц — международная аварийная частота.
Ограничения решения
- Нижняя граница 70 МГц определяется приёмником Pluto и без смены оборудования не преодолевается.
- Скачки требуют согласованной последовательности у обеих сторон, то есть зависят от криптографической аутентификации, которая пока не реализована.
- Расчёты выполнены для свободного пространства. Потери на препятствиях 20–40 дБ учтены оценочно и подлежат измерению.
- Дальность 10 км без усилителя мощности не достигается.
Влияние на ближайшие работы
На Lab042 не влияет: там кабельная петля, несущая 435 МГц выбрана произвольно. Диапазон 200–250 МГц вступает в силу начиная с эфирных испытаний.
Запись 019
Дата
10 августа 2026 года
Тема
Lab042: первая передача изображения через реальный радиотракт. Эфирная проверка на паре антенн.
Причина эфирного прогона
Кабельная петля требует переходника SMA папа-папа, которого пока нет: пигтейлы к антеннам оканчиваются папой, а разъёмы Pluto — мамы. Чтобы не простаивать, выполнена вспомогательная эфирная проверка на двух антеннах, разнесённых на 60 см. Она не заменяет кабельный опыт: уровни в помещении не контролируются строго, возможны переотражения. Её задача — снять последнюю неизвестность в коде, а именно обвязку вокруг устройства, которая в моделях не проверяется.
Условия
- Устройство Analog Devices PlutoSDR Rev.C, чип AD9361, прошивка v0.32.
- Несущая 225 МГц, внутри целевого диапазона Записи 018.
- Антенны, рассчитанные на 108 МГц, работают на несущей как полуволновые. Частота передачи и частота, на которую рассчитана антенна, различны, поэтому в авиационный диапазон 108–137 МГц опыт не заходит.
- Изображение 320x180 в градациях серого, JPEG 4756 байт при качестве 35, десять фрагментов.
Результат
- Изображение передано и собрано побайтово идентично исходному. Контрольная сумма MD5 переданного и принятого файла совпала.
- Десять фрагментов из десяти, ни одной несошедшейся контрольной суммы.
- Средняя нормированная корреляция при поиске кадра 0,99951.
- Средняя оценка ухода несущей минус 0,368 Гц, что отражает общий опорный генератор передатчика и приёмника.
- Канальная скорость 18,404 кбит/с при длительности сигнала в эфире около 2,07 секунды.
- Результат воспроизведён тремя запусками подряд с одинаковой контрольной суммой.
Дефекты, вскрытые железом
Программная модель проходила чисто, но на устройстве обнаружились четыре дефекта, каждый воспроизведён и устранён.
- Кадр длиной 566 528 отсчётов не помещался в приёмный буфер 262 144. Между отдельными чтениями поток отсчётов не является непрерывным, и кадр на стыке разрушался. Приём переведён на один буфер, размер которого рассчитывается по длине кадра.
- Частотная коррекция применялась всегда, тогда как при общем опорном генераторе истинный уход близок к нулю. Оценка по маркеру длиной 80 символов состояла из шума, и коррекция им поворачивала фазу вдоль всего кадра: измерено 65 процентов ошибочных битов. Перенесена защита should_apply_cfo_correction из Lab023, разрешающая коррекцию только вне мёртвой зоны.
- Усиление приёмника 20 дБ давало сигнал около 0,0003 от шкалы АЦП. Рабочие уровни подобраны измерением: приёмник 50 дБ, передатчик минус 10 дБ дают ноль ошибочных битов с запасом.
- Величина вектора ошибки при неудачном приёме возвращала ноль, то есть показывала идеальный сигнал там, где сигнала не было. Это тот же класс ошибки, что вписанные показатели Lab041: метрика при отказе рапортует лучшее значение. Заменена на явный признак невычислимости.
Ограничения
- Эфирный прогон является проверкой тракта, а не измерением: уровни не контролируются как в кабельной сборке.
- Потолок усиления передатчика в эфирном режиме рассчитывается из бюджета линии по расстоянию между антеннами, а не задан константой.
Следующий этап
Кабельная петля через аттенюатор 30 дБ после получения переходника папа-папа. Это и есть заявленный опыт Lab042 с контролируемыми уровнями, его результат станет основным для лабораторной. Затем Lab043 — разведение на два устройства.
Запись 020
Дата
11 августа 2026 года
Тема
Lab042 завершена: кабельная петля через аттенюатор, зависимость доставки от мощности, устранение трёх дефектов отчётности.
Схема опыта
Выход передатчика PlutoSDR через кабель SMA, аттенюатор AT30S 30 дБ, переходник и второй кабель на вход приёмника того же устройства. Антенны сняты. Это заявленный основной опыт лабораторной с контролируемыми уровнями, в отличие от вспомогательной эфирной проверки Записи 019.
Зависимость доставки от мощности передатчика
Кабельный тракт при неизменной схеме исследован по усилению передатчика. Получен отчётливый переход от отказа к устойчивой передаче:
- TX минус 30 дБ: 0 из 10 фрагментов, контрольная сумма не сходится ни разу, средняя корреляция 0,936. Сигнал ниже порога уверенного приёма.
- TX минус 20 дБ: 8 из 10 фрагментов, средняя корреляция 0,992. Пограничный режим: часть кадров проходит.
- TX минус 10 дБ: 10 из 10 фрагментов, изображение собрано побайтово. Устойчивая передача.
Значения TX минус 30 и минус 20 дБ — исследование порога, повторять их не требуется. Рабочая точка кабельной петли: TX минус 10 дБ, RX плюс 20 дБ, аттенюатор 30 дБ, несущая 435 МГц.
Начальные умолчания кабельного режима TX минус 30 и RX плюс 20 дБ на железе прежде не проверялись; отказ первого прогона объяснялся именно этим, а не дефектом обработки.
Результат рабочей точки
- Найдено 10 кадров из 10, контрольная сумма сошлась у всех десяти, восстановлены все фрагменты.
- Изображение собрано и совпадает с переданным. Совпадение подтверждено независимо: SHA-256 принятого файла сверен с SHA-256 переданного JPEG, пересобранного из исходника отдельно от прогона. Оба равны 751d7ea0d8711e2ef54fc5cf209a809cfee5bbb14916dd20aa201d5285b40286.
- Размер JPEG 4756 байт, качество 30, десять фрагментов.
- Длительность сигнала около 2,07 секунды, канальная скорость 18,404 кбит/с.
- Кадр 8 прошёл контрольную сумму при пониженной корреляции поиска 0,866 против 0,998 у остальных: низкая корреляция маркера не означает испорченных данных, фаза дискретизации была подобрана и кадр демодулировался чисто.
Устранённые дефекты отчётности
Разбор кабельного прогона вскрыл три дефекта, при которых провал мог быть принят за успех. Все три устранены, каждый закрыт быстрым тестом в tests/test_lab042_reporting.py.
- Величина вектора ошибки нормировалась на единичный эталон, из-за чего при слабом сигнале становилась искусственно малой: провалившийся прогон показывал EVM меньше, чем успешный. Нормировка исправлена на мощность подогнанного сигнала. При невозможности вычислить величину возвращается признак невычислимости, а не ноль.
- Отчёт перечислял lab042_received.jpg среди созданных файлов безусловно, даже когда изображение не собрано и файла нет. Теперь файл указывается только при фактической сборке.
- Программа завершалась кодом ноль при полном отказе передачи. Введён критерий приёмки: при несобранном изображении код завершения ненулевой, чтобы автоматика не приняла провал за успех.
Проверки
- Быстрые тесты ядра расширены с 125 до 135. Добавленные проверяют неуспешный путь: провал даёт ненулевой код, отсутствующий файл не объявляется созданным, невычислимая метрика не превращается в ноль.
- Окончательный кабельный прогон рабочей точки выполнен уже исправленной версией программы, поэтому итоговый отчёт сформирован ею.
Следующий этап
Lab043: передаёт PlutoSDR, принимает RTL-SDR. Общий опорный генератор исчезает, впервые появляется реальное рассогласование несущей и частоты дискретизации двух независимых устройств. Здесь понадобится защищённая частотная коррекция, перенесённая в Записи 019.
Запись 021
Дата
31 августа 2026 года
Тема
Lab044 (произвольный protocol packet через реальный BPSK HackRF-канал): implementation prepared, hardware validation pending.
Статус
Lab044 implementation prepared. Hardware experiment NOT YET RUN, RF TX count = 0. Реализация построена поверх рабочей точки Lab043 (checkpoint 4cee6e9) без изменения её RF-параметров, gain, PHY sync, PRBS7-преамбулы, CRC или независимого детектора. Три пробела, найденные аудитом (отсутствие теста на обрезанный protocol packet, отсутствие BEFORE/DURING/AFTER диагностики записи, отсутствие SHA-256 для всех бинарных RX/TX артефактов), закрыты и покрыты новыми тестами. Подробности — в docs/lab044_current_state.md.
Следующий этап
Реальный аппаратный RF-прогон Lab044 (ровно один TX) должен выполнить локальный агент после полного PASS python tools/quick_gate.py и python -m pytest tests/ -q на машине с подключённым HackRF.
Запись 022
Дата
31 августа 2026 года
Тема
Lab044: первый реальный аппаратный RF-прогон произвольного protocol packet через BPSK HackRF-канал (ровно один TX).
Выполнено
Software gate пройден полностью на рабочем интерпретаторе машины (Python 3.13.1, numpy 2.2.6, scipy 1.18.0, pytest 9.1.1): python -m pytest tests/ -q = 373 passed, 0 failed, 0 skipped; python tools/quick_gate.py = OK; git diff --check чист. Выполнен ровно один аппаратный RF-эксперимент python experiments/lab044_hackrf_bpsk_packet.py --hardware --i-understand-hardware. RF TX count = 1, без retry.
Common-clock preflight PASS: MASTER reg29 = 0x26, SLAVE reg29 = 0x26, SLAVE CLKIN = DETECTED за 69 мс (bounded polling 0.05/0.05/0.5 с). RX стартовал до TX. Логи TX/RX чистые: 0 underruns, 0 overruns. Clipping 0, перегрузки АЦП нет.
Результат — RESULT C, CRC NOT_REACHED (CRC не PASS). Независимый PRBS7-детектор нашёл преамбулу (peak/median +38.3 dB), PHY SYNC 0xD391 восстановлен верно. Physical-layer BER по преамбуле ≈ 0.625 % (8/1280), согласуется с Lab043. Но одиночные битовые ошибки попали в поля длины: PHY LENGTH декодировано 264 вместо 268 байт, а protocol payload_length — 2304 вместо 256, из-за чего protocol header дал PAYLOAD_LENGTH_MISMATCH и разбор пакета сорвался раньше CRC. Protocol SYNC 0xAA55, version, message type (TELEMETRY), sequence (44) при этом декодированы верно. Packet/payload BER не вычислялись как «после успешного decode»: RX-пакет 264 байта не сопоставим с TX 268 байт, rx_payload.bin не создан. SNR 7.19 dB, separation 4.574, CFO 0.101 Hz (общий опорник). Артефакты: C:\Users\user\Documents\SDR_Rover_Lab044_raw\20260831_140142_bpsk_packet\, SHA-256 всех реально созданных бинарных файлов пересчитаны независимо и совпали с metadata.json; фиктивный rx_payload.bin не создавался (SHA = null). Cleanup: MASTER/SLAVE CLKOUT OFF, зависших hackrf_transfer.exe нет. Пост-RF software gate повторно пройден (373 passed). Изменения ещё не коммитятся: сначала результат смотрит ChatGPT. Подробности и таблица BEFORE/DURING/AFTER — в docs/lab044_current_state.md.
Следующий этап
Защитить критические поля кадра от одиночных битовых ошибок при BER ~0.6 %: FEC либо избыточное/помехоустойчивое кодирование PHY LENGTH и protocol-заголовка (ошибка сорвала разбор именно в длине, а не в CRC полезной нагрузки). Только после этого имеет смысл повторный аппаратный прогон Lab044 и переход к более длинным/структурированным передачам.
Запись 023
Дата
31 августа 2026 года
Тема
Lab045: программная подготовка bit-level FEC для реального BPSK-пакета.
Выполнено
Реализован свёрточный код R=1/2, K=7 с многочленами 171 и 133 octal, нулевым начальным состоянием и шестью нулевыми tail bits. Soft-decision decoder Витерби использует евклидову branch metric по вещественным BPSK-решениям до hard slicing. Соглашение BPSK сохранено от существующего тракта: бит 0 соответствует минус 1, бит 1 соответствует плюс 1.
Добавлен детерминированный блочный interleaver с записью строками и чтением столбцами. Перестановка не теряет элементы на неполной последней строке, проверяется как полная биекция и одинаково применяется к coded bits и soft values. Существующий GF(256) erasure FEC 12+3 не менялся и остаётся механизмом более высокого уровня для известных потерянных fragments.
Весь существующий protocol packet длиной 268 байт, включая 8-байтовый заголовок, 256 байт произвольного payload и CRC32, преобразуется в 2144 information bits и кодируется вместе с шестью tail bits в 4300 coded bits. Protocol parser вызывается только после deinterleave и soft Viterbi; существующий CRC32 остаётся независимым end-to-end решением.
PHY header расширен до magic, версии, длины packet и 8-битного checksum. Его 48 бит защищены побитовым повторением b,b,b до 144 бит. Majority decoder fail-closed проверяет magic, версию, checksum, предел длины и наличие рассчитанного числа coded symbols до запуска FEC decoder.
Подготовлен IQ-адаптер поверх доказанного Lab044: независимый PRBS7 detector, timing, CFO и phase/polarity recovery переиспользуются без TX payload, а FEC получает normalized.real до hard slicing. Диагностическое сравнение с TX разрешено отдельной функцией только после независимого CRC verdict.
Точный кадр Lab045 содержит 5724 BPSK-символа. При 400 samples per symbol и существующих guard/RRC параметрах Lab044 форма содержит 2 306 400 samples и длится 288,3 мс при 8 MS/s. Для сравнения Lab044 содержал 3456 символов, 1 399 200 samples и 174,9 мс.
Синтетический software-тракт прошёл. В детерминированном опыте с 28 ошибками из 4300 coded bits, BER 0,6512 процента, после FEC осталось 0 ошибок protocol packet, CRC PASS и payload восстановлен точно. Пачка из 14 соседних channel symbols также исправлена. Отдельный AWGN-тест подтвердил реальное использование soft-амплитуд: soft Viterbi дал 0 information-bit errors, тогда как hard baseline по тем же значениям дал 5.
Полный программный шлюз: python tools/quick_gate.py PASS, python -m pytest tests/ -q дал 417 passed, 0 failed, 0 skipped, git diff --check чист. Подробности, формат кадра и ограничения записаны в docs/lab045_current_state.md.
Аппаратные утилиты в этой сессии не запускались. RF TX = 0, RF RX = 0, hardware validation не выполнялась. Git add, commit и push не выполнялись.
Следующий этап: после отдельного разрешения подготовить ограниченный аппаратный runner Lab045 на базе common-clock preflight, one-TX guard, артефактов и cleanup Lab044, повторно пройти software gate и только затем рассматривать один аппаратный FEC-прогон.
Запись 024
Дата
1 сентября 2026 года
Тема
Lab045: первый аппаратный RF-прогон bit-level FEC — RESULT A, реальная помехоустойчивая коррекция в эфире доказана.
Выполнено
Перед эфиром исправлена устаревшая цифра в Записи 023 (414 → 417 passed) и в документации явно разделены две величины: информационные символы кадра (5724 символа, 2 289 600 отсчётов, 286,2 мс) и фактически сгенерированная форма сигнала (2 306 400 отсчётов, 288,3 мс). Разница в 42 символа (16 800 отсчётов) подтверждена прямо по формирователю shape_frame_like_lab042: 32 нулевых защитных символа (guard, по 16 с каждой стороны) плюс 10 символов длины корневого приподнятого косинуса (переходный хвост фильтра, режим full). Это учётная величина, а не дефект сигнала; форма не менялась. Тот же механизм даёт 1 399 200 отсчётов в Lab044.
Программный шлюз перед эфиром: quick_gate PASS, pytest 417 passed, git diff --check чист. Обе платы видны, серийники соответствуют ролям.
Выполнен ровно один аппаратный прогон python experiments/lab045_hackrf_bpsk_fec.py --hardware --i-understand-hardware. RF TX count = 1, без повторов. Рабочая точка Lab043/Lab044 без изменений: RF 1080 МГц, 8 MS/s, BPSK 20 ксимв/с, digital carrier +50 кГц, TX VGA 10 дБ, RX LNA/VGA 24/24 дБ, RF amp и bias OFF. Общий опорник: MASTER reg29 = 0x26, SLAVE reg29 = 0x26, SLAVE CLKIN = DETECTED (за 2 опроса, 141,8 мс). RX стартовал до TX; логи TX/RX чистые: 0 overruns, 0 underruns; clipping 0.
Результат — RESULT A с флагом REAL RF FEC CORRECTION DEMONSTRATED = YES. Канал в этом прогоне оказался существенно шумнее рабочей точки Lab044: SNR всего 2,63 дБ, ошибок преамбулы 39/1280 (3,05 %). Независимый приёмник (детектор преамбулы, timing, CFO, phase/polarity, мажоритарный PHY header) без доступа к переданным данным извлёк мягкие BPSK-значения. Диагностическое сравнение с TX, разрешённое только после независимого CRC-решения, показало 155 ошибок из 4300 кодированных бит (BER 3,60 %) до FEC. После deinterleave и мягкого декодера Витерби: 0 ошибок пакета (0/2144), 0 ошибок payload (0/2048), 0 байтовых ошибок. CRC PASS, protocol header корректен (SYNC 0xAA55, версия 1, тип 2, sequence 44, payload_length 256). Восстановленный 256-байтный произвольный payload побитово точен: SHA-256 rx_payload.bin совпал с tx_payload.bin (cb9d06fe…), rx_packet.bin совпал с tx_packet.bin (ed5a5713…). Это прямое доказательство: при SNR 2,63 дБ незащищённый пакет Lab044 не прошёл бы CRC, а свёрточный код R=1/2 K=7 с мягким Витерби исправил все реальные ошибки эфира.
Артефакты: C:\Users\user\Documents\SDR_Rover_Lab045_raw\20260901_103434_bpsk_fec\. SHA-256 всех реально созданных бинарных файлов вычислены дважды и совпали; фиктивных файлов не создавалось. Cleanup: MASTER/SLAVE CLKOUT OFF (SLAVE CLKIN «no clock signal detected»), зависших hackrf_transfer нет. Пост-RF шлюз повторно пройден: quick_gate PASS, pytest 417 passed, git diff --check чист. Второй TX не выполнялся. Git add/commit/push не выполнялись: результат сначала смотрит ChatGPT.
Следующий этап
Проанализировать первый аппаратный результат Lab045 (в частности, почему SNR упал до 2,63 дБ против 7,19 дБ в Lab044 — вероятно антенна/связь/положение) и по решению ChatGPT определить, что дальше: закрепление рабочей точки, переход к более длинным/структурированным передачам или к сжатому изображению. Ни FEC/QPSK/JPEG/video, ни второй TX в этой сессии не запускаются.
Запись 025
Дата
1 сентября 2026 года
Тема
Lab046: многопакетная передача большого бинарного объекта — только программно, RF TX = 0, аппаратная проверка не проводилась.
Выполнено
Статус: SOFTWARE VALIDATED. RF TX = 0. HARDWARE VALIDATION = NOT PERFORMED. HackRF и hackrf_transfer не запускались; ни JPEG, ни видео, ни QPSK.
Сначала аудит. Установлено, что оба нужных уровня уже есть: protocol/image_fragments даёт семантику фрагмента (object_id, индекс, число фрагментов, общий размер) и fail-closed reassemble_image, а Lab045 даёт кадр целиком (build_transmission_plan, analyze_post_preamble_soft, simulate_soft_channel, диагностика pre/post-FEC). Отдельный модуль формата фрагмента не создавался — переиспользован 12-байтовый заголовок image_fragments (>IHHI). Два уровня строго разделены: уровень 1 (внутри кадра) — свёрточный код R=1/2 K=7 + перемежитель + мягкий Витерби + CRC (Lab045); уровень 2 (объект) — фрагментация/нумерация/сборка. Erasure-код 12+3 GF(256) protocol/packet_erasure_fec НЕ использован и НЕ изменён (остаётся будущим расширением для потери целых фрагментов, а не для битовых ошибок).
Минимальный новый слой в experiments/lab046_bpsk_object_transport.py: упаковка фрагмента в 256-байтную нагрузку Lab045 (FRAGMENT_DATA_SIZE = 256 − 12 = 244) с обрезкой добивки на приёме по длине из полей заголовка (expected_fragment_data_length) и fail-closed ObjectAssembler (offer возвращает accepted/duplicate/conflicting/rejected, никогда не бросает). Приёмник без оракула: TX-объект/TX-биты не используются для приёма, FEC, метаданных и решения о завершении; сравнение с оригиналом — только в диагностике после независимого CRC и независимой сборки. При недостающем/повреждённом фрагменте OBJECT COMPLETE = NO и recovered_object = None, фиктивный объект не создаётся. original_size проверяется на обе границы, чтобы поле не управляло размером аллокаций.
Детерминированный объект 16384 байта (16 KiB, не JPEG; numpy default_rng(seed=46)), SHA-256 748013b5…3408d515; в Git не добавлялся. Разбит на 68 фрагментов, последний короткий (36 байт данных). Метрики (идеальный канал): протокольный пакет 268 байт, 68 BPSK-кадров, 389 232 информационных символа (5724 × 68), 156 835 200 отсчётов формы (2 306 400 × 68), эфирное время 19,60 с, полезный goodput 835,7 байт/с = 6,69 кбит/с (≈0,337 полезного бита на символ). Накладные расходы: фрагментация 12 байт/пакет (816 байт), протокольный header+CRC 12 байт/пакет (816 байт), свёрточный код R=1/2, PHY преамбула+header 1424 бита/кадр, guard/ФРК 42 символо-времени/кадр, добивка последнего фрагмента 208 байт.
Шесть программных сценариев (seed фиксирован): A идеальный — объект точен (CRC 68/0, sha совпал, 0 байт-ошибок); B распределённые битовые ошибки — честный гауссов шум sigma=0.40 даёт 1805 сырых ошибок кодированных бит до FEC, post-FEC 0, все 68 CRC PASS, объект побитово точен (уровень sigma выбран так, чтобы мягкий Витерби исправлял все кадры; при sigma≥0.45 отдельный кадр не декодируется и без erasure-FEC объект неполон — это по сути сценарий E, а не подгон); C приём в обратном порядке — объект точен; D дубликаты кадров — учтены, объект точен; E потерян кадр 1 — OBJECT COMPLETE = NO, кадр 1 в missing, recovered SHA = None; F повреждён кадр 0 (инверсия coded-потока) — CRC FAIL, объекта нет.
Новый набор tests/test_lab046_bpsk_object_transport.py (фрагмент туда-обратно, короткий последний фрагмент, чужой object_id, невозможный индекс, несогласованный счётчик, усечённые и абсурдные метаданные без крупной аллокации, полный тракт PHY A–F, отсутствие оракула, детерминизм/SHA). Один тест на верхнюю границу original_size выявил реальный пробел в expected_fragment_data_length (проверялась только нижняя граница) — добавлена проверка original_size ≤ fragment_count·244. Документация: docs/lab046_current_state.md.
Software gate: quick_gate PASS (438 тестов ядра, 6 функциональных проверок лабораторий выполнено, 13 штатно пропущено); pytest tests/ -q 438 passed, 0 failed, 0 errors, 0 skipped. Единственное предупреждение связано с отсутствием прав на создание .pytest_cache и на результат тестов не повлияло. git diff --check чист. Git add/commit/push до финальной проверки не выполнялись.
Следующий этап
По решению ChatGPT после анализа Lab046: либо оптимизация накладных расходов серии кадров (преамбула/guard на кадр доминируют в goodput), либо подключение erasure-кода 12+3 для восстановления потери целых фрагментов поверх уже готового bit-level FEC, либо аппаратный прогон многопакетной передачи. RF, QPSK, JPEG и видео в этой сессии не запускались.
Запись 026
Дата
1 сентября 2026 года
Тема
Lab046A: continuous multi-frame receive для 16 KiB объекта в одном soft-stream - только программно, RF TX = 0, аппаратная проверка не проводилась.
Выполнено
Статус: CONTINUOUS STREAM VALIDATION = PASS (NORMALIZED SOFT-SYMBOL LEVEL). CONTINUOUS SAMPLE/IQ VALIDATION = NOT PERFORMED. RF TX = 0. HARDWARE VALIDATION = NOT PERFORMED. HackRF, hackrf_transfer, RF RX/TX, QPSK, JPEG и видео не запускались.
Проведён аудит Lab043-Lab046. Установлено, что предыдущий Lab046 уже собирал 16 KiB объект из 68 Lab045 кадров, но делал это по отдельным кадрам из TX-плана и не доказывал поиск нескольких кадров в одном continuous receive stream. Добавлен Lab046A слой в experiments/lab046_bpsk_object_transport.py: приёмник получает только один float32 normalized soft-symbol stream, самостоятельно ищет PRBS7 candidates, fail-closed декодирует защищённый PHY header, вычисляет длину coded body только из принятого header, запускает существующие Lab045 FEC/CRC и передаёт fragment в ObjectAssembler.
TX offsets, список длин кадров, ожидаемое число 68, порядок/индексы TX, исходный объект, TX packets и coded bits scanner-у не передаются. TX-side frame_starts остаётся только в генераторе stream и используется тестами только для постфактум-сравнения после независимого receive. Scanner fail-closed: rejected candidate не останавливает поиск; cursor монотонен; MAX_FRAMES и MAX_SEARCH_ITERATIONS дают явную причину остановки.
Verifier read-only нашёл реальный дефект первого варианта: глобальный non-maximum suppression мог удалить настоящий старт кадра, если перед ним был более сильный ложный PRBS7 peak. Исправление: список candidates теперь содержит все позиции выше порога в порядке stream; повторный decode уже принятого кадра предотвращается только монотонным cursor после accepted frame. Добавлен регрессионный тест test_stronger_false_peak_does_not_delete_overlapping_later_frame.
Фактические continuous-сценарии для детерминированного объекта 16384 байта, SHA-256 748013b5f670c82bd52650be5454555355dbd8528538753df4558f1c3408d515: ideal continuous - candidates 68, valid headers 68, FEC PASS 68, CRC PASS 68/68, fragments 68, complete=True, SHA совпал, 0 байт-ошибок; background до/между/после 37/37/43 soft-символа - valid frames 68, SHA совпал; noisy continuous sigma=0.40 seed=46001 - pre-FEC 1791, post-FEC 0, CRC 68/0, complete=True, SHA совпал; malformed preamble + bad protected header - candidates 71, rejected 3, последующие valid frames 68, complete=True, SHA совпал.
Учёт: 68 фрагментов, 389 232 soft-symbols, 156 835 200 эквивалентных waveform samples, baseline airtime 19,604400 с при 8 MS/s, useful goodput 6,685846 кбит/с. Основной soft stream занимает 1 556 928 байт; correlation scores 1 551 812 байт; cumulative-energy 3 113 864 байта. Полный continuous complex64 IQ stream не материализуется; при 156 835 200 samples он занял бы около 1,17 GiB до временных копий.
Документация обновлена в docs/lab046_current_state.md. Прямой запуск python experiments/lab046_bpsk_object_transport.py --object-size 300 --sigma 0.4 проверен и работает. Software gate после исправлений: python tools/quick_gate.py PASS, python -m pytest tests/ -q 454 passed, 0 failed, 0 errors, 0 skipped, git diff --check чист. Git add/commit/fetch/pull/push не выполнялись.
Следующий этап
Сначала ChatGPT смотрит Lab046A software result. После отдельного явного разрешения можно выбирать следующий шаг: аппаратная проверка многокадровой передачи, оптимизация накладных расходов серии кадров или erasure-FEC для потери целых фрагментов. RF TX, QPSK, JPEG и video автоматически не запускать.
Запись 027
Дата
1 сентября 2026 года
Тема
Lab046B: программная проверка нескольких полных Lab045-кадров в одном непрерывном сыром IQ-потоке, RF TX = 0, аппаратная проверка не выполнялась.
Выполнено
Статус: ПРОГРАММНАЯ ПРОВЕРКА НЕПРЕРЫВНОГО СЫРОГО IQ-ПОТОКА = PASS. RF TX = 0. АППАРАТНАЯ ПРОВЕРКА = НЕ ВЫПОЛНЯЛАСЬ. HackRF, hackrf_transfer, common-clock операции, RF RX/TX, JPEG, video, QPSK, erasure FEC и ARQ не запускались.
Добавлен software-only эксперимент experiments/lab046b_continuous_iq.py. Пять кадров формируются существующим Lab045: protocol packet, convolutional FEC R=1/2 K=7, interleaver, защищённый PHY header, PRBS7, BPSK, RRC и guards. Они размещаются в одном complex64 IQ stream. Приёмный scan_continuous_iq получает только IQ и известные PHY/FEC параметры; TX offsets, длины waveform, payload, packets и coded bits в его API отсутствуют. TX reference используется лишь в отдельной диагностике после независимого CRC PASS.
Первичный поиск переиспользует PRBS7 reference и normalized correlation Lab043/044, но не применяет глобальный mandatory peak/second gate. Все локальные candidates рассматриваются по положению. Для каждого кандидата локально переиспользуются refine start, matched filter, preamble-only timing, CFO, phase/polarity и normalized.real; затем Lab045 выполняет header-driven deinterleave, soft Viterbi и CRC. Cursor монотонен, accepted frame повторно не декодируется, rejected candidate не останавливает поиск, MAX_FRAMES и MAX_SEARCH_ITERATIONS ограничивают работу.
Фактический идеальный stream: 5 waveform, leading 137 samples, gaps 211/353/587/809, trailing 233; всего 11 534 330 complex64 samples = 92 274 640 bytes (88.0 MiB). PRBS7 candidates 32, processed 5, accepted 5, rejected 0, PHY header PASS 5, FEC PASS 5, CRC 5/0. Все обнаруженные sample offsets совпали с TX при постфактум-сравнении; sampling phase modulo 400 = 137/348/301/88/97. Peak/second настоящих кадров около 0 dB, что воспроизводимо показывает непригодность старого глобального критерия для многокадрового решения.
Сценарий CFO/phase/amplitude: внесено 0.2 Hz, 0.7 rad и scale 0.65 без передачи этих истинных значений scanner-у. Медианная независимая оценка 0.200003768 Hz и 0.699634288 rad, полярность восстановлена по PRBS7, CRC 5/0. Комплексный AWGN: seed 46002, финальная sigma=0.17, accepted 5, pre-FEC 0, post-FEC 0, CRC 5/0. Начальная разумная sigma=0.12 также дала 0 pre-FEC ошибок; после одной разрешённой корректировки дальнейшего подбора не было. Результат шума фиксируется честно как успешный IQ receive без нового события FEC correction.
Ложный IQ-кандидат содержит настоящую PRBS7 waveform и неверный protected PHY magic. Получено candidates 11, processed 8, rejected 7; поиск продолжился и следующий настоящий кадр прошёл PHY/FEC/CRC. Добавлены 14 тестов: два и пять реальных IQ-кадров, arbitrary/non-grid start, разные gaps, ровно один приём кадра, tail background/noise, malformed candidate, продолжение поиска, отсутствие TX-oracle API, CFO/phase, deterministic complex noise, monotonic cursor, оба safety limits и регрессия нескольких сильных настоящих пиков.
Независимый read-only verifier подтвердил тракт, отсутствие TX oracle, multi-peak решение, ложный кандидат, численные CFO/phase и размер основного массива; 88.0 MiB относится именно к main IQ array, не к полному peak RSS с FFT/RRC workspace. Software gate: python tools/quick_gate.py PASS (468 тестов, 7 функциональных лаб, 13 штатно пропущено); python -m pytest tests/ -q = 468 passed; git diff --check чист, кроме информационных LF/CRLF notices. Документация обновлена в docs/lab046_current_state.md. Git add/commit/push не выполнялись.
Следующий этап
Сначала ChatGPT анализирует Lab046B. Аппаратную Lab046, JPEG, video, QPSK, 12+3 erasure FEC, ARQ и адаптивную модуляцию автоматически не начинать.
Запись 028
Дата
1 сентября 2026 года
Тема
Подготовка одного непрерывного аппаратного BPSK-сеанса Lab046C без RF-передачи.
Выполнено
Проведён аудит фактических Lab043--Lab046B. Новый радиопротокол не создавался:
Lab046C переиспользует общий clock-gate и однократный TX guard Lab043--Lab045,
физический FEC/CRC-кадр Lab045, фрагментацию и ObjectAssembler Lab046,
локальный многокадровый IQ-поиск Lab046B.
Подготовлен experiments/lab046c_hackrf_bpsk_object.py. Он создаёт новый
криптографически случайный объект 16384 байта, последовательно формирует один
cs8-файл из 68 waveform без искусственных gaps и фиксирует SHA-256. Расчёт по
фактическому коду: 2 306 400 samples на кадр, 156 835 200 samples и
313 670 400 bytes всего, 19,6044 с при 8 MS/s.
Будущий приём запланирован на 24,0 с: 192 000 000 cs8 samples и
384 000 000 bytes. Файл читается через memmap окнами в complex64; RX API не
принимает TX offsets, длины waveform, ожидаемые 68 фрагментов, TX packets,
coded bits или объект. Завершённость определяется только принятыми метаданными
и ObjectAssembler после CRC.
Аппаратная последовательность fail-closed: фиксированные MASTER/SLAVE serial,
common-clock gate, RX раньше TX, ровно один вызов guard перед одним TX process,
cleanup CLKOUT/processes в finally, без retry. Отдельный --preflight-only
не может выполнить TX. Реальный аппаратный Lab046C не запускался, RF TX = 0.
Фактически создан внешний каталог
C:\Users\user\Documents\SDR_Rover_Lab046_raw\20260901_145339_bpsk_object.
SHA-256 нового tx_object.bin:
f7568a5d1a6dc5dd907fa1e971a171578315de740bd6788136f447e409fc6bf8.
SHA-256 единого tx_stream.cs8:
8941eb231f1f2f99cde51f3cc5426472dbedf1a61675543e7774faec4b935f5e.
Quick gate прошёл 482 теста и 8 функциональных лаб, полный pytest дал
482 passed. Безопасный common-clock preflight без RF TX подтвердил MASTER и
SLAVE reg29 0x26, точный SLAVE CLKIN DETECTED за 141,51 мс; cleanup
выключил CLKOUT обеих плат, оставшихся hackrf_transfer нет. RF TX count = 0.
Следующий этап: после успешных software gates и безопасного common-clock preflight остановиться и запросить точную отдельную авторизацию на один непрерывный RF TX Lab046C; без неё передачу не выполнять.
Запись 029
Дата
1 сентября 2026 года
Тема
Первый непрерывный аппаратный опыт Lab046C: официальный RESULT C.
Выполнено
После отдельной точной авторизации выполнен ровно один непрерывный RF TX
Lab046C без повтора. Передан единый tx_stream.cs8: 68 полных Lab045 waveform,
156 835 200 complex samples, 313 670 400 bytes, 19,6044 с при 8 MS/s. MASTER/TX
000000000000000097c063dc323b97d3, SLAVE/RX
000000000000000097c063dc2e5327d3, RF 1080 МГц, TX VGA 10 дБ, RX LNA/VGA
24/24 дБ, RF amp и bias OFF.
Common-clock gate прошёл: MASTER reg29 0x26, SLAVE CLKIN DETECTED, SLAVE
reg29 0x26. Фактический TX длился 19,60632 с и полностью находился внутри RX
capture 24,00386 с. TX underruns 0, RX overruns 0; cleanup выключил CLKOUT обеих
плат и не оставил процессов hackrf_transfer. RF TX COUNT = 1.
Независимый многокадровый приёмник не использовал TX offsets, packets, coded
bits, ожидаемые 68 фрагментов или исходный объект. Его официальный результат:
LAB046C HARDWARE RESULT = C, PREAMBLE CANDIDATES = 0, VALID FRAMES = 0,
PHY HEADER PASS = 0, CRC PASS = 0, OBJECT COMPLETE = NO. Восстановленный
объект не создавался. Рабочий порог PRBS7 оставался 0.65, независимый максимум
равен 0.126562; detector, gain, PHY, FEC и Витерби после опыта не менялись.
TX-файл независимо проверен: SHA-256
8941eb231f1f2f99cde51f3cc5426472dbedf1a61675543e7774faec4b935f5e, RMS
44,002775 code (-9,274598 dBFS), peak 70,405966 code, BPSK около +50 кГц.
Первый, средний и последний кадры проходят PRBS7, PHY header, FEC и CRC прямо
из файла; амплитуда практически идентична успешному Lab045. Дефект TX-файла
или runner, объясняющий RESULT C, не найден.
Только после фиксации независимого RESULT C выполнена read-only диагностика с
TX reference. Обнаружены следы 68/68 waveform с точным периодом 2 306 400
samples: aligned min/median/max 0.065784/0.089991/0.122379, смещённый контроль
median/max 0.004275/0.010075, медианное преимущество 26,46 дБ. Все 68 aligned
значений выше максимума контроля. Это доказывает слабое присутствие TX в RX,
но не меняет официальный исход: POST-RUN TX-REFERENCE DIAGNOSTIC = 68/68
WAVEFORM TRACES DETECTED; OFFICIAL RESULT CHANGED = NO. OBJECT TRANSPORT PASS
и LAB046C COMPLETE SUCCESS не заявляются.
Перед фиксацией результата повторно пройдены software gates: python tools/quick_gate.py PASS, python -m pytest tests/ -q = 482 passed,
git diff --check чист, кроме информационных LF/CRLF notices.
Следующий этап определяется отдельной постановкой после анализа RESULT C; повторный RF TX, изменение PRBS7 threshold, gain или detector автоматически не разрешены.
Запись 030
Дата
1 сентября 2026 года
Тема
Lab046C: автономная слабосигнальная обработка исходного RX capture, offline результат FAIL без нового RF.
Выполнено
Исходный аппаратный результат сохранён без изменения: ORIGINAL LAB046C HARDWARE RESULT = C, RF TX COUNT = 1, ORIGINAL HARDWARE RESULT CHANGED = NO. HackRF не запускался, RF TX в этом этапе равен 0, второй аппаратный или offline независимый прогон не выполнялся.
Добавлен отдельный experiments/lab046c_offline_recovery.py. Исторический
Lab046B threshold 0.65 и поведение Lab045 не менялись. Новый первый каскад
зафиксирован до полного прогона только по фону первых 0,5 с: 99,9-й процентиль
локальных PRBS7-максимумов, threshold 0.025011632591485977, median
0.00838765874505043, MAD 0.003039387986063957, 5193 peaks, 6 candidates,
12,0 candidates/s. На независимом контрольном фоне 21--24 с уже фиксированное
правило дало 35501 peak, 301 candidate, 100,333333 candidates/s; после этого
порог не изменялся.
Выполнен ровно один полный independent pass сохранённых 192 000 000 cs8
samples. API не получал TX stream/object, offsets, ожидаемые 68, fragment order,
packets или coded bits. Coarse stage: 291446 local peaks и 3025 candidates.
Strict stage обработал все 3025: refinement/timing/carrier PASS 3025,
PHY HEADER PASS 0, PHY HEADER FAIL 3025 (MAGIC_MISMATCH), FEC attempts 0,
CRC 0/0, valid frames 0. VALID FRAGMENTS = 0, OBJECT COMPLETE = NO,
recovered_object.bin не создан. OFFLINE REPROCESSING OF ORIGINAL RX CAPTURE
= FAIL; OBJECT RECOVERED = NO.
Только после независимого verdict выполнена TX-reference диагностика. Все 68
реальных стартов имели candidate в пределах +-40 samples; корреляция
min/median/max 0.059379209/0.088661019/0.126557365, все выше фиксированного
threshold. Однако preamble errors min/median/max 341/430/554 из 1280,
PHY-header errors 30/54/81 из 144, SNR
-19.282130/-12.829480/-9.195846 dB. Все 68 диагностических заголовков дали
MAGIC_MISMATCH. FALSE CRC PASS = 0, independently valid frames matching TX =
0, missed TX frames = 68. Ни один пропущенный кадр не добавлялся обратно в
ObjectAssembler.
Производительность: background calibration 0,269617 с, control 1,031204 с, coarse search 7,721316 с, strict processing 836,340048 с, среднее 0,276476 с на кандидат, полный прогон 845,427589 с, то есть 35,226150 длительности 24-секундного capture. RX использован как memmap, coarse block 16 000 000 complex64 samples; консервативная оценка временной памяти 1 545 705 764 байта, strict local window не более 594400 samples / 4 755 200 байт. Полный complex64 capture в память не загружался.
Добавлены 24 теста statistical calibration/control, deterministic weak PRBS7, CRC-only acceptance, ошибок magic/version/checksum/length, FEC/CRC fail, block-boundary ownership, monotonic cursor, safety limits, отсутствия TX oracle и регрессии Lab045/Lab046B. До полного прогона verifier нашёл и помог закрыть fail-open status safety-limit и заниженную оценку памяти; повторная проверка дала чистый pre-run verdict.
Финальный software gate после фиксации offline FAIL: python tools/quick_gate.py PASS, 506 проверок и 9 функциональных лабораторий;
python -m pytest tests/ -q = 506 passed. Предупреждение .pytest_cache не
повлияло на результат. git diff --check чист, кроме информационных LF/CRLF
notices. Финальный read-only verifier независимо сверил JSON, документацию,
68/68 post-verdict mapping, счётчики, времена и память; научных расхождений не
найдено.
Следующий этап
Сначала анализируется честный offline FAIL. Порог этого independent pass не менять задним числом и второй улучшенный pass автоматически не запускать. Повторный RF TX, gain ladder, JPEG, video, QPSK, erasure FEC и ARQ без новой отдельной постановки запрещены.
Запись 031
Дата
2 сентября 2026 года
Тема
Lab046C: независимая повторная обработка короткой записи 1400 МГц с отдельным статистическим допуском кандидатов, без нового RF.
Выполнено
Использована сохранённая запись
20260901_172749_1400MHz/rx_1400mhz.cs8: 19 200 000 комплексных отсчётов cs8,
2,4 с при 8 МГц, SHA-256
06ab0867865bca462a21c42c9f3bc7e519e336108f7b5e98e7b283f842387a99.
HackRF не запускался, RF TX = 0. Исторический порог
IQ_PREAMBLE_THRESHOLD = 0.65, Lab045, FEC и PHY не изменялись. Исходный
аппаратный CONTROL RESULT = C сохранён без переписывания.
До полного независимого декодирования зафиксировано отдельное правило первого
каскада только по фону до передачи 0,00 ... 0,50 с:
pre-TX local-peak Q99.9 + 4 * local-peak MAD. Q99.9 равен
0.022788675501942635, MAD равен 0.0027075146790593863, итоговый порог равен
0.03361873421818018. На независимом контрольном фоне после передачи
1,60 ... 2,40 с максимум равен 0.02711654081940651, кандидатов 0. Порог
после просмотра результата не менялся.
Перед полным проходом независимая проверка выявила небезопасную при отказе ошибку общей точки
приёма: противоречивый результат accepted=True, CRC_FAIL мог увеличить
VALID_FRAMES. Добавлена обязательная повторная проверка CRC PASS; сценарий
после исправления даёт VALID_FRAMES = 0. Независимая повторная проверка
признала исправление чистым.
Выполнен ровно один полный проход всей записи без смещений TX, ожидаемого числа
кадров, сигнала TX, пакетов, полезной нагрузки и кодированных битов. Получено
29 205 локальных максимумов и 1 279 кандидатов первого каскада. Строгий каскад
обработал 28 кандидатов: PHY-заголовок PASS/FAIL 3/25, FEC attempts/PASS/FAIL
3/3/0, CRC PASS/FAIL 3/0, VALID FRAMES = 3. Поиск завершился по концу
записи и списка кандидатов; ограничения безопасности не сработали.
Независимый результат записан до открытия опорных данных передатчика. Только
после этого три действительных кадра сопоставлены с тремя переданными:
пропущено 0, FALSE CRC PASS = 0, ошибки положения 0/-1/+2 отсчёта. Ошибки
до FEC составили 17 + 19 + 29 = 65 бит, после FEC 0 бит, в полезной нагрузке
0 байт и 0 бит. Независимая проверка готовых JSON и трёх пар полезной
нагрузки/пакета
расхождений не выявила. 1400 MHz OFFLINE REPROCESSING = PASS,
RF PATH ASSESSMENT = HEALTHY.
Итоговый программный шлюз перед полным проходом: python tools/quick_gate.py
код 0 и 512 проверок; python -m pytest tests/ -q = 512 passed;
git diff --check код 0 с информационными уведомлениями LF/CRLF. Git add,
commit и push не выполнялись.
Подробный отчёт и машинно-читаемые результаты сохранены в
docs/lab046c_1400mhz_offline_reprocessing.md и
data/processed/lab046c_1400mhz_offline/.
Следующий этап
STOP. Новый RF, повтор Lab046C, изменение порога, JPEG, QPSK и изменение FEC без отдельной постановки запрещены.
Запись 032
Дата
2 сентября 2026 года
Тема
Lab046C: успешная полная передача объекта 16384 байта через аппаратный радиоканал 1400 МГц, RESULT A.
Выполнено
После отдельной точной авторизации выполнен один непрерывный процесс передачи
без повтора. Новый криптографически случайный объект 16384 байта разбит
существующей архитектурой Lab046 на 68 фрагментов и передан 68
последовательными защищёнными BPSK-кадрами. RF равна 1400 МГц, частота
дискретизации 8 МГц, символьная скорость 20 ксимв/с, цифровое смещение несущей
+50 кГц. Усиления сохранены: TX VGA 10 дБ, RX LNA/VGA 24/24 дБ, RF amplifier
и Bias-Tee выключены. MASTER reg29 0x26, SLAVE CLKIN DETECTED, SLAVE reg29
0x26; общий опорный генератор прошёл проверку.
Поток передачи содержит 156 835 200 комплексных отсчётов, 313 670 400 байт и
19,6044 с сигнала. Приём содержит 192 000 000 комплексных отсчётов,
384 000 000 байт и 24,0 с сигнала. Приём начался на 0,7525116 с раньше
передачи и закончился на 3,6341200 с позже. RX overruns 0, TX underruns 0,
clipping 0, near limit 0. После опыта оба CLKOUT выключены, оставшихся
процессов hackrf_transfer нет.
До полного декодирования по фону до передачи зафиксирован порог первого
каскада Q99.9 + 4 * MAD: Q99.9 0.023181289434432983, MAD
0.0025865877978503704, threshold 0.033527640625834465. На независимом фоне
после передачи maximum 0.030997175723314285, кандидатов 0. Порог после
начала декодирования не менялся. Исторический строгий
IQ_PREAMBLE_THRESHOLD = 0.65, Lab045, PHY и FEC не менялись.
Независимый приёмник обработал весь 24-секундный файл без смещений и периода
кадров передатчика, ожидаемого числа 68, пакетов, кодированных битов и
исходного объекта. Получено 295469 локальных максимумов, 35009 кандидатов
первого каскада и 95 обработанных неперекрывающихся гипотез. PHY-заголовок
PASS/FAIL 68/27, FEC attempts/PASS/FAIL 68/68/0, CRC PASS/FAIL 68/0,
действительных кадров 68. Поиск завершился по концу записи и списка
кандидатов, а не по известному количеству кадров.
До открытия опорных данных передатчика ObjectAssembler независимо принял 68
уникальных фрагментов без дубликатов, конфликтов и пропусков: OBJECT
COMPLETE = YES. Только после фиксации этого вердикта выполнено сравнение с
передатчиком. Совпали 68/68 кадров, пропущено 0, ложных CRC PASS 0. До FEC
обнаружено 787 ошибок кодированных бит, после FEC 0 ошибок протокольных бит.
Восстановленный объект имеет 16384 байта, 0 ошибочных байт и 0 ошибочных бит.
SHA-256 исходного и восстановленного объектов совпадает:
b5a27caaa3f03dfc468e71a857a06f18cf0259ca6ea21d3c42ccfde7168d1dfe.
SNR min/median/max для 68 кадров равен 8.302870/8.909278/9.837726 дБ, ошибки
преамбулы 0/3/9 из 1280, CFO
-0.214661/0.016493/0.281551 Гц. Медианный SNR по третям сеанса снижался
9.29 -> 8.86 -> 8.57 дБ, но потерь кадров и CRC FAIL не было. Итог:
LAB046C HARDWARE RESULT = A; FULL RF OBJECT TRANSPORT = PASS; 68/68 FRAMES;
OBJECT COMPLETE = YES; SHA MATCH = YES; OBJECT BYTE ERRORS = 0.
Большие сформированные артефакты оставлены вне Git в
C:\Users\user\Documents\SDR_Rover_Lab046_raw\20260902_151819_1400MHz_full.
Независимый проверяющий только чтением сверил аппаратные и независимые JSON,
арифметику порога, счётчики, размеры, SHA-256, побайтовое совпадение объектов,
временное покрытие RX над TX и очистку; расхождений не найдено. После опыта
python tools/quick_gate.py прошёл, python -m pytest tests/ -q дал 512
passed и 0 failed, git diff --check прошёл.
Следующий этап
STOP. Новый RF, JPEG, видео, QPSK, 180 МГц и FEC 12+3 без отдельной постановки не начинать.
Запись 033
Дата
2 сентября 2026 года
Тема
Lab047: программная подготовка первой передачи настоящего JPEG через существующий транспорт Lab046.
Выполнено
Проведён аудит protocol/image_fragments.py и Lab046-Lab046C. Подтверждено,
что транспорт принимает произвольный непустой двоичный объект, а размер 16384
байта был только параметром прежнего опыта. JPEG можно передавать без изменения
протокола, Lab045, FEC и физического уровня; эти части не изменялись.
Для демонстрации выбрана существующая настоящая фотография
data/raw/lab011_scene.jpg. Исходный файл сохранён без изменений. По одной
фиксированной процедуре подготовлен JPEG RGB 320 x 240: LANCZOS, quality 35,
4:2:0, без optimize и progressive. Получено 8724 байта и SHA-256
e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a.
Файл распознаётся Pillow как полный JPEG.
Выполнен программный сквозной проход через фрагментацию Lab046, 36 защищённых
кадров Lab045, идеальный BPSK-канал, PHY/FEC/CRC и независимую сборку объекта.
Получено 36 CRC PASS, 0 CRC FAIL, принято 36 фрагментов, пропущено 0,
OBJECT COMPLETE = YES. Восстановленный recovered_image.jpg имеет 8724
байта, совпадающую SHA-256, 0 ошибочных байтов и 0 ошибочных битов. Pillow
декодирует восстановленный JPEG как RGB 320 x 240.
По фактическому размеру рассчитан будущий поток: 36 кадров, 83 030 400
комплексных отсчётов, 166 060 800 байт cs8, 10,3788 с и 6724,48 бит/с
полезных данных. RX запланирован на 15,0 с: 120 000 000 отсчётов и 240 000 000
байт, начало на 0,75 с раньше TX.
Подготовлен отдельный аппаратный исполнитель с фиксированными параметрами
успешной точки Lab046C: 1400 МГц, 8 МГц, BPSK 20 ксимв/с, 400 отсчётов на
символ, +50 кГц, TX VGA 10 дБ, RX LNA/VGA 24/24 дБ, усилители и Bias-Tee
выключены, MASTER и SLAVE закреплены по серийным номерам. Аппаратный режим
закрыт тремя явными ключами и отдельным параметром разрешения функции,
запрещает автоматический повтор и использует проверку общей опоры с reg29
0x26.
Для будущей новой RX-записи подготовлена динамическая калибровка первого каскада только по фону до передачи: Q99.9 локальных максимумов плюс 4 MAD. Порог фиксируется до полного декодирования; фон после передачи остаётся независимой контрольной выборкой. Строгий каскад PHY/FEC/CRC и исторический порог 0.65 не изменены. Интерфейс независимого приёмника не принимает TX offsets, ожидаемое число кадров, индексы TX-фрагментов, исходный JPEG, пакеты или кодированные биты. TX reference разрешён отдельной диагностической функции только после сохранённого полного независимого вердикта.
Созданы малые демонстрационные артефакты в data/processed/lab047: переданный
и восстановленный JPEG, JSON и краткий текстовый результат. Большие потоки
cs8, сырые IQ и аппаратные данные не создавались. HackRF не запускался,
RF TX = 0. python tools/quick_gate.py прошёл с 524 проверками pytest и 10
быстрыми функциональными проверками лабораторных; полный запуск
python -m pytest tests/ -q дал 524 passed и 0 failed; git diff --check
прошёл. Git add, commit и push не выполнялись.
Следующий этап
STOP. До любой аппаратной операции запросить отдельное новое разрешение на один непрерывный процесс передачи одного JPEG при 1400 МГц. Старое разрешение Lab046C не использовать. Автоматические повторы запрещены.
Запись 034
Дата
3 сентября 2026 года
Тема
Lab047: единственная аппаратная передача JPEG и автономное восстановление
исходной RX-записи после устранения ограничения MAX_CANDIDATES.
Выполнено
После отдельного точного разрешения выполнен один непрерывный RF TX без
повторов при 1400 МГц. Переданы 36 защищённых кадров с JPEG размером 8724
байта. Фактическая длительность TX составила 10,38030 с. RX продолжался
15,00875 с и сохранил 120000000 комплексных отсчётов, или 240000000 байт;
RX overruns 0, TX underruns 0. Общий опорный генератор прошёл проверку.
RF TX COUNT = 1; повтор передачи не выполнялся.
До декодирования по фону до передачи зафиксирован порог первого каскада
Q99.9 + 4 * MAD: Q99.9 0.020810436457395554, MAD
0.002538509201258421, threshold 0.030964473262429237. На независимом
контрольном фоне maximum равен 0.026494961231946945, кандидатов 0. Порог
после аппаратного результата и при автономной обработке не менялся.
Первоначальный независимый приём остановился после 71113 локальных максимумов
и накопления списка из 10000 кандидатов. Сработало
MAX_CANDIDATES_REACHED; строгий каскад PHY/FEC/CRC вообще не запускался.
Исторический результат сохранён без переименования:
ORIGINAL HARDWARE RECEIVE = INCOMPLETE DUE TO MAX_CANDIDATES_REACHED. Это
не PHY FAIL, FEC FAIL, CRC FAIL и не доказательство отказа передачи JPEG.
Аудит lab046c_offline_recovery.py показал, что прежняя двухступенчатая схема
сначала накапливала кандидатов всего файла и при достижении предела передавала
строгому каскаду пустой список. Один кандидат занимает приблизительно 108
байт; основную память использовал 16-миллионный блок IQ. Проверка смещений
выявила ожидаемые боковые максимумы периодической PRBS7-преамбулы, но не
дубликаты на границах блоков.
Реализована последовательная схема: кандидаты каждого блока идут по возрастанию смещения и немедленно проходят строгую проверку. Защитный предел 100000 теперь ограничивает число выполненных строгих проверок и не зависит от числа кадров JPEG. После CRC PASS позиция перескакивает за область принятого кадра; после плохого кандидата продвигается на один отсчёт. Подавляется только точный повтор смещения или кандидат, принадлежащий уже принятому кадру. Произвольный радиус подавления и глобальное отношение первого пика ко второму не применяются. Добавлены проверки для потока более 10000 кандидатов, немедленной обработки, прохождения настоящего кадра среди шума, владения принятым кадром, перекрытий блоков, близкого кандидата после плохого, защитного предела, неизменности порога и отсутствия ожидаемого числа кадров в интерфейсе.
После программного шлюза выполнен ровно один полный автономный проход всей
исходной 15-секундной RX-записи. Смещения и период кадров передатчика,
ожидаемое число кадров, номера TX-фрагментов, исходный JPEG, пакеты и
кодированные биты не использовались. Получено 185828 локальных максимумов,
32414 кандидатов первого каскада и 69 строгих проверок; 32345 кандидатов
пропущены как принадлежащие уже принятому локальному событию, точных повторов
на перекрытиях 0. PHY-заголовок PASS/FAIL 36/33, FEC
attempts/PASS/FAIL 36/36/0, CRC PASS/FAIL 36/0, действительных кадров и
фрагментов 36/36, отсутствующих фрагментов 0. До открытия опорных данных
передатчика получено OBJECT COMPLETE = YES.
Все восемь блоков оценки были исчерпаны, защитные пределы не сработали. Полное время обработки составило 37,42391 с, строгая ступень — 32,459969 с, в среднем 0,470434 с на строгую проверку. Приблизительный максимальный временный объём памяти равен 1545755352 байтам, около 1,44 ГиБ; пиковая память списка кандидатов — 49588 байт.
После единственного полного прохода обнаружена только ошибка учёта признака
завершённости: последнее допустимое начало корреляции было принято за конец
обработанной области IQ, поэтому при исчерпанных восьми блоках поле
completed ошибочно осталось ложным. Полный поиск не повторялся, исходный JSON
с SHA-256 2a16741aa7fd20cfec179a7340300d0884095ab9f781b877230136ea8d249caf
сохранён неизменным. В отдельном исправленном JSON после проверки числа блоков
граница покрытия изменена с 119471220 на 120000000 и completed на true;
full_decoder_rerun = false, threshold_changed = false.
Только после сохранения завершённого независимого вердикта открыты опорные данные передатчика и диагностически повторно расшифрованы 36 уже принятых окон, без второго поиска по capture. Совпали 36/36 кадров, пропущено 0, ложных CRC PASS 0, дубликатов 0. До FEC обнаружено 19 ошибок кодированных бит, после FEC 0 ошибок протокольных бит. В независимый результат кадры не добавлялись.
Восстановленный JPEG имеет 8724 байта, 0 ошибочных байтов и 0 ошибочных бит.
SHA-256 восстановленного и переданного файлов совпадает:
e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a.
Pillow полностью декодирует JPEG как RGB 320 x 240. Итог:
LAB047 OFFLINE RECOVERY OF HARDWARE CAPTURE = PASS. Единственный RF-сеанс
фактически передал JPEG успешно; первоначальный приём не завершился только
из-за вычислительного ограничения MAX_CANDIDATES.
На этапе исправления и автономной обработки HackRF не запускался, RF TX = 0.
python tools/quick_gate.py прошёл с 540 проверками pytest и 10 быстрыми
функциональными проверками лабораторных; python -m pytest tests/ -q дал 540
passed и 0 failed; git diff --check прошёл. Git add, commit, push, pull и
fetch не выполнялись.
Следующий этап
STOP. Разрешение на единственный аппаратный процесс Lab047 израсходовано.
Новый RF, повтор передачи, изменение порога, PHY, FEC, CRC или Lab045 без
отдельной новой постановки не выполнять. RF TX = 0; HackRF не запускать.
Запись 035
Дата
3 сентября 2026 года
Тема
Lab048: профилирование и ускорение автономного приёмника Lab047 до обработки быстрее реального времени.
Выполнено
Работа выполнена только на сохранённой аппаратной RX-записи Lab047
C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747\rx_stream.cs8:
120000000 комплексных отсчётов, 240000000 байт, 15,0 с, SHA-256
8521bf1b574cd1fe4e0a4f980c00c8664f8bb51551a241e46449e1eb2c77e635.
Новый RF не выполнялся, RF TX = 0, HackRF не запускался.
Исходная контрольная точка: полное время 37,423910 с, строгая ступень
32,459969 с, в среднем 0,470434 с на один из 69 строгих кандидатов,
приблизительный пик памяти 1545755352 байта, около 1,44 ГиБ. Результат Lab047:
36/36 кадров, CRC PASS/FAIL 36/0, полный JPEG, точный SHA-256, 0 ошибочных
байтов и битов.
До изменения кода выполнен один полный проход под cProfile. Профилировщик
увеличил время до 45,947287 с, но сохранил 185828 локальных максимумов, 32414
кандидатов первого каскада, 69 строгих проверок, 36 действительных кадров и
точный JPEG. Основные затраты: decode_candidate_from_memmap 40,912 с,
_extract_soft_window 25,697 с, _matched_waveform 21,199 с,
fftconvolve 13,660 с, формирование RRC-коэффициентов 11,885 с и временная
синхронизация 4,140 с. Опорная преамбула формировалась 70 раз,
RRC-коэффициенты — 175 раз. Витерби занял только 0,875 с на 36 кадров,
CFO/фаза 0,054 с, PHY-заголовок 0,006 с; эти части не оптимизировались.
Реализованы ограниченные вычислительные оптимизации без изменения научных
критериев: кэшированы неизменяемые опорная PRBS7-преамбула и RRC-коэффициенты;
полная линейная RRC-свёртка переведена с fftconvolve на математически
эквивалентный overlap-add; кэшированы не более четырёх векторов переноса
несущей; рабочие массивы согласованного фильтра переведены с complex128 на
complex64, коэффициенты — на float32; те же 1601 преамбульные оценки
timing считаются группами по 400 фазам без второго одинакового набора оценок.
Прямое сравнение старого и нового согласованного фильтра ограничивает
абсолютное расхождение величиной 2e-6 и относительное к пику величиной
5e-7. Максимальное измеренное абсолютное расхождение равно 1,263e-6.
Отдельные тесты подтверждают точность и неизменяемость кэшей, ограниченный
размер кэша, тот же timing offset и отсутствие TX/expected-frame параметров у
независимого API. Связанные тесты дали 169 passed.
После программного шлюза выполнен один итоговый полный проход той же записи. Первый вызов нового командного файла остановился до импорта проекта из-за отсутствующего загрузочного пути; RX не открывался и файл-свидетель не был создан. После исправления загрузочного блока выполнен ровно один фактический полный проход без автоматического повтора.
Итоговое время равно 13,966058 с: грубый поиск 4,776677 с, строгая ступень
9,171629 с, средняя строгая проверка 0,132922 с. Ускорение полного прохода
2,679633 раза, отношение времени обработки к 15,0 с эфира 0,931071:
REAL-TIME CAPABLE = YES. Сохранены все исходные счётчики: 185828 локальных
максимумов, 32414 кандидатов первого каскада, 69 строгих проверок, 32345
пропущенных максимумов внутри принятых областей и 0 точных дубликатов.
PHY-заголовок PASS/FAIL 36/33, FEC attempts/PASS/FAIL 36/36/0, CRC
PASS/FAIL 36/0, действительных кадров и фрагментов 36/36, отсутствующих
фрагментов 0, OBJECT COMPLETE = YES.
Независимый приёмник не получал ожидаемого числа кадров, TX offsets, номеров
TX-фрагментов, переданного JPEG, пакетов или кодированных битов. Только после
завершённого независимого вердикта подтверждены 36/36 переданных кадров, 19
ошибок кодированных бит до FEC, 0 ошибок после FEC и 0 ложных CRC PASS.
Восстановленный JPEG имеет 8724 байта, RGB 320 x 240, декодируется Pillow и
имеет тот же SHA-256
e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a;
ошибочных байтов 0, ошибочных битов 0.
После оптимизации крупнейшее верхнеуровневое узкое место — грубый поиск, 4,776677 с. В строгой ступени согласованный фильтр занимает 3,282575 с, уточнение начала 3,121533 с, timing 1,270783 с, Витерби 0,627109 с. Пиковая оценка памяти осталась около 1,44 ГиБ, потому что её определяет неизменённый 16-миллионный блок грубого поиска; уменьшение блока не выполнялось, чтобы не изменять границы и результат детектора.
Созданы experiments/lab048_receiver_performance.py,
tests/test_lab048_receiver_performance.py, docs/lab048_current_state.md и
малые артефакты в data/processed/lab048. Изменены только вычислительные
примитивы в experiments/lab043_hackrf_bpsk.py,
experiments/lab044_hackrf_bpsk_packet.py и
experiments/lab046b_continuous_iq.py, а также этот журнал и указатель
лабораторных. До итогового прохода python tools/quick_gate.py прошёл с 547
тестами и 11 функциональными проверками; python -m pytest tests/ -q дал 547
passed и 0 failed; git diff --check прошёл.
Следующий этап
STOP. Не переходить к Lab049, видео, QPSK, повышению символьной скорости или
новому RF-сеансу без отдельной постановки. RF TX = 0; HackRF не запускать.
Запись 036
Дата
3 сентября 2026 года
Тема
Lab049: программное повышение символьной скорости BPSK с сохранением приоритета управления.
Выполнено
До изменения кода проверены Lab047--Lab048, зависимости PHY и решения
Lab033--Lab041. Подтверждено, что новый планировщик не нужен:
protocol/priority_scheduler.py уже задаёт непрерываемое обслуживание с
порядком EMERGENCY > CONTROL > TELEMETRY > VIDEO, а LATEST_STATE заменяет
устаревшие ожидающие состояния CONTROL и TELEMETRY. Политики Lab034--Lab036
сохраняют целостность видеокадров и допускают служебный трафик между пакетами.
Реализован отдельный программный параметрический адаптер Lab049, не меняющий
доказанный аппаратный тракт Lab047. При Fs = 8 Мвыб/с проверены 20, 50, 100
и дополнительный режим 200 ксимв/с, то есть ровно 400, 160, 80 и 40
выборок/символ. Режим 20 ксимв/с побайтно воспроизводит прежнюю CS8-форму
Lab045. BPSK, PRBS7, PHY-заголовок, свёрточный FEC R=1/2, K=7, 171/133 octal, перемежитель, CRC, packet format и fragment format не изменялись.
Во всех режимах использован сохранённый JPEG Lab047: 8724 байта, RGB
320 x 240, SHA-256
e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a,
36 физических кадров. Каждый режим прошёл полный frame-aligned IQ-тракт от
фрагментации и BPSK/RRC до независимого восстановления PHY-длины, FEC, CRC и
сборки объекта. Приёмник кадра не получает TX bits, payload, packet или
ожидаемое число кадров; диагностическое сравнение выполняется после CRC.
До полного прогона для всех скоростей одинаково зафиксирован шум
coded-bit Eb/N0 = 7,0 dB, семена 49000 + frame_index. Sigma вычисляется
из фактической энергии кодированного BPSK-бита, поэтому корректно меняется с
samples/symbol и не подбирается по результату режима.
Идеальный и шумный каналы восстановили 36/36 кадров и точный JPEG во всех
четырёх режимах. В шумном канале получено 129/114/107/110 ошибок кодированных
бит до FEC для 20/50/100/200 ксимв/с; после FEC во всех режимах 0 ошибок,
CRC PASS/FAIL 36/0, ошибочных байтов и битов JPEG 0/0.
Длительность одного физического кадра равна 288,30/115,32/57,66/28,83 мс, полного JPEG — 10,37880/4,15152/2,07576/1,03788 с. Полезная скорость объекта равна 6,724/16,811/33,622/67,245 кбит/с: фактический выигрыш 1,0/2,5/5,0/10,0 раза, рассчитанный по неизменному кадру.
Шумный приём занял 7,14440/3,15468/1,92894/1,30565 с; отношение обработки к длительности сигнала 0,68836/0,75989/0,92927/1,25799. Режимы 20, 50 и 100 ксимв/с успевают в реальном времени, 200 ксимв/с — нет. Поэтому 200 ксимв/с является устойчиво декодируемым, но только частичным результатом.
Проверка существующего LATEST_STATE на постоянно заполненной VIDEO-очереди,
CONTROL каждые 50 мс, TELEMETRY каждые 100 мс и одной EMERGENCY подтвердила
порядок VIDEO(active) -> EMERGENCY -> CONTROL -> TELEMETRY -> VIDEO.
Начатый кадр не прерывается. Верхняя граница блокировки новой CONTROL или
EMERGENCY равна длительности кадра: 288,30/115,32/57,66/28,83 мс.
Для нагрузки планировщика каждое сообщение занимает целый неизменный
физический кадр Lab045. Прикладные CONTROL и EMERGENCY не дополняются внутри
LinkPacket: сохранены точные 36- и 34-байтные сообщения, проверено их
обратное декодирование. При CONTROL 20 сообщений/с и TELEMETRY 10 сообщений/с
требуется 30 физических кадров/с. Ёмкость режимов равна
3,469/8,672/17,343/34,686 кадра/с, поэтому остаток полезной скорости VIDEO
равен 0/0/0/9,085 кбит/с, или 0/0/0/0,1302 JPEG в секунду. Это программная
модель планирования, а не реализованная упаковка LinkPacket в физический
кадр.
Штатный LATEST_STATE заменяет ожидающее старое состояние, но сам по себе не
удаляет пакет по истечении deadline_ms. В нагрузочном сценарии при 50
ксимв/с один CONTROL начал передаваться через 100,760 мс при сроке 100 мс;
при 20 ксимв/с EMERGENCY ожидала 87,900 мс при сроке 50 мс. Конкретное
событие при 100 ксимв/с ожидало 30,240 мс, но худшая фаза 57,660 мс всё равно
нарушает 50-миллисекундный срок EMERGENCY.
Статусы всех режимов — PARTIAL. 20 и 50 ксимв/с нарушают требования по
блокировке и не оставляют VIDEO; 100 ксимв/с укладывает CONTROL в 100 мс, но
нарушает срок EMERGENCY и также не оставляет VIDEO; 200 ксимв/с исправляет
эти ограничения, но приёмник не успевает в реальном времени с отношением
1,25799. Для следующего отдельного аппаратного опыта только с PHY выбран
диагностический кандидат 100 ксимв/с и 80 выборок/символ. Для объединённой
работы он не рекомендован: recommended_for_integrated_operation = false,
полностью пригодного режима не найдено.
Созданы experiments/lab049_bpsk_symbol_rate.py,
tests/test_lab049_bpsk_symbol_rate.py, docs/lab049_current_state.md и
data/processed/lab049/result.json. Новый RF не выполнялся, RF TX = 0,
HackRF не запускался.
Целевые проверки Lab049 дали 17 passed. python tools/quick_gate.py прошёл:
564 теста ядра и 12 функциональных проверок. python -m pytest tests/ -q дал
564 passed и 0 failed; единственное предупреждение относится к запрету записи
в служебный .pytest_cache. git diff --check прошёл.
Следующий этап
STOP. До объединённого режима отдельно решить просроченные команды, упаковку служебных сообщений в физический кадр и перегрузку бюджета. Не выполнять аппаратный Lab049, QPSK, реальное видео, новый RF или переход на 180 МГц без отдельной постановки и явной авторизации.
Запись 037
Дата
8 сентября 2026 года.
Тема
Lab049: независимый IQ-приём и исправление расчёта полной доставки команд.
Выполнено
Проверен HEAD ac6cc792b8 и обнаружен уже
существующий незакоммиченный вариант Lab049. Запись 036 сохранена.
Независимые verifier/adversary воспроизвели отказ исходного приёмника при
неизвестном начале +240 выборок и CFO +10 Гц на 100 ксимв/с, а также ошибочный
расчёт аварийного срока по началу вместо конца передачи.
Основной IQ-проход использует блочный поиск и строгий декодер Lab048, lab046c_offline_recovery.stream_process_capture. Адаптер читает синтетический complex64 без отсечения шума, временно задаёт Rs/SPS и возвращает константы и функции через finally. TX offsets, объект и число кадров в RX не передаются. Порог Lab047 0.030964473262429237, PRBS7, BPSK, PHY, FEC, CRC и форматы сохранены. Дробные скорости и нецелое samples/symbol отвергаются без округления.
При Fs=8 Мвыб/с проверен тот же JPEG 8724 байта, RGB 320×240, SHA e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a, в режимах 20/50/100/200 ксимв/с. Идеальный канал восстановил 36/36 и точный JPEG во всех режимах. Шум един: coded-bit Eb/N0=7 dB, фиксированные seeds, остаточный CFO +10 Гц, фаза 0,73 рад и чередование полярности.
В шуме 20 ксимв/с восстановил только 6/36 кадров, JPEG не собран — FAIL. 50/100/200 восстановили 36/36, CRC PASS/FAIL 36/0, SHA match, ошибки JPEG 0/0. До FEC на принятых кадрах 67/147/119/125 ошибок, после FEC — 0; первая пара относится только к шести кадрам. Все восемь проходов дошли до конца IQ.
Полная обработка шумного IQ заняла 173,65057 / 5,72980 / 7,76244 / 8,17573 с, при длительности IQ 10,458018 / 4,230738 / 2,154978 / 1,117098 с. Отношения 16,60454 / 1,35433 / 3,60210 / 7,31872: ни один режим не успевает в реальном времени. Меньшие времена записи 036 описывали заранее выровненные кадры и не переносятся на полный независимый тракт. 50/100/200 — PARTIAL.
Переиспользован LATEST_STATE и сохранены форматы CONTROL/EMERGENCY. Отдельно считаются ожидание начала, полная доставка, активное окно 2 с и последующее опустошение очереди. На 100 ксимв/с максимум доставки CONTROL 105,64 мс и EMERGENCY 87,90 мс; превышений сроков соответственно 6 и 1. На 20/50/100 внутри активного окна не доставлен ни один TELEMETRY. На 200 худшая доставка EMERGENCY равна почти 57,66 мс, а не 28,83 мс: к блокировке добавляется передача самой команды. Срок 50 мс нарушается.
В модели одного полного PHY-кадра на пакет CONTROL 20 Гц и TELEMETRY 10 Гц перегружают 20/50/100 ксимв/с. На 200 остаются 9,085 кбит/с VIDEO, около 0,1302 JPEG/с; с одной EMERGENCY за 2 с — 8,116 кбит/с. Аппаратная упаковка служебных LinkPacket в PHY не реализована и этой моделью не доказывается.
Для отдельного будущего диагностического PHY-опыта выбран 50 ксимв/с: наименьшая вычислительная перегрузка среди точных шумных проходов. Это не пригодный объединённый канал и не разрешение RF. Старый JSON сохранён как data/processed/lab049/frame_aligned_result.json; актуальный result.json и docs/lab049_current_state.md содержат отрицательные результаты. Добавлены docs/lab049_audit.md, experiments/lab049_independent_iq.py и семь регрессий tests/test_lab049_independent_iq.py. Старые тесты не изменялись. Обновлён docs/LABS_INDEX.md. Модули protocol не изменялись.
Verifier: 24 целевых теста PASS, независимый пересчёт JSON совпал. Adversary подтвердил корректный отрицательный аварийный вердикт. quick_gate PASS: 571 тест ядра, 12 функциональных проверок. pytest: 571 passed, 0 failed; одно предупреждение служебного .pytest_cache. git diff --check PASS. RF TX=0. Git add/commit/push/pull/fetch не выполнялись.
Следующий этап: STOP; отдельная постановка для вычислительной перегрузки, бюджета и задержек перед аппаратной проверкой. Не запускать RF, QPSK, реальный видеопоток, новый FEC или 180 МГц в рамках этой работы.
Запись 038
Дата
8 сентября 2026 года.
Тема
Lab049: архитектура CRSF/ExpressLRS и бюджет отдельного SDR-видеоканала.
Выполнено
Повторно проверены main и HEAD ac6cc792b8.
Существовавшие незакоммиченные Lab049, тесты, данные и записи 036–037 сохранены.
Аудит README, журнала, индекса, Lab033–041, Lab047–048 и protocol подтвердил:
общий EMERGENCY > CONTROL > TELEMETRY > VIDEO создавался для собственного
единого ресурса. Его CONTROL 20 Гц и TELEMETRY 10 Гц в полных видеокадрах
остаются историческим стресс-тестом, не целевой моделью CRSF/ELRS.
По официальному ExpressLRS 4.1.0, коммиту a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6 и спецификации TBS проверены CRSF framing, UART, OTA, интервалы, Full/повторные режимы и телеметрия. CRSF RC: 26 байт по проводу; ELRS OTA4/OTA8: 8/13 байт, DATA: 5/10 байт. Ссылки на источники и точные допущения размещены в docs/lab049_crsf_elrs_architecture.md и crsf_elrs_budget.json.
Рекомендуемая архитектура: обычный RadioMaster, штатные ELRS TX/RX, CRSF к контроллеру ровера для управления и критической телеметрии; отдельный SDR для изображений и объёмных данных. Будущие примерно 180 МГц относятся к SDR, не к стандартному ELRS. Лабораторная RF-база — 1400 МГц. Модели аппаратуры и ELRS-диапазон не уточнены; 100 Full/8ch/1:8 — условный кандидат сравнительной модели, не назначенная аппаратная конфигурация.
При 100 Full/1:8 расчёт даёт до 87,5 RC-возможностей/с, 12,5 TLM-слотов/с, среднее ожидание RC 6,25 мс и верхнюю границу 20 мс только для идеального расписания RC/TLM. Полная задержка стики→ровер не измерена. DATA после LINK имеет потолок 116,667 байт/с до прочих расходов. Даже наиболее щедрый предел 10000 байт/с для двух DATA-трактов ELRS ниже JPEG 3 кадра/с: 26172 байт/с. Обычная ELRS-телеметрия для видео недостаточна.
Свойства безопасности Lab038–041 сохранены. При потере ELRS живое видео не разрешает движение. Требуются локальный таймер, аварийная защёлка, безопасная загрузка и отдельное повторное разрешение движения. Сопряжение не реализовано: RC CRSF не содержит session/boot/epoch/sequence нашего протокола. Локальная нумерация UART не доказывает свежесть источника. Порог ELRS TX для старого ввода пульта 1 с явно отмечен как незакрытое ограничение относительно модельных таймеров 100/200 и 150/250 мс.
JPEG Lab047 сохранён: 8724 байта, RGB 320×240, SHA e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a. Фактические планы Lab046/Lab045 дают 36 кадров, 206064 BPSK-бита и 207576 символьных интервалов с защитными интервалами/фильтром. Для 3/5/10 кадров/с JPEG payload требует 209,376/348,960/697,920 кбит/с, нынешняя PHY — минимум 622,728/1037,880/2075,760 ксимв/с без запаса. Управление ELRS из этого SDR-бюджета не вычитается.
20/50/100/200 ксимв/с дают в идеале 0,09635/0,24088/0,48175/0,96350 JPEG/с. Существующие независимые шумные замеры переиспользованы по SHA, не повторены: на 50/100/200 точный JPEG, но обработка занимает 5,72980/7,76244/8,17573 с, отношение к IQ 1,35433/3,60210/7,31872. На 20 только 6/36 кадров. Lab048 15 с → 13,966058 с остаётся фактом одной записи, не доказательством реального времени при повышении скорости PHY.
Конечная цель — больше 3 кадров/с; 3 промежуточно, далее 5 и 10. При 25 км/ч между изображениями соответственно 2,315/1,389/0,694 м. Рассчитана полная таблица для 10/15/25 км/ч и 1/3/5/10 кадров/с. Предел задержки изображения в один период (333,33/200/100 мс) обозначен как инженерное предложение, не измеренный или утверждённый норматив. Камера, живое кодирование, очередь и экран пока не измерены; RX включает JPEG decode, поэтому оно не прибавляется повторно. Кодек не менялся.
Добавлены experiments/lab049_crsf_elrs_budget.py, 35 тестов в tests/test_lab049_crsf_elrs_budget.py и отдельный машинный результат data/processed/lab049/crsf_elrs_budget.json. Обновлены документы состояния, индекс и краткий указатель актуальной архитектуры в README. Старые protocol tests и модули protocol не изменены.
Verifier независимо пересчитал расходы PHY, RC-ожидание перечислением интервалов, LINK/DATA и SHA исходных замеров; 35 целевых тестов PASS. Adversary: 7 проверок сеансов PASS; при живом видео без команд watchdog переходит в ступени 100/200 мс. Искусственная нумерация старого состояния подтверждает описанное ограничение свежести, не готовность bridge. Воспроизведённых расхождений в новой работе не обнаружено.
quick_gate PASS: 606 тестов и 13 функциональных проверок. pytest: 606 passed за 64,32 с; одно предупреждение о доступе к .pytest_cache. git diff --check PASS. Дополнительный ruff не выполнен: модуль не установлен. RF TX = 0; оборудование не запускалось и не инвентаризировалось. Git add/commit/push/pull/fetch не выполнялись.
Следующий этап: STOP. Рекомендуемый Lab050 — отдельная программная задача профилирования/потоковой обработки SDR-видео с ограничением возраста очереди и проверкой выполнимости 5 кадров/с. Сопряжение CRSF и его сценарии отказов требуют отдельной постановки и уточнения аппаратуры. Нового RF, QPSK, CRSF/ELRS-протокола, перекодирования JPEG или переноса на 180 МГц здесь нет.
Запись 039
Дата
8 сентября 2026 года.
Тема
Lab050: потоковая архитектура JPEG, ограничение возраста и блочный IQ-приём.
Выполнено
По явному заданию проверены HEAD, status, diff/stat/check и staged scope Lab049.
Создан коммит cdf5396e80 с сообщением
Lab049: define ELRS control and SDR video architecture. Вошли 12 файлов:
код, тесты, документы, журнал, индекс и указатель README. Сгенерированные данные,
настройки окружения и посторонние локальные файлы не добавлялись. Push не выполнялся.
Lab050 начата от нового HEAD и оставлена без staging/commit.
Аудит Lab034–037 подтвердил возможность переиспользовать существующий protocol/video_frame_scheduler.py: активное изображение завершается, ожидающее заменяется самым свежим, перед началом прогнозируется завершение. Добавлены готовность JPEG отдельно от времени съёмки, произвольный MAX_VIDEO_AGE, прогноз задержки после RF и счётчик максимальной ожидающей очереди. Пять прежних политик сохраняют поведение на проверенном сценарии видео+CONTROL. В самой Lab050 SDR-очередь содержит только VIDEO; управление ELRS отдельно.
Verifier/adversary воспроизвели ошибку первой реализации: позднее завершение кодирования старого снимка вытесняло более свежий, либо возвращало старый снимок после опустошения очереди. Исправлено сравнением времени съёмки и ID с сохранением самого свежего виденного значения. Две регрессии и повторная независимая проверка PASS.
Из data/raw/lab011_scene.jpg созданы четыре фиксированных профиля: A 320×240 RGB q35 — 8724 байта; B 160×120 RGB q35 — 2771; C 128×96 RGB q25 — 1740; D 160×120 grayscale q30 — 2028. Первый A совпал с SHA Lab047. По 30 детерминированных сдвигов фото, не съёмка камеры; размеры соответственно 8724–9250, 2771–3031, 1740–1893, 2028–2233 байта. PSNR относительно несжатого изображения того же профиля: 28,12 / 28,11 / 27,17 / 30,15 dB. Это не оценка пригодности для управления.
Нынешний пакет несёт 244 байта JPEG и занимает 5766 символьных интервалов. Точный предел Jmax=244floor(Rs/(5766fps)) включает фрагментацию, добивку, FEC, PHY header, преамбулу, защитные интервалы и фильтр. На 500/800/1000 ксимв/с для 5 кадров/с предел 4148/6588/8296 байт; для 10 — 1952/3172/4148 байт. BPSK, FEC R=1/2 K=7, CRC и форматы сохранены. QPSK, новый кодек и 12+3 стирающий FEC не вводились.
Выполнены 240 событийных сценариев: четыре профиля, вход 3/5/10 кадров/с, Rs=200/400/500/800/1000 ксимв/с при Fs=8 Мвыб/с, предел возраста 200/333/500/1000 мс. Ожидающая очередь не превышает один снимок. Сохраняются capture/encode/queue/TX/RX/complete/decode/display timestamps; не выполненные стадии имеют null. FPS внутри окна и после опустошения разделены.
Идеальная модель C/500k/5fps/200ms передаёт и показывает 30/30 за 6 с, без удалений, FRESH DISPLAY FPS=5, возраст min/median/max 92,563 / 92,590 / 92,629 мс. Это модель нулевой стоимости RX и экрана. При C/200k, камере 10 кадров/с и возрасте 333 мс передано 14, заменено 16; внутри 3 с показано 13, FRESH DISPLAY FPS=4,333, ещё один после окна. При возрасте 200 мс все 30 отклонены: радио само требует 230,64 мс.
Добавлен StreamingReceiver.push_iq_block с выдачей пакетов до finish. Корреляция и строгий PHY/FEC/CRC взяты из Lab048; в старый декодер добавлен необязательный IQ-reader без изменения поведения по умолчанию. Буфер удерживает блоки, левый запас и максимальный допустимый PHY-кадр; TX-границы, payload, ожидаемые ID и число кадров RX не получает. Децимация поиска 20/10/8/5/4 сохраняет две выборки/символ, порог Lab047 0.030964473262429237 не меняется. Адаптер последовательный, live-драйвер не подключён.
На каждой скорости выполнен шумный опыт трёх JPEG C, 24 RF-пакета: единый coded-bit Eb/N0=7 dB, seed=50050, CFO +10 Гц, фаза 0,73 рад, смена полярности. Все пять опытов дали 24/24 пакета и 3/3 точных JPEG до finish. Большой IQ-файл не создавался; SHA проверялся после независимого CRC/сборки. Обработка заняла 35,12417 / 59,47086 / 55,15755 / 60,95497 / 55,92195 с при IQ 0,792483 / 0,401868 / 0,323745 / 0,206561 / 0,167499 с. Отношения 44,32166 / 147,98602 / 170,37365 / 295,09484 / 333,86514: приёмник не успевает в реальном времени. На 500k строгая обработка 54,586 с против 0,492 с грубого поиска, 2374 кандидата и 24 принятых пакета. После исправления вызовов API packet в модели итоговая матрица пересчитана через --reuse-benchmarks; пять тяжёлых замеров сохранены без повторения.
Пик удерживаемых IQ 2,13–6,51 МиБ; расчёт массивов с запасом 47,5–143,4 МиБ, не RSS процесса. Предел IQ-буфера не зависит от длительности сессии. История событий симулятора хранится для отчёта и не выдаётся за постоянную память бесконечной камеры. Потери блоков/переполнение live-драйвера не реализованы.
При подстановке измеренной стоимости RX все 30 кадров C/5fps отклоняются до TX, FRESH DISPLAY FPS=0 для всех проверенных пределов возраста. Условный вариант: JPEG ≤1952 байт, 500 ксимв/с, MAX_VIDEO_AGE=200 мс. При стоимости RX-пакета ≤16 мс модель даёт 5 кадров/с и возраст около 192,5 мс; это требует примерно 144-кратного ускорения данного замера. Для 10 кадров/с нужны ≤12 мс и примерно 192-кратное ускорение; возраст около 160,5 мс, 29 показов в первые 3 с (9,667 кадра/с), ещё один после окна, интервалы около 10 кадров/с. Ускорения не достигнуты и не обещаются. Обе цели без QPSK — CONDITIONAL; нынешний RX — NO по реальному времени. Камера, экран, jitter и запас ещё не измерены.
Добавлены experiments/lab050_video_stream.py, lab050_streaming_receiver.py, tests/test_lab050_video_stream.py, docs/lab050_current_state.md и локальные результаты data/processed/lab050. Обновлён LABS_INDEX. Модули аварии, управления и сеансов не менялись; при потере ELRS видео не продлевает движение.
44 целевых теста PASS. Verifier независимо проверил границы JPEG, 60 сценариев очереди, 32 прогноза RX, исходные IQ-числа и все итоговые временные отметки JSON. Adversary подтвердил устранение найденной регрессии свежести. quick_gate PASS: 650 тестов и 14 функциональных проверок. pytest: 650 passed за 78,73 с, одно предупреждение о доступе к .pytest_cache. git diff --check PASS. RF TX=0, оборудование не запускалось. Lab050 git add/commit и push/pull/fetch не выполнялись.
Следующий этап: STOP. Рекомендуемый Lab051 — программное профилирование и ускорение строгой проверки ложных кандидатов на C/500k с сохранением независимости RX и FEC/CRC. До доказанной скорости и свежести не выполнять RF, QPSK, новый видеокодек или перенос SDR на 180 МГц.
Запись 040
Дата
8 сентября 2026 года
Тема
Lab051 — алгоритмическое ускорение потокового BPSK-приёмника на 500 ксимв/с и проверка свежести JPEG при измеренной стоимости обработки
Выполнено
Перед новой разработкой проверены HEAD, status, diff stat и diff check.
По прямому разрешению текущего задания Lab050 закреплена коммитом
60691a09f1:
Lab050: model fresh-frame SDR video stream.
В показанный staged scope вошли девять файлов: код и тесты Lab050, необходимые
изменения прежних модулей, отчёт, журнал, индекс и небольшой receiver_benchmarks.json.
Большой result.json, JPEG-профили и посторонние файлы не добавлялись. Push не выполнялся.
Lab051 начата от нового HEAD. Аудит прочитал Lab046B/C, Lab047/048/050, связанные функции Lab043/044/045 и convolutional_fec. Рабочая точка строго 500000 символов/с, Fs=8000000, 16 отсчётов/символ; профиль C 128×96 RGB q25, 1740–1893 байта. Управление ELRS/CRSF и локальная защита остаются отдельно. Ни один файл protocol в Lab051 не менялся.
Воспроизведён прежний короткий шумный опыт Lab050: три JPEG, 24 пакета, seed50050, coded-bit Eb/N0=7 дБ, CFO+10 Гц, фаза0,73 и чередование полярности. Историческая стоимость 55,157553 с / 0,323745 с IQ =170,373647. Свежий инструментированный baseline занял49,614327 с, отношение153,251430; это отдельный замер, с влиянием настольной нагрузки/инструментации. Обнаружены2374 кандидата:24 valid и2350 false; средние72,967/20,099 мс.
Главная стоимость ложных кандидатов — timing:41,833 с из47,232 с. При nominal416 и диапазоне±800 прежняя функция возвращалась к Python-перебору 1601 смещения. Matched filter на ложных кандидатах занимал0,934 с, уточнение2,797 с. Ранний отказ PHY header уже существовал и не запускал тело/Viterbi/CRC.
Добавлен отдельный вычислительный адаптер Lab051. Повторно используется внутренняя часть децимации с точным совпадением отсчётов; пересчитываются новые края. Общая корреляция уточнения и общий перенос/RRC обслуживают срезы кандидатов. Сохранены локальный DC и нулевые края. Результат извлечения кэшируется по уточнённому положению/длине в пределах блока. Timing вычисляет все прежние1601 смещения через корреляцию и накопленные энергии, без сужения диапазона. Для неразделимых FFT-пиков и постоянного IQ сохранён исходный выбор первого максимума.
Viterbi использует предвычисленные четыре пары евклидовых метрик и сравнение двух ветвей с прежним tie→branch0. K7,R1/2,171/133,tail6,интерливер,CRC и результаты декодирования сохранены. CFO-оценка прежняя; кэшируются векторы переноса. Новый порог отсева, GPU, multiprocessing и зависимости не добавлены. Фиксированный порог кандидатов0.030964473262429237 не изменялся.
Финальный короткий контроль:24/24 пакета,3/3 JPEG, SHA MATCH; совпали число кандидатов и все причины отказов. Медиана трёх проходов1,144176 с, processing/RF3,534193 — ускорение48,21 раза относительно исторической базы. Средний valid candidate17,7675 мс, false0,187317 мс; false-медиана0,0605 мс. Полная стоимость с ложными кандидатами/фоном47,674 мс на физический пакет.
Основной опыт:30 изображений, вход5/с, окно6 с, LATEST_ONLY, MAX_VIDEO_AGE200 мс. Реально поданы6,044416 с синтетического IQ блоками; receiver не получал TX-границы, payload или ожидаемый счётчик. Все240/240 пакетов и30/30 JPEG восстановлены точно. Фактическая стоимость каждого push, сборки и JPEG decode использована в событийной шкале CPU. Суммарно38,630132 с, processing/RF6,391045,160,959 мс/пакет. Получены147082 кандидата,12239 новых окон синхронизации и135057 cache hits. Ни один JPEG не уложился в200 мс: DISPLAYED=FRESH DISPLAYED=0,FRESH DISPLAY FPS=0. Цель5 свежих/с и минимальная цель>0 НЕ достигнуты.
Переданы30 изображений, до TX удалено0, после decode по возрасту удалено30. Возраст декодированных/отброшенных JPEG min/median/max: 276,515/15691,203/31150,009 мс. Это не измерение камеры/экрана: их задержки UNKNOWN. Capture lookup используется только после независимого JPEG для отчётной метрики; в прежнем fragment format нет capture timestamp. Live-контроль возраста не доказан. Видеочередь≤1, однако непрерывный IQ-источник потребовал бы внешнего backlog 2088473848 байт при отставании32,632404 с. Такой буфер не реализован и не скрыт. REAL-TIME CAPABLE=NO. Поток воспроизводится офлайн с обратным давлением источнику.
Пик удерживаемого IQ3177728 байт(3,031 МиБ), проверяемый предел3398912 байт. Инженерная оценка рабочих массивов136,161 МиБ; это не универсальный предел и не RSS. RSS процесса после потока154,105 МиБ, peak178,004 МиБ, включая Python/генератор/кэши. Длинный тест4096 блоков(33,554432 с,нулевой фон) не показал роста IQ и децимации: 2653440 и397216 байт после прогрева. RSS156,199–156,250 МиБ. Finish освобождает буферы. В отдельном replay посчитана нижняя граница наблюдаемых ndarray/владельцев и tracemalloc peak. Внутренние C-аллокации не объявляются полностью измеренными; холодные общие массивы могут занимать больше памяти, чем отдельное старое окно.
Сохранённая Lab047-запись20 ксимв/с повторно разобрана штатным Lab048: 36/36,FEC/CRC PASS,JPEG SHA MATCH,19 ошибок до FEC и0 после. Исходные IQ/JPEG сохранены. Новый адаптер рассчитан только на500 ксимв/с; аппаратных запусков не было.
38 целевых тестов PASS. Verifier независимо нашёл два FFT tie-расхождения; оба исправлены и повторно воспроизведены с совпадением старого результата. Adversary проверил malformed PHY без body/Viterbi, дубликаты/старые ID, лимиты объекта, усечение, восстановление подмен и арифметику возраста/backlog. Таблицы отчёта сверены с JSON. Документ проверен в UTF-8, ссылки существуют. quick_gate PASS:688 тестов,17 функциональных проверок,13 штатных пропусков. Полный pytest:688 passed за72,92 с,0 failed; одно предупреждение доступа к .pytest_cache. git diff --check PASS. Lab051 git add/commit и push не выполнялись; индекс пуст. RF TX=0; HackRF,180 МГц,QPSK,новый FEC/кодек и аппаратные500 ксимв/с не запускались.
Следующий этап: STOP. Рекомендуемый Lab052 — отдельное программное исследование стоимости уникальных фоновых кандидатов в полном режиме5 изображений/с, с неизменными PHY/FEC/CRC и независимыми положительными/отрицательными регрессиями. До отдельного разрешения не выполнять RF или аппаратные500 ксимв/с.
Запись 041
Дата
8 сентября 2026 года
Тема
Lab052 — уменьшение числа ложных кандидатов преамбулы при 500 ксимв/с, сохранение слабых пакетов и повторная проверка свежести JPEG
Выполнено
Перед новой разработкой проверены root/main/HEAD/status, diff stat/check,
фактический код Lab051, отчёт, индекс и запись 040. Повторные шлюзы Lab051:
quick_gate PASS, pytest 688 passed, 0 failed. Verifier подтвердил scope.
По прямому разрешению нового задания показан staged scope из 13 файлов,
создан коммит 9f33607d3a:
Lab051: accelerate 500 ksymbol/s streaming receiver.
9695 добавлений; код, тесты, документация и шесть итоговых JSON Lab051.
IQ-окна, промежуточные результаты и посторонние файлы не добавлены; push не было.
Lab052 начата от этого фактического HEAD.
Рабочий режим сохранён: BPSK, 500000 символов/с, Fs=8000000, 16 отсчётов/символ, JPEG C 128×96 RGB q25, 1740–1893 байта. Управление ELRS/CRSF остаётся отдельно. Ни один файл protocol, старые модули PHY/FEC/CRC или формат фрагмента не изменён.
Уточнена исходная метрика: исторические 147082 Lab051 — все строгие кандидаты, включая 240 valid; ложных было 146842. Новые timing-окна 12239 также включают настоящие. Прежняя длинная сетка зависела от несохранённых encode_seconds. В Lab052 тот же генератор с seed50050/CFO10/фазой0,73/чередованием полярности использует один сохранённый замер готовности JPEG; SHA всех изображений проверяется. Все сравниваемые варианты получают одну и ту же новую воспроизводимую сетку. Точное историческое размещение пакетов не объявляется восстановленным.
Профиль прежнего Lab051 на 6,044416 с IQ:1675842 локальных пика, 392785 выше первого порога,147005 строгих проверок,240true/146765false. 24281,089 ложных проверок на секунду IQ. Ложные кандидаты дают11387 уникальных уточнённых позиций и135378 повторных. Низкий нормированный порог пропускает шум независимо от его абсолютной амплитуды; повторная PRBS7 создаёт сильные боковые пики.
Построены распределения нормированной корреляции, median/MAD и квантили по блокам. Медиана false score0,035464; главный true peak0,841691. В357 блоках чистого фона, выделенных только после независимых решений, медиана блочных медиан0,016353, MAD0,006184; фон не идеально стационарен. Адаптивный median/MAD-порог рассмотрен, но не выбран: он не устраняет структуру повторных пиков, а чувствительность при смене фона требует отдельного доказательства. Нормировка энергией каждой половины использует только наблюдаемый IQ, без TX reference.
Первый вариант подавлял меньшие пики в радиусе преамбулы и давал0false на основном потоке, но adversary воспроизвёл потерю слабого VALID рядом с сильной ложной преамбулой без правильного заголовка. Этот вариант отвергнут. Исправление: сначала общие дешёвые корреляции всех локальных кандидатов по частям, затем ограниченная полная ширина группы; FAIL представителя сохраняет альтернативы. Прежний контрпример и его перенос через границы блоков больше не теряют пакет.
Основное правило: обе половины преамбулы проходят нормированную корреляцию не ниже0,08474038063392896. Порог выбран заранее из номинальной модели Beta(1,N−1),N640,alpha0,01; точная вероятность после фильтрации/отбора пиков не утверждается. Две FFT частей общие на блок, per-candidate timing не запускается на отклонённом шуме. Исходный первый порог0.030964473262429237 сохранён. Фаза/полярность неизвестны, используется модуль; новый фазовый CFO-gate не введён.
Группа имеет полную ширину≤20480 отсчётов от первого пика, без цепочного расширения. Минимальный допустимый кадр26720 отсчётов;20480<26720−2×2008=22704. Это разделяет центральные кандидаты двух последовательных неперекрывающихся кадров в диапазоне прежней точности локализации. Представитель — наибольшая корреляция, tie→правый; при отказе проверяется следующая альтернатива. Только настоящий PHY/FEC/CRC PASS разрешает пропуск принятого физического кадра. Граница IQ-блока может добавить проверки, но не скрывает следующий кандидат.
Сравнены0/1/2/3 части. Ложных строгих проверок145863/332/15/6, во всех вариантах сохранены те же240 уникальных уточнённых стартов и30 JPEG SHA MATCH. Выбраны две части: минимальная проверка распределённой структуры,9784,33× сокращение false. Третья часть уменьшает15до6, но дороже общего этапа. Группировка без дешёвого фильтра и с корректным возвратом альтернатив почти не снижает нагрузку распределённого шума. Глобальный peak/second не используется.
Обнаружены734 лишних построения неизменной опорной формы на каждый проход. Введены локальные постоянные кэши опоры,RRC taps,PRBS bits,171140 байт. Массивы побитно сравнены с прежними, глобальные функции возвращаются в finally. Сами PHY,16 samples/symbol,все1601 timing-offset,soft Viterbi и CRC не менялись.
Три чистых полных прохода:processing/RF1,257688/1,219199/1,219273, в каждом240/240 пакетов,30/30 точных JPEG,15false,0 потерь. Итог — целиком медианный третий проход:7,369795 с обработки /6,044416 с IQ=1,219273. Свежий прежний Lab051 без наблюдателя на той же сетке41,633312 с,ratio6,887897; полное ускорение5,649×, относительно исторической Lab051 —5,242×.
Итоговые счётчики:392785 первого этапа,388407 отклонены дешёво,4378 сохранены, 384 группы,243 строгих представителя+12 альтернатив,15false/240true. 4123 кандидата пропущены внутри уже принятого физического кадра. Строгих проверок42,187699/с IQ,ложных2,481629/с; новых soft-окон488. Настоящие строгие проверки3,996005 с,среднее16,650 мс; ложные всего28,884 мс. Общая децимация/корреляция1,790240 с,проверка частей0,446616 с.
INPUT5fps/30images;RECEIVED30;STALE30;DISPLAYED=FRESH DISPLAYED=0;FRESH FPS=0. Возраст декодированных, затем отброшенных JPEG234,520/834,077/1549,595 мс. MAX_VIDEO_AGE200 мс. Реальная измеренная стоимость каждого push и сборки/decode использована в прежней событийной шкале. Нулевая стоимость RX не подставлялась. Цель реального времени и5 свежих кадров/с НЕ достигнута. Теперь ограничение — настоящие пакеты вместе с децимацией,FFT и копированием IQ,а не ложные кандидаты. Финальный отдельный cProfile:FFT1,650 с,FIR1,295 с,Viterbi1,397 с собственного времени. Вложенные matched/refine не суммируются повторно.
Камера/экран UNKNOWN;capture lookup применяется после JPEG только для отчётной модели вывода. В неизменном fragment format нет capture timestamp, независимая live-проверка возраста не реализована. Отставание1,426779 с соответствовало бы 91313848 байтам внешнего IQ backlog. Такой буфер не хранится офлайн-источником; bounded state не объявляется готовой live-очередью без overflow/gap policy.
Пик удерживаемого IQ3177728 байт(3,031 МиБ),проверяемый предел3398912 байт. Инженерная оценка рабочих массивов136,161 МиБ,не универсальный предел C-аллокаций. RSS выбранного процесса после потока149393408 байт,peak168804352(160,984 МиБ). Короткий отдельный replay измерил6754 наблюдаемых ndarray(6681 владельцев), 37378942 суммарных байта владельцев иtracemalloc peak11586792 байта. Число массивов — нижняя граница Python-наблюдения; tracing не входит в CPU benchmark.
Длинный тест2048 блоков,16,777216 с распределённого шума со сменой амплитуды: 4783206 пиков,1068038 кандидатов,одна строгая ложная проверка,0 принятых пакетов. Во всех контрольных точках после прогрева IQ2653440 байт,децимация397216, сохранённых кандидатов0. RSS после прогрева кэшей стабилизируется. После finish IQ-буферы освобождены. Основной поток:не более23 eligible пиков и3 групп на блок; история наблюдателя существует только вне рабочего RX.
45 слабых сценариев Eb/N0=0/1/2/3/7 дБ,CFO−100/+10/+100 Гц,триseed/масштаба: старый и новый правильно приняли37/45,0 дополнительных потерь;8 не приняты обоими. Старая Lab047-запись20 ксимв/с штатным Lab048:36/36,CRC PASS,JPEG SHA MATCH, 19 ошибок до FEC,0 после,0 байтовых ошибок. Аппаратных запусков не было.
30 целевых тестов PASS,verifier иadversary независимо подтвердили исправление ложного подавления,границы блоков,плохую CRC,эквивалентность частей и finally. ФинальныеJSON,выбор медианного прохода,UTF-8,ссылки и график проверены независимо. quick_gate PASS:718 тестов,20 функциональных проверок,13 штатных пропусков. Полный pytest:718 passed за77,15 с,0 failed,одно предупреждение .pytest_cache. Новый helper наблюдения массивов отдельно выполнен;три модуля проверены py_compile и run_functional_tests после его добавления. git diff --check PASS. Обязательные регрессии в acceptance.json PASS;real-time/5-fps target явно FAIL. Lab052 git add/commit иpush не выполнялись;индекс пуст. RF TX=0.
Следующий этап: 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-эксперименту.
Запись 046
Дата
9 сентября 2026 года
Тема
Lab055 — энергетический аудит сохранённых аппаратных Lab047 и Lab054
Выполнено
По заданию пользователя сравнили цифровую мощность TX, согласованную компоненту RX, отдельный фон и остаток модели. Новых аппаратных команд не было, RF TX=0. SHA и размеры исходных аппаратных записей проверены до и после расчёта; Lab047 анализируется по записи единственного опыта, восстановленной позднее независимым программным приёмом, а не по программному loopback JPEG. Исторический Lab054 NOT_A, 0/16 пакетов, сохранён без изменений.
Созданы experiments/lab055_energy_audit.py, tests/test_lab055_energy_audit.py, docs/lab055_current_state.md и отдельные малые результаты data/processed/lab055. Итоговый файл — energy_audit_v2.json. Предварительный energy_audit.json сохранён как заменённый: исправлены недовзвешивание guard при Welch TX и попадание проверочных отсчётов в поиск задержки. Verifier воспроизвёл утечку, после исправления проверил её закрытие и независимо пересчитал мощности/PSD/МНК.
Средняя цифровая мощность активного TX 1950,308/1950,598 код², разница +0,000645 дБ: обе формы нормированы к RMS44. Цифровая энергия символа уменьшилась на13,9788 дБ, но одинаковый TX VGA10 дБ не доказывает одинаковую выходную RF-мощность. Медианная согласованная RX-компонента модели упала с0,202732 до0,00582916 код², на15,413 дБ. Медианный фон в одинаковой полосе 675кГц сопоставим:0,117815/0,112066 код². Ватты и потери подключения неизвестны.
Чередующиеся плитки внутри каждого кадра разделяют обучение и проверку модели. Остаток содержит шум и искажения; после RRC он превышает отдельный фон примерно в2,06/1,11 раза. Условное разложение Es/N0 с эквивалентной плотностью фона даёт−26,224 дБ, отношение к эквивалентному остатку — изменение−23,554 дБ; это разные показатели. Условия постоянной принятой мощности и N0 не подтверждены, утверждение «14дБ уже объяснены скоростью» не принимается.
Описан только будущий кабельный/экранированный контроль с измерением мощности, нагрузкой50Ом и известным ослаблением. Усилитель не назначен. Проверены официальные HackRF и ITU RR2024: п.5.340 запрещает излучения1400–1427МГц; будущая схема и допустимая частота требуют отдельного согласования. Архитектура сохраняется: RadioMaster/ExpressLRS/CRSF — управление, SDR — видео, цель минимум5 свежих изображений/с, перспектива видеотракта около180МГц.
Проверки:9 целевых тестов PASS; quick_gate823 теста/28 функциональных/13 штатных пропусков PASS; pytest823 passed,89,15с; diff check PASS. Предупреждение pytest касается только кеша. Verifier: остаточных находок нет. HEAD прежний0368c6d3e930f4d245e056223fd4e5c4f70e6b49, main; предыдущие изменения Lab054 сохранены. Git add/commit/push/pull/fetch не выполнялись. Следующий этап: STOP и согласование измерительной схемы, приборов и допустимой частоты; никакого автоматического аппаратного продолжения.
Запись 047
Дата
9 сентября 2026 года
Тема
Lab055 — фиксация результата; Lab056 — программная подготовка эфирного ABAB
Выполнено
По новому явному разрешению пользователя Lab055 зафиксирована коммитом
5add95ecb8 с сообщением
Lab055: audit received signal energy across symbol rates.
В коммите семь файлов только Lab055: анализатор, тесты, отчёт, два JSON,
запись 046 и раздел индекса. Предшествующие изменения Lab054 сохранены
незакоммиченными. Перед коммитом quick_gate 823/28/13 PASS, pytest 823 passed.
Push не выполнялся. Исторический Lab054 NOT_A, 0/16, не изменён;
повторная проверка SHA-256 всех 34 входов Lab055 не выявила изменений.
Прямой выбор пользователя — эфирный опыт вместо предпочтительного кабеля из приложения. Подготовлен один TX-файл ABAB: 20/500/20/500 ксимв/с, прежние PRBS7/BPSK/RRC, Fs 8 Мвыб/с и цифровая несущая +50 кГц. Созданы experiments/lab056_abab_energy.py, lab056_capture_runner.py, tests/test_lab056_preparation.py, docs/lab056_current_state.md и малые результаты data/processed/lab056. Большие CS8 находятся в data/raw/lab056.
TX RMS всего сегмента A/B: 44,004413/44,001925 код; разница мощности −0,000491 дБ. Активные участки отдельно: −0,042606 дБ; клиппинг 0. TX 10 588 544 отсчёта, 1,323568 с; RX планируется 3 с с упреждением 0,5 с. A1=A2 и B1=B2 побайтно. Пять gaps по 0,1 с содержат нулевой цифровой IQ при работающем TX-процессе: это не доказательство выключенного RF.
Анализатор сохраняет полную и AC-мощность RX, локальный фон, устойчивую разность мощностей, комплексный коэффициент передачи, согласованную компоненту, остаток и интегральный спектр. Мощность и энергия символа выводятся отдельно. RX не выравнивается по амплитуде после приёма. Искусственные записи с одинаковым усилением и падением B на 6,020600 дБ обработаны успешно: оценки разницы коэффициента передачи соответственно +0,001786/−0,002894 дБ и −6,014144/−6,022175 дБ для двух пар. Это программные проверки, не аппаратный результат.
Подготовлен RX-first runner с единственной конечной TX-попыткой, без повтора, проверкой процессов, SHA, размеров, счётчиков потерь и cleanup. Common clock проверен только mock-тестами; реальные reg29/CLKIN сейчас NOT_PERFORMED. Частота не назначена: 1400 МГц пересекает запрещённую для излучения полосу 1400–1427 МГц (ITU RR2024, п. 5.340). Для будущего опыта нужны допустимая частота/полоса, страна и подтверждение антенн/неизменной геометрии. Эфирный ABAB измеряет весь путь, включая антенны и распространение; он не изолирует внутренние аппаратные потери HackRF и не измеряет dBm.
Verifier независимо пересчитал коэффициенты, проверил TX и mock-отказы. Воспроизведённая ошибка разбора счётчиков с префиксом RX/TX исправлена; повторная проверка закрыла находку. Остаточных воспроизведённых находок нет. 34 целевых теста PASS; итоговые quick_gate 857/30/13 PASS, pytest 857 passed, 0 failed, 96,50 с; git diff --check PASS. HackRF не запускался, RF TX=0. Lab056 не коммитилась; push не выполнялся. Следующий этап: STOP, согласование допустимой эфирной конфигурации и отдельное разрешение на конкретный однократный RF-сеанс перед аппаратным preflight.
Запись 048
Дата
10 сентября 2026 года
Тема
Lab056 — принятое пользователем изменение методики на контролируемый OTA
Выполнено
Пользователь сообщил об отсутствии необходимого SMA-переходника и осознанно выбрал эфирный ABAB. Кабельный TX → 30 дБ → RX отложен до получения переходника как отдельная проверка. Центральную частоту определяет пользователь: RF_FREQ = USER_AUTHORIZED_RF_HZ. Конкретное значение пока не сообщено; обязательные поля страны/регуляторной полосы убраны из параметров runner, национальная регуляторика повторно не исследовалась. В отчёте подготовлены поля антенн, расстояния, ориентации/поляризации, LOS/NLOS и частоты.
Готовый ABAB waveform, метаданные, прежние результаты и исходная сводка 857 passed сохранены. RMS A/B 44,004413/44,001925 код, разница мощности −0,000491 дБ, TX 1,323568 с, RX 3 с. Усиления TX10/RX24/24, Fs 8 Мвыб/с и несущая +50 кГц не менялись; внешних PA/LNA нет.
В runner оформлен отдельный RX-only preflight: common clock с обоими reg29=0x26 и SLAVE CLKIN=DETECTED, 0,1 с приёма фона для проверки уровня, сохранение результата и cleanup, затем STOP перед отдельным разрешением TX. При частоте UNKNOWN аппаратных действий нет. capture_once требует PASS этой конфигурации, отдельной авторизации и свежей проверки опоры. При клиппинге до TX — RF TX=0; при обнаружении только в записи ABAB — RF TX=1 и отказ без повтора. Счётчик уже выполненной передачи не обнуляется. Ни частота, ни gains автоматически не подбираются.
Добавлен явный комплексный h прежней модели, сводки X/Y/Z и повторяемость A2/A1, B2/B1. Те же искусственные IQ прочитаны повторно с новыми именами выходных JSON. Для равного усиления X/Y/Z −0,046404/−0,000553/−14,025804 дБ; для ослабления B на 6,020600 дБ: −6,039124/−6,018156/−20,018524 дБ. Это программные значения, не аппаратный результат Lab056. Эфирный опыт будет характеризовать весь путь, а не отдельно внутренние потери HackRF.
44 целевых теста PASS. Итоговые quick_gate 867/30/13 PASS,
pytest 867 passed, 0 failed, 89,32 с; git diff --check PASS.
Verifier независимо исполнил 44 случая с данными в памяти, без записи
и оборудования; воспроизведённых находок нет. Исторический Lab054 NOT_A
сохранён. HEAD 5add95ecb8, Lab056 не коммитилась,
push не выполнялся. Аппаратных команд нет, RF TX=0.
Следующий этап: получить RF_FREQ, выполнить разрешённый RX-only аппаратный
preflight, остановиться с кратким отчётом и ждать отдельного разрешения
на один ABAB-сеанс. Кабельный контроль и PA автоматически не добавляются.
Запись 049
Дата
10 сентября 2026 года
Тема
Lab056 — аппаратный common-clock и RX-only preflight на частоте пользователя
Выполнено
Пользователь задал RF_FREQ=1400000000 Гц только для текущей лабораторной проверки. Это не рабочая частота SDR_Rover; ориентир полевых работ около 180 МГц и варианты 50/144 МГц здесь не исследуются. Задана геометрия OTA: имеющиеся антенны 1400 МГц, LOS, неподвижное оборудование, одинаковые поляризация/ориентация, расстояние примерно 3–5 м. Точные модели антенн и измеренное расстояние не сообщены; описание сохранено без выдуманных данных.
Выполнен только разрешённый аппаратный preflight. Инвентаризация подтвердила MASTER ...323b97d3 и SLAVE ...2e5327d3. После коротких RX-start обоих устройств MASTER reg29=0x26, SLAVE reg29=0x26, SLAVE CLKIN=DETECTED; опора обнаружена первым запросом через 67,787 мс ожидания. Затем SLAVE записал 800 000 комплексных отсчётов, 0,1 с, на той же частоте, Fs 8 Мвыб/с, RX24/24 дБ, RF amplifier/Bias-Tee OFF. Внешних PA/LNA нет. TX не запускался.
CS8 1 600 000 байт, SHA-256 c4257f26e4cc8562eb32228f9a50fdeb055879c928af0744cdf4a81cf7cd085b. RMS 2,203152571 код, мощность 4,85388125 код², AC-мощность 0,6658039582 код², максимумы абсолютных I/Q 4/6 код. Клиппинг 0 из 800 000 отсчётов, overruns 0. Отсутствие клиппинга фона без TX не гарантирует отсутствие перегрузки при будущем включении TX. После проверки CLKOUT обеих плат выключены, процессы CLEAR до/после, cleanup без ошибок.
Сохранены исходный RX, preflight_result/attempt, план и журнал фактических команд. Три hackrf_transfer-команды были только RX: два коротких запуска для опоры и запись фона; TX-команд 0. Отчёт docs/lab056_rx_preflight.md. Verifier только по сохранённым файлам подтвердил 12 команд, регистры, CLKIN, параметры и cleanup; пересчитал SHA и мощность/клиппинг вторым способом. Воспроизведённых расхождений нет, PASS, аппаратных команд не было. Код и готовый TX не менялись; SHA совпадают с проверенной версией. Последние программные проверки этой версии: 44 целевых теста, quick_gate 867/30/13 PASS, pytest 867 passed. Git diff --check PASS. Lab054 NOT_A сохранён. HEAD 5add95ecb8865f59075bbbced08d97b183fb3b48; Lab056 не коммитилась, push не выполнялся. RF TX=0. Следующий этап: STOP с техническим READY FOR SINGLE ABAB TX=YES; дождаться отдельного разрешения пользователя на единственный ABAB TX.
Запись 050
Дата
10 сентября 2026 года
Тема
Lab056 — единственный OTA ABAB 20/500 ксимв/с; большой провал не воспроизведён
Выполнено
После отдельного явного разрешения пользователя выполнен один конечный ABAB TX с неизменным ранее подготовленным файлом 10 588 544 отсчёта, 1,323568 с. RX запущен первым и сохранил 24 000 000 комплексных отсчётов, 48 000 000 байт, 3 с. Частота 1400000000 Гц только для Lab056, Fs 8 Мвыб/с, TX10/RX24/24 дБ, несущая +50 кГц, прежние PRBS7/BPSK/RRC; RF amplifier/Bias-Tee OFF, внешних PA/LNA нет. Геометрия по заданию пользователя: имеющиеся антенны 1400 МГц, LOS, примерно 3–5 м, неподвижность и одинаковые поляризация/ориентация. Параметры между A/B не менялись. Код, пороги, timing, FEC/CRC и цифровой TX не менялись.
Свежая опора перед сеансом PASS: оба reg29=0x26, SLAVE CLKIN=DETECTED через 137,359 мс штатного ожидания. По журналу RX стартовал на 0,517342 с раньше TX. RX overruns=0, TX underruns=0, клиппинг 0 до и после ABAB. Полный RX RMS 2,235380477 код, максимумы абсолютных I/Q 5/6 код. Все 14 аппаратных команд сохранены; среди них один TX без повтора. CLKOUT после опыта выключены, процессы CLEAR, cleanup без ошибок.
Подготовленный анализатор нашёл четыре сегмента с корреляцией 0,384366. Начала A1/B1/A2/B2 в RX: 5 254 791 / 7 709 991 / 10 149 062 / 12 604 263; общий сдвиг относительно TX расходится лишь на один отсчёт. Все активные окна 0,2048 с, порядок ABAB и gaps подтверждены. Полезные мощности после фона A1/B1/A2/B2: 0,462680958 / 0,476010015 / 0,414075173 / 0,423007891 код². Согласованные компоненты: 0,312320987 / 0,297815525 / 0,299566893 / 0,285847043 код². Raw/AC/фон/комплексный h/остаток/спектры по каждому сегменту приведены в docs/lab056_rf_result.md и rf_analysis.json.
Итоги по средним линейным мощностям: X, принятая мощность B/A после вычитания фона: +0,108895 дБ; Y, коэффициент передачи abs(h)² B/A: −0,163042 дБ; Z, энергия символа этой же принятой мощности: −13,870505 дБ. Повтор A2/A1 по мощности −0,482024 дБ, B2/B1 −0,512676 дБ; по abs(h)² −0,181074/−0,178136 дБ. Парные оценки B/A близки.
Прежний провал порядка 15,41 дБ в одной короткой OTA-сессии не воспроизвёлся. Это не выделяет собственные потери HackRF из антенн и распространения и не объясняет причину старого различия раздельных опытов. Кабельный контроль после SMA-переходника остаётся отдельным необходимым этапом для такого разделения. PA не назначен. Packet/PHY PASS, видео и FEC не исследовались. Исторический Lab054 NOT_A, 0/16 сохранён; 34 исходных SHA Lab055 не изменились.
Verifier только по сохранённым файлам независимо подтвердил команды,
SHA/размеры/клиппинг, четыре начала, мощности/фон и комплексный МНК;
расчёты согласованы до 1e−12, воспроизведённых находок нет.
RX SHA e336dd653fa554058052fcf851e9f2462f66b8cf7c710815ca2b9a09ffc23ad4.
TX SHA 5b34bbe1a8e6d037d2d6d367a74e9eb84e8940db7da61600ffaa7f7497d4f600.
Сохранены raw IQ, журналы, машинная сводка rf_result.json и график
data/processed/lab056/rf_overview.png. Код прежний: последние проверки
44 целевых теста, quick_gate 867/30/13, pytest 867 passed; diff check PASS.
HEAD 5add95ecb8. Lab056 не коммитилась,
push не выполнялся. Выполненных TX=1, сейчас RF TX=0, повторов нет.
Следующий этап: STOP и рассмотрение отчёта пользователем; никакого
автоматического второго RF-сеанса, кабельного контроля или добавления PA.
Запись 051
Дата
10 сентября 2026 года.
Тема
Lab057 — OFFLINE-диагностика ошибок символов и заголовка Lab054.
Выполнено
На HEAD 92477a4632 зафиксирован исходный
незакоммиченный scope, 149 SHA исходников и 60 исторических файлов. Работа
выполнена только с сохранёнными данными; обращений к SDR не было, RF TX=0.
Штатные исходники и старые результаты сохранены, Lab054 остаётся NOT_A, 0/16.
Полный независимый поток воспроизвёл все 100 кандидатов, их порядок/начала, 100 PHY_HEADER_MAGIC_MISMATCH, 0 пакетов, FEC/CRC NOT_REACHED. Все 16 настоящих начал присутствуют. Диагностические S0/D0/D1/D2/D3 проверены на всех 16 кадрах. TRAIN [32,608), VALIDATION [672,1248), разрыв 64 символа. Заголовки и payload не участвуют в выборе CFO/phase/timing. Диапазоны поиска зафиксированы заранее.
Ошибки VALIDATION из 9216: S0 3494, D0 3775, D1 3355, D2 3440, D3 3466. Ошибки header из 768: 283/331/254/277/274. Каждый вариант имеет 0/16 header и 0/16 CRC PASS. D1 против D0 улучшает VALIDATION на 420 ошибок, против S0 на 139 (1,5082 п.п.), но не восстанавливает заголовки. Только переоценка фазы ухудшает VALIDATION; добавление локального timing не даёт устойчивого выигрыша. Вклад компенсации ограничен; единственная первопричина не установлена.
Проверены активная двухблочная CFO-ветвь, множитель 2, знак, единицы и область однозначности: ±9,765625 Гц на 20K, ±244,140625 Гц на 500K. Модель Lab055 не использовалась как истинный CFO. Штатные RRC, PHY, FEC, CRC не менялись.
Verifier обнаружил утечку через глобальный DC mean в TRAIN-подготовке. Она устранена локальной сырой опорой TRAIN; выход решений остаётся штатным. Скрытая проверка для D3 подтверждена точной инвариантностью параметров при изменении raw вне TRAIN. Унаследованные timing/CFO у D0 и timing у D1/D2 явно не объявляются независимыми от VALIDATION. Остаток включает искажения и рассогласование DC-представлений и не называется чистым шумом.
Положительные контроли всех вариантов: TX Lab054 16/16, RX Lab047 36/36. Отрицательный контроль: 0/16 заголовков/пакетов. Синтетика с фиксированными seed проверяет фазу, CFO, дробную задержку и шум при одинаковом Es/N0 между скоростями. Добавлено 19 тестов: полный pytest 886 passed, 1 предупреждение записи cache; quick_gate 886/31/13 PASS. Verifier независимо пересчитал результаты и SHA.
Отчёт docs/lab057_offline_result.md, постановка docs/lab057_current_state.md; CSV/JSON, все комплексные статистики CFO, созвездия, фазы и карты ошибок/остатка сохранены в data/processed/lab057. Контрольные успешные пакеты отделены; новых успешных пакетов Lab054 нет. Коммит и push не выполнялись. Следующий этап: STOP и отдельное согласование OFFLINE-оценки качества символов сохранённой ABAB-записи Lab056; Lab058 и новые RF-сеансы автоматически не запускать.