Main Content

受信機の周波数オフセット キャリブレーション

この例では、MATLAB® および Communications Toolbox™ を使用して、受信機で送信機と受信機の間の周波数オフセットの測定とキャリブレーションを行う方法について説明します。取得した信号か、Communications Toolbox Support Package for RTL-SDR Radio を使用してリアルタイムに受信した信号のいずれかを使用できます。受信機は受信した信号を監視し、送信機と受信機の間の周波数オフセットを計算し、それを MATLAB® コマンド ウィンドウに表示します。

必要なソフトウェアとハードウェア

取得した信号を使用してこの例を実行するには、Communications Toolbox™ が必要です。

信号をリアルタイムで受信するには、RTL-SDR 無線機と、対応する Communications Toolbox Support Package for RTL-SDR Radio のサポート パッケージ アドオンも必要です。

Communications Toolbox でサポートされる SDR プラットフォームのすべてのリストについては、Software-Defined Radio (SDR) 情報ページのサポートされているハードウェアの節を参照してください。

無線を使用してリアルタイムで信号を受信する場合、既知のブロードキャスト パイロット トーンに調整するか、信号ソースに既知の中心周波数を提供してベースラインを確立する必要があります。使用可能なシグナル ジェネレーターがない場合は、低価格の Family Radio Service のトランシーバーをソースとして使用できます。信号ソースを、理想的なソースとなっている正弦波をもつ、狭帯域にしなければならないことに注意してください。

背景

すべての無線受信機は、送信機と比較した場合の周波数オフセットを示します。場合によっては、周波数オフセットが受信機のアルゴリズムで処理できるよりも大きくなる場合があります。そのため、受信機をキャリブレーションして周波数オフセットを最小限にしなければならない場合があります。

例では、通信リンクに関する次のような情報が提供されます。

  • 周波数オフセットの定量値 (Hz と PPM)

  • 受信信号の定性 SNR レベルのグラフィカル ビュー

送信機がある場合は、それを使用してトーンなどの狭帯域信号を生成できます。

送信機がない場合は、ブロードキャスト信号を使用できる場合があります。たとえば米国では、ATSC デジタル TV 信号には、RF 搬送波上の狭帯域パイロット トーンが含まれます。パイロット トーンは通常、チャネルの下端より上の 309.440 kHz の公称周波数です。このような信号が地域内にある場合は、予想される中心周波数値をトーンの周波数に設定できます。この例では、約 560e6 + 309.440e3 Hz のチャネル 29 のパイロット トーンを使用しています。チャネル番号のリストと周波数値については、North American television frequencies を参照してください。

受信機として RTL-SDR 無線機を使用している場合は、表示された PPM 補正値を RTL-SDR Receiver System object™ の FrequencyCorrection プロパティとして指定し、周波数オフセットを補正します。仕様では必ずオフセットの符号を使用してください。これを行うと、受信機のスペクトル アナライザー System object で表示されたスペクトルは、約 0 Hz で最大振幅になるはずです。

例の実行

既知の信号ソースを使用して送信を開始します。米国の場合は、予想される中心周波数値を近くのデジタル TV 送信機のパイロット トーンに設定できます。

FrequencyOffsetCalibrationForReceiversExample スクリプトは、-200 kHz から 200 kHz の周波数範囲にある受信信号のスペクトルを表示し、推定周波数オフセット (Hz と PPM) をコマンド ウィンドウに表示します。次は示すケースでは、受信信号の最大強度の周波数は約 -35 kHz です。

コード例

受信機は、ユーザーの入力を求めて、変数を初期化します。次に、信号ソース、DC ブロッカー、粗トーン周波数オフセット推定器、およびスペクトル アナライザーをループで呼び出します。ループは、フレーム時間を使用して無線時間も追跡します。

% 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 = 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);
Frequency offset = -35808.562500 Hz,
Frequency correction value (Hz) = 35808.562500 
Frequency correction value (PPM) = 63.908546 

まとめ

この例では、Communications Toolbox™ System object を使用して、送信機と受信機の間の相対周波数オフセットを計算する受信機を構築しました。