Lab046C: analyze weak RF capture offline

This commit is contained in:
LittleSam129
2026-09-01 17:09:27 +03:00
parent b6654671b4
commit 9b906c622d
4 changed files with 1682 additions and 1 deletions

View File

@@ -20,6 +20,17 @@
**OFFICIAL RESULT CHANGED BY POST-RUN DIAGNOSTICS = NO.**
**OFFLINE DETECTOR STUDY = COMPLETE.**
**OFFLINE REPROCESSING OF ORIGINAL RX CAPTURE = FAIL.**
**OFFLINE VALID FRAMES = 0. OFFLINE OBJECT COMPLETE = NO.**
**ORIGINAL HARDWARE RESULT CHANGED = NO.**
**CURRENT SOFTWARE GATE = PASS: quick_gate 506, pytest 506 passed,
git diff --check clean.**
Lab046A/B остаются только программными лабами. Для Lab046C выполнен ровно один
заранее разрешённый непрерывный RF-сеанс без повтора. Ни JPEG, ни видео, ни
QPSK не запускались.
@@ -105,6 +116,69 @@ read-only диагностика с TX reference. Она обнаружила с
исход остаётся `LAB046C HARDWARE RESULT = C`, `RF TX COUNT = 1`,
`OBJECT COMPLETE = NO`.
## Lab046C: автономная слабосигнальная обработка исходного RX capture
После аппаратного RESULT C реализован отдельный offline-модуль
`experiments/lab046c_offline_recovery.py`. Lab045 и строгий многокадровый
порог Lab046B `IQ_PREAMBLE_THRESHOLD = 0.65` не изменялись. Новый режим не
содержит HackRF-команд и читает только ранее сохранённый `rx_stream.cs8` через
`np.memmap`.
Первый каскад был зафиксирован до полного прогона по калибровочному фону
`0.0--0.5 s`: порог равен 99,9-му процентилю локальных PRBS7-максимумов.
Получено `threshold = 0.025011632591485977`, correlation median
`0.00838765874505043`, MAD `0.003039387986063957`, 5193 локальных максимума,
6 кандидатов, `12.0 candidates/s`. После фиксации правило проверено на
отдельном контрольном фоне `21.0--24.0 s` и больше не менялось: 35501 локальный
максимум, 301 кандидат, `100.333333 candidates/s`. Временные границы TX
использовались только для выбора участков, где передачи заведомо не было, и не
передавались поиску кадров.
Выполнен ровно один независимый полный offline-прогон 192 000 000 samples без
`tx_stream.cs8`, `tx_object.bin`, TX offsets, ожидаемого числа 68, fragment
order, packets или coded bits. Первый каскад насчитал 291446 локальных
максимумов и 3025 кандидатов выше порога. Все 3025 прошли refinement, timing и
оценку carrier/CFO/phase, но все 3025 были отвергнуты как
`PHY_HEADER_MAGIC_MISMATCH`. `PHY HEADER PASS = 0`, `FEC ATTEMPTS = 0`,
`CRC PASS = 0`, `VALID FRAMES = 0`, `VALID FRAGMENTS = 0`,
`OBJECT COMPLETE = NO`. `recovered_object.bin` не создавался.
Только после завершённого independent verdict была открыта TX reference.
Диагностика показала, что каждый из 68 настоящих стартов имел first-stage
кандидат в пределах `+-40 samples`; корреляция на этих кандидатах
min/median/max `0.059379209/0.088661019/0.126557365`, то есть все они были выше
зафиксированного порога. `FALSE CRC PASS = 0`, но совпавших independently valid
frames также 0, пропущены все 68 TX frames. На известных только post-verdict
позициях локальная физическая экстракция прошла для 68/68, однако ошибки
min/median/max составили `341/430/554` из 1280 бит преамбулы и `30/54/81` из
144 бит PHY header. Оценочный SNR min/median/max
`-19.282130/-12.829480/-9.195846 dB`; все заголовки дали `MAGIC_MISMATCH`.
Следовательно, новый first-stage detector обнаружил слабые следы, но качество
демодуляции оказалось недостаточным даже для защищённого PHY header.
Производительность: calibration `0.269617 s`, control `1.031204 s`, coarse
search `7.721316 s`, strict candidate processing `836.340048 s`, в среднем
`0.276476 s/candidate`, полный прогон `845.427589 s`. Capture длительностью
24 s обработан за `35.226150` его длительности. RX остаётся `memmap`; самый
большой coarse `complex64` block содержит 16 000 000 samples (128 000 000
байт), консервативная оценка временных массивов SciPy `1 545 705 764` байта.
Максимальное strict local window: 594400 samples, 4 755 200 байт. Полный
192M-sample `complex64` массив не создавался.
Артефакты результата находятся в
`data/processed/lab046c_offline_recovery/`: `independent_result.json`,
`post_verdict_diagnostics.json`, `tx_reference_stage_diagnostics.json`.
Правильная итоговая формулировка: **ORIGINAL LAB046C HARDWARE RESULT = C;
OFFLINE REPROCESSING OF ORIGINAL RX CAPTURE = FAIL; OBJECT RECOVERED = NO;
ORIGINAL HARDWARE RESULT CHANGED = NO.** Второй независимый прогон с новым
порогом не выполнялся.
Финальный software gate после результата: `python tools/quick_gate.py` PASS,
506 проверок и 9 функциональных лабораторий; `python -m pytest tests/ -q` =
506 passed. Единственное предупреждение связано с недоступным `.pytest_cache`
и не является отказом. `git diff --check` чист, кроме информационных LF/CRLF
notices.
## Назначение
Lab046 переходит от одиночной 256-байтной полезной нагрузки к передаче
@@ -398,4 +472,6 @@ Goodput 6,69 кбит/с — это честная baseline при 20 ксимв
Для Lab046A/B RF TX = 0; первый аппаратный Lab046C завершён с RESULT C и одним
RF TX без повтора. Erasure-код 12+3 GF(256) не задействован. Порог PRBS7,
gain, PHY, FEC и detector после результата не менялись. Следующий этап
определяется отдельной постановкой; новый RF-сеанс автоматически не разрешён.
определяется отдельной постановкой. Offline weak-signal прогон с заранее
зафиксированным правилом уже завершён как FAIL и не повторяется с другим
порогом. Новый RF-сеанс автоматически не разрешён.