В приложениях, требующих фазовой когерентности (пеленгация, пассивная радиолокация, интерферометрия и радиоастрономия), рассинхронизация опорных генераторов между отдельными 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.048e6center_freq=1.42e9gain=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 при наличии вывода внешнего осциллятора.
