|
| 1 | +# Трекинг: комплексные и целочисленные фильтры для IQ-потоков |
| 2 | + |
| 3 | +## Цель |
| 4 | +Реализовать полноценную линейку IQ-фильтров для: |
| 5 | +- комплексных потоков |
| 6 | +- целочисленных потоков формата HackRF One (interleaved int8 I/Q) |
| 7 | +- целочисленных потоков формата USRP B210 (interleaved int16 little-endian I/Q) |
| 8 | + |
| 9 | +С обязательным повторением существующей методики: |
| 10 | +- расчёт коэффициентов (как в текущих FIR/IIR/семействах Butterworth/Chebyshev/Elliptic) |
| 11 | +- структура API фильтров |
| 12 | +- система модульных тестов и проверок устойчивости |
| 13 | + |
| 14 | +## Ключевой принцип внедрения |
| 15 | +Каждый этап должен давать сразу используемый результат (не ждать окончания всей программы работ). |
| 16 | + |
| 17 | +## Область покрытия |
| 18 | +- FIR |
| 19 | +- IIR (включая SOS там, где применимо) |
| 20 | +- Билдеры/спецификации для расчёта коэффициентов |
| 21 | +- Потоковые API (Span/Stream + async) |
| 22 | +- Набор тестов (корректность, стабильность, совместимость форматов) |
| 23 | + |
| 24 | +## Соглашения по форматам |
| 25 | +- HackRF One: interleaved int8, порядок байт I,Q,I,Q... |
| 26 | +- USRP B210: interleaved int16 LE, порядок I,Q,I,Q... |
| 27 | +- Для целочисленных API обязательны: |
| 28 | + - saturating clamp |
| 29 | + - явно документированная политика округления |
| 30 | + - контроль переполнений и формата входа |
| 31 | + |
| 32 | +## Этапы |
| 33 | + |
| 34 | +### Этап 0: Контракт и базовые типы данных (MVP foundation) |
| 35 | +Статус: Planned |
| 36 | + |
| 37 | +Результат этапа: |
| 38 | +- Общие контракты для IQ-фильтров (процессинг одного отсчёта, блока, потока) |
| 39 | +- Типы/адаптеры для complex/int8/int16 IQ-представления |
| 40 | +- Единая политика преобразований int <-> double/complex |
| 41 | + |
| 42 | +Задачи: |
| 43 | +- Ввести интерфейсы (например, IIqFilter<TSample>) без ломки текущего API |
| 44 | +- Зафиксировать соглашения по формату буферов HackRF/B210 |
| 45 | +- Добавить вспомогательные конвертеры interleaved <-> sample/span |
| 46 | + |
| 47 | +Критерии готовности: |
| 48 | +- Есть минимальный API для обработки блока IQ-данных трёх типов |
| 49 | +- Есть тесты на конвертацию форматов и граничные случаи буферов |
| 50 | + |
| 51 | +Используемость после этапа: |
| 52 | +- Можно строить пайплайн с уже единым форматом входа/выхода |
| 53 | + |
| 54 | +--- |
| 55 | + |
| 56 | +### Этап 1: Комплексный FIR для IQ (первый рабочий фильтр) |
| 57 | +Статус: Planned |
| 58 | + |
| 59 | +Результат этапа: |
| 60 | +- FIR для Complex IQ-потока |
| 61 | +- Поддержка IEnumerable/Span/Stream(опционально) |
| 62 | + |
| 63 | +Задачи: |
| 64 | +- Реализовать ComplexFIR с состоянием |
| 65 | +- Добавить FrequencyResponse и поведение Reset |
| 66 | +- Проверить совпадение с референсом (double FIR на I и Q по отдельности) |
| 67 | + |
| 68 | +Критерии готовности: |
| 69 | +- Точность тестов в рамках заданного eps |
| 70 | +- Нет аллокаций в hot path для Span API |
| 71 | + |
| 72 | +Используемость после этапа: |
| 73 | +- Можно сразу фильтровать комплексный IQ в реальных задачах |
| 74 | + |
| 75 | +--- |
| 76 | + |
| 77 | +### Этап 2: Комплексный IIR для IQ + SOS |
| 78 | +Статус: Planned |
| 79 | + |
| 80 | +Результат этапа: |
| 81 | +- IIR для Complex IQ-потока |
| 82 | +- SOS-путь для высоких порядков (аналогично текущему IIR) |
| 83 | + |
| 84 | +Задачи: |
| 85 | +- Реализовать ComplexIIR (direct form + SOS) |
| 86 | +- Повторить методику валидации секций и коэффициентов |
| 87 | +- Сверить выход с референсом (раздельная фильтрация I/Q в double) |
| 88 | + |
| 89 | +Критерии готовности: |
| 90 | +- Устойчивость на длинных прогонах |
| 91 | +- Совпадение амплитудно-частотных и фазовых характеристик с допуском |
| 92 | + |
| 93 | +Используемость после этапа: |
| 94 | +- Комплексные IIR фильтры готовы для production-пайплайнов |
| 95 | + |
| 96 | +--- |
| 97 | + |
| 98 | +### Этап 3: Целочисленные FIR/IIR для HackRF One (int8) |
| 99 | +Статус: In progress (частично) |
| 100 | + |
| 101 | +Результат этапа: |
| 102 | +- int8 interleaved IQ фильтрация FIR/IIR |
| 103 | +- in-place и out-of-place блоковые методы |
| 104 | +- stream/sync/async API |
| 105 | + |
| 106 | +Задачи: |
| 107 | +- Довести FIR-покрытие до паритета с IIR |
| 108 | +- Унифицировать состояние и поведение ошибок |
| 109 | +- Документировать политику квантования и клиппинга |
| 110 | + |
| 111 | +Критерии готовности: |
| 112 | +- Полный набор тестов для int8 |
| 113 | +- Совпадение с complex/double референсом после квантования |
| 114 | + |
| 115 | +Используемость после этапа: |
| 116 | +- Готовый путь для HackRF RX/TX в raw-буферах |
| 117 | + |
| 118 | +--- |
| 119 | + |
| 120 | +### Этап 4: Целочисленные FIR/IIR для USRP B210 (int16) |
| 121 | +Статус: Planned |
| 122 | + |
| 123 | +Результат этапа: |
| 124 | +- int16 LE interleaved IQ фильтрация FIR/IIR |
| 125 | +- API аналогичный HackRF ветке |
| 126 | + |
| 127 | +Задачи: |
| 128 | +- Реализовать обработку int16 LE без лишних копирований |
| 129 | +- Добавить in-place/out-of-place и stream/sync/async |
| 130 | +- Проверить корректность endian и знакового диапазона |
| 131 | + |
| 132 | +Критерии готовности: |
| 133 | +- Проход тестов совместимости формата B210 |
| 134 | +- Совпадение с reференсом на эталонных наборах |
| 135 | + |
| 136 | +Используемость после этапа: |
| 137 | +- Готовая интеграция в пайплайн USRP B210 |
| 138 | + |
| 139 | +--- |
| 140 | + |
| 141 | +### Этап 5: Расчёт коэффициентов для IQ-линейки (паритет с текущими фильтрами) |
| 142 | +Статус: Planned |
| 143 | + |
| 144 | +Результат этапа: |
| 145 | +- Повторена вся методика расчёта коэффициентов для IQ-линейки |
| 146 | +- Билдеры/спецификации возвращают варианты для complex/int8/int16 обработки |
| 147 | + |
| 148 | +Задачи: |
| 149 | +- Переиспользовать текущие формулы и билдеры, не дублируя логику |
| 150 | +- Добавить фабрики/адаптеры для целевого типа потока |
| 151 | +- Ввести проверку соответствия коэффициентов между ветками |
| 152 | + |
| 153 | +Критерии готовности: |
| 154 | +- Для каждого семейства фильтров коэффициенты совпадают с базовой веткой |
| 155 | +- Тесты регрессии на коэффициенты стабильны |
| 156 | + |
| 157 | +Используемость после этапа: |
| 158 | +- Полноценный расчёт и создание нужного IQ-фильтра из одного DSL |
| 159 | + |
| 160 | +--- |
| 161 | + |
| 162 | +### Этап 6: Полная тестовая матрица и регрессия |
| 163 | +Статус: Planned |
| 164 | + |
| 165 | +Результат этапа: |
| 166 | +- Единая система модульных тестов для всех представлений сигнала |
| 167 | + |
| 168 | +Подсистемы тестирования: |
| 169 | +- Unit: корректность Process/Reset/State |
| 170 | +- Golden vectors: фиксированные входы/выходы |
| 171 | +- Property-based: инварианты (линейность, нулевая реакция, boundedness) |
| 172 | +- Stability/long-run: длинные последовательности, дрейф и overflow |
| 173 | +- Format tests: interleaved/endianness/odd-length/partial-read |
| 174 | +- Cross-check: complex vs double(I/Q), int vs quantized reference |
| 175 | + |
| 176 | +Критерии готовности: |
| 177 | +- Покрытие критичных веток не ниже целевого порога |
| 178 | +- Отсутствие флаки-тестов |
| 179 | +- Отдельные профили тестов: fast/extended |
| 180 | + |
| 181 | +Используемость после этапа: |
| 182 | +- Надёжная база для дальнейшего развития и рефакторинга |
| 183 | + |
| 184 | +## Декомпозиция по релизам (предлагаемый порядок) |
| 185 | +1. R1: Этап 0 + Этап 1 |
| 186 | +2. R2: Этап 2 |
| 187 | +3. R3: Этап 3 (доведение до полного паритета) |
| 188 | +4. R4: Этап 4 |
| 189 | +5. R5: Этап 5 + Этап 6 |
| 190 | + |
| 191 | +## Технические риски и меры |
| 192 | +- Риск: расхождение результатов между complex и int ветками |
| 193 | + - Мера: единый reference pipeline + golden vectors |
| 194 | +- Риск: нестабильность IIR высоких порядков |
| 195 | + - Мера: обязательный SOS путь и long-run тесты |
| 196 | +- Риск: overhead от конвертаций |
| 197 | + - Мера: Span/in-place API и профилирование hot path |
| 198 | +- Риск: ошибки формата USRP LE |
| 199 | + - Мера: отдельный набор тестов на endian/знак/границы |
| 200 | + |
| 201 | +## Definition of Done (для каждого этапа) |
| 202 | +- Реализован API и минимум один рабочий сценарий использования |
| 203 | +- Добавлены и проходят модульные тесты этапа |
| 204 | +- Обновлена документация с примерами |
| 205 | +- Нет регрессий в уже реализованных этапах |
| 206 | + |
| 207 | +## Трекер задач (чеклист) |
| 208 | +- [ ] Этап 0: контракты и базовые адаптеры |
| 209 | +- [ ] Этап 1: Complex FIR |
| 210 | +- [ ] Этап 2: Complex IIR + SOS |
| 211 | +- [ ] Этап 3: HackRF int8 FIR/IIR (паритет) |
| 212 | +- [ ] Этап 4: USRP B210 int16 FIR/IIR |
| 213 | +- [ ] Этап 5: коэффициенты/билдеры IQ-линейки |
| 214 | +- [ ] Этап 6: полная тестовая матрица |
| 215 | + |
| 216 | +## Примечание по текущему состоянию |
| 217 | +Уже реализованы части этапа 3 для IIR (включая interleaved, stream sync/async). Нужно довести FIR-паритет и встроить в общий трек этапов 0/5/6. |
0 commit comments