321 lines
14 KiB
Markdown
321 lines
14 KiB
Markdown
# 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. Используйте на свой страх и риск.
|
||
|