メインコンテンツ

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

GPS 波形生成

この例では、全地球測位システム (GPS) のレガシー ナビゲーション (LNAV) データ、民間ナビゲーション (CNAV) データ、および複雑なベースバンド波形を生成する方法を示します。データの拡散は、coarse acquisition コード(C/A コード)、高精度コード(パルス符号)、または民生中程度/民生長コード(L2 CM/L2 CL コード)で実行されます。この例は、IS- GPS -200規格[1]に準拠したGPS波形生成を示しています。GPSに基づいたナビゲーション システムを設計するには、受信信号を使用して受信機をテスト必要があります。送信機とチャネルパラメーターを制御できないため、衛星から受信した信号は受信機のテストには役立ちません。受信機をテストには、制御された一連のパラメーターの下で生成された波形を使用する必要があります。

この例では、障害なく 1 つの衛星のGPS波形を生成する方法を示します。複数の衛星からの現実的なGPS波形生成については、ソフトウェア無線を用いたGNSS信号伝送 の例を参照してください。

はじめに

次の 3 つの手順を使用してGPS信号を生成します。

  1. 後のセクションで説明する構成パラメーターを使用して、 GPSデータ ビットを生成します。データ ビットは 50 ビット/秒 (bps) の速度で生成されます。

  2. これらの低レートのデータ ビットを高レート拡散コードを使用して拡散します。GPS規格IS-GPS_200 [1]では、3種類の拡散コードを規定しています。C/A コード、 パルス符号、および L2 CM/L2 CL コード。この規格では、これら 3 つのコードに加えて、操作のスプーフィング防止モードがアクティブな場合にパルス符号の代わりに使用する Y コードも指定します。パルス符号と Y コードを合わせて P(Y) コードと呼びます。構成パラメーターは、波形を生成するために使用される拡散コードを決定します。

  3. 構成パラメーターのセットに従って同相ブランチと直交位相ブランチ上のコードを選択し、拡散コードによって拡散されたビットからGPS複素ベースバンド波形を生成します。

この図は、構成パラメーターからのGPS波形発生器のブロック図を示しています。

GPS信号構造

標準規格[1]では、2つの周波数でのGPS信号の送信について規定しています。L1(1575.42 MHz)とL2(1227.60 MHz)。基本周波数 10.23 MHz の信号は、これら両方の信号を生成します。L1の搬送周波数は154 x 10.23 MHz = 1575.42 MHz、L2の搬送周波数は120 x 10.23 MHz = 1227.60 MHzです。この例では、 GPSベースバンド信号の生成を示します。生成された波形は、要件に応じて L1 または L2 周波数にアップコンバートできます。規格によれば、レガシー信号は L1 周波数と L2 周波数の両方で送信されます。したがって、この例では、搬送周波数情報を除外して、ベースバンドでレガシー波形または L2C 波形のいずれかを柔軟に生成できます。この図は、標準で指定された信号構造と MATLAB ベースバンド波形生成オプションの関係を示しています。

同相ブランチおよび直交位相ブランチを介して送信するコンテンツを選択するには、この表を使用します。

signalType      = "legacy" % Possible values - "legacy" | "l2c"
signalType = 
"legacy"
hasDataWithPCode  = true; % When set to false, only spreading code is modulated without any data with it
hasDataWithCACode = true; % When set to false, only spreading code is modulated without any data with it

スペクトルと相関プロットの可視化を有効にするには、showVisualizations プロパティを設定します。必要に応じて、複素ベースバンド波形をファイルに書き込むには、writeWaveformToFile プロパティを設定します。この例では、可視化を有効にし、波形をファイルへ書き込むことを無効にします。

showVisualizations  = true;
writeWaveformToFile = false;

衛星PRNインデックスを[1,63]の範囲の整数で指定します。

PRNID = 1;
sampleRate = 4*10.23e6; % 4 time the rate of P-code to be able to see the side lobes of the spectrum

ナビゲーション データ全体のGPS波形を生成するには多くの時間とメモリが必要になるため、この例では、ナビゲーション データの 1 ビットのみの波形を生成する方法を示します。プロパティ NumNavDataBits を使用して、指定された数のデータ ビットの波形の生成を制御できます。

% Set this value to 1 to generate the waveform from the first bit of the
% navigation data
NavDataBitStartIndex = 1321;

% Set this value to control the number of navigation data bits in the
% generated waveform
NumNavDataBits = 1;

GPSデータの初期化

LNAV データと CNAV データで送信されるプロパティの多くは同じですが、フレーム構造は異なります。LNAV データは 1500 ビット長のフレームで送信され、各フレームは各サブフレームが 300 ビットの 5 つのサブフレームで構成されます。データ レートは 50 bps なので、各サブフレームの送信には 6 秒、各フレームの送信には 30 秒かかります。各サブフレームは 10 ワードで構成され、各ワードには 30 ビット (24 データ ビットと 6 パリティ ビット) が含まれます。GPSデータには、時計と衛星の位置に関する情報が含まれています。この図は、LNAV データのフレーム構造を示しています。

CNAV データは、メッセージ タイプ の形式で継続的に送信されます。各メッセージ タイプは 25 bps で送信される 300 ビットで構成されます。これらのビットはレート半分の畳み込みエンコーダーを通過し、各メッセージ タイプから 50 bps で 600 ビットが取得されます。各メッセージタイプの送信には 12 秒かかります。標準[1]では、14種類のメッセージタイプが次の順序で定義されています。10、11、30、31、32、33、34、35、36、37、12、13、14、15。各メッセージタイプと送信されるデータの詳細については、IS- GPS-200L付録III [1]を参照してください。各メッセージ タイプが送信される順序は完全に任意ですが、最適なユーザー エクスペリエンスを提供するために順序付けられています。この例では、これらのメッセージ タイプが送信される順序を選択できます。この図は CNAV メッセージの構造を示しています。

この図に示すメッセージ タイプには次のフィールドがあります。

  • PRN ID:疑似ランダムノイズ(PRN)指数

  • MSG:メッセージ

  • TOW:週の時間

  • CRC:巡回冗長検査

CNAV データを生成するためにデータ構成オブジェクトを初期化します。HelperGPSNavigationConfig オブジェクトから構成オブジェクトを作成できます。必要に応じて波形をカスタマイズするには、構成オブジェクトのプロパティを更新します。

cnavConfig = HelperGPSNavigationConfig(SignalType = "CNAV", PRNID = PRNID)
cnavConfig = 
  HelperGPSNavigationConfig with properties:

                           SignalType: "CNAV"
                                PRNID: 1
                         MessageTypes: [4×15 double]
                               HOWTOW: 1
                           L2CPhasing: 0
                         SignalHealth: [3×1 double]
                           WeekNumber: 2149
               GroupDelayDifferential: 0
                 ReferenceTimeOfClock: 0
                  SemiMajorAxisLength: 26560000
            ChangeRateInSemiMajorAxis: 0
                 MeanMotionDifference: 0
           RateOfMeanMotionDifference: 0
                         Eccentricity: 0.0200
                          MeanAnomaly: 0
             ReferenceTimeOfEphemeris: 0
              HarmonicCorrectionTerms: [6×1 double]
                  IntegrityStatusFlag: 0
                    ArgumentOfPerigee: -0.5200
                 RateOfRightAscension: 0
             LongitudeOfAscendingNode: -0.8400
                          Inclination: 0.3000
                      InclinationRate: 0
                              URAEDID: 0
                InterSignalCorrection: [4×1 double]
          ReferenceTimeCEIPropagation: 0
    ReferenceWeekNumberCEIPropagation: 101
                             URANEDID: [3×1 double]
                            AlertFlag: 0
                      AgeOfDataOffset: 0
                      AlmanacFileName: "gpsAlmanac.txt"
                           Ionosphere: [1×1 struct]
                     EarthOrientation: [1×1 struct]
                                  UTC: [1×1 struct]
               DifferentialCorrection: [1×1 struct]
                           TimeOffset: [1×1 struct]
                       ReducedAlmanac: [1×1 struct]
                  TextInMessageType36: 'This content is part of Satellite Communications Toolbox. '
                  TextInMessageType15: 'This content is part of Satellite Communications Toolbox. '

理論上は、すべての衛星の時計は同期されている必要があり、これはすべてのGPS衛星の時計が特定の瞬間に同じ時刻を示す必要があることを意味します。実際には、バイアス、ドリフト、経年劣化といった決定論的な衛星クロック誤差特性と、群遅延バイアスや平均微分群遅延といった衛星実装特性が存在します。これらの誤差により、衛星クロックはGPSシステムの時間とずれてしまいます。

GPS衛星は楕円軌道で地球の周りを周回しており、地球はその楕円の焦点の 1 つにあります。この楕円軌道上の衛星の位置を正確に定義する軌道パラメーターのセットは、エフェメリス と呼ばれます。各GPS衛星は、LNAV データの場合はサブフレーム 2 および 3、CNAV データの場合はメッセージ タイプ 10 および 11 で独自のエフェメリスデータを送信します。この図は、地球中心の地球固定(ECEF) 座標系における衛星の 5 つの軌道パラメーターを示しています。この図は実際のGPS衛星を示すものではなく、説明のみを目的としています。

  • 長半径の長さ、A:衛星の楕円軌道の中心から遠地点または近地点までの距離

  • 傾斜角角度、i:地球の赤道面と衛星の軌道面の間の角度

  • 昇交点の経度、Ω:グリニッジ子午線と昇交点の方向との間の角度

  • 近地点引数、ω:昇交点の方向と近地点の方向の間の角度

  • 真近点角、υ:近地点の方向と衛星の現在の位置の方向との間の角度

ケプラーの惑星運動の第二法則によれば、角速度(真近点角の変化率)は軌道上の場所によって異なります。衛星の軌道全体にわたって変化率が一定である平均近点角を定義できます。GPSエフェメリスパラメーターでは、真近点角を指定するのではなく、平均近点角を指定します (そこから真近点角が見つかります)。IS- GPS-200L表20-IV [1]は平均近点角と真近点角を関連付けるアルゴリズムを規定している。

楕円の離心率も軌道を定義します。離心率は、楕円軌道が円形からどれだけずれているかを示す尺度です。

LNAV データにも同様のプロパティ セットが存在します。LNAV データを保存するための構成オブジェクトを作成します。

lnavConfig = HelperGPSNavigationConfig(SignalType = "LNAV", PRNID = PRNID)
lnavConfig = 
  HelperGPSNavigationConfig with properties:

                       SignalType: "LNAV"
                            PRNID: 1
                     FrameIndices: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25]
                       TLMMessage: 0
                           HOWTOW: 1
                    AntiSpoofFlag: 0
                        CodesOnL2: "P-code"
                      L2PDataFlag: 0
                         SVHealth: 0
                 IssueOfDataClock: 0
                            URAID: 0
                       WeekNumber: 2149
           GroupDelayDifferential: 0
    SVClockCorrectionCoefficients: [3×1 double]
             ReferenceTimeOfClock: 0
              SemiMajorAxisLength: 26560000
             MeanMotionDifference: 0
                  FitIntervalFlag: 0
                     Eccentricity: 0.0200
                      MeanAnomaly: 0
         ReferenceTimeOfEphemeris: 0
          HarmonicCorrectionTerms: [6×1 double]
             IssueOfDataEphemeris: 0
              IntegrityStatusFlag: 0
                ArgumentOfPerigee: -0.5200
             RateOfRightAscension: 0
         LongitudeOfAscendingNode: -0.8400
                      Inclination: 0.3000
                  InclinationRate: 0
                        AlertFlag: 0
                  AgeOfDataOffset: 0
        NMCTAvailabilityIndicator: 0
                          NMCTERD: [30×1 double]
                  AlmanacFileName: "gpsAlmanac.txt"
                       Ionosphere: [1×1 struct]
                              UTC: [1×1 struct]
                      TextMessage: 'This content is part of Satellite Communications Toolbox. Thank you. '

GPS信号生成

ベースバンドでGPS信号を生成するには、次の手順に従います。

  1. ナビゲーション データ ビットを 50 ビット/秒で生成します。

  2. 構成に基づいて、 C/A コード、 パルス符号、L2 CM/L2 CL コード、またはそれらの組み合わせを生成します (gpsWaveformGenerator オブジェクト内で実行されます)。

  3. CNAV または LNAV データ ビットを適切な測距コードで拡散します (gpsWaveformGenerator オブジェクト内で発生します)。

  4. 両方のブランチのビットをビット 0 から +1、ビット 1 から -1 にマップします (gpsWaveformGenerator オブジェクト内で実行されます)。

  5. 各ブランチのコードをレートマッチングして、同相ブランチと直交位相ブランチのデータを収集します (gpsWaveformGenerator オブジェクト内で実行されます)。

  6. (オプション) このベースバンド波形をファイルに書き込みます (writeWaveformToFile プロパティ値によって異なります)。

設定に基づいて、CNAV データを生成します。

cnavDataFull = HelperGPSNAVDataEncode(cnavConfig);

CNAV データを畳み込みエンコーダに渡します。

% 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");
encodedCNAVData = cenc(cnavDataFull);

設定に基づいて、LNAV データを生成します。

lnavDataFull = HelperGPSNAVDataEncode(lnavConfig);

生成された LNAV データと CNAV データには多くのビットが含まれます。それらの中から、NavDataBitStartIndexNumNavDataBits に基づいてデータ ビットを選択します。

dataBitIdx = NavDataBitStartIndex + (0:NumNavDataBits-1);
lnavData = logical(lnavDataFull(dataBitIdx));
cnavData = logical(encodedCNAVData(dataBitIdx));

波形生成に必要なすべてのプロパティを指定し、gpsWaveformGenerator オブジェクトを作成します。

% Initialize the GPS waveform generation object
gpswaveobj = gpsWaveformGenerator(SignalType=signalType, ...
    PRNID=PRNID, ...
    SampleRate=sampleRate, ...
    EnablePCode=true, ...
    HasDataWithCACode=hasDataWithCACode, ...
    HasDataWithPCode=hasDataWithPCode)
gpswaveobj = 
  gpsWaveformGenerator with properties:

           SignalType: "legacy"
                PRNID: 1
          EnablePCode: true
     HasDataWithPCode: true
    HasDataWithCACode: true
          InitialTime: 0
           SampleRate: 40920000

  Show all properties

bitDuration = gpswaveobj.BitDuration; % BitDuration is a read-only property that gets its value based on SignalType

% Assuming the simulation starts at the beginning of the week, calculate
% the initial time based on navigation data start index.
inittow = bitDuration*(NavDataBitStartIndex-1);
gpswaveobj.InitialTime = inittow;

波形を書き込むファイルを作成します。

if writeWaveformToFile == 1
    bbWriter = comm.BasebandFileWriter("Waveform.bb",sampleRate,0);
end

ナビゲーション データを gpsWaveformGenerator オブジェクトに渡すことで、 GPS波形を生成します。

gpsBBWaveform = gpswaveobj({lnavData,cnavData});
size(gpsBBWaveform)
ans = 1×2

      818400           1

オプションで生成された波形をファイルに書き込む

if writeWaveformToFile == 1
    bbWriter(gpsBBWaveform);
    release(bbWriter);
end

信号の可視化

C/A コードの自己相関をプロットします。測距コード シーケンスの自己相関は、ゼロ遅延を除いてほぼゼロであり、2 つの異なるシーケンスの相互相関もほぼゼロです。C/A コードは1023 チップの周期で発生するため、自己相関は 1023 チップごとに遅延がピークになります。

if showVisualizations
    IBranchData = real(gpsBBWaveform);
    QBranchData = imag(gpsBBWaveform);
    corrdata = QBranchData(1:1e-3*sampleRate,1); % Auto-correlate with 1 millisecond of data
    lags = linspace(-1023,1023,2*size(corrdata,1)-1);
    plot(lags,xcorr(corrdata))
    grid on
    xlabel("Number of C/A-code chips Delayed")
    ylabel("Autocorrelation")
    title("Autocorrelation of GPS Spreading Code")
end

Figure contains an axes object. The axes object with title Autocorrelation of GPS Spreading Code, xlabel Number of C/A-code chips Delayed, ylabel Autocorrelation contains an object of type line.

同相分岐信号と直交分岐信号の電力スペクトル密度を比較します。このスペクトル プロットは、パルス符号を使用するとパルス符号コードが広くなることを示しています。

if showVisualizations
    if hasDataWithPCode == true
        IBranchContent = "P(Y) + D";
    else
        IBranchContent = "P(Y)";
    end

    if signalType == "l2c"
        QBranchContent = "L2 CM + Dc With L2 CL";
    else % legacy
        if hasDataWithCACode ==true
            QBranchContent = "C/A + D";
        else
            QBranchContent = "C/A";
        end
    end

    % Plot the power spectral density of the in-phase and quadrature-phase
    % signals separately
    iqScope = spectrumAnalyzer(SampleRate = sampleRate, ...
        SpectrumType = "Power density", ...
        SpectrumUnits = "dBW", ...
        YLimits = [-130, -50], Title = ...
        "Comparison of Power Spectral Density of GPS baseband I and Q Signals", ...
        ShowLegend = true, ChannelNames = ...
        ["Q-branch spectrum with content: " + QBranchContent, ...
        "I-branch spectrum with content: " + IBranchContent]);

    iqScope([QBranchData,IBranchData]);

    % Plot the signal power spectral density of the entire baseband signal
    bbscope = spectrumAnalyzer(SampleRate = sampleRate, ...
        SpectrumType = "Power density", ...
        SpectrumUnits = "dBW", ...
        YLimits = [-120,-50], ...
        Title = "Power Spectral Density of Complex Baseband GPS Signal");
    bbscope(gpsBBWaveform);
end

その他の調査

サポート ファイル

この例では、次のヘルパー ファイルを使用します。

参考文献

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

参考

関数

オブジェクト

トピック