Наконец-то дошли руки, чтобы сделать подробный обзор этого мощного и не очень дешевого SDR на базе FPGA Cyclone V и AD9361. Интерес к bladeRF 2.0 micro xA9 у меня появился ровно по той причине, по которой многие упираются в потолок HackRF и других бюджетных SDR: на уровне "послушать и что-то увидеть" они работают, но как только хочется системно строить чуть более сложные радиокейсы (широкая полоса, стабильный поток данных, MIMO, полный дуплекс и т. д.), ограничения становятся непреодолимым потолком.
Облазив весь интернет, не найдя вменяемых подробных текстовых обзоров, которые бы попали в индексацию Google/Yandex - я решил в своей статье, с присущей мне дотошностью, самостоятельно разобрать данную железку по кирпичикам, рассказывая подробно о каждом составном элементе и возможностями и ограничениями которые из этого следуют.
Всем заинтересованным - добро пожаловать под кат! =)

Предыстория
Начнем, как полагается, с небольшой вступительной лирики. История bladeRF как линейки устройств начинается с далекого 2013-го года, когда Nuand вывела проект на Kickstarter. Ключевой идеей проекта было не просто вывести на рынок железку, но и сформировать экосистему для изучения премудростей радио с опорой на открытый код, документацию и комьюнити. Технически bladeRF первого поколения (линейка x40/x115) строилась вокруг RFIC Lime Micro LMS6002D и FPGA Cyclone IV, а обмен с хостом шел по USB 3.0 через тот же контроллер FX3 (что и у xA9). Смысл вариаций x40 и x115 был тем же, что позже стало логикой xA4/xA9: одинаковая радиочасть, но разный запас ресурсов FPGA под различные вычислительные цепочки.

Линейка развивалась, и в августе 2018-го была представлена новая ветка bladeRF 2.0 micro. С точки зрения позиционирования - это были уже устройства “следующего поколения” с более широким диапазоном частот и поддержкой MIMO 2x2. Ключевой инженерный поворот был в том, чтобы сменить LMS6002D на AD9361, который применяется в большинстве высокопроизводительных SDR-приемников, таких как USRP B210. Это автоматически дает платформе классические свойства семейства AD936x: 12-bit тракт, MIMO 2x2 и характерные особенности архитектуры с нулевой промежуточной частотой.
Nuand описывает bladeRF 2.0 micro как готовый USB 3.0 SDR, который одновременно доступен для студентов (с деньгами 😀) и обеспеченных RF-энтузиастов и при этом является "платформой разработки источника разнообразных сигналов/волновых форм" уровня, который ожидают индустриальные пользователи. При этом внутри семейства 2.0 micro вариант xA9 выделяется не радиочастью (она общая), а ресурсом FPGA. Nuand прямо продает это как смысл xA9: увеличенное место в ПЛИС под аппаратные ускорители и HDL-цепочки обработки (FFT, турбо-декодеры, корреляторы, модуляторы/фильтры и т.д.), потому как в xA4 уже тесно для размещения всего этого ЦОС-хозяйства. То есть xA9 можно использовать не только как трансивер, который стримит I/Q на ПК, но и как платформу, которая может забрать на себя часть задач потоковой обработки данных, что критически необходимо в системах реального времени и передачи данных со строго регламентированными временными окнами.
Исходя из предпосылок получилось устройство, обладающее следующим перечнем характеристик (взято тут):
FPGA в Micro xA9 - это Altera Cyclone V E FPGA c ёмкостью 301 kLE из которых 292 kLE доступны для пользовательских сценариев;
Диапазон частот:
от 47 МГц до 6 ГГц для передатчика;
от 70 МГц до 6 ГГц для приемника;
Full-duplex Tx/Rx с MIMO 2х2 и частотой дискретизации 61.44 МГц с возможностью оверклокинга до 122.88 МГц с понижением битности с 12 до 8;
56 МГц фильтрованная полоса пропускания (IBW);
Автоматическая регулировка усиления (AGC);
Таблицы контроля пользовательским усилением в реальном времени, управляемые через SPI и дискретные внешние входные контакты;
Автоматическая коррекция смещения IQ и DC;
128-tap цифровая фильтрация FIR;
Поддержка USB 3.0 SuperSpeed через периферийный контроллер Cypress FX3 с интегрированным процессором ARM926EJ-S 200 МГц;
Заводская калибровка SiTime MEMS VCTCXO;
Калибровка в пределах 1 Гц - 38,4 МГц;
Преобразование поддерживается через 12-бит ЦАП или ADF4002 PLL;
MEMS генераторы обеспечивают превосходную надежность, подавление шума источника питания и вибрационных/ударных характеристик по сравнению с кварцевыми генераторами;
Порт с 32 входами / выходами (доступно LVDS);
Отладка через JTAG;
Порты для синхронизации нескольких устройств;
Встроенный инжектор питания обеспечивает дополнительно 5 V для активной антенны и аксессуаров с питанием из разъема SMA;
К слову, все это хозяйство поставляется с открытой документацией: доступны схемы, HDL и firmware под open source лицензиями и совместимое через libbladeRF с типовым SDR-стеком (GNU Radio, SoapySDR, GQRX и др.).
Такой набор позволяет решать целый пул разнородных задач связанных с радио:
FPGA-платформа для разработки и прототипирования RF PHY. Данный девайс позволяет разрабатывать свои и изучать уже реализованные PHY, например 802.11 или ADS-B. По сути получается, что это вход в мир, где SDR перестает быть простым АЦП для радиосигнала и становится устройством, которое можно превратить в специализированный приемник/модем, при этом разгрузив ПК и транспорт от сложных вычислений;
Универсальный широкополосный Rx/Tx для лабораторных радиокейсов. Запись широких полос I/Q, построение собственных приемников/передатчиков в GNU Radio, проверка идей по модуляциям, канальным эффектам и т.п. Особенно ценными тут становится 12-битный тракт AD9361, полнодуплексный приемопередатчик и ширина полосы, которую реально можно стримить по USB 3.0;
MIMO и двухканальные эксперименты. Два одновременно работающих приемных и передающих каналов используют для пространственных/корреляционных задач: простая оценка направления (по фазе/времени), двухканальный прием, channel sounding. MIMO 2x2 также позволяет делать прототипы базовых MIMO-схем и даже организовать базовую станцию LTE;
FPGA как способ вынести обработку из CPU. xA9 берут, когда хочется не просто получать I/Q в ПК, а собирать аппаратные цепочки: DDC/DUC, FFT-обработку, корреляторы, декодеры, специфические протоколы, т.к. смысл xA9 именно в бОльшем FPGA-ресурсе под onboard DSP.
Полевые и “мобильные” сценарии с упором на производительность. Производитель отдельно позиционирует micro как маленький форм-фактор для high-performance и mobile use cases, то есть когда важны габариты, питание от USB и при этом нужна функциональность MIMO 2x2.
Итого: это устройство стоит на стыке любительского радио и мира разработчиков сложных систем связи и не смотря на свою сложность, остается доступным для изучения всеми желающими. Но пойдем дальше в рассмотрение с аппаратной точки зрения.
Общий вид платы, разъемы и светодиоды
Итак. Nuand bladeRF 2.0 micro xA9. Данный девайс выглядит как “взрослое” устройство в компактном форм-факторе при относительно низкой цене. За диапазон частот 47 MHz - 6 GHz, 2x2 MIMO, 12-bit I/Q, дискретизацию 61.44 MSPS, за USB 3.0 SuperSpeed, и главное - большую FPGA Cyclone V 301 KLE - нужно вывалить порядка $900. На фоне этого тот же HackRF One мягко скажем остается далеко позади и устройством совсем иного класса.
Выглядит устройство вот так:


Схема, описывающая архитектуру данного SDR выглядит следующим образом:

По сути, устройство состоит из трёх ключевых микросхем и обвязки:
RFIC Analog Devices AD9361 (2x RX, 2x TX), ставший уже в некотором роде классическим для подобных систем, на котором сделано уже больше десятка разных SDR (и на его младшем собрате AD9363).
FPGA Altera Cyclone V E (5CEFA9) c 301 kLE, который производитель прямо позиционирует как ресурс с запасом под разные аппаратные цепочки обработки (FFT, декодеры, корреляторы и т.д.)
USB-контроллер Cypress FX3 (USB 3.0 SuperSpeed), который позволяет передавать на ПК весь объем полезных данных со скоростью до 5 Гбит/сек.
Ну и тактирование, питание, RF-коммутация, память, разъемы и прочее.
Детально останавливаться на рассмотрении даташитных характеристик я не буду, думаю при желании каждый может самостоятельно углубиться в предоставляемые технические возможности каждого из основных узлов. Схематик на плату можете самостоятельно изучить тут.
Отдельно отмечу лишь, что на плате мы можем множество распаянных и DNP-компонентов и перечислю их указав функциональное назначение.
В первую очередь RF разъемы:
J1, SMA, RX_T1 - вход приемника 1, RX1;
J2, SMA, TX_T1 - выход передатчика 1, TX1;
J3, SMA, RX_T2 - вход приемника 2, RX2;
J4, SMA, TX_T2 - выход передатчика 2, TX2.
Далее - USB и питание:
U21, USB 3.0 TYPE B - основной интерфейс к хосту: USB 3.0 data + питание по VBUS;
J49, DC barrel jack - внешнее питание 5V на шину VDC, приоритетно выбирается схемой питания при наличии напряжения);
Тактирование и опоры (U.FL):
J93, UFL_CLK_IN - вход внешнего тактового сигнала в узел распределения тактов;
J92, UFL_CLK_OUT - выход тактового сигнала наружу;
J95, ADF_REFIN - вход опорной частоты на PLL ADF4002, используется для привязки тактирования/подстройки.
Отладка и расширение:
U74, EXPANSION - двухрядный разъем 2x30, выведены линии FPGA GPIO, тактирование, служебные сигналы и питание; по смыслу это основной порт расширения;
J51, MINI_EXP - малый 3-контактный разъем: MINI_EXP_1, MINI_EXP_2 и GND;
J5, JTAG_TCE_CONN - JTAG разъем для FPGA Cyclone V: TCK/TMS/TDI/TDO, VCC_TRGT, GND;
J8, FX3 JTAG - JTAG разъем для контроллера Cypress FX3;
J6, FX3 UART - 3-контактный UART: FX3_UART_RX, FX3_UART_TX, GND; на схеме помечен как DNP, то есть может быть не установлен в конкретной сборке.
Опциональные коаксиальные посадочные места (DNP)
U1: коаксиальный разьем (DNP), подключен к паре RX1Cp/RX1Cn.
U77: коаксиальный разьем (DNP), подключен к паре RX2Cp/RX2Cn.
Из индикаторов на плате доступны следующие:
D4, неуправляемый индикатор питания, который находится на цифровой шине 3.3V (VD3P3);
D1, D2, D3: 3 светодиода на линиях LED1/LED2/LED3 которые подключены к FPGA. Функционально показывают, что логика жива, Tx Underflow, Rx Overflow соответственно. Поведение можно переназначать в софте NIOS;
Но это все мелочи. Теперь давайте взглянем на суть данной архитектуры через рассказ о том, как из каких этапов состоит dataflow приемника и передатчика и поймем с чем мы имеем дело.
Dataflow для RX
Вход каждого приемного канала (RX1 и RX2) на плате проходит через типовую обвязку:
SMA разьем;
ESD-защита на линию;
DC-block/развязка (конденсатор в разрыве тракта);
RF-переключатель (SPDT), который выбирает одну из двух цепочек согласования под выбранный поддиапазон;
Балун и согласование к дифференциальному RF-входу AD9361;
Для каждого RX канала есть отдельные цепочки, подписанные 70MHz - 3GHz и 3 - 6GHz + SPDT-переключатель семейства SKY13374, после которого тракт уходит на SMA через защиту. Смысл этой части простой. Внутри AD9361 RF-порты устроены как дифференциальные пары. Это типичная практика для интегральных трансиверов: дифференциальные пары удобны для подавления помех общего режима и устойчивости аналоговых узлов. А "мир снаружи" представляет собой single-ended интерфейс 50 Ом. Поэтому на плате неизбежны балуны и необходимы минимальные цепи согласования, плюс переключение между поддиапазонами, чтобы обеспечить необходимый уровень характеристик в каждом из них.
Внутреннее устройство AD9361 выглядит следующим образом и львинная доля функций по обработке сигнала доступна внутри:

Обработка принимаемого сигнала происходит по следующему флоу:
RF вход -> LNA/VGA -> квадратурный смеситель -> ФНЧ базовой полосы -> АЦП -> цифровые I/Q в FPGA.
У AD9361 предусмотрены альтернативные RF порты/цепи согласования (условно "A" и "B"), а на bladeRF 2.0 micro это разведено через электронные RF переключатели: в зависимости от частоты LO и выбранного диапазона, сигнал идет через один из двух фронтендов согласования/балунов к RFIC. На практике это выглядит как "низкочастотный" и "высокочастотный" путь между SMA и ногами AD9361, выбираемый переключателем. Но такое решение тоже не обходится бесплатно:
возможен "шов" по АЧХ/КСВ/усилению и по линейности на границе диапазонов, потому что меняется аналоговый фронтенд и добавляется переключатель (insertion loss и нелинейность характеристик переключателя);
калибровки (DC offset, IQ imbalance) и оптимальные уровни усиления могут быть немного разными для разных путей, поэтому при переносе проекта между диапазонами полезно перепроверять спектральные артефакты и уровень зеркальных помех.
AD9361 использует прямое преобразование частоты (direct conversion, zero-IF): выбранный участок спектра сразу переносится в базовую полосу вокруг 0 Гц, а не в промежуточную частоту на десятки МГц и чтобы приемник мог различать частоты выше и ниже настройки LO, используется квадратурное смешение: LO внутри чипа формируется в двух фазах: 0 и 90 градусов, RF-сигнал умножается на обе копии LO и на выходе получаются две компоненты: I (in-phase) и Q (quadrature). В этом случае I/Q вместе дают комплексное представление сигнала, который позволяет корректно представлять "положительные" и "отрицательные" частоты относительно центра и можно делать цифровую обработку как у комплексного сигнала (фильтрация, перенос частоты, демодуляция) без потери информационной составляющей.
У такого типа преобразования есть свои плюсы и минусы.
Плюсы zero-IF заключаются в том, что нет классической "зеркалки" супергетеродина относительно ПЧ, потому что перенос происходит сразу в базовую полосу и канал комплексный I/Q.
Минусы:
DC offset и "игла" в центре спектра RX. Самосмещение, утечки LO, самосмешение и 1/f шум приводят к компоненте около 0 Гц в I/Q. На практике это выглядит как пик в центре FFT, который может маскировать очень узкие сигналы около LO. Поэтому часто делают прием с небольшим частотным сдвигом (tune offset) и затем цифровой перенос.
Утечка LO на TX (carrier leakage). Из-за несовершенств квадратурного тракта и утечек появляется тон на частоте LO даже при "нулевых" I/Q, что видно как паразитный несущий в центре.
IQ imbalance -> зеркалка. Несовпадение амплитуды/фазы I и Q дает неполное подавление "зеркала" относительно нуля: в спектре появляется копия сигнала на симметричной частоте. Для AD9361 есть встроенные калибровки, но остаточный уровень зависит от условий.
Теперь рассмотрим это преобразование по шагам.
Шаг 1. Чип выставляет частоту приема используя LO синтезатор (локальный гетеродин). В AD9361 есть отдельный синтезатор частот для Rx и отдельный для Tx. То есть когда через софт задается частота приема, то на самом деле мы указываем AD9361 сгенерировать частоту локальному гетеродину (LO). AD9361 делает это не прямым генератором нужной частоты, а через RF PLL синтезаторы fractional-N с интегрированным VCO и фильтрами петли, которые сначала настраивают VCO в диапазоне 6-12 GHz, а затем делит эту частоту до нужного LO. Это базовая идея архитектуры AD9361.
Шаг 2. Смеситель умножает RF на LO и переносит содержимое полосы на 0 Гц. Так как LO квадратурный, получаются I и Q ветки. Кстати, именно здесь рождаются типовые "артефакты прямого преобразования":
DC offset (пик на 0 Гц в спектре I/Q);
LO leakage (в передаче особенно заметно как "несущая в центре");
IQ imbalance (зеркалка относительно центра).
Хоть AD9361 и имеет калибровки/коррекции под эти эффекты, но они не делают архитектуру идеальной, они лишь уменьшают проявления подобных вполне легитимных эффектов.
Шаг 3. После смешения I и Q идут в аналоговый baseband. В AD9361 так же есть два программируемых НЧ фильтра:
Rx TIA LPF (Transimpedance Amplifier LPF) - одно-полюсный НЧ фильтр с программируемой частотой среза, который дает грубое подавление ВЧ составляющих после смесителя и стабилизирует аналоговый тракт.
Rx BB LPF (BaseBand LPF) - аналоговый 3-го порядка Butterworth НЧ фильтр с программируемой частотой среза, который формирует максимально ровную АЧХ в полосе baseband и подавляет то, что иначе попало бы в АЦП как мусор и вызвало бы алиасинг.
То есть эти фильтры задают, насколько широкую базовую полосу реально хочется переварить до АЦП.
Шаг 4. Далее сигналы I (синфазный) и Q (квадратурный) поступают на АЦП и подвергаются дальнейшей цифровой обработке с децимацией и FIR. Тут важный момент: частота, на которой реально работают АЦП и цифровая "начинка" сразу после них, чаще всего выше, чем та частота, которую потом выставляется как "sample rate" на выходе. Причина в том, что дальше стоят децимирующие фильтры.
Шаг 5. После АЦП поток проходит через 4 стадии цифровых децимирующих фильтров (каждую к слову можно отправить в bypass). В документации AD9361 эти 4 стадии выглядят так:
HB3 (half-band decimation filter);
HB2;
HB1;
RX FIR (программируемый FIR, до 128 taps);
Half-band фильтр - это по сути фиксированный фильтр, который обычно либо децимирует (делает выборку каждого N-го семпла) в 2 раза, либо отключен (bypass) и удобен тем, что дает "дешевую" по ресурсам децимацию с приличной фильтрацией. Это все позволяет уменьшить поток данных, сузить полосу, ускорить обработку и отрезать весь внеполосный мусор.
Далее RF FIR финально формирует полосу и подавление внеполосного сигнала, и может быть использован для компенсации завалов по амплитуде и фазе, которые вносят аналоговые и half-band фильтры. То есть не только “режет” но еще и “выравнивает” 🙂
Шаг 6. После того как поток прошел цифровую фильтрацию и децимацию, AD9361 применяет/поддерживает набор коррекций, которые нужны именно для архитектуры нулевой ПЧ:
DC offset correction и tracking, который убирает смещение по постоянной составляющей, которое проявляется как "центр в пике" (около 0 Hz) в спектре комплексного I/Q. В AD9361 е��ть калибровки и режимы трекинга, в том числе базовая полоса (BB) может менять скорость трекинга после смены усиления.
Quadrature (I/Q) correction и tracking для уменьшения “зеркалки” относительно центра, возникающую из-за несовпадения амплитуды/фазы между I и Q трактами. В документации по AD936x прямо описан статический и динамический RX quadrature calibration, плюс непрерывный tracking.
AGC и режимы усиления. AGC относится к RX подсистеме как функция в целом (включая аналоговую часть и цифровые петли управления). Важно то, что на выходе цифрового тракта мы получаем поток с тем уровнем, который является результатом выбранного режима gain/AGC.
То есть практический смысл этого шага: после фильтров сигнал становится "готовым" для внешней цифровой обработки без необходимости реализовывать базовые компенсации в FPGA/CPU.
Шаг 7. Параллельно основному потоку AD9361 умеет считать и отдавать диагностические/метрические данные: уровни мощности, RSSI, результаты калибровок и т.п. Это не меняет сам поток I/Q, но объясняет, откуда берутся многие читаемые "уровни" в драйверах и почему они могут считаться на разных точках тракта (например, после HB1 или после FIR).
Шаг 8. После фильтрации/коррекций AD9361 выдает наружу уже "финальный" поток комплексных сэмплов фиксированной разрядности и формата:
Данные идут как 12-bit two's complement I и Q.
В LVDS режиме чтобы выжать больше пропускной способности без удвоения частоты такта и без увеличения числа проводников, используется DDR режим: 12 бит передаются через две 6-битные линии на дифференциальных парах.
Плюс есть сигналы такта и фрейминга (DATA_CLK и Rx_FRAME), по которым внешняя логика понимает, где начинаются и как упакованы слова.
Это ключевой стык: внутри чипа это непрерывная DSP цепочка, а снаружи это уже жестко определенный интерфейс, который должна правильно принять FPGA/SoC.
Ну а далее на bladeRF 2.0 micro поток с цифрового интерфейса AD9361 принимает FPGA. После всех внутренних аналоговых и цифровых этапов (фильтры, децимация, коррекции) AD9361 выдает наружу I/Q как параллельный поток: такт (DATA_CLK), фрейминг (RX_FRAME / TX_FRAME), линии данных (RX_DATA / TX_DATA). В режиме LVDS данные идут в DDR, то есть как сказано выше - на обоих фронтах такта. Поэтому FPGA получает вдвое больше бит при той же частоте DATA_CLK. Практически это выглядит так: на одном фронте прилетает 6 бит, на другом еще 6 бит, вместе это образует 12-битное слово. Дальше такие слова идут в определенном порядке, который размечается RX_FRAME (там уже появляется структура I, Q и второй канал, если включен 2x RX).
На входе FPGA стоит задача гарантированно и детерминированно восстановить правильные слова из физического интерфейса. Обработка происходит на двух слоях: PHY и Link.
PHY слой занимается электрическим и временным уровнем:
принимает дифференциальные пары LVDS;
захватывает данные на обоих фронтах DATA_CLK (DDR);
выдает уже параллельные куски данных во внутренний домен тактирования;
Смысл PHY слоя в том, что дальше по дизайну можно работать не с "битами на фронтах", а с нормальными словами, которые можно складывать, мультиплексировать и писать в FIFO.
Дальше включается Link слой. Он смотрит на RX_FRAME и понимает, как из потока 12-битных слов собрать логическую последовательность:
где I, где Q;
какой канал сейчас идет (RX1 или RX2), включен ли 2-й RX;
как правильно выровнять поток, чтобы не сдвинуться на полслова и не перепутать порядок;
Почему это место реально важное: ошибка здесь дает максимально "обманчивые" симптомы. Если перепутать I и Q или поменять местами знаки, созвездие развернется, появится зеркалка. Если перепутать каналы в 2-поточном RX, будет ощущение, что один канал не работает или каналы меняются местами. При этом железо оказывается полностью исправно, а проблема локализована только в сборке данных.
После этого происходит нормализация разрядности, где 12 бит превращаются в 16. AD9361 дает 12-битные signed значения. Дальше почти всегда делают приведение к 16 битам на компоненту. Делается это не потому, что "так точнее", а потому что так удобнее жить всей остальной системе:
Транспорт и хостовый софт проще унифицировать под тип int16 I и int16 Q;
Внутренняя DSP обработка в FPGA тоже чаще рассчитана на 16 бит и выше, потому что после умножений и сумм разрядность растет, и 12 бит становятся неудобными.
Технически это обычно sign-extend: старшие биты заполняются знаком, чтобы сохранить правильные отрицательные значения. В результате получается привычный формат: 16 бит на I и 16 бит на Q, то есть один комплексный сэмпл упакован в 32 бита. Это важная точка: начиная с этого места данные уже в форме, которая одинаково удобна и для дальнейшего FPGA DSP, и для отправки в ПК.
Дальше FPGA может работать в двух режимах, которые отличаются не железом, а тем, что решает разработчик делать с потоком.
Первый вариант - FPGA как мост (hosted), где задача максимально стабильно доставить сырые I/Q в ПК. Тогда после нормализации разрядности поток идет в буферизацию и на интерфейс с FX3. В этом режиме FPGA делает минимум, который нужен для транспорта данных в ПК.
Второй вариант - FPGA как обработчик (waveform/PHY), и с этого момента начинается причина, почему xA9 интересен как платформа для разработки. После того как появляется корректный поток I/Q в удобной разрядности, есть возможность вставить блоки цифровой обработки еще до отправки их в USB. И это меняет экономику системы, потому что USB и CPU перестают быть узким местом. Типовые блоки, которые реально дают практический выигрыш:
DDC (digital downconverter): NCO + комплексное умножение переносят нужный канал в ноль, дальше можно фильтровать и децимировать;
Децимация в FPGA. CIC как грубая и очень дешевая децимация, затем halfband/FIR для нормальной АЧХ и подавления алиасинга. Очевидный выигрыш: уменьшается поток на USB и нагрузка на ПК. Это один из самых полезных эффектов FPGA.
Канализация. PFB channelizer превращает широкую полосу в несколько узких каналов параллельно и в ПК отдаются только нужные каналы, а не весь спектр.
Детекторы и метрики. Оценка мощности, пороговая детекция, burst detection, выдача событий и измерений вместо непрерывного потока.
FFT в FPGA. Если задача мониторинга спектра, можно отдавать не сырые I/Q, а FFT бины (или усредненные бины), в этом случае трафик падает кратно, а результат для мониторинга часто даже удобнее.
Предобработка для 2-канального приема. Корреляция каналов, оценка разности фаз и задержек, грубая синхронизация, в ПК можно отдавать уже вычисленные параметры или более компактные представления.
Самый удобный стык для DSP обычно находится после дефрейминга и нормализации, но до FIFO и упаковки на USB. До FIFO потому, что необходимо уменьшать поток как можно раньше.
Но есть также вещи, которые сложно ускорить в ПЛИС:
алгоритмы, где основная сложность в разветвлениях, нерегулярном доступе к памяти, больших структурах данных и "софтверной" логике принятия решений (планировщики, протокол-стек целиком, сложная адаптация);
тяжелая арифметика с плавающей точкой, если нет жесткого указания разрядности (в FPGA чаще переходят на fixed-point и тщательно контролируют разрядность);
вещи, которые уже эффективно сделаны внутри AD9361 (часть калибровок, некоторые цифровые блоки) или упираются в интерфейсы/пропускную способность USB 3.0.
После этого поток должен перейти из "радиотакта" в "USB-такт". Это почти всегда разные домены. Поэтому ставятся FIFO, часто асинхронные, которые решают задачи согласования доменов тактирования и сглаживание пакетной природы USB.
Дальше FPGA общается с FX3 по GPIF II. GPIF это параллельный интерфейс, где FX3 через DMA забирает и отдает данные блоками, не дергая постоянно CPU внутри FX3. Именно на этом участке появляются два периодических типичных состояния:
RX overflow: FPGA не успевает выгрузить принятый поток в FX3, FIFO переполняется, данные начинают теряться.
TX underflow: FPGA не успевает получить данные от FX3, FIFO пустеет, передача идет с разрывами.
Эти состояния напрямую связаны с выбранной частотой дискретизации, количеством каналов (1 или 2 канала) и тем, насколько стабильно хост успевает принимать или отдавать поток. И если данные доходят корректно дальше начинается обычная обработка на ПК. И на этом этапе становится очевидной ключевая идея xA9: можно выбрать, где заканчивается поток "сырой I/Q". Конечно, можно тащить широкую полосу в ПК и делать все там. А можно часть работы сделать раньше, в FPGA, и отправлять в ПК уже более компактные и гораздо более подготовленные к работе данные.
Dataflow для TX
Передающий тракт bladeRF логически зеркален приемному, но есть один момент: на TX стороне непрерывность потока задает уже не радиочасть, а хост. То есть если ПК или USB не успевают, то тракт не "переполняется", а наоборот "голодает" и это проявляется как TX underflow.
На стороне ПК об��чно формируется поток комплексных отсчетов I/Q. Источники могут быть разные:
синтез сигнала (NCO, модулятор, фреймер) прямо в приложении;
GNU Radio flowgraph;
чтение из файла IQ;
генерация базового сигнала и тестовых последовательностей (tone, chirp, PRBS).
Приложение отдает данные в libbladeRF пакетами (буферами). Внутри библиотеки это превращается в поток USB bulk transfers и может передаваться с метаданными и без оных, что позволяет управлять потоком данных: например, можно задавать момент старта burst, делать разрывы/задержки, планировать последовательность передач во времени и т.д. Дальше данные уходят по USB 3.0 в контроллер FX3. Здесь полезно помнить, что USB живет пакетами, а задержка и джиттер доставки пакетов со стороны ПК не нулевые. Поэтому в FX3 и FPGA почти всегда заложено буферирование, DMA, double buffering. То есть FX3 старается постоянно держать заполненными внутренние буферы, чтобы FPGA могла читать данные равномерно.
Далее FX3 общается с FPGA по GPIF II как по параллельной шине. На TX стороне FPGA обычно читает 32-битные слова от FX3 блоками, складывает их в TX FIFO (часто dual-clock FIFO) и дальше уже из FIFO равномерно выгружает их в домен тактирования радиочасти. Здесь может проявить себя TX underflow, который означает, что FIFO успело опустеть, потому что либо хост не успел подготовить данные, либо USB не успел их доставить или параметры выбраны слишком агрессивные (высокий sample rate, 2x2, тяжелая нагрузка на систему). Симптомно это выглядит как разрывы, "щелчки" в сигнале, а в некоторых задачах как провалы в огибающей или срывы синхронизации на приемнике.
После того как данные оказались в FPGA, нужно привести их к виду, который можно отдать в AD9361. Если данные приходят как SC16 то из 32 бит нужно получить int16 I и int16 Q. Если включены два канала TX, то из общего потока нужно корректно разложить, какой комплексный сэмпл относится к TX1 а какой к TX2. Это зеркально RX-деинтерливингу: ошибка порядка даст "не тот канал", "каналы поменялись", или странные эффекты, если ожидается определенная фазовая/амплитудная связь между каналами.
Далее происходит масштабирование и контроль насыщения. Даже если входные данные int16, это не значит, что их можно бездумно отдать дальше. Обычно в FPGA либо просто берут старшие 12 бит, либо применяют управляемый scaler, чтобы точно вписаться в рабочий диапазон 12-битного тракта AD9361. Насыщение на TX это очень заметная вещь: она сразу приводит к росту интермодуляции и ухудшению спектра.
На TX стороне цифровая обработка сигнала обычно происходит до момента передачи в AD9361, по той же причине, что и на RX: лучше сделать тяжелые операции до узкого места интерфейса и до аналоговой части.
Типовые полезные блоки:
DUC (digital upconverter): перенос базовой полосы внутри цифрового домена (NCO + комплексное умножение), чтобы не таскать весь сигнал в центре;
интерполяция и фильтрация (CIC + halfband/FIR) для формирования нужного Fs и полосы;
pulse shaping (RRC, Gaussian) для FSK/PSK/QAM, чтобы контролировать занимаемую полосу;
формирование бурстов: огибающая, ramp-up/ramp-down, окно, чтобы уменьшить спектральные выбросы при включении/выключении;
предыскажение (в простом виде): компенсация неравномерности АЧХ, грубая компенсация фазовых завалов, в сложном виде DPD (Digital Pre-Distortion), если цель именно обеспечить линейность.
Смысл TX-FPGA обработки чаще всего в двух вещах: улучшить спектральную форму и управляемость сигнала (фильтры, shaping, окна) и согласовать частоты и формат так, чтобы AD9361 работал в комфортной конфигурации (правильная Fs, полоса, уровень).
Дальше начинается жестко определенный цифровой интерфейс AD9361, но уже в обратную сторону. В LVDS DDR режиме на TX обычно используются:
Tx_DATA[5:0] как 6 дифференциальных линий данных;
Tx_FRAME как разметка порядка слов;
FB_CLK (feedback clock) как такт, относительно которого AD9361 захватывает входные данные.
DDR здесь означает, что за один период FB_CLK FPGA отдает два раза по 6 бит, то есть формирует 12-битное слово. И дальше по Tx_FRAME AD9361 понимает, что является I, что Q и как идут каналы.
Этот участок критичен по временным требованиям. На практике именно здесь важны несколько моментов: правильный phase alignment данных к такту, стабильность домена тактирования, корректная стартовая синхронизация фрейминга.
Внутренний TX тракт AD9361 можно описать как "обратный RX":
Цифровая интерполяция. AD9361 прогоняет входной поток через несколько стадий интерполяции (зеркально децимации на RX) и через программируемый TX FIR. Это позволяет поднять внутренний rate до нужного для DAC, сформировать полосу и подавление внеполосной составляющей еще до аналоговой части, частично компенсировать завалы и особенности аналогового тракта.
DAC. Дальше I и Q уходят в ЦАП.
Аналоговая базовая полоса. После DAC стоят аналоговые НЧ фильтры базовой полосы. Они добивают подавление внеполосных составляющих и уменьшают нагрузку на смеситель по мусору.
Практически это означает: в TX есть два слоя контроля спектра. То есть цифровой с FIR и интерполяцияей и аналоговый: baseband LPF. И если цифровая часть настроена некорректно, то аналоговая часть уже не спасет от неправильной спектральной формы.
Дальше AD9361 выполняет обратную операцию к RX. То есть берет I и Q базовую полосу, использует квадратурный LO (0 и 90 градусов), выполняет upconversion в RF на частоту LO. В этот самый момент рождаются типовые TX-артефакты нулевой ПЧ:
LO leakage: остаточная "несущая" в центре;
IQ imbalance: “зеркалка” относительно центра;
побочные составляющие от нелинейности и насыщения (если уровень выбран слишком высоким или тракт работает в неподобающем режиме).
AD9361 имеет калибровки TX quadrature и LO leakage, которые заметно уменьшают эти эффекты, но, к великому сожалению, не делают тракт идеальным.
И уже после RF выхода AD9361 сигнал идет через обвязку платы, которая зеркальна RX. То есть сигнал попадает на дифференциальный RF выход AD9361, идет к балуну и согласованию к single-ended, после попадает на RF переключатель SPDT, выбирающий одну из цепочек поддиапазона, идёт через ESD защиту и выходит на SMA разьем TX1 или TX2.
Учитывая всё вышеизложенное можно сделать однозначный вывод: bladeRF позволяет работать с радиосигналами на уровне очень тонких настроек и подвергать его потоковой DSP-обработке. Он одинаково хорошо подходит и для широкополосного наблюдения, и для построения прототипов, и для задач, где требуется точная цифровая обработка и контроль тракта. Именно эта комбинация глубины, масштабируемости и возможности переносить обработку между AD9361, FPGA и ПК в зависимости от кейса, что делает платформу действительно гибкой и мощной.
Тактирование и синхронизация: 38.4 MHz, внешняя опора 10 MHz, PLL/VCTCXO
Теперь перейдем к не менее важной части любого SDR-устройства, а именно к тактированию. Базовая опора на плате - MEMS VCTCXO 38.4 MHz, в brief заявлена заводская калибровка "в пределах 1 Hz" на 38.4 MHz (это про стартовую точность). Но в общем-то не отменяется дальнейшее влияние температуры и необходимость рассчета индивидуальных поправочных коэффициентов для разных отклонений от НУ и, конечно, естесственной эксплуатационной деградации.
Все негативные факторы можно скомпенсировать, и на устройстве есть два механизма чтобы "приручить" частоту:
Подстройка VCTCXO через DAC (trim).
Аппаратная PLL на плате, которая может залочить 38.4 MHz VCTCXO к внешней опоре. В Wiki/FAQ Nuand описывает, что PLL (ADF4002) позволяет привязать 38.4 MHz к внешнему референсу практически любой частоты до 300 MHz; по умолчанию в libbladeRF часто используют 10 MHz, потому что это стандартная опорная частота в измерительном оборудовании.
На практике это означает:
меньше частотная девиация и лучше долгосрочная точность LO, а значит проще и более точная демодуляция узкополосных сигналов, меньше AFC-работы и меньше накопление фазовой ошибки;
удобная синхронизация нескольких устройств, если всем раздать общий референс и триггерить выборку (в brief отдельно упомянута "triggered multi-device sampling synchronization").
Конечно, внешняя 10 MHz опора сама по себе не делает "фазово-идеальную" систему, но резко повышает воспроизводимость частоты и позволяет строить многоплатные стенды, где частотные ошибки уже задаются качеством единого эталона.
Питание: USB 3.0, внешний DC, бюджет мощности
Что касается питания - bladeRF 2.0 micro заявлен как полностью питаемый от USB 3.0, но также имеет вход внешнего питания 5 V через DC barrel jack с автоматическим переключением. USB 3.0 в "стандартном" сценарии дает ограниченную мощность, и запас быстро съедается при одновременной работе 2 TX, высокой скорости дискретизации, активной FPGA загрузке и включенном bias-tee на нескольких портах. Поэтому для внешнего питания Nuand в Wiki по аксессуарам рекомендует адаптер 5 V, рассчитанный минимум на 1.5 A, и отдельно предупреждает про просадку напряжения у "слабых" блоков питания (это существенно влияет на качество работы и итоговые характеристики).
Поэтому если включаете bias-tee и питаете внешние усилители, или грузите FPGA плотной DSP-цепочкой, внешний БП с запасом по мощности обычно снижает риск нестабильностей и упрощает повторяемость измерений.
Bias-tee на SMA: когда полезно, как есть риски и как не спалить периферию
В datasheet на bladeRF указано, что на плате есть bias-tee, который опционально подает 5 V на RF разъемы для питания активных антенн и аксессуаров. Управление включением делается программно (есть API в libbladeRF: bladerf_set_bias_tee / bladerf_get_bias_tee).
Nuand продает совместимые модули (BT-100 PA и BT-200 LNA), питающиеся от SMA через bias-tee:

Bias-tee реально полезен когда необходимо питание активной антенны (например, GNSS active antenna, если она рассчитана на питание по фидеру) или необходимо питание внешнего LNA возле антенны, чтобы улучшить суммарный NF тракта и "дотащить" слабые сигналы до приемника.
Использование bias-tee несет с собой некоторые риски, которые необходимо четко осознавать:
Некоторые антенны/фильтры/согласующие элементы могут иметь DC short (например, для сброса статики). Если включить bias-tee, на такой конфигурации вы получите большой ток, просадку питания и потенциальные повреждения.
Так же Nuand отдельно предупреждает об опасности "overdrawing current" при питании от USB и одновременном включении нескольких bias-tee усилителей.
Подача 5 V туда, где ее не ждут. Анализаторы, аттенюаторы, некоторые трансформаторы/фильтры и часть лабораторной периферии не рассчитаны на DC на центральном проводнике.
Поэтому перед подключением неизвестной периферии: мультиметром измерить сопротивление между центральным контактом SMA и землей (если почти 0 Ом, bias-tee не включать). Если нужно подключать "непонятное": ставить внешний DC block (конденсаторный), а питание подавать отдельно или через корректный bias-tee инжектор. Включать bias-tee только когда уже все подключено, и выключать перед переподключением кабелей. При нескольких потребителях по bias-tee и активной передаче: использовать внешний 5V БП, а не рассчитывать на USB.
Механика, нагрев, экранирование
SMA на небольшой плате плохо переносят боковую нагрузку: тяжелые кабели лучше разгружать (стяжка к столу/корпусу), иначе со временем страдает пайка/пятаки. Для обычной эксплуатации логично использовать металлический корпус и зафиксировать плату на основании.
У Nuand для bladeRF 2.0 micro отдельно упомянут RF shield cap: он экранирует чувствительную RF часть от EMI и одновременно помогает с тепловым режимом. По температуре в brief приводится диапазон 0...70 °C для обычных xA4/xA9 и -40..85 °C для версии xA9 Thermal. И наверняка при работе 2x2 MIMO, широкой полосе и активной FPGA нагрузке тепловыделение становится заметным; экран-крышка и умеренный обдув уменьшают дрейф параметров от изменения тепловой картины. Рекомендую цельнометаллический корпус с самостоятельно уложенном СВЧ-поглотителем для снижения интермодуляционных помех.

Характеристики bladeRF micro 2.0 xA9
Ну а теперь более подробно остановимся на разборе ключевых характеристик приемопередатчика и сделаем акцент на том, чтобы сбить идеалистические ожидания созданные описанными выше возможностями 🙂.
Если оставить только то, что реально влияет на практические результаты, то паспортные данные выглядят так:
12-bit АЦП/ЦАП, штатный потолок Fs 61.44 MSPS, и filtered bandwidth (IBW) до 56 MHz;
Диапазоны частот: RX 70-6000 MHz, TX 47-6000 MHz;
Заявляется CW output power: +8 dBm, без указания условий по частоте, искажениям (EVM/Power) и режиму. Это важно именно как общая цифра, но ее нельзя воспринимать как гарантированную мощность на любой частоте, при любой модуляции во всем диапазоне.
При этом bladeRF 2.0 micro xA9 по мне логично характеризовать не как "еще один SDR на AD9361", а как платформу, в которой одновременно важны три слоя: RFIC (AD9361), транспорт (USB 3.0) и ПЛИС (Cyclone V). В версии xA9 ключевое преимущество заключается в доступном ресурсе ПЛИС: 301 kLE, плюс заметный запас DSP и RAM под обработку данных.
Дальше начинается то, что обычно не пишут в "характеристиках" и это один из ключевых факторов в реальном применении: сколько данных надо протащить через USB и стек хоста. Для комплексных сэмплов SC16 (16-bit I + 16-bit Q) один канал при 61.44 MSPS дает 61.44e6 х 4 = 245.76 MB/s полезных данных. Два RX канала уже 491.52 MB/s. Если добавить TX (full duplex) и накладные расходы USB/драйвера/буферизации, становится понятно, почему на bladeRF 2.0 micro гарантированно могут возникнуть проблемы устойчивости стриминга. И в некотором отношении USB 3.0 является узким местом (как наверное и у большинства подобных SDR) в производительности системы.
В поисках результатов СВЧ-измерений, как основной характеризующий набор цифр я нашел любопытное сравнение нескольких приемников (тут). Приведу несколько интересных моментов из этого исследования.
Авторы измеряли noise figure двумя способами (через MDS и через Y-factor) и отмечают, что в целом результаты хорошо согласуются между собой, но за исключением частоты 1.28 GHz, где они считают MDS-измерения ненадежными: при подключении к генератору устройство подхватывало заметный внешний шум. Второе наблюдение еще более интересное: на 5.8 GHz уровень шума оказался чувствителен к тому, как физически состыкован USB-коннектор. Это редкий случай, когда механика и посадка разъема меняют измеряемый шум.
Если брать их сводную таблицу "lowest measured noise figure", то минимальные NF для bladeRF 2.0 micro получились такими:
5.0 dB на 145 MHz
4.9 dB на 437 MHz
7.4 dB на 1.28 GHz
9.0 dB на 2.25 GHz
9.5 dB на 2.425 GHz
15.8 dB на 5.83 GHz.
Картина простая: на VHF/UHF вполне умеренно, дальше по частоте шум растет и к 5.8 GHz становится уже заметным ограничением.

Авторы исследования прямо связывают чувствительность к внешнему шуму с тем, что штатный корпус у устройства акриловый и вероятно размещение устройства в металлический корпус с РПМ-ом внутри дало бы существенно лучшую картину.
Перейдем к следующей характеристике - blocking dynamic range и главному выводу про равномерность по диапазону. По поводу BDR они фиксируют три вещи:
Максимально допустимая входная мощность без перегруза (Pin) ожидаемо падает по мере роста усиления, зависимость в основном линейная;
Мам динамический диапазон по gain меняется слабо, местами чуть проседает на некоторых частотах при самых больших усилениях;
И самое важное: между 145 MHz и 5.8 GHz они видят крупный разброс порядка 30 dB.
Третий пункт и есть суть: широкий диапазон настройки не означает одинаковую линейность и одинаковый запас по всему диапазону. И это не "особенность конкретной платы", это реальность широкополосных SDR, но тут она подтверждена измерениями.



Далее исследователи перешли к рассмотрению спектральной чистоты. В разделе receiver spectral purity они показывают спектры при подключенном 50-омном терминаторе и отмечают, что видны спуры, которые либо генерируются устройством, либо подхватываются им даже в таком "идеальном" входном режиме. Плюс они отдельно отмечают чувствительность к внешнему шуму на 145 MHz и 2.4 GHz и снова объясняют это отсутствием нормального экрана (акриловый корпус). В этому случае даже без антенны можно увидеть, насколько окружение и экранирование влияют на видимые "паразитные полки" и отдельные линии:











Что касается передатчика, чистоты, того сколько мощности реально выходит с порта, то TX в отчете раскрыт не одной цифрой "мощность", а цепочкой измерений.
Спектральная чистота CW: для каждой частоты они показывают два режима - при меньшем TX gain спектр чистый (по сути один тон), при большем gain начинают появляться спуры. Это удобная иллюстрация того, что "добавить gain" не всегда означает влить просто больше мощности, а часто означает влить больше мусора в полезный сигнал:












Выходная мощность: в их сводной таблице "highest measured output power" для bladeRF 2.0 micro видно, что максимальная измеренная мощность заметно зависит от частоты:
7.7 dBm (145 MHz)
6.9 dBm (437 MHz)
5.0 dBm (1.28 GHz)
1.6 dBm (2.25 GHz)
0.1 dBm (2.425 GHz),
-7.2 dBm (5.83 GHz).
Это аккуратно укладывается в логику, что чем выше частота, тем сложнее выжать ту же мощность и сохранить чистоту, и цифра "8 dBm CW" из паспорта не должна восприниматься как константа по всему диапазону:

MER на DVB-S2: они измерили качество модуляции (8-PSK, 6.25 Msym/s, FEC 9/10, roll-off 0.20) и дали таблицу MER как функцию TX gain. MER быстро растет до примерно 24-25 dB и дальше упирается, но авторы отдельно оговаривают, что насыщение NsMAR и MER связано с ограничениями их анализатора, а не обязательно с пределом передатчика.


Если объединить все это в один вывод, то он звучит так: bladeRF 2.0 micro (и, соответственно, xA9 по RF) в VHF/UHF выглядит предсказуемо и по мере ухода к 2.4-5.8 GHz начинают проявляться вполне обыденные вещи - рост NF, падение доступной мощности, повышенная чувствительность к экранированию и даже к механике USB.
Заключение
Обобщая все вышесказанное - bladeRF 2.0 micro в варианте xA9 - это компактный 2x2 MIMO SDR на AD9361 с акцентом на "железную" обработку и стендовое использование. Его сильная сторона не столько в уникальной радиочасти (AD9361 встречается и у других), сколько в балансе: относительно нормальная аналоговая обвязка, быстрый транспорт по USB 3.0, большой FPGA ресурс и полезные системные опции вроде внешней опоры и bias-tee.
У него много сильных сторон:
2x2 MIMO и полноценный full duplex в реально применимом форм-факторе;
Большой запас по FPGA в xA9: удобно переносить часть DSP в HDL, снижать поток на хост и делать предобработку в реальном времени;
Тактирование 38.4 MHz с возможностью привязки к внешней опоре 10 MHz: проще добиться воспроизводимой частоты и синхронизации нескольких устройствах;
Bias-tee на SMA дает практичную интеграцию с внешними LNA/активными антеннами, когда надо улучшить чувствительность на месте приема.
Но имеются и типичные минусы:
Архитектура zero-IF у AD9361 означает типовые артефакты: DC в центре, утечка LO, остаточная IQ-несимметрия. Это лечится калибровками и цифровыми приемами, но полностью "само" не исчезает.
USB питание ограничивает сценарии "все включено сразу": 2 TX, высокая полоса, активная FPGA логика и еще внешние потребители по bias-tee могут упереться в бюджет мощности. Внешний 5 V БП часто переводит систему из "работает обычно" в "работает стабильно".
Механика маленькой платы и SMA требует аккуратности с кабелями, иначе страдает надежность разъемов и пайки. Для длительных стендов лучше корпус или жесткое крепление.
Данный девайс подойдет для:
Разработка и тестирование PHY, прототипы радиосистем, задачи с MIMO, стенды, где есть смысл унести DSP в FPGA и контролировать задержки.
Лабораторные измерения и длительные прогоны, особенно если нужна внешняя частотная опора и повторяемость.
Но может не подойти:
Если нужен прием/передача сильно ниже десятков МГц.
Если нужен максимально простой "подключил и забыл" SDR без внимания к калибровкам, теплу, питанию и DC на RF портах.
Если проект завязан на конкретный софт-стек и инфраструктуру других семейств (например, UHD-first окружение), тогда выбор может быть не оптимальным.
То есть если возможности данного устройства вписываются в ваши компетенции и технические потребности - то это будет хорошим, но не отличным, выбором для начала работы. В следующей статье я рассмотрю реальные кейсы применения данного SDR под Linux и простой туториал по настройке среды для начала работы.
Спасибо за внимание! =)
Размещайте облачную инфраструктуру и масштабируйте сервисы с надежным облачным провайдером Beget.
Эксклюзивно для читателей Хабра мы даем бонус 10% при первом пополнении.

