Распределение тактового сигнала для фазово-когерентной работы нескольких RTL-SDR приёмников

В приложениях, требующих фазовой когерентности (пеленгация, пассивная радиолокация, интерферометрия и радиоастрономия), рассинхронизация опорных генераторов между отдельными RTL-SDR приёмниками приводит к недопустимому фазовому дрейфу. Стандартные кварцевые генераторы на борту dongle’ов имеют разброс частоты порядка 20–50 ppm и независимы, что делает невозможным когерентный приём даже при использовании одного ПК. Статья описывает практическую схему распределения единого тактового сигнала на несколько приёмников с сохранением фазовой стабильности в пределах единиц градусов на интервале минут.

Техническая суть

Предлагается отказаться от штатных 28,8 МГц кварцев в каждом RTL2832U и подать внешний опорный сигнал частотой 28,8 МГц с амплитудой 0–10 dBm.

Основные элементы схемы:

  • высокостабильный источник (обычно TCXO или OCXO со стабильностью < 0.1 ppm);
  • активный или пассивный делитель мощности (power splitter) на требуемое число каналов с изоляцией >20 дБ;
  • RC-цепочки или аттенюаторы 3–6 дБ на входе каждого RTL-SDR для согласования уровней и подавления отражений;
  • коаксиальные кабели одинаковой длины (или с известной разностью длин) для минимизации фазового рассогласования.

Физически тактовый сигнал подаётся на вывод 1 чипа RTL2832U вместо штатного кварца (либо через конденсатор 100 пФ на вывод XIN). Никаких дополнительных программных параметров (вроде direct_samp=2) для активации внешней синхронизации не требуется. Чип RTL2832U аппаратно тактируется сигналом, поступающим на вход XIN, и работает в своём штатном режиме, умножая опорную частоту с помощью внутреннего PLL независимо от источника генерации.

При этом частота дискретизации остаётся жёстко привязанной к внешнему источнику, а смещение несущей между каналами сводится к фазовому шуму самого генератора.

SDR / Программная часть

В GNU Radio для каждого устройства создаётся отдельный блок osmocom Source с одинаковыми параметрами:

  • samp_rate = 2.048e6
  • center_freq = 1.42e9
  • gain = 40

Далее применяется блок Phase Coherent Align (кастомный Python-блок) или готовый gr-sync для компенсации фиксированной фазовой задержки между каналами.

Ниже представлен концептуальный пример скрипта на Python для оценки фазовой стабильности:

import numpy as np
from rtlsdr import RtlSdr

sdr1 = RtlSdr(0)
sdr2 = RtlSdr(1)
sdr1.center_freq = sdr2.center_freq = 1_420_000_000
sdr1.sample_rate = sdr2.sample_rate = 2_048_000

# Считывание выборок (для реальной когерентной оценки требуется 
# аппаратное или программное выравнивание задержки старта потоков по USB)
samples1 = np.array(sdr1.read_samples(2**18))
samples2 = np.array(sdr2.read_samples(2**18))
phase_diff = np.angle(np.mean(samples1 * np.conj(samples2)))
print(f"Phase offset: {phase_diff*180/np.pi:.2f}°")

Перспективы и применение

Решение уже используется в проектах KrakenSDR / KerberosSDR (4–5 каналов) и в любительских интерферометрах на водородной линии 1420 МГц. В перспективе аналогичный подход применим к другим чипам семейства RTL (RTL2832U rev.2/3) и к низкобюджетным SDR на базе Mirics или SDRplay при наличии вывода внешнего осциллятора.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *