Калибровка смещения частоты для приемников

Этот пример показывает, как измерить и калибровать смещение частоты между передатчиком и приемником в получателе с помощью MATLAB ® и Communications Toolbox™. Можно использовать записанные сигналы или принимать сигналы в режиме реального времени, используя Пакет поддержки Communications Toolbox для Радио RTL-SDR. Приемник контролирует принятый сигнал, вычисляет смещение частоты между передатчиком и получателем и отображает его в командном окне MATLAB ®.

Необходимое аппаратное и программное обеспечение

Чтобы запустить этот пример с помощью записанных сигналов, вам нужно следующее программное обеспечение:

Чтобы принимать сигналы в режиме реального времени, вам также нужно следующее оборудование:

  • Радио RTL-SDR

и следующее программное обеспечение

Полный список платформ SDR, поддерживаемых Communications Toolbox, см. в разделе «Поддерживаемые аппаратные средства» страницы Программно определяемого радио (SDR).

Если вы принимаете решение принимать сигналы в реальном времени с помощью радио, вам нужно настроить на известный широковещательный тональный сигнал пилот-сигнала или предоставить источник сигнала с известной центральной частотой, чтобы установить базовую линию. Если у вас нет доступного генератора сигналов, можно использовать недорогую рацию Family Radio Service в качестве источника. Обратите внимание, что источник сигнала должен быть узкополосным, причем синусоида является идеальным источником.

Фон

Все радио приемников показывают смещение частоты по сравнению с передатчиком. В некоторых случаях смещение частоты может быть больше, чем может обработать алгоритм приемника. Поэтому вам может потребоваться калибровать приемник, чтобы минимизировать смещение частоты.

Пример предоставляет следующую информацию о ссылке связи:

  • Количественное значение смещения частоты в Гц и PPM

  • Графическое представление качественного уровня ОСШ принимаемого сигнала

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

Если у вас нет передатчика, вы можете использовать широковещательный сигнал. Для примера в США цифровые телевизионные сигналы ATSC включают в себя узкополосный пилот-тон на несущей RF. Тон управления обычно находится на номинальной частоте 309,440 кГц над нижним ребром канала. Если такой сигнал присутствует в вашей области, можно задать ожидаемое значение центральной частоты на частоту тонального сигнала. Этот пример использует тональный сигнал управления канала 29, который находится приблизительно на 560e6 + 309,440e3 Гц. Список количества каналов и значений частоты см. в североамериканских телевизионных частотах.

Если в качестве приемника используется радио RTL-SDR, укажите отображаемое значение коррекции PPM в качестве свойства FrequencyCorrection object™ RTL-SDR Приемник System, чтобы компенсировать смещение частоты. Обязательно используйте знак смещения в вашей спецификации. Как только вы это сделали, спектр, отображаемый системным объектом анализатора спектра приемника, должен иметь максимальную амплитуду приблизительно 0 Гц.

Запуск примера

Начните передачу с вашего известного источника сигнала. Если вы находитесь в США, можно задать ожидаемую центральную частоту в пилотный тон ближнего цифрового ТВ-передатчика. Затем введите FrequencyCalibrationExample в Командном окне 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, чтобы создать приемник, который вычисляет относительное смещение частоты между передатчиком и получателем.