Lab048: accelerate BPSK receiver to real-time

This commit is contained in:
LittleSam129
2026-09-03 14:42:02 +03:00
parent 6fb7e4ec54
commit ac6cc792b8
11 changed files with 1047 additions and 9 deletions

View File

@@ -1270,3 +1270,100 @@ 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 не запускать.