Files
SDR-Rover/docs/lab053_current_state.md

38 KiB
Raw Permalink Blame History

Lab053 — стоимость настоящих пакетов и свежесть видео

Дата: 8 сентября 2026 года.

Программная цель достигнута в выполненных опытах: BPSK 500 ксимв/с, 8 Мвыб/с, 16 отсчётов/символ, JPEG C 128×96 RGB q25, вход 5 кадров/с. Получены 240/240 пакетов, 30/30 точных JPEG и 5 свежих кадров/с при неизменном пределе возраста 200 мс. RF TX=0, оборудование не запускалось и не перечислялось. Управление RadioMaster/ELRS/CRSF остаётся отдельным трактом.

Основание и Git

Перед работой проверены root/main/HEAD/status, diff stat/check, состав Lab052, отчёт, журнал, индекс, обнаружитель и результаты. Повторены quick_gate: 718 тестов, 20 функциональных проверок, 13 штатных пропусков; отдельный pytest: 718 passed, 0 failed, 79,79 с. Verifier подтвердил scope.

По прямому разрешению задания в индекс внесены только 27 файлов Lab052: код, тесты, документация и итоговые JSON/график/текстовые профили. После показа staged stat/status и проверки cached diff создан коммит:

cc38900caea4b310568edc691be7db124503fd21

Lab052: suppress false preamble candidates

В коммите 77397 добавленных строк; большие NPZ/NPY, профиль .prof и посторонние файлы не добавлены. У SVG и двух профилей удалены только концевые пробелы. Предыдущий HEAD: 9f33607d3ae82992c595de37dd64e99d7e4dea73. Lab053 начата от фактического нового HEAD. Push не выполнялся.

Что именно измерено

Использован точный источник Lab052: сохранённая готовность JPEG из source_fixture.json, seed50050, coded-bit Eb/N0=7 дБ, остаточная расстройка несущей +10 Гц, фаза 0,73 рад, чередование полярности. Байты JPEG сохранены: 1740–1893 байта. Приёмник получает только последовательные комплексные IQ-блоки. Ожидаемые границы, количество пакетов, содержимое и номера фрагментов ему не даны.

Генератор один раз записал 48355328 complex64 отсчётов, 386842624 байта, 6,044416 с IQ в игнорируемый Git каталог data/raw/lab053. SHA256: 9b4f5469b21985f796a77e22981f93bcd3b7a203b573349e8bdf7ea55891bea0. Подготовка источника заняла 6,225262 с; это синтез передаваемого сигнала, а не стоимость приёмника. Конвейер читает файл обычными ограниченными read, не отображает весь файл в память. Файл и готовность JPEG одинаковы для вариантов.

Два опыта отвечают на разные вопросы и сохранены отдельными целыми проходами:

Опыт Что измеряет Итог с одним строгим работником
Подача IQ по часам, 30 JPEG/6 с Фактический возраст и очереди 30 свежих JPEG, 5,0 кадра/с
Сумма измеренной работы стадий в этом опыте Консервативный бюджет обслуживания без ожидания входа 4,384788 с /6,044416 = 0,725428
Полное время того же опыта по часам Включает ожидание входных блоков и завершение потоков 6,074946 с
Воспроизведение без ожидания, с обратным давлением Реальная пропускная способность всего конвейера 4,010478 с /6,044416 = 0,663501

Сумма работы стадий включает чтение IQ, подготовку кольца, RX, сборку/JPEG decode и проверку свежести. Стадии перекрываются, поэтому их сумму нельзя объявлять измеренным полным временем процесса. Напротив, 6,074946 с paced-опыта нельзя делить на длительность IQ для оценки вычислительной скорости: там есть ожидание поступления данных. Воспроизведение без ожидания отдельно измеряет elapsed wall time. Нулевая стоимость RX нигде не подставляется.

В stream.json целиком выбран paced-проход 1 — медианный по сумме работы стадий из трёх: 0,725428 /0,712269 /0,731542. Все три дали 240 пакетов, 30 точных JPEG и 5 свежих кадров/с. Их максимальные возраста:176,062 /168,978 /171,311 мс. В throughput.json целиком выбран второй проход: ratios0,662067 /0,663501 /0,680789. Показатели разных проходов не смешаны в одну временную шкалу.

Новый профиль исходной Lab052

Свежий профиль снят с основного потока после коммита Lab052, без использования профиля Lab051 в качестве основания оптимизации. Инструментированный проход: 7,774377 с, 240 настоящих и 15 ложных строгих проверок. Средняя настоящая проверка17,354 мс, медиана17,122 мс,p95=19,520 мс,max26,724 мс.

Затрата настоящего пакета Среднее, мс Сумма для 240 пакетов, с
Уточнение старта 4,508 1,082006
Фильтрация с подготовкой окна 3,250 0,779990
Timing 2,035 0,488404
CFO + фаза/диагностика, без двойного счёта вложенных вызовов 0,770 0,184774
Viterbi 5,700 1,367891
Настоящий пакет целиком 17,354 4,165062

40×17,354 мс = 694,177 мс обслуживания в секунду только на настоящие пакеты. Ложные проверки занимали около30 мс во всём инструментированном проходе. Общая децимация —1,388460 с, грубое обнаружение вместе с ней1,804805 с, дешёвая проверка Lab052 —0,428240 с. Отдельные shared PHY header calls профиля принадлежат генератору TX; в стоимость RX они не включены.

Историческая чистая база Lab052 остаётся 7,369795 с /6,044416 =1,219273. Время инструментированного профиля не подменяет эту базу.

Реализованные изменения

  1. Локальное уточнение вместо большого общего FFT для редких кандидатов. Сохранены исходная опорная преамбула, локальное вычитание среднего и диапазон ±2000 отсчётов. Общая корреляция Lab051 строила большой участок ради множества ложных кандидатов. После Lab052 такая работа стала дороже короткой локальной корреляции. Стоимость настоящего уточнения снизилась с4,508 до1,367 мс.
  2. Короткие локальные окна фильтрации. Общая RRC-фильтрация большого IQ-окна не выбрана для этой плотности кандидатов. Штатная свёртка выполняется для preamble/header и затем для тела принятой по заголовку длины. Средние локальных окон и нулевые края сохранены. Их нельзя без поправки заменить одним непрерывным фильтром: это меняет численный вход timing/оценки несущей.
  3. Зеркальный кольцевой IQ-буфер. Ранее дважды копировался почти весь удерживаемый участок: при добавлении блока и при отбрасывании начала. Теперь новый блок копируется в две половины кольца, а retained IQ и кандидаты читают непрерывные views, в том числе через стык. Старый участок не переносится. Следующая запись начинается после завершения всех jobs текущего блока.
  4. CPU-компиляция циклов soft Viterbi. NumPy вычисляет те же четыре метрики ветвей. Numba выполняет переходы и обратный проход по той же решётке, с тем же порядком сложения, сравнением one < zero и выбором ветви0 при tie. fastmath=False, nogil=True; старт/финиш0,64 состояния,хвост6 бит. Код R=1/2,K=7,171/133 octal,soft-decision не изменён. Группировка нескольких шагов trellis не применена: округлённые равенства могли бы изменить traceback.
  5. Частные зависимости строгого декодера. bind() связывает исходные code objects функций Lab045/046/043 с отдельным словарём констант и helpers. Нет exec/eval и подмены функций общих модулей во время обработки. Константы фиксированы для500ксимв/с, временные метрики кандидата находятся в ContextVar. Новый strict decoder не зависит от внешнего адаптера режима20ксимв/с.

Обнаружитель Lab052 не переписан: прежние coarse/split функции, пороги, полная ширина группы20480, максимум первым, альтернативы после FAIL и пропуск физического кадра только после CRC PASS. В основной последовательности снова 1675842 локальных пика,392785 кандидатов первого каскада,388407 дешёвых отказов, 384 группы,243 строгих представителя+12 альтернатив,240true/15false.

Один раз на IQ-блок вычисляются общая децимация с повторным использованием неизменного FIR-участка, перенос обнаружителя, грубая корреляция и две корреляции частей Lab052, накопительные энергии. Все кандидаты используют их общие результаты. Переносы локального строгого окна кешируются по длине; готовые векторы неизменяемы.

Timing, несущая и этапы заголовка/тела

Lab051 убрала медленную организацию поиска, но не диапазон1601 смещений. Lab053 сохраняет все прежние смещения от−800 до+800; новый узкий timing-gate не введён. Он не понадобился для выполнения целевого бюджета, а проверка корреляций частей Lab052 сама по себе не доказывает более узкую ошибку timing.

Декодирование по-прежнему двухэтапное. Сначала преамбула и PHY header; только после правильного заголовка и проверки длины запрашивается полное окно тела. Неверный header не вызывает Viterbi. После полного извлечения прежний анализатор повторно проверяет header, затем выполняет deinterleave,FEC,protocol parser,CRC.

CFO (частотная расстройка), фаза и полярность оцениваются только по преамбуле. Полезные биты тела для оценки не используются. Оценка повторена для полного окна, поскольку его локальная средняя составляющая отличается от probe. Результат затем один раз применяется ко всему извлечённому вектору символов. Слепая подмена этой оценки значениями probe и сужение timing не применены.

Сравнение всех240 принятых пакетов с Lab052, отдельно для1/2/4 работников:

  • последовательность всех255 строгих решений и отказов — одинаковая;
  • начало/конец, timing, полярность, PHY/CRC и все байты пакетов — одинаковые;
  • наибольшая разность CFO: 5,4867626531e−7 Гц;
  • наибольшая разность фазы: 4,6813191101e−9 рад;
  • наибольшая разность soft values: 6,7149294158e−7.

Последние разряды float не объявлены побитно одинаковыми: другое разбиение FFT меняет округление. Побитно совпадают результаты FEC/пакеты, timing и verdict. 45 слабых случаев Lab052 дали37/45 у обоих декодеров, без дополнительных потерь; 8 отказов обоих не объявляются успешным декодированием.

Профиль настоящего пакета после оптимизации

Данные выбранного paced-прохода. Каждая строка — сумма вызовов этой операции внутри одного настоящего пакета; вложенные затраты вычтены из родительских строк. Например, CFO отдельно от оставшейся фазовой обработки, Viterbi отдельно от тела.

Операция Среднее, мс Медиана, мс p95, мс Максимум, мс
Подготовка IQ views 0,0032 0,0030 0,0047 0,0076
Перенос частоты и локальная DC 0,2395 0,1955 0,3633 4,1497
Согласованная RRC-фильтрация 1,7115 1,6345 2,2153 2,7005
Уточнение кандидата 1,3675 1,3157 1,6683 2,4152
Timing 1,7848 1,7010 2,3002 4,2951
Оценка CFO 0,3591 0,3336 0,5189 0,7358
Фаза/полярность/преамбульная диагностика без CFO 0,3659 0,3321 0,5690 0,7817
Извлечение/нормировка soft symbols 0,2762 0,2556 0,3773 0,8008
PHY header, оба вызова 0,0591 0,0545 0,0867 0,2697
Подготовка тела без Viterbi/header/parser 0,4588 0,4268 0,6474 1,1569
Viterbi 0,2839 0,2710 0,3398 0,6717
Protocol/CRC parser 0,0074 0,0072 0,0088 0,0137
Обработка фрагмента после строгого verdict 0,0268 0,0264 0,0419 0,0504
Строгий пакет целиком, включая организационные затраты 7,0164 6,8617 8,2923 12,6110

Средняя стоимость с последующей обработкой фрагмента —7,0432 мс. Квантили строгой обработки и фрагмента не складываются. Для бюджета40 пакетов/с: 40×7,016407 мс =280,656 мс/с строгой работы одного работника; с фрагментами около281,728 мс/с. Длительность по perf_counter включает задержки планирования ОС и служит бюджетом обслуживания, а не точным числом активных тактов CPU.

Дополнительно записаны process_time и thread_time. Полный CPU процесса в выбранном paced-опыте3,234375 с. Thread-time на этой Windows квантуется по 15,625 мс: медиана отдельного короткого пакета получается0. Этот счётчик не используется для заявления «нулевой обработки» или пер-пакетных квантилей. Сырые измерения оставлены в JSON. Отдельный throughput-проход: CPU4,140625 с, wall4,010478 с; разные стадии действительно работают одновременно.

Разбиение полного времени A–J

Часть выбранного paced-опыта Время, с
A. Чтение IQ и подготовка входного кольца 0,345752
B. Общий front-end: децимация 1,371813
C. Грубое обнаружение без B 0,374433
D. Дешёвая проверка Lab052 0,428823
E. Строгая обработка настоящих пакетов без G 1,614029
F. Строгая обработка ложных кандидатов 0,043819
G. Viterbi и protocol/CRC 0,069909
H. Фрагменты/сборка объекта 0,006432
I. JPEG decode 0,006325
J. Проверка свежести после JPEG 0,000045
Прочая организация, кластеризация и инструментирование 0,123409
Сумма 4,384788

Чтение файла отдельно0,130580 с; подготовка кольца0,215171 с. Viterbi теперь занимает около1,55% этой суммы. Основные вычислительные затраты — общая FIR-децимация и timing/RRC/уточнение настоящих пакетов.

Конвейер, параллелизм и порядок

Конвейер имеет отдельные потоки источника IQ и сборки/JPEG output. Между ними работает RX с обнаружением и строгим декодированием. При2/4 работниках строгие представители групп поступают в ограниченный ThreadPool. IQ не копируется отдельно каждому работнику: им передаётся неизменяемый view общего кольца.

Это не полностью асинхронная пятиступенчатая архитектура: обнаружение следующего RX-блока ждёт завершения строгих jobs текущего. Такое ограничение сохраняет политику принятия и безопасное время повторного использования кольца. Источник и JPEG output в это время могут обрабатывать другие блоки/пакеты.

Результаты строгих jobs применяются в прежнем порядке групп/альтернатив. Раннее завершение не даёт права изменить accepted_until. Неиспользованные опережающие результаты отброшены и учтены отдельно; они не становятся пакетами. Все альтернативы также идут через pool — главный поток не создаёт скрытого дополнительного строгого работника. После ошибки ожидается завершение всех jobs, сохраняется первоначальная ошибка, затем освобождаются IQ и счётчики.

Строгих работников Полный throughput wall/RF Paced работа стадий/RF Fresh FPS Max age, мс IQ peak Candidate peak
1, выбран 0,663501 0,725428 5,0 176,062 5 1
2 0,689214 0,732485 5,0 176,126 6 2
4 0,676192 0,734393 5,0 189,207 7 2

Для2/4:271 опережающая проверка представителя,28 результатов затем пропущены по уже принятому кадру. Логических строгих проверок всё равно255, из них15false. Внутриблочного полезного параллелизма мало. Выбран один строгий работник; дополнительные workers не дали выигрыша в итоговом сравнении. multiprocessing не применялся. Существующий ObjectAssembler принимает фрагменты по индексам; отдельный тест подтверждает сборку при обратном порядке. Конвейер дополнительно сохраняет порядок подачи между изображениями в существующий ImageSink.

Свежесть и остаточная задержка

INPUT5fps,30 изображений; RECEIVED30, DISPLAYED30, FRESH DISPLAYED30, FRESH DISPLAY FPS=5. Возраст в выбранном paced-проходе: 150,298 /153,996 /176,062 мс (min/median/max). MAX_VIDEO_AGE остаётся200мс. Три повторения и оба варианта2/4workers уложились.

Восемь физических пакетов занимают92,256 мс IQ на JPEG. Медианное время от окончания последнего радиопакета JPEG до выдачи RX-пакета —61,284 мс (диапазон57,438–83,117мс). Последующая выдача JPEG —медиана0,309мс, max0,643мс. Здесь основной остаток задержки — bounded lookahead и ожидание/ обработка пачки IQ, а не JPEG decode. Lookahead289792 отсчёта=36,224мс, core-блок65536=8,192мс. Ошибка фактической подачи источником достигала15,830мс.

Запас бюджета по сумме работы стадий —27,46%; по отдельной пропускной способности —33,65%. Максимальный возраст выбранного короткого опыта имеет 23,94мс до предела. Это наблюдаемый запас на данном компьютере, не гарантия жёсткого реального времени при произвольной нагрузке ОС.

Камера и физический экран UNKNOWN. В неизменном формате фрагмента нет capture timestamp. Сопоставление с сохранённым временем создания источника делается после независимых PHY/CRC, сборки и JPEG decode. Оно не влияет на RX verdict. Получен программный критерий свежести в стенде, а не независимый аппаратный контроль возраста живой камеры.

Очереди, память и длинная сессия

Очередь IQ —8 блоков по65536 complex64, предел4МиБ. В выбранном paced-опыте пик5 блоков=2,5МиБ, в24-секундном —7. В throughput-опыте источник специально упирается в8 блоков и ждёт; это обратное давление конечного replay. В paced-опыте источник не замедляет свою временную шкалу: Full вызывает IQ_QUEUE_OVERFLOW и остановку сессии. Пропущенные участки IQ не склеиваются.

Очередь строгих jobs —4, выбранный пик1; для2/4worker пик2. Вместимость включает ожидающие и ещё не потреблённые результаты. Полный список дешёвых кандидатов ограничен размером одного IQ-окна и уничтожается после сканирования. Очередь выходных пакетов —16; переполнение также видно отдельным счётчиком. Все штатные итоговые проходы имеют IQ/candidate/output overflow=0.

Память Величина
Максимальный полезный retained IQ 3177728 байт =3,031МиБ
Реально выделенные две половины кольца 6797824 байта =6,483МиБ
Оценка временных рабочих буферов, включая кольцо/очереди 35224064 байта
Максимальный резерв кеша16 переносов для допустимых PHY lengths 36581376 байт
Резерв8 переносов обнаружителя 3398912 байт
Резерв констант/решётки 1048576 байт
Рабочие массивы с перечисленными резервами 76252928 байт =72,720МиБ
Измеренный RSS peak выбранного процесса 206778368 байт =197,199МиБ
RSS peak длинного опыта 208031744 байта =198,395МиБ

Оценка массивов — инженерный резерв, не универсальная верхняя граница временных C/SciPy/LLVM-аллокаций. RSS включает весь Python, NumPy/SciPy, Numba/LLVM, аллокатор и диагностические результаты опыта. Это разные показатели, их нельзя складывать. Резерв rotation-cache рассчитан для максимального допустимого кадра285792 отсчёта, а не только для размера основного JPEG-пакета.

Длинный источник:120 изображений,960 физических пакетов,24,044416с IQ, 1538842624байта на диске. Изображения C повторены по содержимому с новыми ID; радиокадры формируются заново, шум продолжается с тем же воспроизводимым seed. Все960/960 и120/120 точных JPEG приняты. Fresh FPS=5; возраст 149,337 /155,733 /189,396мс. Работа стадий17,861142с,ratio0,742840. Медианы первой/второй половины155,662 /156,001мс: накопления задержки не видно.

Retained IQ в контрольных точках2653440байт, candidate jobs после блока0, очереди не выходят за предел. Поздний RSS197709824–201424896байт, без монотонного накопления; линейная оценка на последней половине+105078байт/с на фоне колебаний. Конечный опыт не доказывает абсолютно нулевой долгосрочный дрейф RSS. Массивы/кеши/очереди RX имеют явные пределы; история строк измерений принадлежит внешнему эксперименту. После close retained IQ/decimator/ring=0, pending jobs=0, все потоки завершены.

Неуспешные варианты и исправления

  • Только локальные окна:240/240,30/30, но ratio1,108 и fresh FPS0.
  • Добавление кольца без JIT в ранней событийной оценке:ratio0,931,fresh FPS4,5.
  • Фактический paced-конвейер без JIT:IQ queue overflow1,239 пакетов,29 JPEG, fresh FPS3,667. Его ratio не считается результатом полного потока.
  • Искусственная задержка20мс на блок:IQ queue peak8,overflow1,явный STOP, состояние освобождено. Это проверка отказа, не throughput PASS.
  • Первый общий runner ошибочно сопоставлял ID JPEG с нуля вместо единицы. Отрицательные SHA-сравнения были ошибкой внешней диагностики; lookup исправлен до итоговых paced/throughput серий. Итоговые JSON заново получены целиком.
  • Adversary воспроизвёл early exception, при котором ожидание оставшихся futures прекращалось после второй ошибки. Исправлено ожидание всех jobs с сохранением первой ошибки; повторный сценарий подтвердил0 активных workers и closed=True.
  • Verifier воспроизвёл третье параллельное decode приworkers2. Альтернативы переведены в тот же пул; прежний вход теперь имеетpeak_active2.
  • Missing/empty source раньше теряли отчёт из-за повторного stat или деления на0 после cleanup. Теперь возвращаются SOURCE_EXCEPTION/EMPTY_IQ_SOURCE, ratio=None и освобождённое состояние. Оба сценария повторены adversary.

CPU-зависимости и GPU

GPU=NOT USED. После локальных вычислений и CPU-JIT цель выполнена. Общая децимация остаётся заметной, однако стоимость запусков/переносов GPU для блоков по64К отсчётов не измерялась; убедительного прогноза полного выигрыша нет. Не выполнялись GPU-инвентаризация, CUDA-опыты или автоматический multiprocessing.

Numba0.61.2 и llvmlite0.44.0 установлены локально в .lab053_cpu_runtime/packages; системное окружение не изменено. Пакеты закреплены в requirements-lab053-cpu.txt; SHA wheel-файлов сохранены. Поддержка Python3.13 и NumPy2.2 указана в официальной таблице Numba. nogil и fastmath — параметры CPU JIT.

Первый отдельный прогрев занял1,221810с; прогрев с дисковым кешем выбранного процесса0,151137с. Он выполнен до начала приёма IQ, отдельно от основного таймера. Импорт библиотек также относится к запуску процесса. Без доступного Numba предусмотрен прежний NumPy decoder, но целевые результаты требуют CPU-JIT; их нельзя переносить на fallback без отдельного измерения.

Первоначальная установка pip перенесла каталоги с правами временной папки. Изменение ACL было отклонено автоматической проверкой и не выполнялось. Официальные wheel-файлы распакованы обычным sandbox в новый доступный каталог. Старая локальная попытка установки, wheel и JIT-кеши не добавляются в Git.

Проверки и воспроизведение

50 целевых тестов проверяют побитную эквивалентность Viterbi на шуме, ties, больших значениях и допустимых длинах; валидацию входов; timing на всём диапазоне; CFO/фазу/PHY/CRC, в том числе намеренно испорченную CRC; запрет тела до header; параллельные verdict, обратный порядок фрагментов, стыки кольца, bounded queues, реальное переполнение, исключения и предел работников. Оба независимых проверяющих подтвердили закрытие своих воспроизведённых находок.

Старая15-секундная запись Lab047 обработана штатным Lab048:36/36фрагментов, CRC PASS,JPEG320×240/8724байта SHA MATCH,19ошибок доFEC,0после,0байтовых. SHA:e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a. Обработка14,147788с. Код20ксимв/с и весь protocol не изменялись.

Полный pytest: 768 passed за 77,81 с, одно предупреждение о недоступном .pytest_cache; проваленных тестов нет. Численные критерии, SHA исходного IQ и поведение при принудительном переполнении пересчитываются в acceptance.json. Финальный quick_gate PASS: 768 тестов, 26 функциональных проверок, 13 штатных пропусков. Все 20 критериев acceptance PASS; git diff --check PASS, концевых пробелов в новых исходниках и отчёте нет. Verifier и adversary независимо пересчитали свежесть, медианный выбор, память и границы отрицательных опытов; остаточных воспроизведённых дефектов нет. Индекс Git пуст.

python -m pip install -r requirements-lab053-cpu.txt
# Команда установки нужна для нового обычного расчётного окружения.
# В текущем workspace пакеты уже доступны в .lab053_cpu_runtime/packages.
python experiments/lab053_viterbi.py
python experiments/lab053_receiver_profile.py --stage profile
python experiments/lab053_receiver_profile.py --stage source
python experiments/lab053_pipeline.py --workers 1 --unpaced --name throughput_1_repeat_1.json
python experiments/lab053_pipeline.py --workers 1 --name paced_1_repeat_1.json
# Аналогично repeat_2/repeat_3; сравнение --workers 2 и --workers 4.
python experiments/lab053_receiver_profile.py --stage source --frames 120
python experiments/lab053_pipeline.py --frames 120 --source data/raw/lab053/source_120.c64 --name long_stream.json
python experiments/lab053_regression.py --stage equivalence
python experiments/lab053_regression.py --stage sensitivity
python experiments/lab053_pipeline.py --numpy-viterbi --name without_jit_paced.json
python experiments/lab053_pipeline.py --processing-delay 0.02 --name overflow_probe.json
python experiments/lab053_receiver_profile.py --stage report
python tools/quick_gate.py
python -m pytest tests/ -q
git diff --check

Lab048 воспроизводится командой с --run-saved-capture, исходным C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747\rx_stream.cs8, его independent_result.json,--tx-image data/processed/lab047/tx_image.jpg и --output-directory data/processed/lab053/regression20k.

Основные файлы: профиль/сводка, строгие вычисления, потоковый RX, Viterbi, конвейер, регрессии, тесты, основной поток, пропускная способность, память, критерии, график.

Lab053 git add/commit иpush не выполнялись. BPSK,Fs,Rs,SPS,PRBS7,PHY,FEC,CRC, формат фрагментов и candidate policy сохранены. RF TX=0. Следующий этап — рассмотрение программных результатов ChatGPT. QPSK,180МГц,новый FEC, аппаратные500ксимв/с и RF не разрешены. STOP.