Lab061: integrate T2 into the strict receiver

This commit is contained in:
LittleSam129
2026-09-14 11:07:40 +03:00
parent 92b0e0f8dd
commit 25cc89f0c7
20 changed files with 1290 additions and 20 deletions

View File

@@ -547,6 +547,26 @@
[JSON](../data/processed/lab060/summary.json),
[real CSV](../data/processed/lab060/real_results.csv),
[synthetic CSV](../data/processed/lab060/synthetic_results.csv).
- **STOP:** исходные IQ не изменились, Lab060 не коммитировалась, push не
выполнялся, Lab061 не создана. Следующий этап — отдельно согласовать решение
о внедрении T2 в штатный receiver.
- **Фиксация:** Lab060 зафиксирована коммитом
`92b0e0f8dd726f4420e8ef5d5e7c049357296e7c`; push не выполнялся.
## Lab061 — T2 в строгом приёмнике
- **Запись 055; только offline, RF TX=0.** T2 встроен в существующий
`PacketProcessor` как явный режим; legacy остался значением по умолчанию.
Автоматического CRC-fallback нет, строгие header/FEC/CRC правила не менялись.
- **Полный synthetic PHY 500K:** 39 случаев на режим, CFO от −10 до +10 Гц,
три качества. Header legacy/T2 92,307692/94,871795%, CRC
89,743590/94,871795%. На EVM0,844032 packets 9/13 против11/13.
- **Реальные контроли:** Lab047 legacy/T2 36/36; Lab054 0/16; saved TX 16/16;
background 0 headers и0 packets. Исторический Lab054 `NOT_A` сохранён.
- **Lab056:** средняя SER A/B 0,017756/3,501780%, потери lock нет. Реальная
широкополосная ошибка около3,5% остаётся физическим ограничением.
- **Решение:** `READY_BEHIND_EXPLICIT_MODE` до контролируемого RF-теста с
полными 500K-пакетами. [План](lab061_current_state.md),
[отчёт](lab061_offline_result.md),
[JSON](../data/processed/lab061/summary.json),
[real CSV](../data/processed/lab061/real_results.csv),
[synthetic CSV](../data/processed/lab061/synthetic_packet_results.csv).
- **STOP:** Lab061 фиксируется этим отдельным коммитом; push выполняется
пользователем отдельно, Lab062 не создана.

View File

@@ -0,0 +1,52 @@
# Lab061 — план интеграции T2 в строгий приёмник
Lab061 выполняется только офлайн. `RF TX = 0`; HackRF не опрашивается.
## Фактический путь приёмника
`lab053_streaming_receiver.StreamingReceiver` выполняет независимый поиск
кандидатов и передаёт заранее выбранному `PacketProcessor` IQ-окно. Внутри
`PacketProcessor` последовательно работают RRC-фильтр, временная
синхронизация, оценка несущей, извлечение мягких символов, строгий разбор PHY
header, Viterbi FEC, parser и CRC.
T2 добавляется в этот существующий путь после RRC и timing. Начальное состояние
P3 вычисляется по квадрату всей 1280-символьной преамбулы. После преамбулы T2
видит только текущий символ, собственное BPSK-решение и предыдущее состояние.
Header, payload, CRC и будущие символы ему недоступны.
Среднее DC в T2 считается только до последнего raw-отсчёта, который через
причинную импульсную характеристику RRC способен повлиять на последнюю точку
P3. Отсчёты header и payload не входят и в эту подготовительную оценку.
Режим задаётся до запуска как `carrier_tracking_mode="legacy"` или `"t2"`.
Значение по умолчанию — `legacy`. Повторной попытки после CRC FAIL нет.
## Зафиксированная математика
При нормированной полосе `Bn=0.0005` и затухании `zeta=1/sqrt(2)`:
`theta = Bn / (zeta + 1/(4*zeta))`
`alpha = 4*zeta*theta / (1 + 2*zeta*theta + theta^2)`
`beta = 4*theta^2 / (1 + 2*zeta*theta + theta^2)`
Получаются `alpha=0.0013324447407406753` и
`beta=8.882964938271169e-7` на один символ. Частотное состояние внутри петли
хранится в радианах на символ; для отчёта оно переводится в герцы как
`omega*Rs/(2*pi)`. Коэффициенты Lab060 не перенастраиваются.
## Критерии
- чистый полный штатный PHY-пакет 500 ksymbol/s проходит поиск, header, FEC и CRC;
- сравнение legacy/T2 выполняется при заранее выбранном режиме;
- Lab047 остаётся 36/36 в обоих режимах;
- Lab054 остаётся историческим `NOT_A, 0/16`, если строгий путь его не восстановит;
- background даёт ноль header и packet;
- изменение диагностической reference payload не меняет решения или траекторию T2;
- алгоритм остаётся конечным при ошибках символов, провале амплитуды и шуме.
После завершения и независимой проверки Lab061 фиксируется отдельным коммитом
по разрешению пользователя. Push выполняется пользователем отдельно. Lab062 не
создаётся автоматически.

View File

@@ -0,0 +1,92 @@
# Lab061 — T2 в строгом приёмнике
## Результат простыми словами
T2 перенесён из диагностической Lab060 в тот же строгий путь, который ищет
пакет, синхронизируется, разбирает PHY header, запускает FEC и принимает пакет
только после CRC PASS. Режим включается явно; обычный запуск по-прежнему
использует legacy. Скрытого повторного декодирования нет.
На сохранённом Lab047 оба режима приняли 36 из 36 пакетов. На Lab054 оба дали
0 из 16: исторический результат `NOT_A` не изменён. Чистая сохранённая TX-форма
дала 16/16 в обоих режимах, фон — ноль допустимых заголовков и пакетов.
## Полный синтетический PHY-пакет 500K
Штатный генератор сформировал преамбулу, повторённый header, FEC-кодированное
тело и CRC. Проверено 39 реализаций для каждого режима: 13 начальных ошибок
частоты от −10 до +10 Гц, фиксированная начальная фаза и три уровня шума.
Условное среднее измеренное EVM уровня `LAB056_B_LIKE` равно 0,844032 по 11
полным T2-траекториям из 13; два случая, остановившиеся раньше полного
извлечения, в это среднее не входят.
| Режим | Header | CRC и packet |
|---|---:|---:|
| legacy | 92,307692% | 89,743590% |
| T2 | 94,871795% | 94,871795% |
На качестве около Lab056 B legacy принял 9/13 пакетов, T2 — 11/13. На двух
лучших уровнях оба режима приняли 26/26. По всем трём уровням доля T2 для CFO
−10/−5/−2/−1/−0,5/−0,25/0/+0,25/+0,5/+1/+2/+5/+10 Гц составила
66,67/100/100/100/100/100/100/100/100/100/100/66,67/100%.
Текущий штатный пакет с 256 байтами payload содержит 268 packet bytes и 5724
символа; его сформированная длительность — 11,532 мс. Указанные ранее 204,8 мс
относятся к длинному диагностическому B-burst Lab056 из 102400 символов, а не к
этому штатному пакету. На всём B-burst T2 также проверен: срыва сопровождения
нет.
## Сохранённые данные
Средняя ошибка символов Lab056 после интегрированного ядра T2:
- A: `(1 + 0) / (2816 + 2816) = 0,017756%`;
- B: `(3290 + 3792) / (101120 + 101120) = 3,501780%`.
B1/B2 дали 3,253560% и 3,750000%; A1/A2 — 0,035511% и 0%. Все четыре
траектории сохранили устойчивый внутренний lock без больших фазовых скачков.
Для 36 пакетов Lab047 начальная P3-оценка лежала от −0,119281 до +0,207932 Гц.
Это далеко внутри проверенного диапазона; прежнее ограничение 20 ksymbol/s при
искусственной ошибке до ±10 Гц сохраняется. Отдельная настройка 20K не вводилась.
Lab054 дал в обоих режимах 0 header, 0 FEC, 0 CRC и 0 packet из 16 проверенных
исторических кандидатов. T2 не переопределяет этот отрицательный результат.
## Независимость и отказоустойчивость
T2 не принимает reference payload. Тест причинности меняет последний будущий
символ и подтверждает полное равенство всех предыдущих решений и состояний.
Отдельный тест меняет все raw-отсчёты после причинной границы P3 и подтверждает
равенство начальных частоты и комплексного коэффициента P3 с допуском `1e-8`;
остаток порядка `4e-9 Гц` возникает из-за округления FFT-свёртки.
Изменение диагностической reference меняет только последующее сравнение; путь
приёма и его RX bits от неё не зависят.
Одиночная ошибка, серии из 10 и 80 ошибок, провал амплитуды и шумовой участок
не создали NaN/Inf. Максимальное наблюдаемое частотное состояние составило
1,676428 Гц; дополнительный state clamp не вводился. На реальном фоне оба
режима проверили 13 кандидатов и не приняли ни одного заголовка или пакета.
## Решение
`PRODUCTION DECISION = READY_BEHIND_EXPLICIT_MODE`.
T2 численно совпадает с Lab060, полезен на полном строгом пути и не создаёт
регрессии Lab047, saved TX или background. Его рано делать режимом по умолчанию:
Lab054 остаётся 0/16, а контролируемого RF-сеанса с полноценными 500K-пакетами и
заранее выбранным T2 ещё не было.
После исправления программного сопровождения реальный широкий B-сигнал Lab056
всё равно имеет около 3,5% ошибочных символов при хорошем диагностическом
выравнивании. Следующая физическая задача — проверить энергетику и качество
широкополосного канала на полноценном пакете в одном заранее разрешённом
контролируемом опыте. Это отдельная лаборатория и здесь не выполнялось.
[Сводка JSON](../data/processed/lab061/summary.json),
[реальные результаты](../data/processed/lab061/real_results.csv),
[синтетические пакеты](../data/processed/lab061/synthetic_packet_results.csv),
[траектории](../data/processed/lab061/trajectories.npz).
`RF TX = 0`. Lab061 фиксируется этим отдельным коммитом. Push выполняется
пользователем отдельно. Lab062 не создавалась.