Files
go-service/SDR/README.md
2026-06-03 14:36:15 +03:00

321 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OFDM Radio Link — PlutoSDR
Система цифровой радиосвязи на базе PlutoSDR с использованием OFDM-модуляции и помехоустойчивого кодирования Рида-Соломона RS(255,223).
## Оглавление
- [Возможности](#возможности)
- [Требования](#требования)
- [Структура проекта](#структура-проекта)
- [Быстрый старт](#быстрый-старт)
- [Сборка](#сборка)
- [Использование](#использование)
- [Параметры командной строки](#параметры-командной-строки)
- [Формат кадра](#формат-кадра)
- [Диагностика](#диагностика)
- [Устранение неполадок](#устранение-неполадок)
- [Лицензия](#лицензия)
## Возможности
- **OFDM-модуляция**: 64 поднесущих, циклический префикс 16, сглаживающее окно 4
- **Помехоустойчивое кодирование**: Рида-Соломона RS(255,223) с CRC32
- **Частотная коррекция**: адаптивная компенсация CFO через NCO с экспоненциальным фильтром (α=0.95)
- **Ручное управление усилением**: фиксированное усиление для максимальной стабильности
- **Потоковая передача**: работа через stdin/stdout для конвейерной обработки
- **Мониторинг в реальном времени**: RSSI, EVM, CFO, статистика кадров
- **Гибкая настройка**: частота, полоса, усиление, амплитуда, паузы между кадрами
## Требования
### Аппаратное обеспечение
- 2× PlutoSDR (один на передачу, один на приём) или 1× для тестирования в петле
- Raspberry Pi (рекомендуется) или любой Linux-компьютер
- Антенны/аттенюаторы для RF-тракта
### Программное обеспечение
```bash
# Установка зависимостей
sudo apt update
sudo apt install -y build-essential python3 cmake libfftw3-dev
# libiio (для работы с PlutoSDR)
sudo apt install -y libiio-dev
# liquid-dsp (OFDM и FEC)
git clone https://github.com/jgaeddert/liquid-dsp.git
cd liquid-dsp
./bootstrap.sh
./configure
make -j4
sudo make install
sudo ldconfig
```
## Структура проекта
```
pluto/
├── common.h # Общие определения и прототипы
├── common.c # Реализация общих функций
├── transmitter.c # Передатчик
├── receiver.c # Приёмник с частотной коррекцией
├── Makefile # Система сборки
├── README.md # Этот файл
└── test_input.bin # Тестовый файл (создаётся make test)
```
## Быстрый старт
```bash
# 1. Сборка
make
# 2. Создание тестового файла (1 МБ)
make test
# 3. Запуск приёмника (на одном устройстве)
./receiver -f 1265000000 -r 3840000 -b 2000000 -c rs8 > output.bin
# 4. Запуск передатчика (на другом устройстве)
cat test_input.bin | ./transmitter -f 1265000000 -r 3840000 -b 2000000 -g -20 -a 0.3 -c rs8
# 5. Проверка результата
md5sum test_input.bin output.bin
```
## Сборка
```bash
# Сборка всего проекта
make
# Сборка только передатчика (если есть transmitter.c)
make transmitter
# Сборка только приёмника (если есть receiver.c)
make receiver
# Создание тестового файла 1 МБ
make test
# Очистка
make clean
# Справка
make help
```
**Флаги компиляции:**
- `-Wall -O2` — все предупреждения и оптимизация
- `-liio` — библиотека libiio для PlutoSDR
- `-lliquid` — liquid-dsp (OFDM, FEC, NCO)
- `-lfftw3f` — FFTW для преобразований Фурье
- `-lm -lpthread` — математика и потоки
## Использование
### Передатчик
```bash
# Базовая передача тестового файла
cat test_input.bin | ./transmitter -f 1265000000 -r 3840000 -b 2000000 -c rs8
# Передача случайных данных
cat /dev/urandom | ./transmitter -f 1265000000 -r 3840000 -b 2000000 -g -20 -a 0.3
# Высокоскоростная передача без пауз
cat data.bin | ./transmitter -f 2400000000 -r 7680000 -b 6000000 -g 0 -a 0.5 -p 0
# Передача текста
echo "Hello, OFDM World!" | ./transmitter -f 1265000000 -r 3840000 -b 2000000
```
### Приёмник
```bash
# Базовый приём с декодированием FEC
./receiver -f 1265000000 -r 3840000 -b 2000000 -c rs8 > output.bin
# Приём без FEC (выше скорость, но нет исправления ошибок)
./receiver -f 1265000000 -r 3840000 -b 2000000 -c none > output.bin
# Приём с сохранением лога статистики
./receiver -f 1265000000 -r 3840000 -b 2000000 -c rs8 > output.bin 2> stats.log
# Мониторинг статистики в реальном времени
watch -n 1 'tail -1 stats.log'
```
### Тестирование на одном устройстве (петля)
```bash
# Терминал 1: Приёмник
./receiver -f 2400000000 -r 3840000 -b 2000000 -c rs8 > output.bin
# Терминал 2: Передатчик
cat test_input.bin | ./transmitter -f 2400000000 -r 3840000 -b 2000000 -g -40 -c rs8
```
## Параметры командной строки
### Общие параметры (для TX и RX)
| Параметр | Описание | По умолчанию |
|----------|----------|--------------|
| `-f ЧАСТОТА` | Несущая частота в Гц | 1265000000 (1265 МГц) |
| `-r СКОРОСТЬ` | Частота дискретизации в Гц | 3840000 (3.84 МГц) |
| `-b ПОЛОСА` | Полоса пропускания в Гц | 3000000 (3 МГц) |
| `-u URI` | Адрес PlutoSDR | ip:192.168.2.1 (RX) / ip:192.168.3.1 (TX) |
| `-c РЕЖИМ` | FEC: `rs8` или `none` | rs8 |
| `-h` | Показать справку | — |
### Специфичные параметры передатчика
| Параметр | Описание | По умолчанию |
|----------|----------|--------------|
| `-g УСИЛЕНИЕ` | Усиление TX в дБ | -30.0 |
| `-a АМПЛИТУДА` | Амплитуда сигнала (0..1) | 0.2 |
| `-p ПАУЗА` | Пауза между кадрами в мкс | 2000 |
### Специфичные параметры приёмника
| Параметр | Значение | Примечание |
|----------|----------|------------|
| Усиление | 50 дБ | Фиксированное, ручной режим |
| CFO фильтр | α=0.95 | Экспоненциальное сглаживание |
## Формат кадра
```
┌─────────────────────────────────────────────────────────────────┐
│ OFDM КАДР │
├──────────┬──────────────────────────────────────────────────────┤
│ Заголовок│ Полезная нагрузка │
│ 12 байт │ до 1024 байт │
└──────────┴──────────────────────────────────────────────────────┘
Заголовок (12 байт):
┌───────┬───────┬──────────────────┬───────────────┬───────────────┬──────────────┬──────────┐
│ Байты │ 0-1 │ 2-5 │ 6-7 │ 8-9 │ 10 │ 11 │
├───────┼───────┼──────────────────┼───────────────┼───────────────┼──────────────┼──────────┤
│ Знач. │ 0xF0 │ Порядковый номер │ Длина исходных│ Кол-во блоков │ Последний │ Резерв │
│ │ 0xAA │ кадра (32 бита) │ данных (16 бит)│ FEC (16 бит) │ блок RS │ │
└───────┴───────┴──────────────────┴───────────────┴───────────────┴──────────────┴──────────┘
```
## Диагностика
### Вывод приёмника в реальном времени
```
Кадры | Загол. | CRC | RS испр | Вывод | RSSI | EVM | CFO
--------+--------+------+---------+--------+-------+-------+----------
1234 | 1200 | 1180 | 15 | 1195 | -45 | 2.3 | 0.0015
```
**Расшифровка:**
- **Кадры** — всего обнаружено кадров синхронизатором
- **Загол.** — количество корректно декодированных заголовков
- **CRC** — кадры с корректной контрольной суммой
- **RS испр** — кадры, исправленные кодом Рида-Соломона
- **Вывод** — успешно выведено кадров в stdout
- **RSSI** — уровень сигнала в дБм (чем ближе к 0, тем лучше)
- **EVM** — вектор ошибки в % (чем меньше, тем лучше)
- **CFO** — оценка частотного сдвига в рад/семпл
### Итоговая статистика
```
═══════════════════════════════════════════════════
ПРИЁМ ЗАВЕРШЁН
═══════════════════════════════════════════════════
Обнаружено кадров: 1024
Корректных заголовков: 1024 (100.0%)
Корректных CRC: 1024 (100.0%)
Исправлено RS: 0
Успешно выведено: 1024 кадров
Всего принято данных: 1048576 байт (1.00 МБ)
Финальная оценка CFO: 0.0012 рад/семпл
═══════════════════════════════════════════════════
```
## Устранение неполадок
### Ошибка подключения к PlutoSDR
```bash
# Проверка подключения
iio_info -s
# Пинг устройства
ping 192.168.2.1
# Проверка интерфейса
ifconfig eth1
```
### Нет приёма сигнала
1. **Проверьте частоту** — убедитесь, что TX и RX на одной частоте
2. **Увеличьте усиление TX** — попробуйте `-g 0` вместо `-g -30`
3. **Уменьшите расстояние** — или используйте проводное соединение
4. **Проверьте антенны** — убедитесь, что они подключены к правильным портам
5. **Используйте петлю** — подключите TX напрямую к RX через аттенюатор 30-40 дБ
### Высокий EVM / много ошибок
1. **Уменьшите полосу**`-b 1500000` вместо `-b 3000000`
2. **Увеличьте усиление RX** — отредактируйте `RX_GAIN` в `receiver.c`
3. **Добавьте паузы**`-p 5000` для стабилизации
4. **Уменьшите амплитуду TX**`-a 0.15` для снижения искажений
5. **Проверьте CFO** — значение > 0.1 требует настройки частоты
### Ошибка сегментирования (Segmentation Fault)
1. **Проверьте версию liquid-dsp** — требуется >= 1.3.0
2. **Пересоберите с отладкой**:
```bash
gcc -g -O0 -o receiver_debug receiver.c common.c -liio -lliquid -lfftw3f -lm -lpthread
gdb ./receiver_debug
run -f 1265000000 -r 3840000 -b 2000000 -c rs8
bt
```
3. **Проверьте права доступа к USB**:
```bash
sudo chmod 666 /dev/iio*
```
### Предупреждения компиляции
Предупреждения типа `-Wformat` исправлены добавлением суффикса `LL` к константам:
```c
#define DEFAULT_FREQ 1265000000LL // было 1265000000
```
## Оптимальные параметры для разных сценариев
### Максимальная скорость
```bash
# TX
cat data.bin | ./transmitter -f 2400000000 -r 7680000 -b 6000000 -g 0 -a 0.5 -p 0
# RX
./receiver -f 2400000000 -r 7680000 -b 6000000 -c none > output.bin
```
### Максимальная надёжность
```bash
# TX
cat data.bin | ./transmitter -f 1265000000 -r 3840000 -b 1500000 -g -10 -a 0.4 -p 5000 -c rs8
# RX
./receiver -f 1265000000 -r 3840000 -b 1500000 -c rs8 > output.bin
```
## Лицензия
Данный проект распространяется под лицензией MIT. Используйте на свой страх и риск.