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