This commit is contained in:
Maxim
2026-06-03 14:25:24 +03:00
parent 24b7cc402e
commit 3cceda32f4

320
SDR/README.md Normal file
View File

@@ -0,0 +1,320 @@
# 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. Используйте на свой страх и риск.