188 lines
6.9 KiB
Markdown
188 lines
6.9 KiB
Markdown
# RFG STM32 ADC Receiver GUI
|
||
|
||
Реалтайм-плоттер для визуализации данных FMCW радара, получаемых через виртуальный COM-порт от STM32 ADC.
|
||
|
||
## Описание
|
||
|
||
Приложение визуализирует данные в реальном времени, отображая 6 синхронизированных графиков:
|
||
|
||
1. **Сырые данные** - график последнего полученного свипа
|
||
2. **Водопад сырых данных** - временная серия последних N свипов
|
||
3. **FFT спектр** - спектр текущего свипа в частотной области
|
||
4. **B-scan** - спектрограмма (водопад FFT)
|
||
5. **Фаза спектра** - развернутая фаза для анализа расстояния
|
||
6. **Водопад фазы** - временная эволюция фазы
|
||
|
||
## Возможности
|
||
|
||
- ✅ Высокопроизводительная визуализация в реальном времени
|
||
- ✅ Два бэкенда визуализации: matplotlib (совместимость) и pyqtgraph (скорость)
|
||
- ✅ Автоматическая обработка фазы для FMCW радара
|
||
- ✅ Преобразование фазы в расстояние
|
||
- ✅ Поддержка pyserial или raw TTY доступа
|
||
- ✅ Заполнение пропущенных точек (режим --fancy)
|
||
- ✅ Инверсия сигнала при отрицательном уровне
|
||
- ✅ Диагностика потерь данных
|
||
|
||
## Установка
|
||
|
||
### Минимальные требования
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### Зависимости
|
||
|
||
**Обязательные:**
|
||
- `numpy` - обработка массивов и FFT
|
||
- `matplotlib` - визуализация
|
||
|
||
**Опциональные (рекомендуется):**
|
||
- `pyserial` - доступ к serial порту (обязательно для Windows)
|
||
- `pyqtgraph` + `PyQt5` или `PySide6` - быстрый бэкенд визуализации
|
||
|
||
## Использование
|
||
|
||
### Базовый запуск
|
||
|
||
```bash
|
||
python -m rfg_adc_plotter.cli /dev/ttyACM0
|
||
```
|
||
|
||
### С параметрами
|
||
|
||
```bash
|
||
python -m rfg_adc_plotter.cli /dev/ttyACM0 \
|
||
--baud 115200 \
|
||
--max-sweeps 200 \
|
||
--max-fps 30 \
|
||
--backend pg \
|
||
--fancy
|
||
```
|
||
|
||
### Параметры командной строки
|
||
|
||
- `port` - путь к порту (например `/dev/ttyACM0`, `COM3`)
|
||
- `--baud` - скорость порта (по умолчанию 115200)
|
||
- `--max-sweeps` - количество свипов в водопаде (по умолчанию 200)
|
||
- `--max-fps` - ограничение частоты отрисовки (по умолчанию 30)
|
||
- `--cmap` - цветовая карта для водопадов (по умолчанию viridis)
|
||
- `--spec-clip` - процентильная обрезка контраста B-scan (по умолчанию 2,98)
|
||
- `--title` - заголовок окна (по умолчанию "ADC Sweeps")
|
||
- `--fancy` - заполнение пропущенных точек средними значениями
|
||
- `--ylim` - фиксированные пределы по Y (формат: min,max)
|
||
- `--backend` - бэкенд визуализации:
|
||
- `auto` - автоматический выбор (сначала pyqtgraph, fallback на matplotlib)
|
||
- `pg` - pyqtgraph (быстрее)
|
||
- `mpl` - matplotlib (совместимее)
|
||
|
||
## Формат данных
|
||
|
||
Приложение ожидает текстовые строки через serial порт:
|
||
|
||
```
|
||
Sweep_start
|
||
s 0 1234
|
||
s 1 1256
|
||
s 2 1278
|
||
...
|
||
Sweep_start
|
||
s 0 1235
|
||
...
|
||
```
|
||
|
||
- `Sweep_start` - начало нового свипа
|
||
- `s X Y` - точка данных (индекс X, значение Y), целые числа со знаком
|
||
|
||
## Архитектура проекта
|
||
|
||
```
|
||
rfg_adc_plotter/
|
||
├── __init__.py
|
||
├── config.py # Константы и типы
|
||
├── cli.py # Точка входа CLI
|
||
├── data_acquisition/
|
||
│ ├── __init__.py
|
||
│ ├── serial_io.py # Serial порт I/O
|
||
│ └── sweep_reader.py # Фоновый поток чтения данных
|
||
├── signal_processing/
|
||
│ ├── __init__.py
|
||
│ └── phase_analysis.py # Обработка фазы
|
||
├── visualization/
|
||
│ ├── __init__.py
|
||
│ ├── matplotlib_backend.py # Matplotlib визуализация
|
||
│ └── pyqtgraph_backend.py # PyQtGraph визуализация
|
||
└── utils/
|
||
├── __init__.py
|
||
└── formatting.py # Утилиты форматирования
|
||
```
|
||
|
||
## Технические особенности
|
||
|
||
### Оптимизации производительности
|
||
|
||
- Фоновый поток для чтения и парсинга данных
|
||
- Векторизованные numpy операции
|
||
- Кольцевые буферы для водопадов
|
||
- Неблокирующее чтение из serial порта
|
||
- Буферизация с увеличенным размером (256KB)
|
||
|
||
### Обработка сигналов
|
||
|
||
- **FFT анализ**: окно Хэннинга, длина 1024
|
||
- **Phase unwrapping**: адаптивный алгоритм с порогом 0.8π
|
||
- **Преобразование фазы в расстояние**: формула Δl = φ × c / (4π × ν)
|
||
- **Инверсия сигнала**: автоматическая при среднем уровне < порога
|
||
|
||
### Диагностика
|
||
|
||
Каждые 10 секунд в stderr выводится диагностическая информация:
|
||
- Номер свипа
|
||
- Среднее количество валидных точек
|
||
- Количество принятых строк
|
||
- Ошибки парсинга
|
||
- Ошибки чтения
|
||
- Размер буфера
|
||
- Потерянные свипы
|
||
|
||
## Примеры использования
|
||
|
||
### Linux с pyserial
|
||
|
||
```bash
|
||
python -m rfg_adc_plotter.cli /dev/ttyACM0 --backend pg
|
||
```
|
||
|
||
### Linux с raw TTY (без pyserial)
|
||
|
||
```bash
|
||
python -m rfg_adc_plotter.cli /dev/ttyACM0 --backend mpl
|
||
```
|
||
|
||
### Windows
|
||
|
||
```bash
|
||
python -m rfg_adc_plotter.cli COM3 --backend pg --baud 115200
|
||
```
|
||
|
||
### С высоким разрешением времени
|
||
|
||
```bash
|
||
python -m rfg_adc_plotter.cli /dev/ttyACM0 --max-sweeps 500 --max-fps 60
|
||
```
|
||
|
||
### С заполнением пропусков и фиксированным Y
|
||
|
||
```bash
|
||
python -m rfg_adc_plotter.cli /dev/ttyACM0 --fancy --ylim -2000,2000
|
||
```
|
||
|
||
## Лицензия
|
||
|
||
См. LICENSE файл в корне проекта.
|
||
|
||
## Авторы
|
||
|
||
Разработано для визуализации данных FMCW радара с STM32 ADC.
|