メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

GPS受信機の取得とトラッキング

この例では、全地球測位システム (GPS) 信号を取得して追跡する方法を示します。この例では、これらの信号がサポートされています。

  • GPS L1 C/A [1]

  • GPS L1C [2]

  • GPS L5 [3]

はじめに

符号分割多重アクセス (CDMA) の原理に基づいて動作するすべてのGPS信号は、同様の取得およびトラッキングアルゴリズムを使用します。取得は、すべての可視衛星を検出し、これらの可視衛星の周波数オフセット(ドップラーシフトを含む)とコード位相オフセットのcoarse値を推定するプロセスです。取得から得た値を使用して、トラッキングモジュールは、可視衛星の周波数オフセットとコード位相オフセットを微調整します。取得は通常、 GPS受信機の最初のステップです。取得から得た情報を使用して、図に示すように、可視衛星ごとに並列受信操作を実行します。特定の可視衛星の場合、信号損失が発生しない限り、取得は 1 回限りの操作ですが、トラッキングは周波数オフセットとコード位相オフセットの変化を追跡するための継続的なプロセスです。

この例では、選択した衛星のGPSベースバンド波形を生成し、信号内の可視衛星を検索するための取得を実行し、この図に示すように可視衛星を追跡します。

gpsacqTrack.png

取得およびトラッキングアルゴリズムの詳細については、C/Aコードを使用したGPS受信機の取得とトラッキング の例を参照してください。

初期パラメーターの設定

サンプルワークフローを制御するすべてのパラメーターを指定します。

まず、信号の種類を指定します。

signalType = "GPS C/A"; % Possible values: "GPS C/A" | "GPS L1CD" | "GPS L5I" | "GPS L5Q"

オプションで、writeWaveformToFilewriteTrackedSignalToFile をそれぞれ true として指定することで、生成された波形とトラッキング出力をファイルに書き込むことができます。

writeWaveformToFile      = false;
writeTrackedSignalToFile = false;

可視衛星のみの取得を実行するように指定します。代わりにすべてのGPS衛星の取得を実行するには、acquireActiveSatellitesOnlyfalse として指定します。ただし、すべてのGPS衛星の取得を選択すると、使用可能なシステム メモリによってはメモリの問題が発生する可能性があることに注意してください。

acquireActiveSatellitesOnly = true;

可視衛星の数を指定します。

numSat = 4;

可視衛星の疑似ランダムノイズ (PRN) 番号を指定します。

PRNIDs = [7; 11; 20; 28];

この例では、処理するデータ ビットの数を指定します。長時間実行されるシミュレーションの場合は、numDataBits を適切な高い値に設定します。たとえば、 GPS L1C 信号のすべての情報を送信するには、それぞれ 1800 ビットのフレームが 8 つ必要で、合計 14400 ビットになります。このようなシミュレーションの実行には長い時間がかかるため、サンプルの結果を検証するにはこのパラメーターを小さい値に設定してください。

numDataBits = 300;

可視衛星ごとにドップラー、遅延、信号対雑音比 (SNR) を指定します。

frequencyoffset = [-3589 4256 -1563 2666];       % In Hz
sigdelay        = [300.34e-6 587.21e-6 425.89e-6 312.88e-6]; % Delay in sec
SNRs            = [-20 -21.5 -20.5 -21];         % In dB

信号の中間周波数とサンプリング レートを設定します。

IntermediateFrequency = 0;                          % In Hz
SampleRate            = 20e6;                       % In samples/sec

取得を実行するときに、周波数ステップ サイズを実数の正の数に設定します。この値を -1 に設定すると、例では信号の種類に応じてこれらのデフォルトの周波数ステップ サイズを考慮します。

  • 「GPS C/A」、「GPS L5I」、「GPS L5Q」 — 500 Hz

  • 「GPS L1CD」—50 Hz

acquisitionFrequencyStep = -1;    % Default

位相ロック ループ (PLL)、周波数ロック ループ (FLL)、および遅延ロック ループ (DLL) のループ ノイズ帯域幅を設定します。帯域幅が広いほど、ループを通過するノイズは多くなりますが、急速に変化するパラメーターを追跡できるようになります。帯域幅が低いほどループを通過するノイズは少なくなりますが、トラッキングパラメーターが急速に変化するとロックが失われます。受信機が高速で移動するオープンスカイ環境では、ノイズが低く、パラメーターが急速に変化することを期待できるため、ノイズ帯域幅を高い値に設定します。屋内などのノイズの多い環境では、ノイズ帯域幅を減らして受信機の感度を高めます。この例では、デフォルト設定ではノイズが中程度であるため、ループ帯域幅に中程度の値を使用します。

PLLNoiseBandwidth = 90;                             % In Hz
FLLNoiseBandwidth = 4;                              % In Hz
DLLNoiseBandwidth = 1;                              % In Hz

再現可能な波形を生成するためのシードを設定します。

seed = 73;

シミュレーションの構成

前のセクションで指定したパラメーターを使用してシミュレーションを構成します。

まず、パラメーターの初期セットを構成します。

初期設定に基づいて波形生成オブジェクトを初期化します。

gpswavegen = gpsWaveformGenerator(PRNID=PRNIDs,SampleRate=SampleRate);

% Configure various parameters based on the signalType.
switch(signalType)
    case "GPS C/A"
        numBitsPerStep = 1;
        numCodeBlocksPerBit = 20;
        samplesPerCodeBlock = SampleRate*1e-3;
        gpswavegen.EnablePCode = true;
        gpswavegen.HasDataWithPCode = true;
        gpswavegen.HasDataWithCACode = true;
        gpswavegen.SignalType = "legacy";
        navDataType = "LNAV";
        defaultAcqFqyStep = 500;
    case "GPS L1CD"
        numBitsPerStep = 2;
        numCodeBlocksPerBit = 1;
        samplesPerCodeBlock = SampleRate*10e-3;
        gpswavegen.SignalType = "l1c";
        navDataType = "CNAV2";
        defaultAcqFqyStep = 50; 
    case {"GPS L5I" "GPS L5Q"}
        numBitsPerStep = 1;
        numCodeBlocksPerBit = 10;
        samplesPerCodeBlock = SampleRate*1e-3;
        gpswavegen.SignalType = "l5";
        navDataType = "L5";
        defaultAcqFqyStep = 500;
    otherwise
        error("Invalid signalType.")
end
numCodeBlocks = numDataBits*numCodeBlocksPerBit;
numSteps = numDataBits/numBitsPerStep;
numCodeBlocksPerStep = numCodeBlocksPerBit*numBitsPerStep;
if acquisitionFrequencyStep == -1 % Set default value
    acqfqystep = defaultAcqFqyStep;
else
    acqfqystep = acquisitionFrequencyStep;
end

if writeWaveformToFile == true
    % Initialize the baseband file writer object
    bbwriter = comm.BasebandFileWriter("gpsWaveform.bb",SampleRate,IntermediateFrequency);
end

GPSチャネルオブジェクトを構成する

gnssChannel = HelperGNSSChannel(SampleRate = SampleRate, SignalToNoiseRatio=SNRs, ...
        SignalDelay=sigdelay,FrequencyOffset=frequencyoffset,...
        RandomStream="mt19937ar with seed",Seed=seed);

受信機取得オブジェクトを構成する

gsa = gnssSignalAcquirer(GNSSSignalType=signalType, ...
FrequencyResolution=acqfqystep, ...
IntermediateFrequency=IntermediateFrequency, ...
SampleRate=SampleRate)
gsa = 
  gnssSignalAcquirer with properties:

              GNSSSignalType: "GPS C/A"
                  SampleRate: 20000000
       IntermediateFrequency: 0
              FrequencyRange: [-10000 10000]
         FrequencyResolution: 500
    DetectionThresholdFactor: 1.9000

% If CNAV, encode it with convolutional encoder
% Initialize the trellis for convolutional encoder
trellis = poly2trellis(7,["1+x+x^2+x^3+x^6" "1+x^2+x^3+x^5+x^6"]);
cenc = comm.ConvolutionalEncoder(TrellisStructure = trellis, ...
    TerminationMethod = "Continuous");

cfg = cell(numSat,1);
cfg{1} = HelperGPSNavigationConfig(SignalType=navDataType, ...
        L1CTOI=60);
tempData = HelperGPSNAVDataEncode(cfg{1});
if any(strcmp(navDataType,["CNAV" "L5"]))
    tempData = cenc(tempData);
    reset(cenc);
end
transmittedBits = [tempData zeros(size(tempData,1),numSat-1)];

for isat = 2:numSat
    cfg{isat} = HelperGPSNavigationConfig(SignalType=navDataType, ...
        L1CTOI=60);
    navdata = HelperGPSNAVDataEncode(cfg{isat});
    if any(strcmp(navDataType,["CNAV" "L5"]))
        transmittedBits(:,isat) = cenc(navdata);
        reset(cenc);
    else
        transmittedBits(:,isat) = navdata;
    end
end

GPS信号を取得する

取得に適した波形を生成し、受信機取得オブジェクトを使用して取得します。

% Initialize data bits for the waveform
b = transmittedBits(1:numBitsPerStep,:);
% Generate waveform for those data bits
txwaveform = gpswavegen(b);

% pass the transmitted signal through the channel
rxwaveform = gnssChannel(txwaveform);

if writeWaveformToFile == true
    bbwriter(rxwaveform)
end
% Perform acquisition
if acquireActiveSatellitesOnly == true
    prntable = gsa(rxwaveform(end-2*samplesPerCodeBlock+1:end),PRNIDs)
else
    % Searching for all satellites requires more system memory
    prntable = gsa(rxwaveform(end-2*samplesPerCodeBlock+1:end),1:32)
end
prntable=4×4 table
    PRNID    FrequencyOffset    CodePhaseOffset    IsDetected
    _____    _______________    _______________    __________

     20           -1500              435.7           true    
      7           -3500             307.21           true    
     28            2500              320.1           true    
     11            4500             600.71           true    

PRNIDsToSearch = prntable(prntable(:,4).IsDetected==1,1).PRNID.';         % Get row vector
doppleroffsets = prntable(prntable(:,4).IsDetected==1,2).FrequencyOffset;
codephoffsets  = prntable(prntable(:,4).IsDetected==1,3).CodePhaseOffset;

numdetectsat = length(PRNIDsToSearch);

disp("The detected satellite PRN IDs: " + num2str(PRNIDsToSearch))
The detected satellite PRN IDs: 20   7  28  11

GPS信号を追跡する

信号トラッキングオブジェクトを作成して構成します。取得が完了した後も、波形の生成を継続し、ループ内で信号を追跡します。この例では、シミュレーションの進行中に衛星が変更されないことを前提としているため、信号トラッキングオブジェクトは複数の衛星を処理できます。

if isempty(PRNIDsToSearch)
    % Because no satellites are detected, stop the simulation
    return
end
carrierCodeTrack                        = gnssSignalTracker;
carrierCodeTrack.GNSSSignalType         = signalType;
carrierCodeTrack.SampleRate             = SampleRate;
carrierCodeTrack.IntermediateFrequency  = IntermediateFrequency;
carrierCodeTrack.PLLNoiseBandwidth      = PLLNoiseBandwidth;
carrierCodeTrack.FLLNoiseBandwidth      = FLLNoiseBandwidth;
carrierCodeTrack.DLLNoiseBandwidth      = DLLNoiseBandwidth;
carrierCodeTrack.PRNID                  = PRNIDsToSearch;
carrierCodeTrack.InitialFrequencyOffset = doppleroffsets;
carrierCodeTrack.InitialCodePhaseOffset = codephoffsets;
longDisplay(carrierCodeTrack)
  gnssSignalTracker with properties:

            GNSSSignalType: "GPS C/A"
                SampleRate: 20000000
     IntermediateFrequency: 0
           IntegrationTime: 1.0000e-03

   Initialization from acquisition
                     PRNID: [20 7 28 11]
    InitialCodePhaseOffset: [4×1 double]
    InitialFrequencyOffset: [4×1 double]

   Phase Locked Loop (PLL)
                DisablePLL: 0
                  PLLOrder: 2
         PLLNoiseBandwidth: 90

   Frequency Locked Loop (FLL)
                DisableFLL: 0
                  FLLOrder: 1
         FLLNoiseBandwidth: 4

   Delay Locked Loop (DLL)
                  DLLOrder: 1
         DLLNoiseBandwidth: 1

トラッキングオブジェクトからの出力を保存するための変数を初期化します。

% Initialize all the properties which must be accumulated.
[accuph, accufqy, accufqyerr, accupherr, ...
    accudelay, accudelayerr, accuintegwave] = ...
    deal(zeros(numCodeBlocks,numdetectsat));           % Each column represents data from a satellite

生成された波形の初期トラッキングを実行し、値を保存します。

[trackedWave,trackinfo] = carrierCodeTrack(rxwaveform);
tridx = 1:numCodeBlocksPerStep;
accuintegwave(tridx,:) = trackedWave;
accuph(tridx,:)        = trackinfo.PhaseEstimate;
accupherr(tridx,:)     = trackinfo.PhaseError;
accufqy(tridx,:)       = trackinfo.FrequencyEstimate;
accufqyerr(tridx,:)    = trackinfo.FrequencyError;
accudelay(tridx,:)     = trackinfo.DelayEstimate;
accudelayerr(tridx,:)  = trackinfo.DelayError;

ループ内の信号を追跡します。

for ii = 2:numSteps
    % Waveform generation
    b = transmittedBits((ii-1)*numBitsPerStep+1:ii*numBitsPerStep,:);
    txwaveform = gpswavegen(b);

    % pass the transmitted signal through the channel
    rxwaveform = gnssChannel(txwaveform);

    if writeWaveformToFile == true
        bbwriter(rxwaveform);
    end

    % Track at receiver
    [trackedWave,trackinfo] = carrierCodeTrack(rxwaveform);
    
    % Store tracking output
    tridx = (ii-1)*numCodeBlocksPerStep + (1:numCodeBlocksPerStep);
    accuintegwave(tridx,:) = trackedWave;
    accuph(tridx,:)        = trackinfo.PhaseEstimate;
    accupherr(tridx,:)     = trackinfo.PhaseError;
    accufqy(tridx,:)       = trackinfo.FrequencyEstimate;
    accufqyerr(tridx,:)    = trackinfo.FrequencyError;
    accudelay(tridx,:)     = trackinfo.DelayEstimate;
    accudelayerr(tridx,:)  = trackinfo.DelayError;
end
trackedOutput = accuintegwave(1:tridx(end),:);
trackedOutput = trackedOutput/rms(trackedOutput(:));    % Normalize tracking output

if writeWaveformToFile == 1
    release(bbwriter);
end

% Plot constellation after tracking is complete
scatterplot(trackedOutput(:))

Figure Scatter Plot contains an axes object. The axes object with title Scatter plot, xlabel In-Phase, ylabel Quadrature contains a line object which displays its values using only markers. This object represents Channel 1.

その他の調査

この例を使用すると、生成された波形をファイルに保存し、それらのサンプルを受信機チェーンで使用して受信機をテストできます。

トラッカーの出力をファイルに書き込んでさらに処理することもできます。トラッカー出力を符号付き固定小数点数として保存します。

if writeTrackedSignalToFile == true
    % Initialize the number of bits for the integer (a) and fractional (b)
    % parts of the fixed point number. Ensure that a+b is always 7, so as
    % to store the signal in int8 format.
    a = 1; % Number of bits for integer part
    b = 6; % Number of bits for fractional part
    % Convert the tracked output to integer values.
    intTrackedOutput = round(trackedOutput*2^b);

    % Store the real and imaginary components of the integer-tracked signal
    % as different matrices for the purpose of converting them to
    % fixed-point numbers independently.
    tempTrackedSignal = zeros(size(intTrackedOutput,1),size(intTrackedOutput,2),2);
    tempTrackedSignal(:,:,1) = real(intTrackedOutput);
    tempTrackedSignal(:,:,2) = imag(intTrackedOutput);
    signOfTrackedSignal = int8(sign(tempTrackedSignal));

    % Store only the LSBs of the absolute value. Handle the sign separately.
    lsbOfTrackedSignal = bitand(int32(abs(tempTrackedSignal)),2^(a+b)-1);

    % Apply the sign to the signal.
    tempFixedPointSignal = int8(lsbOfTrackedSignal).*signOfTrackedSignal;

    % Create a fixed-point, complex signal in int8 format.
    trackedSignal = complex(tempFixedPointSignal(:,:,1),tempFixedPointSignal(:,:,2));
    save trackedSignal trackedSignal
end

サポート ファイル

この例では、これらのデータとヘルパー ファイルを使用します。

  • HelperGPSNAVDataEncode.m — 構成オブジェクトからナビゲーションデータをビットにエンコードします

  • HelperGPSNavigationConfig.m — GPSナビゲーションデータの構成オブジェクトを作成する

  • L1CLDPCParityCheckMatrices.mat — L1C データをエンコードするためのLDPCパリティ検査行列

参考文献

[1] IS- GPS-200、改訂:N. NAVSTAR GPS宇宙セグメント/ナビゲーション ユーザー セグメント インターフェース。2022年8月22日; コード識別:66RP1。

[2] IS- GPS-800、改訂:J. NAVSTAR GPS宇宙セグメント/ユーザーセグメント L1C インターフェース。2022年8月22日; コード識別:66RP1。

[3] IS- GPS-705、改訂:J. NAVSTAR GPS宇宙セグメント/ユーザーセグメント L1C インターフェース。2022年8月22日; コード識別:66RP1。

参考

関数

オブジェクト

トピック