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

