メインコンテンツ

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

GPSデータのデコード

この例では、IS- GPS -200 [1]に従ってビットおよびフレーム同期を実行し、従来のGPSナビゲーション(LNAV)データをデコードする方法を示します。

はじめに

この図は、一般的なGPS受信機におけるさまざまな動作を示しています。GPS受信機の取得とトラッキング の例では、この図の赤いブロックで示されている操作について説明します。この例では、緑のブロックに焦点を当てています。GPS LNAV データは 50 ビット/秒の速度で送信されます。つまり、各ビットの送信には 20 ミリ秒かかります。受信機のトラッキングモジュールは、可視GPS衛星と受信機間の位相シフト、周波数オフセット、および遅延を追跡します。トラッキングのために、受信したベースバンド信号を統合してトラッキングメトリックを計算します[2]。トラッキング中に、ビット遷移にわたって積分が行われると、ビット値が変化するため、有効な積分値が減少します。したがって、データデコードの最初のステップは、正確なビット遷移境界を見つけることです。次に、フレーム同期モジュールを使用して、ナビゲーション データのデコードに必要なフレーム境界を計算します。フレーム境界がわかったら、データデコードを実行して、衛星から受信したナビゲーションデータを取得します。各トラッキング出力チャネルからのデータのデコードは、個別に実行する必要があります。この例では、単一の衛星のデータをデコードする方法を示します。

この例は3つの部分に分かれています。

  1. ビット同期 —トラッキングループの出力でビット境界を見つけます。

  2. フレーム同期 — 復調されたビット内のフレーム境界を見つけます。

  3. GPS LNAV データのデコード — ビットをデコードして、受信機の位置を推定するために必要なタイミング、エフェメリス、アルマナックなどのデータを取得します。

これらのいずれかの手順を実行するには、トラッキング結果 (時間と周波数が同期された波形) が必要です。デフォルトでは、この例では衛星PRN ID 7 からの 125 サブフレームのデータを使用します。これらのデータは trackedSignal.mat に保存され、この例にサポート ファイルとして添付されています。サンプルは、信号対雑音比 (SNR) -23 dB で収集されます。GPS信号の取得とトラッキングの詳細については、GPS受信機の取得とトラッキング を参照してください。

トラッキングループが出力するサンプルをロードします。この配列内の各サンプルの持続時間は 1 ミリ秒です。トラッキングループ出力のデータ型は、浮動小数点倍精度です。ストレージを節約するために、MAT ファイルは、1 符号ビット、整数部分に 1 ビット、小数値に 6 ビットの固定小数点形式でデータを保存します。固定小数点データを浮動小数点倍精度形式に戻します。

load trackedSignal.mat
trackedSignal = double(trackedSignal)/(2^6); % Convert fixed-point number to real value

ビット同期

LNAV データの場合、C/A コードのトラッキングが完了すると、1 ミリ秒の持続時間のC/A コード境界を持つ各コード ブロックがわかります。この 1 ミリ秒のコード ブロックは、1 つのサンプルを取得するためにトラッキングモジュールに統合されています。各データ ビットは、20 ミリ秒に対応する 20 個のサンプルで構成されます。20ミリ秒の各ブロックのビット境界を取得するには、(この20ミリ秒のブロック内で)遷移数が最大となる場所にフラグを設定します[2]

ビット遷移が発生する場所を見つけるには、gnssBitSynchronize 関数を呼び出します。C/A コードは波形の直交ブランチ上にあるため、信号の虚数部のみを考慮します。gnssBitSynchronize 関数は、データの遷移を推定し、20 サンプル内のビット位置の開始を示す遷移の最大数のインデックスを提供します。numAveragingBits 変数は、データ遷移を検索するウィンドウの長さを制御します。各データ ビットは 20 個のサンプルで構成されているため、numAveragingBits を 100 に設定すると、ビット遷移境界を決定するために 20 * 100 = 2000 個のサンプルのウィンドウが使用されます。

numCACodeBlocksPerBit = 20;
numAveragingBits = 100;
numAveragingSamples = numCACodeBlocksPerBit*numAveragingBits;
[maxTransitionLocation, transitionValues] = ...
    gnssBitSynchronize(imag(trackedSignal(1:numAveragingSamples,1)),numCACodeBlocksPerBit);
maxTransitionLocation
maxTransitionLocation = 
2
bar(transitionValues)
xlabel('Sample Index')
ylabel('Number of Transitions')
title('Bit Transitions Chart')

Figure contains an axes object. The axes object with title Bit Transitions Chart, xlabel Sample Index, ylabel Number of Transitions contains an object of type bar.

上の図では、ビット遷移の位置で最も多くの遷移が発生していることに注目してください。

ビット遷移の位置から 20 個のサンプルのブロックを検討し、20 個のサンプルごとに統合してソフト対数尤度比 (LLR) を生成します。ソフト LLR 値からビット値を取得します。

[samples,leftout] = buffer(trackedSignal(maxTransitionLocation:end,1),numCACodeBlocksPerBit);
softbits = mean(samples).';
bits = imag(softbits)<0;
rxconstellation = comm.ConstellationDiagram(1,"ShowReferenceConstellation",false);
rxconstellation.Title = "Constellation of Received Data After Bit Synchronization";
rxconstellation(softbits(:))

フレーム同期

フレーム同期は、サブフレームの正確な開始点と終了点を決定します。この情報は、データ デコーダーがデータを処理するために必要です。

各サブフレームは既知の 8 ビットのプリアンブルで始まります。フレーム同期モジュールはこの 8 ビット シーケンスを検索します。8 ビットのシーケンスは小さいため、同じシーケンスがデータ内の他の場所に発生する可能性があります。8 ビットのプリアンブルを検出した後、サブフレームの最初と 2 番目のワードをデコードします。パリティチェックに合格した場合は、ハンドオーバーワード[1]に含まれる週の時間とサブフレームIDをデコードします。週の時間とサブフレーム ID が一致する場合、フレーム境界の検出が成功したと宣言します。トラッキングループではサイクルスリップが発生する可能性があるため、フレーム同期を継続的に処理することで、デコーダが常に正確なサブフレームで動作することを保証します[2]。この図は、 GPS LNAV データ サブフレーム内のテレメトリワードとハンドオーバー ワードを示しています。

フレーム同期System objectを初期化します。このオブジェクトは、各列のフレーム同期されたサブフレームを返します。すべてのデータをこのオブジェクトを通じて送信します。このオブジェクトは、データの各サブフレームが反復的に渡される場合にも機能します。

framesync = HelperGPSLNAVFrameSynchronizer;
[syncidx, rxsubframes, subframeIDs] = framesync(bits);
syncidx
syncidx = 
1
numSubframes = size(rxsubframes,2)
numSubframes = 
124
subframeIDs
subframeIDs = 1×124

     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5     1     2     3     4     5

GPS LNAVデータのデコード

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

この例では、各サブフレームを個別に処理します。

cfg = struct;
accuParityChecks = zeros(numSubframes,10);
for isubframe = 1:numSubframes
    [cfg,parityChecks] = HelperGPSLNAVDataDecode(rxsubframes(:,isubframe),cfg);
    accuParityChecks(isubframe,:) = parityChecks;
end
numWordsInError = numel(accuParityChecks) - nnz(accuParityChecks)
numWordsInError = 
0

送信された構成プロパティとデコードされた構成プロパティは同じ値である必要があります。これらはデコードされた構成パラメーターです。

cfg
cfg = struct with fields:
                       SignalType: "LNAV"
                         Preamble: 139
                       TLMMessage: 0
                           HOWTOW: 124
                    AntiSpoofFlag: 0
                        CodesOnL2: "P-code"
                      L2PDataFlag: 0
                         SVHealth: 0
                 IssueOfDataClock: 0
                            URAID: 0
                       WeekNumber: 101
           GroupDelayDifferential: 0
    SVClockCorrectionCoefficients: [3×1 double]
             ReferenceTimeOfClock: 0
              SemiMajorAxisLength: 2.6560e+07
             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
                  AgeOfDataOffset: 0
        NMCTAvailabilityIndicator: 0
                          NMCTERD: [30×1 double]
                       Ionosphere: [1×1 struct]
                              UTC: [1×1 struct]
                      TextMessage: 'This content is part o'
                        AlertFlag: 0
                       SubframeID: 4
                           DataID: [2×1 double]
                         SVPageID: 63
                          Almanac: [1×1 struct]
             ReferenceTimeUTCData: 0
      TimeDataReferenceWeekNumber: 101
              PastLeapSecondCount: 18
    LeapSecondReferenceWeekNumber: 101
     LeapSecondReferenceDayNumber: 1
            FutureLeapSecondCount: 18
                  AlmanacSVHealth: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

その他の調査

この例では、一度にすべてのサブフレームを考慮してフレーム同期を実行します。実際には、新しいデータが受信されるたびに、各サブフレームの処理がループ内で実行されます。各サブフレームごとにフレーム同期を個別に実行できます。また、この例では、ビット同期ステータスをトラッキングループに更新しません。ビット同期値を使用して位相ロック ループ (PLL) の統合時間を増やし、低い SNR 値での PLL パフォーマンスを向上させることもできます。

サポート ファイル

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

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

参考文献

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

[2] Elliott D. KaplanとC. Hegarty編、「Understanding GPS/ GNSS」原理とアプリケーション 、第3版、 GNSSテクノロジーとアプリケーションシリーズ(ボストン、ロンドン:(アーテックハウス、2017年)。

参考

関数

オブジェクト

トピック