Lab048: accelerate BPSK receiver to real-time
This commit is contained in:
@@ -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 не запускать.
|
||||
|
||||
Reference in New Issue
Block a user