3004 lines
254 KiB
Markdown
3004 lines
254 KiB
Markdown
# Инженерный журнал SDR Rover Link
|
||
|
||
## Назначение журнала
|
||
|
||
Этот файл содержит хронологию разработки проекта SDR Rover Link.
|
||
|
||
В журнале фиксируются:
|
||
|
||
- выполненные работы;
|
||
- полученные результаты;
|
||
- обнаруженные ошибки;
|
||
- принятые технические решения;
|
||
- результаты экспериментов;
|
||
- планы следующего этапа.
|
||
|
||
Записи не следует удалять. Если решение изменилось, необходимо добавить новую запись и объяснить причину изменения.
|
||
|
||
---
|
||
|
||
# Запись 001
|
||
|
||
## Дата
|
||
|
||
10 июля 2026 года
|
||
|
||
## Тема
|
||
|
||
Создание структуры проекта и локального Git-репозитория.
|
||
|
||
## Выполнено
|
||
|
||
1. Проверена установленная версия Git:
|
||
|
||
```text
|
||
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` без связи с профилем `nominal` Lab039, откуда они происходят.
|
||
- Пять из четырнадцати инвариантов безопасности не измерялись: два вычислялись выражением с умножением на ноль, один был литеральным нулём, ещё два опирались на поля, которые никогда не заполнялись. Проверка `validate_outputs` подтверждала эти константы, то есть проверяла тождество.
|
||
- Формулировка «все 2807 введённых старых пакетов были отклонены» описывает перебор таблицы сценариев, а не измеренную вероятность отклонения. Число раскладывается как семь сценариев на 401 повтор.
|
||
|
||
## Выполнено
|
||
|
||
- Из Lab041 удалены четыре показателя: доли доставки видео, телеметрии и управления и максимальная длина очереди. Они относятся к Lab037 и Lab040 и в Lab041 не моделируются.
|
||
- Удалён график `lab041_traffic_impact.png`, потерявший основание. Осталось семь графиков.
|
||
- Удалены поля `negative_speed_cases` и `speed_limit_exceeded_cases`, которые никогда не вычислялись, и тождественные проверки в `validate_outputs`.
|
||
- Параметры торможения связаны с профилем `nominal` Lab039 через именованные константы `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 дБ.
|
||
|
||
Совокупность мер против подавления:
|
||
|
||
1. **Скачки по частоте в пределах 200–250 МГц.** Требуют от заградительной помехи на 22 дБ больше мощности при неизменной антенне и механике ровера.
|
||
2. **Направленная антенна наземной станции.** Даёт 10–20 дБ усиления и пространственно подавляет помеху, приходящую с иного направления.
|
||
3. **Расширение спектра для команд управления.** Поток команд составляет 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 ac6cc792b896e34f7dd6d291955a0387fdafcf41 и обнаружен уже
|
||
существующий незакоммиченный вариант 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 ac6cc792b896e34f7dd6d291955a0387fdafcf41.
|
||
Существовавшие незакоммиченные 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.
|
||
Создан коммит cdf5396e807b83f82a264632dc46f71428fcd616 с сообщением
|
||
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=244*floor(Rs/(5766*fps)) включает фрагментацию, добивку,
|
||
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 закреплена коммитом
|
||
60691a09f193f36983c7174c5252ed0897c559e9:
|
||
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 файлов,
|
||
создан коммит 9f33607d3ae82992c595de37dd64e99d7e4dea73:
|
||
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 зафиксирована коммитом
|
||
5add95ecb8865f59075bbbced08d97b183fb3b48 с сообщением
|
||
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 5add95ecb8865f59075bbbced08d97b183fb3b48, 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 5add95ecb8865f59075bbbced08d97b183fb3b48. Lab056 не коммитилась,
|
||
push не выполнялся. Выполненных TX=1, сейчас RF TX=0, повторов нет.
|
||
Следующий этап: STOP и рассмотрение отчёта пользователем; никакого
|
||
автоматического второго RF-сеанса, кабельного контроля или добавления PA.
|
||
|
||
# Запись 051
|
||
|
||
## Дата
|
||
|
||
10 сентября 2026 года.
|
||
|
||
## Тема
|
||
|
||
Lab057 — OFFLINE-диагностика ошибок символов и заголовка Lab054.
|
||
|
||
## Выполнено
|
||
|
||
На HEAD 92477a4632d2172578c859afd823e6d3b39f42a6 зафиксирован исходный
|
||
незакоммиченный 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-сеансы автоматически не запускать.
|
||
|
||
# Запись 052
|
||
|
||
## Дата
|
||
|
||
10 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab058 — OFFLINE-анализ качества символов сохранённого ABAB-сеанса Lab056
|
||
|
||
## Выполнено
|
||
|
||
После фиксации Lab057 коммитом 5773136ebfa8bafdffc344462d0ce6b56838d3af выполнен
|
||
только офлайн-анализ исходных TX/RX Lab056 с повторной проверкой размеров и SHA-256.
|
||
Исторические Lab054/Lab056 не изменялись, оборудование не опрашивалось, RF TX=0.
|
||
|
||
A1/B1/A2/B2 обработаны отдельно. Receiver-like использует штатные RRC/timing/carrier и
|
||
только известную приёмнику 1280-символьную преамбулу; oracle использует TX truth с заранее
|
||
разделёнными 64 плитками train/validation и защитными краями. Средний oracle BER A/B
|
||
0%/3,4959%, RMS EVM 0,3174/0,8453, matched/residual 9,9685/1,4648 дБ. Receiver-like BER A/B
|
||
0,0178%/52,4169%: у B штатный CFO около +4,7 Гц вместо близкого к нулю oracle, что
|
||
локализует сильный дополнительный сбой carrier synchronization.
|
||
|
||
Eye opening A/B 1,9979/1,9935, но p01 signed margin 0,4231/−0,8195. Фиксированный ISI
|
||
−5…+5 дал adjacent/main −33,3195/−30,1006 дБ. Усреднённая H(f) дала робастный ripple
|
||
0,4067/5,4714 дБ; источник внутри общего OTA TX–канал–RX пути не разделён, group-delay
|
||
variation неустойчива. TX control BER 0/0; AWGN control при одинаковой sampled noise PSD
|
||
ухудшил EVM B/A на 13,17 дБ в ожидаемую сторону; background дал BER около 50%.
|
||
|
||
Результат MIXED: энергия символа и широкополосная неравномерность ухудшают физическое
|
||
качество B, а текущая синхронизация ухудшает его ещё сильнее. Lab054 остаётся NOT_A,
|
||
0/16. Lab058 не коммитилась, push не выполнялся.
|
||
|
||
Следующий этап: отдельно согласовать полностью офлайн-проверку исправленного preamble-only
|
||
CFO/carrier estimator на сохранённых Lab056, Lab054 и контролях, без payload truth в
|
||
оценивателе и без запуска Lab059 автоматически.
|
||
|
||
# Запись 053
|
||
|
||
## Дата
|
||
|
||
11 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab059 — пределы восстановления несущей только по 1280-символьной преамбуле
|
||
|
||
## Выполнено
|
||
|
||
Lab058 зафиксирована отдельным коммитом
|
||
82f17499ace5e655991240348401b9700c7c3349 с согласованным сообщением; push не
|
||
выполнялся. Затем проведён только офлайн-анализ сохранённых Lab056, Lab054 и
|
||
Lab047. Оборудование не опрашивалось, аппаратных команд не было, RF TX=0.
|
||
|
||
До альтернатив сохранён точный P0 baseline. Активная ветвь корректно учитывает
|
||
BPSK², знак, единицы и reference time, но использует только две точки по 512
|
||
символов и отбрасывает последние 256 символов преамбулы. На Lab056 B ошибка P0
|
||
относительно whole-burst reference составила +4,7307/+4,7608 Гц, средняя SER
|
||
52,4169%. P3 с устойчивым наклоном фазы по всей squared-преамбуле дал
|
||
−0,1249/+0,3917 Гц и SER 3,6170%, близко к диагностическим 3,4959%.
|
||
|
||
Независимая проверка первой реализации выявила зависимость P1–P3 от RAW
|
||
полезной части через глобальное удаление DC. Исправленный расчёт ограничивает
|
||
DC и FIR-опору P1/P3 полной преамбулой, а P2 — только TRAIN; отдельный тест
|
||
меняет RAW после преамбулы и подтверждает неизменность новых оценок. P0 сохранён
|
||
дословно со штатной обработкой как исторический baseline.
|
||
|
||
Две удачные реализации P3 не признаны доказательством устойчивости. Monte Carlo
|
||
с300 реализациями для каждой из17 CFO, двух скоростей и трёх заранее заданных
|
||
уровней EVM дал на500ксимв/с/EVM0,84535 вероятность |ошибки|≤0,5Гц только
|
||
5,86/10,47/3,67/9,61% для P0/P1/P2/P3. Лучший RMSE P1 равен3,728Гц;
|
||
AWGN CRLB sanity check даёт3,598Гц. Lab047 сохранён36/36 для всех методов;
|
||
Lab054 остался0/16 HEADER/FEC/CRC/packet у всех методов, исторически NOT_A.
|
||
|
||
Вывод PREAMBLE_ONLY_INSUFFICIENT: P3 полезен как начальная оценка, но при
|
||
наблюдаемом качестве B требуется carrier tracking через burst. Следующий один
|
||
этап рекомендуется сделать офлайн: decision-directed tracking без payload truth
|
||
и без изменения формата. Физический предел B около3,50% ошибок остаётся.
|
||
|
||
Созданы постановка, отчёт, baseline, CSV/JSON и пять графиков Lab059. Исходные
|
||
IQ повторно хешированы до/после и не изменились. Lab059 не коммитировалась,
|
||
push не выполнялся. Следующий этап: STOP; Lab060 автоматически не начинать.
|
||
|
||
# Запись 054
|
||
|
||
## Дата
|
||
|
||
11 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab060 — OFFLINE-сопровождение несущей по решениям приёмника
|
||
|
||
## Выполнено
|
||
|
||
Lab059 зафиксирована отдельным коммитом
|
||
e16ec23fdb57e95ade46e9b6abc215502fca0686 с согласованным сообщением; push не
|
||
выполнялся. Затем только по сохранённым IQ Lab056, Lab054, Lab047 и синтетике
|
||
сравнены три варианта: T0 с неподвижной экстраполяцией P3, T1 с
|
||
решение-направленной поправкой фазы и T2 с поправкой фазы и частоты.
|
||
Оборудование не опрашивалось, аппаратных команд не было, RF TX=0.
|
||
|
||
Петля после 1280-символьной преамбулы получает текущий комплексный символ,
|
||
собственное решение +1/−1 и предыдущее состояние. Payload truth, header, magic,
|
||
JPEG, CRC, TX waveform и будущие символы не используются. Автоматический
|
||
контроль изменил только диагностический truth: фазовые и частотные траектории и
|
||
решения T1/T2 сохранились точно, а диагностическая SER изменилась. Утечки нет.
|
||
|
||
Пять нормированных полос 0,0002…0,004 проверены только на synthetic
|
||
500ксимв/с/EVM0,845350 с одинаковыми seed и39 сочетаниями стартовой частоты и
|
||
фазы. До реальных IQ для T1/T2 выбрана и заморожена полоса0,0005. Независимая
|
||
синтетическая проверка с другими seed дала на ключевом качестве B долю потерь
|
||
захвата 55,128205/0/0% и среднюю SER26,103132/4,729529/4,725104% для T0/T1/T2.
|
||
T2 снизил среднюю абсолютную конечную ошибку частоты до0,677354Гц.
|
||
|
||
На сохранённом Lab056 средняя SER B равна3,616990/3,509691/3,501780%, потерь
|
||
захвата нет; A остаётся0,017756% у всех. Диагностический физический ориентир B
|
||
3,495896%, EVM0,845350, matched/residual1,464846дБ и неравномерность полосы
|
||
5,471382дБ сохраняются. Lab047 у всех методов дал36/36. Lab054 у всех остался
|
||
0/16 HEADER, FEC/CRC не достигнуты, packets0/16; исторический NOT_A не изменён.
|
||
Фон дал0 ложных заголовков,0 ложных пакетов и не дал устойчивого lock.
|
||
|
||
Итог SUCCESS: лучший из проверенных вариантов T2 устраняет синтетические срывы
|
||
500K и почти достигает физического ориентира реального B, но не восстанавливает
|
||
Lab054. Штатный receiver и production-код не изменялись. Созданы постановка,
|
||
отчёт, CSV/JSON, NPZ, семь графиков и20 тестов Lab060; исходные IQ повторно
|
||
хешированы до/после и не изменились. Независимый read-only verifier подтвердил
|
||
причинность, формулы, отсутствие truth leakage и пересчитал ключевые NPZ/CSV
|
||
метрики без расхождений. Lab060 не коммитировалась, push не выполнялся.
|
||
Следующий этап: STOP и отдельно согласовать решение о внедрении T2 в штатный
|
||
receiver; Lab061 автоматически не создавать.
|
||
|
||
# Запись 055
|
||
|
||
## Дата
|
||
|
||
11 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab061 — OFFLINE-интеграция T2 в строгий приёмник
|
||
|
||
## Выполнено
|
||
|
||
Lab060 зафиксирована коммитом 92b0e0f8dd726f4420e8ef5d5e7c049357296e7c;
|
||
push не выполнялся. T2 встроен в существующий строгий PacketProcessor как явно
|
||
выбираемый режим. Legacy остался режимом по умолчанию, автоматической повторной
|
||
попытки по результату CRC нет. Коэффициенты и P3 численно совпали с Lab060.
|
||
|
||
Полный штатный synthetic PHY-пакет 500K проверен на39 случаях в каждом режиме:
|
||
13 остаточных частот от−10 до+10Гц и три качества. На всех качествах legacy/T2
|
||
дали CRC89,743590/94,871795%; на уровне EVM0,844032 — 9/13 и11/13. Сохранённый
|
||
TX дал16/16 в обоих режимах. Lab047 сохранил36/36, Lab054 сохранил0/16, фон
|
||
дал0 заголовков и0 пакетов.
|
||
|
||
Интегрированное ядро T2 воспроизвело Lab056: средняя SER A/B равна
|
||
0,017756/3,501780%, срыва сопровождения нет. Проверки причинности, отсутствия
|
||
payload truth и конечности при ошибках, fade и шуме прошли. Решение —
|
||
READY_BEHIND_EXPLICIT_MODE до отдельного контролируемого RF-теста с полными
|
||
500K-пакетами. Оборудование не опрашивалось, RF TX=0. Lab061 фиксируется этим
|
||
отдельным коммитом; push выполняется пользователем отдельно. Следующий этап:
|
||
STOP; Lab062 автоматически не начинать.
|
||
|
||
# Запись 056
|
||
|
||
## Дата
|
||
|
||
14 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab062 — подготовка полного пакета 500K и аппаратный RX-only preflight
|
||
|
||
## Выполнено
|
||
|
||
От HEAD 25cc89f0c734f77141632d19dbcdb6b2f066d60b подготовлен один waveform
|
||
из16 полных PHY-пакетов по256 байт payload:1476096 отсчётов,0,184512с,
|
||
SHA-256 e84bbce227426c0aac13a48ded1286ca4a44fc6e3efce01f6e5a513217c87ff5.
|
||
Строгий программный roundtrip legacy/T2 дал16/16 HEADER/FEC/CRC и точных
|
||
payload в исходном порядке. Quick gate:962 теста ядра,35 функциональных
|
||
проверок,13 пропусков; pytest:962 passed,0 failed.
|
||
|
||
Фактическая схема:1400МГц,500ксимв/с, Fs8Мвыб/с, расстояние примерно1,2м,
|
||
LOS в помещении; TX возле окна, RX на столе, одинаковая поляризация. Антенны,
|
||
кабели и USB-схема неподвижны. Усиления сохранены: TX VGA10дБ, RX LNA/VGA
|
||
24/24дБ, RF amplifier и Bias-Tee OFF. Общая опора:10МГц TCXO → MASTER →
|
||
MASTER CLKOUT → SLAVE CLKIN, длинный кабель сохранён.
|
||
|
||
Один аппаратный RX-only preflight подтвердил MASTER/SLAVE reg29=0x26 и SLAVE
|
||
CLKIN=DETECTED на втором опросе через133,5795мс. Записано800000 отсчётов фона:
|
||
полный RMS2,314058, AC RMS0,985483 кода, max|I|/|Q|=6/8, clipping0/800000,
|
||
RX overruns0, неожиданно сильного сигнала нет. Отсутствие аналоговой компрессии
|
||
этим не доказано. CLKOUT выключены без ошибок, процессы до/после CLEAR.
|
||
|
||
RF TX=0, TX-команд не было, усиления не менялись, preflight не повторялся.
|
||
Lab062 не коммитировалась, push не выполнялся. Следующий этап: STOP и ожидание
|
||
отдельного явного разрешения на единственный Lab062 TX; Lab063 не начинать.
|
||
|
||
# Запись 057
|
||
|
||
## Дата
|
||
|
||
14 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab062 — единственный RF-сеанс полного пакета 500K и сравнение legacy/T2
|
||
|
||
## Выполнено
|
||
|
||
После отдельного разрешения пользователя выполнен один TX-сеанс подготовленного потока из 16
|
||
полных PHY-пакетов. Перед TX повторная проверка подтвердила MASTER/SLAVE reg29=0x26 и SLAVE
|
||
CLKIN=DETECTED. Автоматических и ручных повторов не было. RX сохранил 24 000 000 комплексных
|
||
отсчётов за 3,000 с, 48 000 000 байт, SHA-256
|
||
ce0bd603e4ca356af67d504ee11c9e9f38171f31c7427fbe61216a28126b2b32; overruns0 и clipping0.
|
||
|
||
В промежуточной строке TX-журнала зарегистрирован один underrun длиной до16672 байт, хотя
|
||
итоговая строка утилиты сообщила0. Ненулевое наблюдение сохранено, сеанс признан
|
||
`INVALID_TX_UNDERRUN`, повтор запрещён и не выполнялся. Cleanup прошёл без ошибок, SDR-процессы
|
||
после сеанса CLEAR, RF TX=0.
|
||
|
||
Одна и та же RX-запись независимо обработана строгими режимами legacy и T2 без fallback. Оба
|
||
получили144 строгих кандидата,3 прохода PHY header,3 запуска и прохода FEC,3 запуска CRC,0 CRC
|
||
PASS и0/16 пакетов. T2 gain равен0. Диагностические границы всех16 пакетов найдены только после
|
||
строгого вердикта и не передавались приёмнику. По сопоставимой методике Lab058 средняя доля
|
||
ошибочных символов равна0,099287, EVM1,220401, matched/residual−1,730051дБ, медианная
|
||
неравномерность полосы p95–p05 равна6,660341дБ. Эти значения хуже Lab056 B, но их нельзя
|
||
отделить от TX underrun.
|
||
|
||
Lab062 не коммитировалась, push не выполнялся, Lab063 не создана. Следующий этап: RF TX=0 и
|
||
отдельно согласовать только офлайн-локализацию underrun относительно границ пакетов.
|
||
|
||
# Запись 058
|
||
|
||
## Дата
|
||
|
||
14 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab063: офлайн-локализация TX underrun и глобального ухудшения Lab062
|
||
|
||
## Выполнено
|
||
|
||
Lab062 зафиксирована отдельным коммитом
|
||
f8ae6c6bfceaa21b6c08dcf55d2bff996dd0dae5 с сообщением
|
||
`Lab062: record invalidated 500 ksymbol/s RF packet trial`; push не выполнялся. Статус
|
||
`RF_SESSION_INVALID_TX_UNDERRUN`, результаты legacy/T2 0/16 и запрет повтора сохранены.
|
||
|
||
По сохранённым TX/RX без аппаратных команд установлено, что 16 waveform по 92 256 отсчётов
|
||
записаны вплотную: 92 256 × 16 = 1 476 096. Дополнительная межпакетная пауза равна нулю.
|
||
`prepare()` не передаёт параметр паузы и не пишет нули между packet waveform, поэтому отсутствие
|
||
обещанных 5 мс признано ошибкой реализации подготовки Lab062. Внутренние защитные участки и
|
||
хвосты RRC каждого пакета сохранены.
|
||
|
||
Строка `longest 16672 bytes` пересчитана в 8 336 комплексных отсчётов, 1,042 мс, 521 символ и
|
||
9,035727% одного packet waveform. Это масштаб сообщения, а не доказанное число потерянных или
|
||
повторённых RF-отсчётов. Локальное сопоставление 512-символьными окнами с шагом 256 символов
|
||
дало 221 надёжное окно из 359. Задержка в них равна 0…1 отсчёту, скачков нет; место underrun по
|
||
RX не локализовано. В 22 дополнительных внутренних окнах пакетов3,4,12,13 корреляция ниже0,15,
|
||
поэтому задержка там не установлена. Края, повторяющаяся PRBS-преамбула и низкокорреляционные
|
||
окна исключены из delay-verdict, но сохранены в CSV. Корреляционные копии преамбулы имеют период
|
||
2 032 отсчёта.
|
||
|
||
Все 16 пакетов хуже Lab056 B по SER, EVM и matched/residual. SER составляет
|
||
7,580920…16,013629%, EVM 1,063657…1,663418, matched/residual от −4,420028 до
|
||
−0,536031дБ. Пакеты 3,4,12,13 выделяются всплесками AC-мощности и остатка при стабильной
|
||
медиане локального |h| 0,004488…0,004805. Пакет14 не имеет общего с ними физического признака.
|
||
Результат классифицирован как `GLOBAL_RF_DEGRADATION`; один локальный underrun недостаточен для
|
||
объяснения качества всего сеанса.
|
||
|
||
AC RMS по пакетам равен0,760816…2,032438 кода, max|I|/|Q| лежат в диапазонах3…6/4…7,
|
||
DC стабилен. Сильная аналоговая перегрузка по цифровым уровням менее вероятна, но без прибора не
|
||
исключена. Локального исходного файла или документации, объясняющей расхождение промежуточного и
|
||
итогового счётчиков `hackrf_transfer`, не найдено; `COUNTER SEMANTICS=NOT_ESTABLISHED`.
|
||
|
||
Созданы постановка, отчёт, JSON, два CSV, восемь графиков, анализатор и тесты. Lab063 выполнена
|
||
полностью офлайн, RF TX=0, оборудование не опрашивалось. Lab063 не коммитировалась, push не
|
||
выполнялся. Следующий этап: STOP и отдельно согласовать исследование уровня RX, усилений,
|
||
геометрии и возможной аналоговой компрессии или слабого полезного сигнала; Lab064 автоматически
|
||
не создавать.
|
||
|
||
# Запись 059
|
||
|
||
## Дата
|
||
|
||
14 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab064: подготовка измерения уровня и линейности, RX-only preflight
|
||
|
||
## Выполнено
|
||
|
||
После фиксации Lab063 коммитом 4437917465274257ff0ca5d3c269029da45de3ec
|
||
подготовлен один измерительный PRBS7/BPSK/RRC waveform без полного PHY-пакета.
|
||
Параметры: 1400 МГц, 20000 символов/с, Fs 8000000 комплексных отсчётов/с,
|
||
цифровая несущая +50000 Гц, TX VGA 10 дБ, RX LNA/VGA 24/24 дБ, RF amplifier и
|
||
Bias-Tee выключены. Геометрия сохранена: примерно 1,2 м, LOS в помещении, TX
|
||
возле окна, RX на столе, одинаковая поляризация.
|
||
|
||
TX-файл содержит 100 мс начальных нулей, четыре одинаковых 100-мс участка с
|
||
цифровыми уровнями −18/−12/−6/0 дБ, три нулевых промежутка по 50 мс и 100 мс
|
||
конечных нулей. Полная длина равна 6000000 отсчётов и 0,75 с. RMS участков:
|
||
5,556137/11,056978/22,056892/44,000457 кода; фактические шаги мощности:
|
||
+5,977270/+5,998157/+5,998257 дБ. Максимумы |I|/|Q| не превышают 69/69,
|
||
цифрового clipping нет. SHA-256 TX:
|
||
fa260719659b2984fe29588238415622cd75c6daefec6cc9130ba1bf851bd3f9.
|
||
|
||
Подготовлены RX-first runner и офлайн-анализатор согласованной составляющей,
|
||
остатка, комплексного h и линейности. Полные stdout/stderr и все промежуточные
|
||
и финальные счётчики потерь сохраняются. Независимая read-only проверка нашла
|
||
и помогла закрыть fail-closed ошибку: промежуточный underrun с финальным нулём
|
||
теперь всегда даёт `INVALID_CAPTURE`, диагностические метрики не превращаются
|
||
в A/B/C. Целевые тесты:13 passed. Quick gate:984 теста ядра,37 функциональных
|
||
проверок,13 пропусков; pytest:984 passed,0 failed; diff-check PASS.
|
||
|
||
Один разрешённый RX-only preflight подтвердил MASTER/SLAVE reg29=0x26 и SLAVE
|
||
CLKIN=DETECTED при первом опросе через66,793мс. Записано800000 отсчётов фона:
|
||
полный RMS2,193193, AC RMS0,832038 кода, средние I/Q 0,933738/1,801650,
|
||
max|I|/|Q|=4/5, clipping0, overruns0, неожиданно сильного сигнала нет. SHA-256
|
||
RX-only записи:02d87adcbb621027290a77d5f8fd3190c299d13e89f887cd294d4af352a6ef52.
|
||
CLKOUT выключены без ошибок, процессы до и после CLEAR.
|
||
|
||
Вызовов TX не было, `RF TX=0`. Lab064 не коммитируется до аппаратного
|
||
результата, push не выполняется. Следующий этап: STOP и ожидание отдельного
|
||
явного разрешения на единственный Lab064 TX; Lab065 не начинать.
|
||
|
||
После отдельного прямого разрешения пользователя выполнен ровно один RF-сеанс
|
||
подготовленного Lab064 waveform. Перед TX MASTER/SLAVE reg29 равнялись0x26,
|
||
SLAVE CLKIN был обнаружен при втором опросе через139,042мс. RX стартовал раньше
|
||
TX. Автоматических и ручных повторов не было. Все две строки TX underrun и все
|
||
четыре строки RX overrun равны нулю. RX clipping отсутствует. Записано16000000
|
||
комплексных отсчётов за2,000000с, SHA-256
|
||
02015891948aaee52ff81e60fdfeb391bb9b76cd9192b75972b8fedbc8690d86.
|
||
После отключения CLKOUT процессы CLEAR, ошибок очистки нет, RF TX=0.
|
||
|
||
Пять окон цифрового нуля дали AC RMS0,718264…0,728217 кода; разброс фоновой
|
||
AC-мощности равен0,119530дБ, фон стабилен. Согласованная мощность L0/L1/L2/L3
|
||
равна0,000750751/0,002961235/0,011333436/0,045331864код². Ошибки трёх ступеней
|
||
относительно цифрового TX равны−0,017501/−0,169270/+0,022162дБ. Общий рост
|
||
L3/L0 равен17,809077дБ при цифровых17,973685дБ; ошибка−0,164609дБ. |h|
|
||
составляет0,004882853/0,004872939/0,004778930/0,004791153. Верхняя ступень не
|
||
показывает компрессии.
|
||
|
||
Matched/residual для L0…L3 равен−32,086493/−25,577463/−16,691669/−12,133336дБ.
|
||
По заранее заданным критериям результат `LINEAR_BUT_WEAK`: тракт линейно
|
||
следует цифровому уровню, но полезная согласованная составляющая даже на L3
|
||
слабее остатка. Абсолютная RF-мощность и разделение вклада TX/эфира/RX без
|
||
измерительного прибора не установлены.
|
||
|
||
Quick gate после сеанса прошёл:986 тестов ядра,37 функциональных проверок,13
|
||
пропусков. Полный pytest:986 passed,0 failed. Lab064 не коммитировалась, push
|
||
не выполнялся. Следующий отдельный шаг рекомендуется только после согласования:
|
||
повтор той же лестницы при TX VGA20дБ и остальных неизменных условиях. Lab065
|
||
не создана.
|
||
|
||
Независимая read-only проверка повторно вычислила SHA, положение сегментов,
|
||
пять окон фона, matched/residual, комплексные h, ступени мощности и амплитуды,
|
||
полное сравнение L3/L0 и двенадцать спектральных значений непосредственно из
|
||
CS8. Расхождений нет, вердикт `чисто`. Оборудование при проверке не опрашивалось,
|
||
RF TX остаётся равным нулю.
|
||
|
||
# Запись 060
|
||
|
||
## Дата
|
||
|
||
15 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab064 зафиксирована; подготовка Lab065 при TX VGA 20 дБ и RX-only preflight
|
||
|
||
## Выполнено
|
||
|
||
После проверки уже подготовленного индекса по прямому разрешению пользователя
|
||
создан коммит `cff226e0bf9e36a627829ea11a4ca3292ae20953` с сообщением
|
||
`Lab064: measure OTA level linearity at TX VGA 10 dB`. В коммит вошли только
|
||
12 файлов и фрагментов Lab064; изменения Lab054 и Lab058 и сырые IQ не вошли.
|
||
Push не выполнялся.
|
||
|
||
Пользователь подтвердил неизменность геометрии, антенн, поляризации, USB,
|
||
clock-кабеля и RF-кабелей. Для Lab065 TX VGA изменён с 10 до 20 дБ. Частота
|
||
1400000000 Гц, RX LNA/VGA 24/24 дБ, RF amplifier и Bias-Tee OFF, PRBS7/BPSK/RRC,
|
||
20000 символов/с, Fs 8000000 отсчётов/с, несущая +50000 Гц и лестница
|
||
−18/−12/−6/0 дБ сохранены. TX-файл побайтово совпадает с Lab064: 6000000
|
||
отсчётов, 12000000 байт, 0,75 с, SHA-256
|
||
fa260719659b2984fe29588238415622cd75c6daefec6cc9130ba1bf851bd3f9.
|
||
|
||
Подготовлены RX-first runner без повторов, fail-closed проверка максимальных
|
||
счётчиков и анализ двух видов линейности: внутри Lab065 и для одинаковых
|
||
уровней Lab064/Lab065. До RF численно заданы границы пяти классификаций.
|
||
Software gate и 12 целевых тестов прошли.
|
||
|
||
RX-only preflight прошёл. Обе HackRF One r9 и роли подтверждены,
|
||
MASTER/SLAVE reg29=0x26, SLAVE CLKIN=DETECTED на третьем опросе через201,986мс.
|
||
RX записал800000 отсчётов фона: полный RMS2,333068, AC RMS1,056565 кода,
|
||
max|I|/|Q|=6/8, clipping0, overruns0, неожиданно сильного сигнала нет.
|
||
Процессы до и после CLEAR, cleanup без ошибок.
|
||
|
||
После отдельного прямого разрешения выполнен ровно один OTA-сеанс Lab065.
|
||
Перед TX MASTER/SLAVE reg29=0x26, SLAVE CLKIN=DETECTED на втором опросе через
|
||
136,897мс. RX стартовал раньше TX. TX underrun maximum0, RX overrun maximum0,
|
||
clipping0, cleanup без ошибок; процессы после CLEAR. RX:16000000 отсчётов,
|
||
2,0с, SHA-256 845d7b7dcaef70e179ab69e6ba0041601859630786d2f4d51c16a8c1c7869d7e.
|
||
Автоматических и ручных повторов не было.
|
||
|
||
Внутренние ошибки ступеней Lab065 равны−0,077363/+0,034934/−0,013858дБ;
|
||
компрессии L2/L3 нет. Относительно Lab064 matched power вырос на
|
||
11,179328/11,119466/11,323670/11,287650дБ. Медианный прирост+11,233489дБ,
|
||
медианное изменение остатка+0,517004дБ, улучшение matched/residual+10,734495дБ.
|
||
Фон стабилен: разброс1,002840дБ при границе3дБ. Остаточные полосы50/100/150кГц
|
||
на L3 выросли на7,304593/6,432281/4,996232дБ, то есть слабее matched power.
|
||
Классификация `LINEAR_GAIN_IMPROVEMENT`.
|
||
|
||
Независимая read-only проверка пересчитала RX SHA и размер, все счётчики,
|
||
локализацию, фон, matched/residual, комплексный h, CFO, внутренние ступени,
|
||
сравнение с Lab064 и полосы50/100/150кГц. Расхождений нет. Adversary подтвердил
|
||
одноразовость runner и нашёл неоднозначную подпись текущего состояния RF после
|
||
сеанса; она исправлена на `RF TX NOW=0` и закрыта отдельным тестом. Финальные
|
||
шлюзы: quick gate1000/38/13 PASS, pytest1000 passed, diff check PASS.
|
||
|
||
RF TX=0. Lab065 не коммитировалась, push не выполнялся, Lab066 не создана.
|
||
Следующий этап: STOP, рассмотрение результата и отдельное разрешение на коммит
|
||
Lab065; повторная передача или изменение усилений запрещены.
|
||
|
||
# Запись 061
|
||
|
||
## Дата
|
||
|
||
15 сентября 2026 года
|
||
|
||
## Тема
|
||
|
||
Lab065 зафиксирована; подготовка исправленного Lab066 и RX-only preflight
|
||
|
||
## Выполнено
|
||
|
||
По прямому разрешению пользователя создан локальный коммит Lab065
|
||
`dacf04f2d0a15c0c1b56a7fb527db61fc2e38462` с сообщением
|
||
`Lab065: validate OTA gain improvement at TX VGA 20 dB`. Push не выполнялся.
|
||
|
||
Lab066 подготовлена как исправленный повтор цели Lab062. Исторический результат
|
||
Lab062 сохранён: `RF_SESSION_INVALID_TX_UNDERRUN`, legacy/T2 0/16. В Lab066
|
||
использованы16 штатных полных PHY-пакетов по256 байт при500ксимв/с, Fs8Мвыб/с,
|
||
цифровой несущей+50кГц, RF1400МГц, TX VGA20дБ и RX LNA/VGA24/24дБ. RF amplifier
|
||
и Bias-Tee выключены; геометрия около1,2м, LOS, антенны и поляризация прежние.
|
||
|
||
Каждый packet waveform содержит92256 отсчётов. Между пакетами записаны15
|
||
фактических нулевых пауз по40000 отсчётов, то есть по5мс. Добавлены начальный и
|
||
конечный guards по800000 отсчётов, или по100мс. Длина без guards равна2076096,
|
||
полная длина3676096 отсчётов,7352192 байта,0,459512с. SHA-256 TX:
|
||
621b0bb8ec72bba4f522c79a5c77669c850740ea481270c4dcc2a7317819f199.
|
||
|
||
Весь конечный TX-файл независимо обработан legacy и T2. Оба режима дали16/16
|
||
HEADER, FEC, CRC, packet output и точных payload в правильном порядке. Позиции
|
||
пакетов совпали с разметкой пауз. Между режимами fallback отсутствует; T2 для
|
||
каждого пакета заново оценивает состояние по его собственной преамбуле.
|
||
|
||
Программные шлюзы: quick gate1013 тестов ядра/39 функциональных/13 аппаратных
|
||
пропусков PASS; pytest1013 passed; diff check PASS. Затем выполнен один RX-only
|
||
preflight. Обе HackRF One r9 и роли подтверждены. MASTER/SLAVE reg29=0x26,
|
||
SLAVE CLKIN=DETECTED на втором опросе через132,113мс. Фон:800000 отсчётов,
|
||
полный RMS2,225641, AC RMS0,827637, max|I|/|Q|=4/5, clipping0, maximum
|
||
overruns0, сильного сигнала нет. Cleanup без ошибок, процессы после CLEAR.
|
||
|
||
Независимый verifier пересчитал SHA, длину,15 нулевых пауз, оба guards,
|
||
16 канонических packet waveform, payload и RX-only метрики; расхождений нет.
|
||
Read-only adversary проверил запрет TX, одноразовость, связь preflight/capture
|
||
с конфигурацией, максимум счётчиков, live-фон перед TX и границу диагностик;
|
||
после исправлений открытых замечаний нет.
|
||
|
||
RF TX=0. Lab066 не коммитировалась, push не выполнялся, Lab067 не создавалась.
|
||
Следующий этап: STOP и ожидание отдельного прямого разрешения на один TX Lab066.
|
||
|
||
После отдельного прямого разрешения выполнен ровно один OTA RF-сеанс Lab066.
|
||
Передача всего потока запущена одним вызовом, автоматических повторов не было.
|
||
Перед TX MASTER/SLAVE reg29=0x26, SLAVE CLKIN=DETECTED на втором опросе через
|
||
131,291мс. Live RX-фон: AC RMS1,173567, max|I|/|Q|=4/5, clipping0. TX underrun
|
||
observations0/0, RX overrun observations0/0/0/0; максимумы0/0. RX записал
|
||
16000000 отсчётов за2,0с, SHA-256
|
||
72ff7ddd8b30baa4a5c066361ca1f8dfa664f1da37f65c0c373b211ce6cf00f0.
|
||
Cleanup без ошибок, процессы после CLEAR; аппаратная запись валидна.
|
||
|
||
Одна RX-запись независимо обработана legacy и T2 без fallback. Оба режима дали
|
||
145 кандидатов,10 HEADER/FEC/CRC PASS,10 packet output и10 точных payload.
|
||
Оба приняли пакеты4–8 и10–14; пакеты1–3,9,15,16 остановились на PHY header.
|
||
Выигрыш T2 равен нулю.
|
||
|
||
Диагностика всех16 пакетов после строгого результата дала SER0,0110466,
|
||
RMS-отклонение0,528374, matched/residual+5,542117дБ и медианную неравномерность
|
||
полосы2,870070дБ. Это лучше Lab056 B на0,0239123 SER,0,316976 RMS,
|
||
4,077271дБ matched/residual и2,601312дБ неравномерности. Относительно Lab062
|
||
улучшения составляют0,0882400 SER,0,692027 RMS,7,272168дБ matched/residual и
|
||
3,790271дБ неравномерности; сравнение с Lab062 контекстное из-за её underrun.
|
||
|
||
Классификация `PARTIAL_PACKET_RECOVERY_NO_T2_GAIN`: аппаратно чистый сеанс
|
||
существенно улучшил физическое качество, но не достиг16/16, а T2 не изменил
|
||
строгий результат. RF TX=0, повтор не выполнялся. Lab066 не коммитировалась,
|
||
push не выполнялся, Lab067 не создавалась. Следующий возможный одиночный шаг —
|
||
отдельно разрешённый офлайн-анализ PHY header не прошедших пакетов по сохранённой
|
||
IQ-записи; новый TX не нужен.
|