В этом примере показано, как измерить и откалибровать сдвиг частоты между передатчиком и приемником в приемнике с помощью MATLAB ® и Communications Toolbox™. С помощью пакета поддержки Communications Toolbox Support Package for RTL-SDR Radio можно либо использовать захваченные сигналы, либо принимать их в режиме реального времени. Приемник отслеживает принятый сигнал, вычисляет сдвиг частоты между передатчиком и приемником и отображает его в окне команд MATLAB ®.
Для выполнения этого примера с использованием захваченных сигналов необходимо следующее программное обеспечение:
Для приема сигналов в режиме реального времени также необходимо следующее оборудование:
Радиоблок RTL-SDR
и следующее программное обеспечение
Полный список платформ SDR, поддерживаемых Communications Toolbox, см. в разделе Поддерживаемые аппаратные средства на странице обнаружения Software Defined Radio (SDR).
При выборе приема сигналов в режиме реального времени с помощью радиоблока необходимо настроить на известный тональный сигнал пилот-сигнала широковещательной передачи или предоставить источник сигнала с известной центральной частотой для установления базовой линии. Если у вас нет доступного генератора сигнала, вы можете использовать в качестве источника недорогую рацию Family Radio Service. Следует отметить, что источник сигнала должен быть узкополосным, причем синусоидальная волна является идеальным источником.
Все радиоприемники имеют сдвиг частоты по сравнению с передатчиком. В некоторых случаях сдвиг частоты может быть больше, чем может обработать алгоритм приемника. Поэтому может потребоваться калибровка приемника для минимизации смещения частоты.
В примере представлена следующая информация о линии связи:
Количественное значение сдвига частоты в Гц и PPM
Графическое представление качественного уровня SNR принятого сигнала
При наличии передатчика его можно использовать для генерации узкополосного сигнала, например тонального сигнала.
Если у вас нет передатчика, вы можете использовать широковещательный сигнал. Например, в США сигналы цифрового ТВ ATSC включают в себя узкополосный тон пилот-сигнала на радиочастотной несущей. Тон пилот-сигнала обычно находится на номинальной частоте 309,440 кГц над нижним краем канала. Если такой сигнал присутствует в вашей области, можно установить ожидаемое значение центральной частоты на частоту тонального сигнала. В этом примере используется тон пилот-сигнала канала 29, который составляет приблизительно 560e6 + 309.440e3 Гц. Список номеров каналов и частотных значений см. в разделе Североамериканские телевизионные частоты.
Если в качестве приемника используется радиоприемник RTL-SDR, укажите отображаемое значение коррекции PPM в качестве свойства FrequencyCorrection object™ системы приемника RTL-SDR для компенсации смещения частоты. Обязательно используйте знак смещения в спецификации. После этого спектр, отображаемый системным объектом анализатора спектра приемника, должен иметь максимальную амплитуду приблизительно 0 Гц.
Начните передачу с известного источника сигнала. Если вы находитесь в США, вы можете установить ожидаемую центральную частоту на пилотный тон близкого цифрового телевизионного передатчика. Затем введите Frequency CalibrationExample в окне команд MATLAB или щелкните ссылку для запуска примера.
В этом примере отображается спектр принятого сигнала в диапазоне частот от -200 кГц до 200 кГц и в окне команд отображается оценочное смещение частоты в Гц и PPM. В случае, показанном ниже, частота максимальной мощности принимаемого сигнала составляет приблизительно -35 кГц.

Приемник запрашивает пользовательский ввод и инициализирует переменные. Затем он вызывает источник сигнала, блок блокировки постоянного тока, блок оценки грубого сдвига частоты тонального сигнала и анализатор спектра в петле. Цикл также отслеживает время радиосвязи с использованием длительности кадра.
% Request user input from command-line for application parameters userInput = helperFrequencyCalibrationUserInput; % Calculate system parameters based on the user input [fcParam,sigSrc] = helperFrequencyCalibrationConfig(userInput); % Create a DC blocker system object to remove the DC component of the % received signal and increase accuracy of the frequency offset estimation. dcBlocker = dsp.DCBlocker('Algorithm', 'Subtract mean'); % Create a coarse frequency offset estimation System Object to calculate % the offset. The system object performs an FFT on its input signal and % finds the frequency of maximum power. This quantity is the frequency % offset. CFO = comm.CoarseFrequencyCompensator( ... 'FrequencyResolution', 25, ... 'SampleRate', fcParam.FrontEndSampleRate); % Create a spectrum analyzer scope to visualize the signal spectrum scope = dsp.SpectrumAnalyzer(... 'Name', 'Actual Frequency Offset',... 'Title', 'Actual Frequency Offset', ... 'SpectrumType', 'Power',... 'FrequencySpan', 'Full', ... 'SampleRate', fcParam.FrontEndSampleRate, ... 'YLimits', [-40,10],... 'SpectralAverages', 50, ... 'FrequencySpan', 'Start and stop frequencies', ... 'StartFrequency', -200e3, ... 'StopFrequency', 200e3,... 'Position', figposition([50 30 30 40]));
msgLength = 0; radioTime = 0; secondCounter = 1; while radioTime < userInput.Duration rxSig = sigSrc(); rxSig = dcBlocker(rxSig); [~, offset] = CFO(rxSig); freqCorrection = (-offset / fcParam.ExpectedFrequency) * fcParam.FrontEndSampleRate; % Visualize spectrum and print results scope(rxSig); if radioTime > secondCounter fprintf(repmat('\b', 1, msgLength)); msg = sprintf(['Frequency offset = %f Hz,\n' ... 'Frequency correction value (Hz) = %f \n' ... 'Frequency correction value (PPM) = %f \n'], ... offset, -offset, freqCorrection); fprintf(msg); msgLength = numel(msg); secondCounter = secondCounter + 1; end % Update radio time radioTime = radioTime + fcParam.FrameDuration; end % Release all System objects release(sigSrc); release(dcBlocker); release(CFO);
В этом примере объекты Communications Toolbox™ System используются для построения приемника, который вычисляет относительное смещение частоты между передатчиком и приемником.