ZetaSDR. Собираем программно определяемый радиоприемник своими руками

SDR (Software Defined Radio) — это программно определяемая радиосистема, где софт преобразует радиосигнал в цифровой вид. Это открывает широчайшие возможности для анализа сигнала. Появление все более доступных систем SDR стало дивным подарком радиолюбителям. В этой статье мы разберемся, как работает SDR, самым надежным методом — создав собственный приемник. И при этом постараемся не утонуть в пучине матанализа.

Один из самых популярных SDR сегодня — это китайский «свисток» RTL-SDR, мы о нем неоднократно писали (можешь посмотреть, например, статью «Делаем первые шаги с RTL-SDR»). Он обладает просто фантастическими возможностями для своей цены.

Схема RTL2832 + RT820 выглядит вот так.

Сигнал поступает на вход радиотракта, реализованного на RT820, где выполняется первое преобразование частоты в промежуточную, здесь 3,57 МГц. Зеркальный канал при этом подавляется фильтрами, насколько это возможно.

Такое решение позволяет покрыть огромный диапазон частот от нескольких десятков мегагерц до пары гигагерц. Не весь сразу, конечно, а только кусочками по несколько мегагерц (судя по документации, RTL2832 способен оцифровать и сигнал частотой в несколько десятков мегагерц, однако упирается в пропускную способность USB). На самом деле зачастую достаточно и этого.

Полученный сигнал ПЧ оцифровывается в RTL2832, после чего подвергается второму программному преобразованию частоты. Здесь уже используется квадратурный гетеродин, реализованный программно как скалярное произведение входящего сигнала на опорный. А в случае квадратурного гетеродина в качестве опорных использованы два сигнала с одной и той же частотой, но сдвинутые по фазе на π/2. На выходе смесителей стоят фильтры низкой частоты, которые фильтруют сигнал с удвоенной опорной частотой. В результате на выходе тоже имеем два сигнала: синфазный (I) и квадратурный (Q). Впрочем, названия до некоторой степени условны.

Сигналы в виде потока данных передаются по USB. Собственно, перед отправкой и происходит ресемплирование, когда скорость передачи понижается до примерно 2 Мвыб/с, в данной схеме это «бутылочное горлышко». Почему именно квадратурный гетеродин? Из теории цифровой обработки сигналов известно, что, имея только сигналы I и Q, можно декодировать сигнал с любым из существующих способов модуляции. Например, АМ-модуляция, на которой мы ниже и сосредоточимся, реализуется наиболее просто.

Если представить, что I — это действительная часть, а Q — мнимая часть комплексного сигнала Z, то |Z| = (I^2 + Q^2)^1/2 и есть искомый демодулированный сигнал. C ЧМ и ФМ уже будет сложнее, но не принципиально. Впрочем, теория цифровой обработки сигналов слишком тяжела, чтобы пересказывать ее в двух словах, — при желании можешь почитать подробнее сам.

Дальше сигнал обрабатывает уже компьютер, где из отдельных семплов I и Q формируется комплексный семпл Z = I + jQ. Однако, как ты понимаешь, это тоже некоторая условность, позволяющая применить математический аппарат комплексного исчисления к сигналу.

По существу, все это реализуется такими программными пакетами, как SDR# (Windows), gqrx (Linux) или GNU radio (Linux). Последний нам наиболее интересен, так как позволяет не только пробежаться по диапазону, но и понять, как программная часть реализована внутри. И при этом вовсе не нужно залезать в дебри программирования, а можно при помощи мыши составить структурную схему (граф) из отдельных блоков. Блоки обычно реализуют одну операцию (в лучших традициях Unix). Вот так в GNU Radio выглядит простейший FM-приемник на RTL-SDR, созданный за пару минут.

Простейший пример

RTL-SDR выступает в роли источника, выдающего поток комплексных Z-значений, что равносильно обоим потокам I и Q. Далее сигнал попадает в цифровой фильтр низких частот ФНЧ, который вырезает интересующую нас полосу. Так как в данном случае ожидается частотная модуляция, то нам потребуется полоса в ~200 кГц, с центром в нуле, которому соответствует выставленная на RTL-SDR частота. Далее сигнал попадает на частотный детектор, на выходе которого получается реальный звуковой сигнал, подходящий для звуковой карты. Ресемплер нужен, чтобы согласовать битрейт сигнала. Итого — половина приемника всего в несколько кликов мышки!

Simple SDR

Раньше относительной популярностью пользовались SDR-приемники, которые использовали звуковую карту компьютера в качестве АЦП. Большинство имели схожую конструкцию и состояли из опорного генератора, фазовращателя, смесителя и усилителя низкой частоты. Выход усилителя подключался к линейному входу звуковой карты. Чувствуешь аналогию с рассмотренным выше RTL2832? Суть та же, только промежуточная частота тут ниже и оцифровывается уже квадратурный сигнал.

Рассмотрим схему популярного приемника ZetaSDR.

Схема ZetaSDR

Сигнал с тактового генератора частотой F идет к фазовращателю, выполненному на двух D-триггерах, соединенных в счетчик Дженсона. Тот представляет собой сдвиговый регистр, последний инвертированный выход которого подан на вход. При подаче тактового сигнала по выходам сдвигового регистра будет распространяться попеременно волна нулей и единиц. В нашем случае на выходах Q0 и Q1 будут последовательно устанавливаться состояния 00, 01, 11, 10, что в десятичной системе соответствует 0, 1, 3, 2. С точки зрения сигналов это два меандра частотой F/4, сдвинутые по фазе на 90°.

Диаграмма сигналов на счетчике Дженсона

Далее полученные опорные сигналы поступают на ключевой смеситель Дэна Тейло (Dan Tayloe), выполненный на мультиплексоре 74HC4052. Смеситель умножает один сигнал на другой, поэтому если один из сигналов — меандр, то умножение сводится к простому переключению.

Принцип работы смесителя Тейло

На приведенной ниже картинке показана диаграмма работы мультиплексора, где включенному каналу условно соответствует высокий уровень на нем.

Работа мультиплексора

Принимая канал X0 за 0°, видим, что 90° — это X1, 180° — X3, а 270° — X4. Соответствующим образом подключены и операционные усилители. В результате на выходе получаем сигналы I и Q, смещенные на 90°. Подробнее о смесителе Тейло можно прочитать в оригинальной статье. Далее сигналы отправляются на линейный вход аудиокарты.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Комментарии (7)

  • Супер статья, спасибо! Для моего уровня это, конечно, чересчур хардкор...

  • Подскажите, можно ли для сигнала генератора в Zeta Sdr использовать сигнал 3.3 В (например с rpi)? Zeta Sdr питается 5В или 3.3В?

    • Да можно, более того здесь синтезатор питается от 3.3в и соответственно выдаёт 3.3в(по факту меньше особенно когда частоты переваливают за 100Мгц). Не уверен что rpi умеет генерировать сигналы с такой частотой, мене удавалось выжать с её GPIO только несколько мегагерц. Сам приёмник питается от 5в, всё как на схеме.

      • Можно генерировать сигналы с высокой частотой. В rpi есть режим, когда встроенный осциллятор на 500 Мгц после делителя подается на GPIO. Изменяя значение делителя можно генерить сигнал любой частоты. В сети есть примеры когда rpi выступает в качестве передатчика fm radio (в районе 100 мгц). Сам проверял,работает.
        https://github.com/markondej/fm_transmitter

        • А вот это очень интересно, спасибо.

Похожие материалы