主要内容

端到端GPS传统导航接收机使用C/A-Code

本例展示了如何使用多卫星GPS基带波形估计全球定位系统(GPS)接收机的位置。您使用接收器独立交换格式(RINEX)和一个年鉴文件来建模GPS星座并生成多卫星基带波形。模拟卫星场景,得到卫星相对于模型接收机的相对位置。对于这个卫星场景,建模多普勒频移、延迟和接收信号功率。基于这些计算,用多普勒频移、延迟和噪声对产生的基带信号造成损害。这个例子展示了如何从这个受损的GPS基带信号估计模拟接收机的位置。

简介

在本例中,您从一个RINEX文件开始,并使用rinexread(导航工具箱)来读取文件并提供输入satelliteScenario(卫星通信工具箱)来模拟GPS星座。基于这个GPS星座和给定的接收机位置,您可以计算从每个可见卫星到接收机的多普勒频移、延迟和信号路径损失。基于来自RINEX和历书文件的星历表、时钟和历书数据,根据IS-GPS-200生成数据位[1]标准。对于接收机可见的卫星,生成粗采集码(C/ a码)和精确码(p码)。p码放在同相(I)支路上,C/ a码放在基带波形的四相(Q)支路上。is - gps -200给出的i支信号衰减3db[1].为所有可见卫星生成基带波形,并将此基带波形通过传播通道,如下图所示。每个卫星信号的传播信道特征都是唯一的,因为每个卫星相对于接收机的位置和速度都是唯一的。在本例中,您对传播信道的特性建模——即多普勒频移、延迟和基于传播路径损耗的缩放信号功率——并向复合信号添加热噪声。提供这个噪声信号作为GPS接收器的输入。此示例支持将此噪声信号存储在文件中,以便您可以测试您的接收机。

由传播信道产生的复杂基带波形通过GPS接收机进行处理。下图显示了这种GPS接收机的高级细节。首先,初始同步模块探测可见卫星。它估计了可见卫星的多普勒偏移和延迟的粗值。对于每一个探测到的卫星,创建单独的接收信道(不要与传播信道混淆)。每个接收信道执行跟踪、位同步、帧同步、数据解码、发射时间估计、卫星位置估计和伪距离计算。对于接收机位置的估计,需要估计卫星在天空中的位置以及卫星到接收机的距离。根据IS-GPS-200中表20-IV提供的星历表解码数据估计卫星的位置[1].通过估计传播时间并将其乘以光速来估计从卫星到接收机的距离。为了计算在接收机处的传播时间,需要计算接收机时间和传输时间之间的差值。虽然精确计算接收机时间是理想的,但GPS接收机无法计算。该方法只能估计信号传输时间,精度较高[2].GPS接收机位置估计不需要精确的接收机时间。在给定的接收机时间,计算每个卫星信号的传输时间,并根据这个值估计每个卫星的伪距离。伪距离不是真距离,误差较大,但由于所有卫星的误差都是相同的,所以在求解接收机位置时可以考虑误差,得到准确的接收机位置[2].有关接收机位置估计的详细信息,请参见GPS接收机位置估计部分。

初始化参数

初始化配置和运行端到端GPS接收机模拟所需的参数。

初始化此示例必须运行的数据持续时间。通常,GPS接收器需要至少50秒的数据来估计接收器的位置。基于可用的计算机资源,模拟这个50秒的数据示例将花费大量的时间。在本例中,将数据持续时间设置为3秒。另外,初始化基带波形生成的采样率。

simulatedDataDuration = 3;%秒samplingRate = 10.23e6;% (Hz)

如果需要,启用WriteWaveformToFile属性,以便您可以通过所选的接收器处理此波形。

WriteWaveformToFile =

这个示例以1毫秒为单位处理数据块。也就是说,1毫秒的数据由波形发生器产生,1毫秒的数据由接收机处理。此示例仅适用于1毫秒的步长。

stepTime = 1e-3;%秒numSteps = (simulatedDataDuration/stepTime) + 1;

初始化设置通道所需的参数。这个例子从一个模拟的GPS星座生成一个GPS波形。作为模拟GPS星座的起点,读取RINEX文件。

rinexFileName =“GODS00USA_R_20211750000_01D_GN.rnx”;almanacFileName =“gpsAlmanac.txt”;rinexdata = rinexread(rinexFileName);

初始化接收器位置,以基于其位置对传播通道建模。为了估计接收机位置,需要对传播时延进行精确建模。延迟取决于接收器的位置。这个例子模拟了一个固定的接收器,不支持移动的接收器。

Rxlat = 39.021;以北纬为单位Rxlon = -76.827;以东经度为单位的经度;负经度是西经度Rxel = 19;海拔百分比(米)

由于GPS数据比特率为每秒50位,每个C/ a码块为1毫秒,因此每个比特由20个C/ a码块组成。初始化该参数。

numCACodeBlocksPerBit = 20;

初始化接收器所需的属性。Receiver必须等待一段时间才能开始接收一些有意义的数据,因为在示例中建模了很大的延迟。一个典型的GPS信号有60到90毫秒的延迟。因此,如果接收器等待100毫秒,那么它就开始处理信号而不是纯噪声。

rxWaitTime = 100;%毫秒performInitSync = true;最初必须设置为true初始化跟踪通道的最大数量。最少4个跟踪%信道是GPS接收机正常工作所必需的。maxNumTrackingChannels = 8;%每个跟踪循环的噪声带宽PLLNoiseBW = 90;% (Hz)FLLNoiseBW = 4;% (Hz)DLLNoiseBW = 3;% (Hz)位同步参数isBitSyncComplete = 0 (maxNumTrackingChannels,1);numBitsForBitSync = 100;numWaitingStepsForBitSync = numCACodeBlocksPerBit*numBitsForBitSync;RXCNTR = 1;

位置估计至少需要解码子帧2和子帧3。子帧的长度是6秒。对于本例,解码48.5秒的数据,以确保包括子帧2和3。

minTimeForPosEst = 48.5;%秒minStepsForPosEst = minTimeForPosEst/stepTime;subframeDuration = 6;%秒numStepsPerSubframe = subframeDuration/stepTime;

初始化模拟所需的物理常数。

C = physconst(“光速”);光速的%,单位为m/sFe = 1575.42e6;% GPS L1频率,单位为HzDt = 12;%发射天线指向性,单位为dBiDtLin = db2pow(Dt);Dr = 4;%接收天线指向性,单位为dBiDrLin = db2pow(Dr);Pt = 44.8;GPS卫星的典型传输功率(瓦特)K = physconst(“波尔兹曼”);%玻尔兹曼常数,单位为焦耳/开尔文T = 300;室温(开尔文)rxBW = 24e6;%带宽(Hz)Nr = k*T*rxBW;%热噪声功率(瓦特)rng默认的初始化为默认随机数生成

模拟配置

实例中初始化的参数在本节中配置示例初始化参数部分。

根据RINEX文件设置卫星场景。

初始化卫星场景sc = satellite场景;根据RINEX数据设置卫星卫星=卫星(sc,rinexdata,“OrbitPropagator”“全球定位系统”);rx =地面站(sc,rxlat,rxlon);设置接收器Ac = access(sat,rx);计算卫星和接收器之间的访问从中获取卫星场景中考虑的卫星列表% RINEX数据indexes = ones(length(sat),1);isat = 1:长度(sat) ele =轨道元素(sat(isat));检查适用性时间与伪随机噪声是否匹配% (PRN)标识,以便RINEX文件中的数据被视为波形%的一代indexes (isat) = find(rinexdata.GPS(:,:)。脚趾== ele。GPSTimeOfApplicability &...rinexdata.GPS(:,:)。卫星id == le. prn);结束

生成要传输的导航数据。首先使用helper函数生成一个导航配置对象HelperGPSRINEX2Config.这个助手函数将从RINEX文件读取的参数映射到生成导航数据所需的配置参数。

生成导航配置对象navcfg = HelperGPSRINEX2Config(almanacFileName,rinexdata.GPS(indices,:));[mintow,locmintow] = min([navcfg(:).HOWTOW]);每周时间(TOW)值必须是1加上的倍数% 5,因此子帧1的数据总是先生成。Mintow = ceil((Mintow -1)/5)*5 + 1;% HOWTOW是一个包含整数值的计数器。递增一个值%的1表示6秒的数据。计数器增加1的值%用于每个新子帧。[navcfg(:)。HOWTOW] =交易(mintow);设置基于mintow的帧开始firstsubframeID = mod(mintow-1,125) + 1;frameID = ceil(firstsubframeID/5);allframeid = [frameID:25,1:(frameID-1)];[navcfg(:)。frameindexes] = deal(allframeid);生成GPS导航数据numNavBits = 37500;%完整GPS数据长度为37500位navdata = 0 (numNavBits,长度(navcfg));isat = 1:length(navcfg) navdata(:,isat) = HelperGPSNAVDataEncode(navcfg(isat));结束

获取卫星位置和速度随时间精确建模的多普勒,延迟和功率。有关更多信息,请参见计算卫星场景下的延迟和多普勒

sc.StartTime = HelperGPSConvertTime(navcfg(locmintow). ceidatset . weeknumber,...mintow * subframeDuration);sc.StopTime = sc.StartTime + seconds(simulatedDataDuration);sc.SampleTime = stepTime;acstats = accessStatus(ac);这个例子最多运行2分钟的数据%持续时间,访问不会改变。因此,只考虑访问状态第一次采样时间的%。Satindices = find(acstats(:,1));Numsat =长度(satindices);获取天空中卫星随时间变化的状态。[initsatpos,satvel] = state (sat,“CoordinateFrame”“ecef”);打乱维度,使每一行对应一个卫星数据Initsatpos = permute(Initsatpos,[3,1,2]);Satvel = permute(Satvel,[3,1,2]);

这张图显示了GPS星座中的卫星。绿色虚线表示接收器和GPS卫星之间的访问。使用玩(sc)为了得到这个数字。

计算所有可见卫星随时间的多普勒偏移[az,el] = aer(sat(satindices),rx);[~,satV] = state (sat(satindices),CoordinateFrame=“地理”);Dir = cat(1,permute(cosd(el).*cosd(az),[3 2 1]),...Permute (cosd(el).*sind(az),[3 2 1]),...Permute (-sind(el),[3 2 1]);dopV = permute(dot(satV,dir),[3 2 1]);fo = ((c./(c-dopV))*fe).';%观察频率fShift = (fo - fe);%所有可见卫星随时间的多普勒频移计算卫星与接收机之间随时间的距离。satdist = 0 (numSteps,numsat);istep = 1:numSteps satdist(istep,:) = pseudoranges([rxlat,rxlon,rxel],...initsatpos (satindices: istep),“RangeAccuracy”, 0);结束延迟= satdist/c;从自由空间路径损失方程得到的接收机功率%SqrtPr = sqrt (Pt * DtLin * DrLin) * (c /(4 *π* fo。* satdist));Timeinweek = mintow*6;prnid = [navcfg(:).PRNID];disp (“可用的卫星——”+ num2str (PRNIDs (satindices)))
可用卫星- 5 10 13 15 18 20 23 24 27 29 30

为GPS星座中的所有卫星生成C/ a代码。在产生波形时使用可见卫星的代码。

cacodes = gnssccode (PRNIDs,“全球定位系统”);caCodeBlockDuration = 1e-3;恒定值numcacodeblocks = stepTime/caCodeBlockDuration;每个C/ a代码块的持续时间为1毫秒要使C/A-code与P-code匹配,每个元素重复10次Cacodesig1 = double(repelem(1-2*repmat(cacodes,numcacodeblocks,1),10,1));将C/ a代码与采样率匹配[upfac,downfac] = rat(samplingRate/10.23e6);Upcacodesig = repelem(cacodesig1,upfac,1);Cacodesig = upcacodesig(1:downfac:end,:);

由于p码生成是一个耗时的过程,并且本例没有将p码用于任何接收器操作,因此使用的值交替1而且0而不是实际的p码。将信号值除以 2 因为根据is - gps -200, p码所在的i -分支被衰减了3db[1]

numSamples = stepTime*samplingRate;pcode = (1 - 2 * repmat ((1, 0), numSamples / 2, 1)) /√(2);

初始化建模多普勒频移所需的对象。

pfo = com . phasefrequencyoffset (FrequencyOffsetSource =“输入端口”...SampleRate = samplingRate);

初始化建模动态延迟所需的对象。对卫星信号的动态时延建模分为两步。首先,建立了不随时间变化的静态时延模型。然后,建模变量延迟使用dsp。VariableFractionalDelay.最初在建模静态延迟时,不要引入整个延迟,以便动态延迟建模处理剩余的延迟。在本例中,此动态延迟被设置为2000。

初始化静态延迟对象dynamicDelayRange = 20000;staticdelay = round(延迟(1,:)*samplingRate - dynamicDelayRange);如果Nnz (staticdelay<0)~=0 staticdelay =0 (1,numsat);结束staticDelayObj = dsp。延迟(“长度”, staticdelay);初始化可变分数延迟对象,用于建模动态延迟VFD = dsp。VariableFractionalDelay (“InterpolationMethod”“法罗”...“MaximumDelay”, 65535);

初始化星座图对象。

rxconstellation = com . constellationdiagram (1,ShowReferenceConstellation=false,...Title =“跟踪输出信号星座图”);

初始化在GPS接收器中执行初始同步的对象。

initialsync = HelperGPSInitialSynchronization;最初搜索全部32颗卫星initialsync。PRNIDsToSearch = 1:32;initialsync。SampleRate = samplingRate;initialsync。CenterFrequency = 0%基带信号
initialsync = HelperGPSInitialSynchronization with properties: PRNIDsToSearch:[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17…CenterFrequency: 0 SampleRate: 10230000 DetectionThresholdFactor: 1.2000

初始化基带文件写入器。

如果WriteWaveformToFile == 1 bbWriter = com . basebandfilewriter (“gpsBBWaveform.bb”samplingRate 0);结束

初始化端到端模拟链所需的属性。

存储初始同步输出的属性[doppleroffsets,codephoffsets] = deal(零(1,maxNumTrackingChannels));存储跟踪模块输出所需的属性[accuPh, accuFqy accuFqyErr、accuPhErr accuIntegWave, accuDelay, accuDelayErr] =...协议(0 (numSteps maxNumTrackingChannels));属性存储位同步和帧的输出%的同步[maxTransitionLocation,sampleCounter] = deal(零(maxNumTrackingChannels,1));syncidx = 0 (maxNumTrackingChannels,1);属性存储数据解码器的输出deccfg = cell(maxNumTrackingChannels,1);初始化模拟链运行的最大步数maxSimSteps = 50/stepTime;

端到端仿真链

本节包含三个主要步骤:

  1. 波形的一代

  2. 传播渠道

  3. 接收机信号处理算法

作为传播信道的一部分,建模多普勒偏移、延迟和噪声。作为接收机的一部分,所涉及的过程包括初始同步、跟踪、位同步、帧同步和数据解码。

抽搐%开始模拟numAx = size(initsatpos,2);istep = 1:numSteps生成波形bitidx = floor((istep-1)/numCACodeBlocksPerBit)+1;Allpcode = repmat(pcode,1,numsat);%获取每颗卫星对应步长时间的导航位Navbitsig = 1-2*navdata(bitidx,satindices);Iqsig = (allpcode + 1j*cacodesig(:,satindices)).*navbitsig;隐式展开%%传播通道建模用于模拟多普勒、延迟、路径损耗和噪声的信道%信号将多普勒引入信号作为频率偏移dopsig = pfo(iqsig,fShift(istep,:));引入可变分数延迟staticDelayedSignal = staticDelayObj(dopsig);leftoutDelay = delay (istep,:)*samplingRate - staticdelay;%值必须始终为正delayedSig = vfd(staticDelayedSignal,leftoutDelay);%按接收功率计算计算延迟信号rmsPow = rms(delayedSig);(rmsPow==0) = 1;避免除零scaledsig = SqrtPr(istep,:).*delayedSig./rmsPow;把接收机上的所有信号加起来。Resultsig = sum(scaledsig,2);%产生噪音noisesig = (wgn(numSamples,1,10*log10(Nr)) + 1j*wgn(numSamples,1,10*log10(Nr)))./√(2);在复合信号中添加恒定的热噪声rx波形=结果信号+噪声信号;将接收到的信号缩放为具有单位功率波形= rx波形/rms(rx波形);如果WriteWaveformToFile == 1 bbWriter(波形);结束timeinweek = timeinweek + stepTime;% %接收机因为有很大的延迟(70到80毫秒)%信号,启动接收器一段时间后才进行处理%有效信号,而不是纯噪声。如果istep > rxWaitTime如果performInitSync == 1;[y,corrval] = initialsync(波形);%初始同步PRNIDsToSearch = y(y(:,4)==1,1).';doppleroffset = y(y(:,4)==1,2).';Codephoffsets = y(y(:,4)==1,3).';numdetectsat =长度(PRNIDsToSearch);如果numdetectsat > maxNumTrackingChannels设置此值可限制跟踪通道的数量numdetectsat = maxNumTrackingChannels;结束为每个跟踪模块执行所需的初始化%通道和缓冲区来存储数据。disp ("探测到的卫星PRN id: "+ num2str (PRNIDsToSearch))绘制第一颗卫星的相关图图;net (-10e3:500:10e3, 0:size(corrval,1)-1, corrval(:,:,PRNIDsToSearch(1)));包含(“多普勒偏移量”) ylabel (“码相位偏移”) zlabel (“相关”) MSG = [PRN ID的相关图:num2str (PRNIDsToSearch (1)];Title (msg) framesyncbuffer = cell(1,numdetectsat);创建一个单元格数组,其中每个元素对应一个载体%跟踪对象。carrierCodeTrack = cell(numdetectsat,1);framessync = cell(numdetectsat,1);更新每个跟踪循环的属性isat = 1:numdetectsat carrierCodeTrack{isat} = HelperGPSCACodeCarrierTracker;carrierCodeTrack{成绩测试标准}。SampleRate = samplingRate;carrierCodeTrack{成绩测试标准}。CenterFrequency = 0;carrierCodeTrack{成绩测试标准}。PLLNoiseBandwidth = PLLNoiseBW;carrierCodeTrack{成绩测试标准}。FLLNoiseBandwidth = FLLNoiseBW;carrierCodeTrack{成绩测试标准}。DLLNoiseBandwidth = DLLNoiseBW; carrierCodeTrack{isat}.PLLIntegrationTime = 1;%单位为毫秒carrierCodeTrack{成绩测试标准}。PRNID = PRNIDsToSearch(isat);carrierCodeTrack{成绩测试标准}。InitialDopplerShift = doppleroffset (isat);carrierCodeTrack{成绩测试标准}。InitialCodePhaseOffset = codephoffsets(isat);初始化帧同步对象framesync{isat} = HelperGPSLNAVFrameSynchronizer;结束结束%因为它将足够得到接收器位置之后%运行模拟50秒的数据,停止循环%后执行50秒的数据。的默认运行%例如,只有3秒的数据被处理,而这一行没有%。该检查是在运行大数据示例时进行的%持续时间(至少50秒的数据)。如果istep > maxSimSteps打破结束Isat = 1:numdetectsat对每颗卫星执行跟踪[integwave, fqyerr fqyoffset、pherr phoffset, derr, dnco] =...carrierCodeTrack{成绩测试标准}(波形);累加值以查看最后的结果accuFqyErr(rxcntr,isat) = fqyerr;accuFqy(rxcntr,isat) = fqyoffset;accuPhErr(rxcntr,isat) = pherr;accuPh(rxcntr,isat) = phoffset;accuIntegWave(rxcntr,isat) = sum(integwave);accuDelayErr(rxcntr,isat) = derr;accuDelay(rxcntr,isat) = dnco;结束执行位同步、帧同步和数据如果接收端步骤的numWaitingStepsForBitSync为%完成。如果rxcntr > numWaitingStepsForBitSync对每颗探测到的卫星进行位同步,帧同步和数据解码Isat = 1:numdetectsat如果~isBitSyncComplete(isat) maxTransitionLocation(isat) =...gnssBitSynchronize (...图像放大(accuIntegWave (1: numWaitingStepsForBitSync,成绩测试标准)),...numCACodeBlocksPerBit);isBitSyncComplete(isat) = 1;sampleCounter(isat) = rxcntr - maxTransitionLocation(isat) + 1;framesyncbuffer{isat} = accuIntegWave(...maxTransitionLocation(成绩测试标准):结束,成绩测试标准);其他的执行帧同步和数据解码sampleCounter(isat) = sampleCounter(isat) + 1;framesyncbuffer{isat}(sampleCounter(isat)) = accuIntegWave(rxcntr,isat);如果mod(sampleCounter(isat),numStepsPerSubframe) == 0 samples = framesyncbuffer{isat}(sampleCounter(isat) -...numStepsPerSubframe + 1: sampleCounter(成绩测试标准));sym = mean(重塑(样本,numCACodeBlocksPerBit,[]));Bits = imag(sym)<0;[syncidx(isat),rxsubframes,subframeIDs] = framesync{isat}(bits(:));如果~ isempty (rxsubframes)%,执行数据解码deccfg{成绩测试标准}。PRNID = PRNIDsToSearch(isat);deccfg{isat} = HelperGPSLNAVDataDecode(rxsubframes,deccfg{isat});结束结束结束结束结束如果Mod (rxcntr,1000) == 0 disp(“加工”+ (rxcntr/1000) +“接收端的SEC数据。”) rxconstellation (accuIntegWave (rxcntr - 999: rxcntr, 1) /...rms (accuIntegWave (rxcntr - 999: rxcntr 1)))结束%更新rxcntrRXCNTR = RXCNTR + 1;结束结束
探测到的卫星PRN id: 13 15 24 27 5 29 18 20

图中包含一个轴对象。标题为PRN ID: 13的Correlation Plot的axis对象包含一个类型为surface的对象。

接收端处理了1秒的数据。接收端处理了2秒的数据。

如果WriteWaveformToFile == 1 release(bbWriter);结束e2eTime = toc;disp (“端到端链跑”e2eTime +“秒”。)
端到端链运行了83.0288秒。

GPS接收机位置估计

要估计接收机的位置,您需要知道至少4颗卫星到接收机的距离,以及在传输时每颗卫星在天空中的位置。从数据解码器的输出计算接收机位置涉及这些步骤。

  1. 在给定的接收时间估计可见卫星的传输时间:传输时间估计值是GPS接收机的自然测量值,而不是伪距离。信号的传输时间是在初始同步、跟踪、位同步、帧同步和数据解码时执行的计时计算的顶点。

  2. 计算所有卫星的伪距离:由于接收机时钟不准确,您可以预期在估计伪范围内有很大的偏移。出于同样的原因,这些估计值不是真实范围,它们被称为伪范围。

  3. 在给定的传输时间估计可见卫星在天空中的位置:从解码后的数据中,得到星历表数据。此星历表数据的有效期为2-6小时[2]为了在给定时间从星历表数据中计算出卫星在天空中的准确位置,使用gnssconstellation(导航工具箱)。

  4. 估计接收机位置:用。估计接收机位置receiverposition(导航工具箱)。

在给定的接收时间估计可见卫星的传输时间。

caChipRate = 1.023e6;% (Hz)codeOffsetTime = codephoffsets(1:numdetectsat)/caChipRate;Rxcntr (Rxcntr <=1) = 2;所以rxcntr-1至少是trackingOffsetTime = accuDelay(rxcntr-1,1:numdetectsat)/caChipRate;bitsyncTime = (maxTransitionLocation(1:numdetectsat) - 1)*caCodeBlockDuration;framesyncTime = (syncidx(1:numdetectsat)-1)*numCACodeBlocksPerBit*caCodeBlockDuration;根据这些参数计算传输时间tt1 = codeOffsetTime(:) - trackingOffsetTime(:) + bitsyncTime + framesyncTime;Tt1 = Tt1 (syncidx~=0);

估计伪范围。

Trtemp = max(tt1);Row = (tt1-trtemp)*c;包括从接收到的导航消息解码的一周时间tow = 0 (maxNumTrackingChannels,1);isat = 1:maxNumTrackingChannels如果isfield (deccfg{成绩测试标准},“HOWTOW”) tow(isat) = (deccfg{isat}.)1)*6;每个子帧的持续时间为6秒结束结束拖=拖(syncidx~=0);%偏移估计传输时间。这个偏移量是根据经验得出的。timeOffset = 0.74;tt = tt1 + tow + timeOffset;

在计算的传输时间估计卫星位置。

Deccfg1 = deccfg(syncidx~=0);只有接收机至少处理完毕,才能估计卫星位置。% minStepsForPosEst数据isFullDataDecoded = true(长度(tt),1);如果rxcntr > minStepsForPosEst [timeofweek,SatelliteID,Delta_n,M0,Eccentricity,sqrtA,Toe,Toc,Cis,Cic,Crs,Crc,Cus,Cuc,...OMEGA0,i0, OMEGA_DOT,IDOT,GPSWeek] = deal(0 (4,1));reqCEIFields = [“WeekNumber”“ReferenceTimeOfEphemeris”“ReferenceTimeOfClock”...“SemiMajorAxisLength”“MeanMotionDifference”“MeanAnomaly”“偏心”...“ArgumentOfPerigee”“倾向”“InclinationRate”“HarmonicCorrectionTerms”...“RateOfRightAscension”“LongitudeOfAscendingNode”];Isat = 1:长度(tt)每周时间(Isat) = tt(Isat);isFullDataDecoded(isat) = (isfield(deccfg1{isat},“PRNID”) & &...(所有(isfield (deccfg1{成绩测试标准}.CEIDataSet, reqCEIFields)));如果isFullDataDecoded(isat) satellite iteid (isat) = deccfg1{isat}.PRNID;GPSWeek(isat) = deccfg1{isat}. ceidatset . weeknumber;脚趾(isat) = deccfg1{isat}. ceidatset . referencetimeoffephemeris;Toc(isat) = deccfg1{isat}. ceidatset . referencetimeofclock;sqrtA(isat) = sqrt(deccfg1{isat}.CEIDataSet.SemiMajorAxisLength);Delta_n(isat) = deccfg1{isat}. ceidatset . meanmotiondifference *pi;M0(isat) = deccfg1{isat}.CEIDataSet.MeanAnomaly*pi;偏心量(isat) = deccfg1{isat}. ceidatset .偏心量;omega(isat) = deccfg1{isat}.CEIDataSet.ArgumentOfPerigee*pi;i0(isat) = deccfg1{isat}. ceidatset .倾角*pi; IDOT(isat) = deccfg1{isat}.CEIDataSet.InclinationRate*pi; hterms = num2cell(deccfg1{isat}.CEIDataSet.HarmonicCorrectionTerms); [Cis(isat),Cic(isat),Crs(isat),Crc(isat),Cus(isat),Cuc(isat)] = deal(hterms{:}); OMEGA_DOT(isat) = deccfg1{isat}.CEIDataSet.RateOfRightAscension*pi; OMEGA0(isat) = deccfg1{isat}.CEIDataSet.LongitudeOfAscendingNode*pi;结束结束transmissionTime = HelperGPSConvertTime(GPSWeek(isFullDataDecoded),timeofweek(isFullDataDecoded));refTime = HelperGPSConvertTime(GPSWeek(:),Toc(:));rx时间表=时间表(refTime,卫星id,Delta_n,M0,偏心量,sqrtA,...脚趾,独联体,中投,Crs, Crc Cus、中联科利,₀,钱数,ω,...OMEGA_DOT、IDOT GPSWeek);[satpos, satvel] = gnssconstellation(transmissionTime(1), rxtimeline);结束

估计接收机的位置,这需要两个输入-伪距离和在传输时间的精确卫星位置,在给定的接收机时间估计。只有当示例运行至少48秒的数据时,才能计算这些值。因为模拟这样的数据需要很长时间,所以伪距离和卫星位置属性(通过运行示例50秒获得)存储在MAT文件中。如果你运行模拟少于minStepsForPosEst,然后加载这些MAT文件,并计算接收器的位置。如果不这样做,则直接从模拟链中获取所需的属性。

如果rxcntr <= minStepsForPosEst此处加载的参数对默认值有效%配置本例负载receiverPositionProperties加载默认配置的参数时,更新% isFullDataDecoded变量,使用所有的1来计算接收器%的位置。isFullDataDecoded = true(长度(行),1);defaultRINEXFileName =“GODS00USA_R_20211750000_01D_GN.rnx”;defaulultrxpos = [39.021, -76.827, 19];exampleRxPos = [rxlat, rxlon, rxel];如果~(strcmp(rinexFileName, defaulultrinexfilename) && isequal(defaulultrxpos,exampleRxPos)) warning(“卫星通信:EndToEndGPSLNAVReceiverExample: InsufficientData”...“估计的接收器位置可能与您提供的不同”+...“因为模拟并没有运行完整的数据。”+..."要获得准确的接收器位置,请运行示例"+...“至少50秒的导航数据。”);结束结束计算接收器位置rxposest = receiverposition(row(isFullDataDecoded),satpos(isFullDataDecoded,:))
rxposest =1×339.0210 -76.8270 18.5258
estRxPosNED = lla2ned(rxposest,[rxlat,rxlon,rxel],“椭球体”);distanceError = vecnorm(estRxPosNED)%(米)
distanceError = 4.0582

进一步的探索

本例展示了如何在3秒内对模拟的卫星星座执行GPS接收机处理。将示例扩展到50秒,并估计接收机的位置,以了解GPS接收机如何工作。

使用您自己的RINEX文件配置示例,并根据本示例中生成的波形估计接收机位置。

附录

这个例子使用了这些数据和帮助文件:

参考文献

[1] IS-GPS-200, Rev: M。导航星GPS空间段/导航用户界面.2021年5月21日;代码识别:66RP1。

[2]艾略特·d·卡普兰、c·赫加蒂编著,了解GPS/GNSS:原理和应用,第三版,GNSS技术与应用系列(波士顿 ;伦敦:Artech House, 2017)。

另请参阅

功能

对象

相关的话题

Baidu
map