このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
GPS受信機の取得とトラッキング
この例では、全地球測位システム (GPS) 信号を取得して追跡する方法を示します。この例では、これらの信号がサポートされています。
GPS L1 C/A [1]
GPS L1C [2]
GPS L5 [3]
はじめに
符号分割多重アクセス (CDMA) の原理に基づいて動作するすべてのGPS信号は、同様の取得およびトラッキングアルゴリズムを使用します。取得は、すべての可視衛星を検出し、これらの可視衛星の周波数オフセット(ドップラーシフトを含む)とコード位相オフセットのcoarse値を推定するプロセスです。取得から得た値を使用して、トラッキングモジュールは、可視衛星の周波数オフセットとコード位相オフセットを微調整します。取得は通常、 GPS受信機の最初のステップです。取得から得た情報を使用して、図に示すように、可視衛星ごとに並列受信操作を実行します。特定の可視衛星の場合、信号損失が発生しない限り、取得は 1 回限りの操作ですが、トラッキングは周波数オフセットとコード位相オフセットの変化を追跡するための継続的なプロセスです。
この例では、選択した衛星のGPSベースバンド波形を生成し、信号内の可視衛星を検索するための取得を実行し、この図に示すように可視衛星を追跡します。
取得およびトラッキングアルゴリズムの詳細については、C/Aコードを使用したGPS受信機の取得とトラッキング の例を参照してください。
初期パラメーターの設定
サンプルワークフローを制御するすべてのパラメーターを指定します。
まず、信号の種類を指定します。
signalType = "GPS C/A"; % Possible values: "GPS C/A" | "GPS L1CD" | "GPS L5I" | "GPS L5Q"
オプションで、writeWaveformToFile
と writeTrackedSignalToFile
をそれぞれ true
として指定することで、生成された波形とトラッキング出力をファイルに書き込むことができます。
writeWaveformToFile =false; writeTrackedSignalToFile =
false;
可視衛星のみの取得を実行するように指定します。代わりにすべてのGPS衛星の取得を実行するには、acquireActiveSatellitesOnly
を false
として指定します。ただし、すべての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(:))
その他の調査
この例を使用すると、生成された波形をファイルに保存し、それらのサンプルを受信機チェーンで使用して受信機をテストできます。
トラッカーの出力をファイルに書き込んでさらに処理することもできます。トラッカー出力を符号付き固定小数点数として保存します。
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
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。