24 KiB
Lab057 — OFFLINE-диагностика ошибок символов и заголовка Lab054
Что установлено простыми словами
Все 16 настоящих начал Lab054 найдены, но восстановленные символы слишком часто получают неправильный знак. Замена только диагностической синхронизации немного меняет ошибки, но не восстанавливает ни одного заголовка или пакета. Выбор частотной компенсации вносит ограниченный дополнительный вклад. Его нельзя объявить единственной причиной отказа. Локальное уточнение timing не дало устойчивого улучшения на проверочной части преамбулы.
Это работа с сохранённой записью. Исторический Lab054 NOT_A, 0/16 сохранён. Lab056 не воспроизвела большой провал полной мощности, но не доказала достаточное качество символов старой Lab054. Остаток после модели не является чистым шумом. Необходимость PA, неисправность HackRF и многолучёвость не установлены.
Происхождение и сохранность
Дата: 10 сентября 2026 года. HEAD: 92477a4632d2172578c859afd823e6d3b39f42a6. Рабочий каталог исходно не чистый. Полный перечень, stderr Git, diff, версии и хеши зафиксированы до реализации в initial_state.json и initial_worktree.diff. Проверены 149 исходных Python-файлов и 60 исторических файлов. IQ читается через memmap в режиме r; большие записи не копируются.
| Вход | Размер, байт | SHA256 |
|---|---|---|
| TX Lab054 | 2952192 | e84bbce227426c0aac13a48ded1286ca4a44fc6e3efce01f6e5a513217c87ff5 |
| RX Lab054 | 48000000 | 641886879964250c315dd399d469503808aae43fb319bef05e0bf2a78bf14585 |
| TX Lab047 | 166060800 | 001a0c11128d18b2b8e3e67a3e8416a84174ed0e383887836186a10aa45beded |
| RX Lab047 | 240000000 | 8521bf1b574cd1fe4e0a4f980c00c8664f8bb51551a241e46449e1eb2c77e635 |
Integrity содержит SHA256 фактически загруженных исходников и версии модулей. Штатные исходники, включая незакоммиченные, не изменены. Исходные байты журнала/индекса сохраняются; Lab057 добавляется отдельной записью. Старые результаты Lab054 не присвоены Lab057.
Неизменённый baseline
StreamingReceiver Lab053 получает только RX блоками 65536 IQ, без TX, числа кадров, начал, заголовка и payload. Использованы фактические штатные функции; обёртка только наблюдает первый probe. Неиспользовавшийся FEC-backend задан эталонной функцией без JIT-прогрева: фактических вызовов FEC нет.
Воспроизведены 100 кандидатов, исходный порядок и все уточнённые начала, 100 PHY_HEADER_MAGIC_MISMATCH, 0 пакетов, FEC_STARTED=0, CRC_STARTED=0. После независимого решения выполнено сопоставление: все 16 настоящих начал представлены с отклонением ≤1 отсчёта. Диагностическое S0 побитно сверяется с probe полного штатного запуска.
Последующие варианты — диагностика при известном начале, а не новый независимый поиск. Эталон нужен только для подсчёта ошибок после фиксации параметров. Длина тела берётся исключительно из естественно принятого заголовка; затем вызываются существующие строгие FEC/CRC.
Заранее определённые варианты и разделение
Постановка до расчёта. Нулевые полуоткрытые индексы: TRAIN [32,608), VALIDATION [672,1248) — по 576 символов, промежуток 64 символа; header начинается с 1280. Защита учитывает память TX/RX RRC и интерполяции.
| Вариант | Timing | Остаточный CFO | Фаза и комплексная нормировка |
|---|---|---|---|
| S0 | Штатный | Штатный | Штатная, вся преамбула |
| D0 | Штатный | Штатный | По TRAIN |
| D1 | Штатный | 0 Гц | По TRAIN |
| D2 | Штатный | По TRAIN | По TRAIN |
| D3 | По TRAIN, локально ±0,5 символа | По TRAIN | По TRAIN |
D2/D3: на 500K сетка ±250 Гц, шаг 1 Гц, одно ограниченное параболическое уточнение; на 20K ±10 Гц, шаг 0,04 Гц. Диапазон основан на зарегистрированных CFO, не на CRC. D3: 33 положения, шаг 1/32 символа, sinc-интерполяция ±8 исходных отсчётов. Время t[k]=(k+0.5)/Rs, постоянная фаза при t=0. Граничные максимумы записываются, диапазоны не расширяются.
Граница независимости: S0 использует всю преамбулу; D0 наследует и timing, и CFO, видевшие VALIDATION; D1/D2 наследуют такой timing. Только новые параметры D3 полностью оцениваются на TRAIN около известного начала.
Verifier воспроизвёл утечку через глобальное вычитание DC среднего при подготовке TRAIN. Она закрыта короткой свёрткой только сырой опоры TRAIN с локальным средним и прежними RRC/несущей. Опоры: 500K [752,10145), 20K [18992,253409). Изменение raw вне опоры сохраняет новые параметры точно неизменными при фиксированных унаследованных параметрах.
Выходные символы для решений всех вариантов сохраняют прежний штатный фильтр с глобальным средним. Поэтому D0 меняет только комплексную нормировку, сохраняя timing/CFO и вход решений. Коэффициент обучен на немного ином DC-представлении; проверочный остаток включает и это рассогласование. Он не считается исключительно шумом или CFO-ошибкой. Частотные диапазоны и разделение после находки не менялись.
Фактическая ветвь CFO
Грубый поиск работает при 400 квыб/с на 20K и 1 Мвыб/с на 500K; точный RRC получает исходные 8 Мвыб/с, SPS=400/16. Оцениватель CFO получает символы с частотой Rs, а не Fs или частотой децимированного потока.
Q0=mean(z[0:512]**2), Q1=mean(z[512:1024]**2). Центры блоков: 256/Rs и 768/Rs. Последние 256 символов преамбулы не используются в двухблочной CFO, но используются в штатном h.
Delta_t = 512/Rs
Delta_phi = unwrap(arg(Q1)) - unwrap(arg(Q0))
f_hat = Delta_phi / (4*pi*Delta_t)
Область однозначности: |f| < Rs/2048; концы диапазона неоднозначны.
20K: Delta_t = 0.0256 s; |f| < 9.765625 Hz.
500K: Delta_t = 0.001024 s; |f| < 244.140625 Hz.
Множитель 2 после возведения в квадрат учтён знаменателем 4π. Несущая +50 кГц снимается один раз отрицательной экспонентой при Fs=8 Мвыб/с, остаточный CFO — один раз при Rs. D1 обнуляет только дополнительный остаточный CFO. Смешения Гц и радиан/отсчёт, неверного знака или повторной компенсации на проверенных синтетических сигналах не воспроизведено. Фаза и частота имеют общий t=0. Ветка FFT ±100 Гц здесь не активна. CFO модели Lab055 не использован как истина.
| Кадр | Q0, код² после RRC | Q1, код² после RRC | abs(Q0) / abs(Q1) | Delta_phi, рад | CFO, Гц |
|---|---|---|---|---|---|
| 1 | -0.166994-0.033792j | -0.055488-0.112911j | 0.170379 / 0.125809 | +0.914370 | +71.057879 |
| 2 | -0.159440+0.148525j | -0.145993+0.062412j | 0.217901 / 0.158774 | +0.345983 | +26.887136 |
| 3 | -0.016597+0.072947j | -0.075975-0.117370j | 0.074811 / 0.139814 | +2.343393 | +182.110640 |
| 4 | -0.036538+0.027430j | -0.086940-0.011387j | 0.045688 / 0.087682 | +0.774204 | +60.165209 |
| 5 | +0.019342+0.000251j | -0.091887-0.051158j | 0.019344 / 0.105169 | -2.646547 | -205.669433 |
| 6 | -0.079948-0.013489j | -0.156132+0.074750j | 0.081078 / 0.173104 | -0.613660 | -47.688961 |
| 7 | -0.123668-0.042891j | -0.032533+0.121485j | 0.130894 / 0.125766 | -1.642987 | -127.680410 |
| 8 | -0.116218-0.067279j | +0.000093-0.069437j | 0.134287 / 0.069437 | +1.047377 | +81.394135 |
| 9 | -0.160522-0.051823j | -0.047792+0.024561j | 0.168680 / 0.053733 | -0.786999 | -61.159558 |
| 10 | -0.025276+0.019238j | +0.081510-0.025604j | 0.031765 / 0.085437 | -2.795374 | -217.235183 |
| 11 | -0.080458+0.013900j | -0.140927-0.069797j | 0.081650 / 0.157264 | +0.630932 | +49.031249 |
| 12 | -0.117610+0.095199j | -0.031542+0.030989j | 0.151311 / 0.044218 | -0.096074 | -7.466154 |
| 13 | -0.261191+0.044353j | -0.031487+0.030377j | 0.264930 / 0.043751 | -0.599248 | -46.568970 |
| 14 | -0.169750-0.025470j | -0.081275+0.043148j | 0.171650 / 0.092018 | -0.636994 | -49.502290 |
| 15 | -0.131155+0.171794j | -0.140169-0.049332j | 0.216136 / 0.148597 | +1.257159 | +97.696774 |
| 16 | -0.155101+0.154485j | -0.012227-0.235640j | 0.218911 / 0.235957 | +2.302361 | +178.921973 |
Полные статистики обеих скоростей: squared_cfo_statistics.json.
Результаты на всех 16 кадрах Lab054
На каждый вариант приходится 9216 TRAIN-символов, 9216 VALIDATION-символов и 768 бит header после объединения повторов. S0 воспроизводит 415–554 ошибки преамбулы из 1280 и 11–31 ошибку header из 48.
| Вариант | TRAIN, ошибок | VALIDATION, ошибок | VALIDATION BER | Header, ошибок /768 | HEADER_ACCEPTED | FEC_STARTED | CRC PASS |
|---|---|---|---|---|---|---|---|
| S0 | 3439 | 3494 | 37.9123% | 283 | 0/16 | 0 | 0/16 |
| D0 | 3331 | 3775 | 40.9614% | 331 | 0/16 | 0 | 0/16 |
| D1 | 3294 | 3355 | 36.4041% | 254 | 0/16 | 0 | 0/16 |
| D2 | 3293 | 3440 | 37.3264% | 277 | 0/16 | 0 | 0/16 |
| D3 | 3270 | 3466 | 37.6085% | 274 | 0/16 | 0 | 0/16 |
В ячейках: ошибки VALIDATION из 576 / ошибки header из 48. Вариант для каждого кадра по этой таблице не выбирается.
| Кадр | S0 | D0 | D1 | D2 | D3 |
|---|---|---|---|---|---|
| 1 | 221 / 20 | 213 / 19 | 224 / 19 | 224 / 22 | 226 / 22 |
| 2 | 201 / 13 | 205 / 13 | 207 / 14 | 217 / 18 | 215 / 18 |
| 3 | 226 / 19 | 289 / 30 | 211 / 18 | 228 / 18 | 234 / 16 |
| 4 | 217 / 15 | 219 / 21 | 211 / 17 | 213 / 15 | 212 / 15 |
| 5 | 256 / 31 | 300 / 30 | 222 / 17 | 219 / 17 | 219 / 17 |
| 6 | 196 / 18 | 208 / 22 | 193 / 17 | 216 / 22 | 222 / 23 |
| 7 | 222 / 20 | 240 / 27 | 208 / 21 | 210 / 18 | 210 / 18 |
| 8 | 243 / 16 | 266 / 22 | 236 / 17 | 219 / 20 | 225 / 20 |
| 9 | 195 / 16 | 196 / 12 | 175 / 15 | 175 / 16 | 175 / 16 |
| 10 | 259 / 21 | 312 / 28 | 229 / 20 | 243 / 20 | 241 / 20 |
| 11 | 207 / 13 | 210 / 13 | 208 / 10 | 214 / 11 | 214 / 11 |
| 12 | 192 / 15 | 193 / 15 | 197 / 15 | 200 / 13 | 200 / 13 |
| 13 | 216 / 11 | 222 / 16 | 213 / 7 | 218 / 12 | 218 / 13 |
| 14 | 200 / 22 | 202 / 21 | 205 / 19 | 215 / 21 | 214 / 19 |
| 15 | 223 / 16 | 236 / 20 | 213 / 14 | 217 / 16 | 217 / 16 |
| 16 | 220 / 17 | 264 / 22 | 203 / 14 | 212 / 18 | 224 / 17 |
CSV и JSON содержат все положения, timing/CFO/фазу, ошибки 144 передаваемых header-битов, voted48 и magic, состояния HEADER/FEC/CRC/PACKET_OUTPUT. Все 1424 нормированных комплексных символа каждого варианта Lab054 сохранены в symbol_observations.npz.
Ответы на восемь вопросов
- Исходный отказ воспроизведён: полный независимый поток совпал с историей, FEC/CRC не достигнуты.
- Только новая фаза/нормировка не помогает: D0 снижает TRAIN 3439→3331, но ухудшает VALIDATION 3494→3775, header 283→331. VALIDATION хуже на 15/16 кадрах. Это не доказательство отдельного аппаратного фазового дефекта. Результат согласуется с плохим переносом короткой оценки вперёд по времени при неточном CFO, но не изолирует шум.
- Замена остаточного CFO меняет результат: при общем методе фазы D1 против D0 снижает VALIDATION на 420 ошибок (4,5573 п.п.), header на 77; VALIDATION лучше на 12/16 кадрах. D2 против D0 снижает VALIDATION на 335 и header на 54. Это ограниченный вклад выбора компенсации.
- Улучшение есть вне TRAIN, но ограниченно: D1 против S0 снижает VALIDATION на 139 ошибок (1,5082 п.п.) и header на 29; VALIDATION лучше на 11/16 кадрах. D2 против S0 снижает VALIDATION лишь на 54 ошибки, header на 6; VALIDATION лучше на 8/16. Нулевой CFO не признан истинным. Коррелированные ошибки внутри кадров не считаются независимыми испытаниями; универсальность эффекта не заявляется.
- Дополнительный timing не даёт подтверждённого улучшения: D3 против D2 снижает TRAIN 3293→3270, увеличивает VALIDATION 3440→3466, header 277→274. VALIDATION лучше у 4 кадров, равно у 7, хуже у 5. Выбраны сдвиги −1,5…+1 отсчёт, то есть −0,09375…+0,0625 символа; соседний период PRBS7 не затрагивается. На Lab054 нет граничных максимумов CFO/timing.
- Заголовки и пакеты: все пять вариантов 0/16; FEC/CRC во всех вариантах Lab054 не запускаются. Диагностического успешного пакета Lab054 нет.
- Оставшееся ограничение: после проверенных оценок остаётся около 36–38% неправильных решений VALIDATION. Не разделены полностью шум, искажения, остаточные ошибки модели/синхронизации и слабость конкретной записи. Вход не объявляется невосстановимым, CFO — единственной причиной.
- Одно следующее действие: отдельно согласовать OFFLINE-измерение качества символов сохранённых A1/B1/A2/B2 Lab056 тем же RRC с фиксированным TRAIN/VALIDATION. Оно проверит 500K при почти одинаковой принятой мощности в одной сессии. Lab056 передаёт PRBS7, а не пакеты: цель — ошибки символов и остаток, не packet PASS. Здесь этот следующий этап не запускался.
Контроли и ограничения
| Контроль | S0 | D0 | D1 | D2 | D3 |
|---|---|---|---|---|---|
| TX Lab054, CRC PASS | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 |
| RX Lab047, CRC PASS | 36/36 | 36/36 | 36/36 | 36/36 | 36/36 |
| Фон Lab054, header/packet accepted | 0/16 | 0/16 | 0/16 | 0/16 | 0/16 |
У 5/16 фоновых окон штатный timing приводит к усечению header-окна. S0/D0/D1/D2 сохраняют это как недоступную диагностику; она не заменена нулевыми ошибками и не исправлена расширением окна. D3 проверен на всех 16. На фоне D2 достигает частотной границы дважды, D3 — семь раз частотной и шесть раз временной. Диапазоны не расширялись. У фона нет эталонного header: ошибка header = null.
Синтетика включает известные фазу/CFO, выход за область однозначности штатного CFO, дробную задержку 0,171875 символа и белый комплексный шум seed5701. Между скоростями сохраняется Es/N0=12 дБ, дисперсия шума на IQ-отсчёт масштабируется с SPS. Это не сравнение при одинаковых мощности и N0. D3 даёт модуль ошибки timing 0,015625 символа во всех четырёх waveform-контролях, VALIDATION без ошибок. CFO-ошибка при шуме: +0,105711 Гц на 20K, −2,031036 Гц на 500K. Эти контроли не доказывают универсальную устойчивость. Подробности: synthetic_controls.json.
Замена файла эталонных header/JPEG сохраняет параметры и строгие решения, меняя только постфактум подсчитанные ошибки. Проверено точное равенство новых оценок при изменении raw вне TRAIN. Добавлено 19 тестов без оборудования и сохранённых IQ.
Средняя мощность остатка VALIDATION S0/D0/D1/D2/D3: 1,706895 / 1,750214 / 1,692657 / 1,706098 / 1,710603 код². Мощность модели: 0,077389 / 0,092981 / 0,096812 / 0,097653 / 0,098538 код². Точка тракта — выход штатного RRC. Это не калиброванные ватты и не измерение чистого N0. По паузам N0 не оценивался.
Графики и артефакты
- Сравнение по кадрам.
- Созвездия VALIDATION: S0, D0, D1, D2, D3.
- Ошибка фазы по времени: круговое среднее 32 символов только для отображения, без переоценки компенсации.
- Положения ошибочных символов и остаток.
- Машинная сводка.
Воспроизведение и проверки
Из корня проекта при наличии исходных IQ и initial_state.json:
$env:OPENBLAS_NUM_THREADS='1'
$env:OMP_NUM_THREADS='1'
$env:PYTHONIOENCODING='utf-8'
python -B experiments/lab057_symbol_diagnosis.py
python tools/quick_gate.py
python -m pytest tests/ -q
git diff --check
Отдельно baseline: python -B experiments/lab057_symbol_diagnosis.py --baseline-only. Runner не имеет аппаратного режима, перезаписывает только собственные результаты Lab057. Контрольные успешные пакеты сохранены отдельно как packet_TX054_* и packet_RX047_*; файлов packet_Lab054_* нет.
Verifier независимо подтвердил baseline, сводные числа, 19 тестовых случаев и закрытие утечки. Итог общих проверок: acceptance.json.
Фактические финальные проверки: pytest 886 passed, 0 failed, 84,80 с;
одно прежнее предупреждение о недоступности записи .pytest_cache.
quick_gate PASS: 886 тестов, 31 функциональная проверка, 13 пропусков.
git diff --check — PASS. Исходные 867 тестов не удалены и не ослаблены.
Исходные 149 файлов обработки/тестов и 60 исторических файлов сохранены;
журнал и индекс расширены только отдельными дополнениями Lab057.
LAB057 STATUS = COMPLETED, PARTIALLY_LOCALIZED
BASELINE REPRODUCED = YES
PHASE CONTRIBUTION = TRAIN-only phase alone worsens validation
CFO CONTRIBUTION = LIMITED; D1 improves validation by 1.5082 pp versus S0
TIMING CONTRIBUTION = NO CONSISTENT HELD-OUT IMPROVEMENT
HEADER ACCEPTED BY VARIANT = S0 0/16; D0 0/16; D1 0/16; D2 0/16; D3 0/16
CRC PASS BY VARIANT = S0 0/16; D0 0/16; D1 0/16; D2 0/16; D3 0/16
REMAINING UNCERTAINTY = input quality versus residual/model/synchronization impairments
RECOMMENDED NEXT SINGLE STEP = separately authorize offline Lab056 symbol-quality audit
LAB054 HISTORICAL RESULT = NOT_A, 0/16
RF TX = 0
COMMIT = NOT PERFORMED
PUSH = NOT PERFORMED
STOP