最佳实施方式
图1中说明了本发明的一个位置确定系统实施例,它在此由通用的附图标记100表示。系统100包括接收机102、以该接收机配置的网络客户机104以及远离该接收机和客户机的网服务器106。一个微波天线108接收从轨道GPS卫星中本地发射到接收机102的信号。第二微波天线110接收从一些相同轨道GPS卫星中本地发射到网服务器106的信号。
虽然接收机102离网服务器106很远,但是它在同一大体的地理区域中并且可以从网服务器106计算出的微分、电离层以及对流层校正中获益。
接收机102包括射频(RF)级112、数字信号处理器(DSP)1141以及为微计算机(μC) 116。μC116包括一随机访问存储器(RAM)、一只读存储器(ROM)以及响应来自客户机104的高级命令的一微处理器。这样的RAM和ROM尺寸通常非常小以便降低制造和运行成本。因此,对本发明的实施例来说关键的是:在接收机102中没有什么用来存储卫星天文历表或日历数据。在至少一个操作方式中,接收机102关键依靠来自网服务器106中的一组多项式的定期更新,其每一个多项式表示可见卫星的位置和速度。
在本发明的一个实施例中,最好把DSP114实现为一个状态机的专用逻辑门结构,例如,作为一个专用集成电路(ASIC)或一个门阵列。利用固件或软件,μC116被编程来实现第二状态机,例如,一个软件实现的状态机。这两个状态机以协作关系工作,从而把RF级112提供的同相和正交抽样转换成由μC116构造并转发的导航测量。串行通信链路118和120把这些测量携带到一个导航平台上,例如,或者携带到客户机104上或者通过它到网服务器106上。这样的导航平台传递回到卫星以便进行搜索、要发生的测量等等。
客户机104和网服务器106之间的通信链路122和124最好包括互联网并且使用传输控制协议/互联网协议(TCP/IP)技术。第三方用户最好具有至少对网服务器106的访问。
通信链路118、120、122和124的部分或全部可以是无线的。特定的应用可取决于这些无线链路、或者由这些无线链路启动。如果接收机102是电池操作的并由用户和交通工具携带或携载的话,则这将尤其是真实的。
对本发明所有实施例来说关键的是:接收机102不执行浮点运算和基于10的运算。单精度,当然还有双精度、浮点,它们对低功率消耗处理器太复杂了并且降低了时钟速度(它最好是接收机102一个不可分割的部分)。取而代之,接收机位置的所有计算和解答需要以基于2的整数算法来进行,例如,32比特二进制。这必须在至少一个操作模式中,网服务器106计算并传递关于作为基于2的整数进行格式化的对流层、电离层、选择可用性(SA)以及微分校正数据。当这是不可能时,这些杂事将落到客户机104上。
通过服务器106利用它自己的参考站GPS接收机来获取并简化GPS导航日历和天文历表以便提供分别表示每个卫星位置和速度的简单多项式。当然,这样的多项式将随着时间而殆尽,但是关键取决于通过互联网在客户机104和106之间的定期联系来提供最新足够的轨道数据。接收机102因此从在本地RAM/ROM中保存当前天文历表和日历数据的复杂存储的需要中解除出来,并且从为每个位置固定以双精度浮点运算来本地地计算卫星轨道位置的RISC处理器258复杂的工作中解除出来。
在本发明的商业模式实施例中,网服务器106属于一个独立的服务提供者并由其进行操作。每次使用或预约都对操作接收机102和/或网络客户机104的用户收取费用。对于专用网络客户机104的半导体集成电路设备设计,还可以选择把接收机102捆绑在一个智能性质(IP)插件中。这样的IP可作为网络客户机104的原始设备制造商(OEM)的一个许可费用和硬件设备费用被出售。
RF级112和DSP114组成一个“硬件启动器(hardwareenabler)”,它可以作为μC的软件捆绑中的Verilog码被商业出售给原始设备制造商(OEM)以便合并到他们的产品中。这样的硬件启动器最好在单个集成电路(IC)设备中被实现为一个芯片内系统(SOC)。其它形式的硬件描述语言(HDL)和软件编程代码,例如C++,Visual-BASIC等等,也可以被使用。
客户机104可以被操作在至少四种方式之一中:自主,半自主,“薄(thin)”以及超薄。在自主方式中,客户机104是导航平台并无需网服务器106的帮助,自己来提供接收机需要的信息。在其余所有方式中,网服务器106作用为导航平台。
在半自主方式中,客户机104周期性地与网服务器106协商信息。在薄方式中,客户机104只在接收机102和网服务器106之间传递数据。该薄方式是优选的,因为它是最大限度地允许建立和操作客户机104的费用降低到最小值的一种方式。在超薄方式中,由其他观察者提供的时差和/或频差信息通过网络被传递以便降低本地时间和本地频率的不确定性。
在操作中,接收机102必须在两个域(例如,频率和码相位)中同步搜索GPS微波信号。本地振荡器和由卫星运载工具相对速度引起的多普勒频移产生被分析的载波频率不确定性。瞬时GPS卫星伪随机数(伪随机数)码相位是另一个未知的。在“噪声基底(floor)”之上的接收信号,搜索相对容易并迅速。但是存在于建筑物内部的弱信号,被埋藏在二十分贝之多的噪声中。对频率/码相位箱的每一次访问都必须停在那里一个足够长的时间,以便与码相关器提供的处理增益一起“击倒”噪声基底。弱信号也需要搜索箱在箱频率和箱码相位之间具有较好的步骤,例如,由于混叠。所以更多的箱需要被搜索并且每个箱需要更多的处理停留,所有这些成指数地增加了搜索时间。
网服务器106在互联网上公布实时导航数据。其他服务当前存在,其部分地或者非实时地在互联网上提供导航和初始化数据,并且这些可以被部分地使用在发送到接收机102的实时导航数据的位置中,或者使用来检查发送到接收机102的实时导航数据的有效性。网服务器106一个主要且关键的任务工作是从接收机102中卸载导航计算工作。如此的卸载可达到的程度取决于接收机102和网服务器106之间可以实现的通信联络的规律性。通过接收机102获得的实际测量值被转发给网服务器106。
作为更高级的抽象和目的,本发明的替代实施例与进行数据库处理的网服务器106协作。例如,网服务器平台包括一个寿命质量监视器,用于检查所述静态观测并防止在所述测量差错和卫星数据消息的数据库中包括不正确信息。在另一方面,对于接收机经过几小时、几天、几星期、几个月、几年的一个周期访问的定位模式,网服务器106可以收集随时间的位置解答信息。然后,这种信息被处理以估计接收机102的用户在何处、用户曾经在何处以及用户将来可能在何处。此类信息在分配、计时钟、软禁(house-arrest)、调度、清单、资产管理、安全以及其他应用中很有用。位置信息可以被理解为智能猜测用户在任何一个时刻正在做什么。如果用户的位置与一个本地食品杂货店的位置匹配,则用户可以被认为是正在购物。记录也可以由用户在网服务器106处进行,例如,通过城市维护部门配置消火栓、电力变压器、公路的永久位置等等并将其“标记”在电子数据库中。
有关用户位置的信息在互联网上的出现可以被广告商或市场商使用来把前后关系消息实时地引导给用户。在本发明的一个商业模型实施例中,这种数据被实时出售。
在本发明的一个实施例中,用户携带接收机102并与客户机104无线连接。例如,该用户进行的滑雪可被记录并随后在一个亭子处被显示。另一个例子中,一个私人训练者可以分析一外出慢跑以便检查特定的训练状况。利用当前的半导体技术可以把接收机102完全结合到一个腕表中。
对于并行地运行不同箱频率/码相位假定的多个处理器,通过复制SOC接收机102获得的信号抽样,本发明的实施例增加了接收机灵敏度,并同时减少了搜索时间。平均起来,即使在室内或交通工具中,也可很快找到正确的箱频率/码相位假定。
一般来说,本发明的实施例使用互联网网服务器来处理远程GPS接收机以如下方式采集的数据,即,该方式与传统接收机和方法相比,增加了信号灵敏度并且缩短了搜索时间。
图2表示本发明的芯片内系统(SOC)的实施例,并在此用通常的附图标记200来表示。SOC200包括集成在一个硅片上的两个基本部分,一个硬件实现的状态机和一个软件实现的状态机。在图1中,这两个功能部分被分别说明为DSP114和μC116。
该硬件实现的状态机输入来自RF级112的抽样(图1)。它使用专用门逻辑以便跟上接收机混合器的操作。在一个嵌入式RISC处理器上执行的一个软件实现的状态机,提供该硬件实现的状态机的实时数据需要。利用XEMICS(瑞士)coolRISCTMCR816商业设备可以实现此类嵌入式RISC处理器。该软件实现的状态机通常通过连续的通信信道与μC116(图1)通信。
SOC200提供一个时钟振荡器202和一个时钟管理器204(它们驱动一个码数字控制振荡器(NCO)206)、一个码发生器208、一个十八部分码存储器210,一个数字本地振荡器212,一个载波NCO214,一个十部分载波发生器216以及一个十部分载波混合器217。一个有限状态机(FSM)218产生数据来填充三百五十二个十部分码假定存储器220、三百五十二个码混合相关器对222以及三百五十二个成对的寄存器锁存224。一个假定存储器226与一个功率和寄存器228进行接口,该功率和寄存器228接收从成对的寄存器锁存224中提取的信息。一组M1、M2和M3在位置230、232和234,且功率寄存器输出到μC116。
一个增益控制器236把同相(“I”)和正交(“Q”)抽样馈送到多路复用器238。一个数据选择器240周期性地在来自抽样存储器A242和抽样存储器B 244中提取存储抽样之间进行切换。在任何一个周期中,一个抽样控制信号246确定哪个存储器正被填充以及哪一个正被读取。增益控制器236通过第一脉冲频率调制器248提供一个“I”DC偏移信号247。一个“Q”DC偏移信号250通过第二脉冲频率调制器252被反馈。通过第三脉冲频率调制器256输出一个AGC反馈信号254。
利用一个XEMICS(瑞士)coolRISCTM精简指令系统计算机(RISC)微处理器,SOC200的μC116软件实现的状态机部分最好基于一个嵌入式、低功率的、精简指令系统(RISC)处理器258。极端低功率数字单元库CooLibTM和8比特RISC核心CoolRISC也作为IP产品被销售。参见“http:∥www.xemisc.ch”。该软件实现的状态机固件使用一个只读存储器(DROM)260、一个静态随机访问存储器(SRAM)262以及一个闪存264。一个加电复位逻辑266提供加电复位。一个温度补偿晶体振荡器(TCXO)268为RISC处理器258提供一个稳定时基。RISC处理器258和客户机104(图1)之间的通信通过一个串行输入/输出(SIO)外设来处理,例如,RS-232、通用串行总线(USB)、以太网等等。
一个频差通信端口271通过一个网络参与信息的分配,这帮助降低了SOC200的本地频率不确定度。一个时差通信端口272类似地通过一个网络参与信息发布,这帮助降低了SOC200的本地时间不确定度。这一个或这两个都被使用在搜索策略公式化中,它们可以改良第一固定时间(time-to-first-fix)、接收机灵敏度以及解答精度。这样的改良通常在顺流数据用户的后处理中实现。例如,网络服务器。
图3表示本发明一个状态机控制程序实施例,并且在此由通用附图标记300来表示。该状态机控制程序300包括一个加电初始化算子302、一个时钟发生器和控制器304、一个模式块阵列程控循环306、一个预计算和重放块308以及一个锁存可用寄存器块310。FSM300通常与一个导航平台312进行接口和响应。这样的导航平台312以全自主模式驻留在客户机104上而以薄客户机和半自主模式驻留在网服务器106上。该导航平台本质上是计算导航解答的地方。
在加电以及初始化之后,状态机控制程序300一般以一种深度睡眠的方式来放置支持硬件,例如,通过操作时钟和执行RISC处理器258(图2)中的一个停止指令。串行输入线上的一个中断将唤醒时钟发生器和控制器304。这唤醒了软件实现的状态机。一个毫秒中断产生(MSEC=On)(MSEC=开)启动并开始累加一个主定时器Msec24。一个温度传感器、时差计数器以及频差计数器每一个获得一个缺省测量值。RF和抽样时钟(SCLK=On)(SCLK=开)被开启,使得AGC程控循环激活。一个抽样存储器A或B必须等待AGC程控循环被初始化并变成稳态。
抽样存储器被手动地开启和关闭,例如,通过写入一个“sampleMemoryControl”(抽样存储器控制)标记。“1”值开启存储器而“0”值则将它关闭。每当定义一个新的有效模式块时最好自动地开启抽样存储器。导航平台也可以命令其它模式,例如通过把“RF”和“Msec”标记的每一个开启或关闭。RF=OFF(RF=关)和Msec=On(Msec=开)模式用于保持时间但又跳跃跟踪任意卫星。这在GPS固定速率很低(例如,每十秒钟)时使用较小的功率。RF=OFF(RF=关)和Msec=OFF(Msec=关)模式允许有限状态机300返回深度睡眠模式。RF=On(RF=开)、Msec=On(Msec=开)并且sample-memory=OFF(抽样存储器=关)模式保持RF-AGC有效,其中,没有卫星被跟踪。
加电初始化算子302为许多有限状态机变量设置为缺省状态。局部(即,不在一个模式块中)变量,在它们的第一用途中被明确地识别在码中。否则,所有变量都在模式块中。表“I”表示以软件来实现加电初始化算子302的一种方法。两个变量,MBP和LAP,在开始重放时钟之前被初始化。
表I
/*初始化模式块指针*/
MBP=numModeBlocks(不在模式块中)
/*初始化锁存有效指针*/
LAP=numModeBlocks(不在模式块中)
latchAvailinit=0(不在模式块中)
/*清除重放状态*/
PlaybackState=0(重放状态Cnt=关)
/*清除所有模式块*/
for(1,0;“I”<numModeBlocks;”I”++){
blockStatus=0(未定义)
blockWriteFlag=0
SV=0
DSPMode=0
}
/*唤醒软件实现的状态机然后将其放入睡眠中*/
initCoolRisc()[execute a halt command inside software-
implemented state machine firmware](在软件实现的状态机固件
内部执行一个停止命令)
/*让所有时钟睡眠*/
SCLK=off(不在模式块中)
MSEC=off(不在模式块中)
PCLK=off(不在模式块中)
<dp n="d10"/>
/*清除主定时器*/
Msec24=0(不在模式块中)
/*在这点,所有电路在睡眠状态但已被初始化*/
时钟发生器和控制器304的逻辑在图4中进一步详述。一个时钟发生器和控制器400包括操作在例如27.456MHz的一个主时钟(MCLK)。一个MSEC数据选择器404允许由RISC处理器258对主时钟(MCLK)输出进行软件控制。类似地,一个PCLK数据选择器406允许对一个重放时钟输出进行软件控制。一个“÷13”分频器408把主时钟频率降低到抽样时钟频率。当一个可编程递减计数器410被载入来从2111递减到0进行计数时,其把主时钟降低到一个13.0KHz时钟。SLK数据选择器412允许对抽样时钟〔SCLK〕输出的软件控制。一个“÷64”分频器414和一个“÷33”分频器416串联并把主时钟频率降低到一毫秒脉冲频率。一个可编程递增计数器418计数16,777,215个主时钟循环。一个“÷10”分频器420把主时钟频率降低到十毫秒脉冲频率,例如,使用来作为一个中断。时钟发生器和控制器400还包括一个递增计数器424、一个状态开/关可写数据选择器426、一个可编程递增/递减12位计数器428以及一个可写初始化值寄存器430。
对于一个有效模式块,软件实现的状态机必须初始化一个模式块。只有软件实现的状态机可以把数据写入模式块中,其定义了许多参数。在初始化之后FSM300不能写入这样的数据。该软件实现的状态机设置blockWriteFlag=1(块写入标记=1),这样,这个块不被有限状态机选择直到该标记被清除为止。在写入适当的数据之后,该软件实现的状态机设置blockWriteFlag=0(块写入标记=0)。
任何时候该软件实现的状态机清除一个blockWriteFlag(从“1”改变为“0”),则有限状态机利用newModeBlockFlag(新模式块标记)来记录该事件。这是一个有限状态机变量并且是全局的,例如,不是模式块特定的。
模式块阵列程控循环306表示有限状态机300的一个主程序程控循环。每当一个startOfNewRecord(新记录的开始)事件发生时或者每当程控循环空闲并且一个newModeBlockFlag(新模式块标记)被设置时,则到达该程控循环的开始。一些变量对有限状态机300来说是全局的。一个“MBP”变量是一个5比特地址模式块指针,其中0-16为可能的值。一个“numModeBlocks”(模式块数目)变量在模式块阵列(MBA)中存储定义的模式块数目。一个“record Toggle”(记录反复)标记是一个一比特计数器,其每十毫秒就改变。一个“Msec4”变量是一个4比特计数器,其每一毫秒就改变,实际上,它等于“Msec24”变量的四个最低有效位。
两个变量,“playbackState”(重放状态)和“playbackStateCnt”(重放状态计数),用来监控在有限状态机每一步中的消耗主时钟数。这些变量主要用来观测有限状态机正在如何工作。然而,它们也能够用来防止竞态状态,正如当该有限状态机在某些危险区域时,在这些危险区域中,由一个以上的有限状态机所使用的全局数据被写入。根据状态机中的位置来改变playbackState(重放状态)。计数器可以是一个递增或者递减计数器,这取决于该计数器被怎样初始化。初始化为零使该变量成为一个递增计数器,反之,初始化为非零则使该变量成为一个递减计数器。当playbackState(重放状态)为零状态时,playbackstateCnt(重放状态计数)被迫为空闲。
表II
/*要跳向的循环点*/查找有效模式块:/*在程序控制循环开始处声明*/playbackState=1 (查找一个模式块)playbackStateCnt=0 (递增计数器)/*首先,查找正被处理的一个模式块,其被取消 */ |
if(MBP<numModeBlocks){/*发送丟失重放事件*/stoppedPlayback=1,stoppedPlaybackbata=MBPblockStatus+playbackStoppedEarly}/*现在查找一个有效模式块来处理*/for(MBP=0;MBPnumModeBlocks;MBP++){if(blockWriteFlag=1)continue(意思是去到程序控制循环的末端并且使MPB增加)if(SV=0)continueif(bSPMode=0)continueif((blockStatus & OxOF)=(开始并且未结束))goto PLAY_THIS_MODE_BLOCKif((blockStatus & OxOF)=(已定义并且未开始)){if(startMode=SIMPLE){if((togglelnit=recordToggle)and(waitTillNextRecord=0)){goto PLAY_THIS_MO**E_BLOCK}else if((togglelnit 1=recordToggle)and(waitTillNextRecord=1)){goto PLAY_THIS_MOtE_BLOCK}}else if(startMode=TIMED){if(msec4init=msec4){goto PLAY_THIS_MODE_BLOCK}}}else{continue} |
|
PLAY_THIS_MOtE_BLOCK,执行预计算和重放块}}/*循环结束并且MPB=num ModeBLocks*/playbackState=0 (计数器为空闲)/*查找最近写入的新模式块*/if(newModeBlockFlag){newModeBlockFlag=0goto LOOK_FOR_ACTTVE_MODE_BLOCK} |
当清除newModeBlockFlag(新模式块标记)时必须小心。禁止在与由一个软件实现的状态机清除blockWriteFlag(块写标记)相同的时钟上清除该变量。这将防止模式块在MBP=numModeBlocks(MBP=新模式块标记)的情况下被执行或者防止正被写的该模式块地址小于当前的MBP。
每当modeBlockPointer(模式块指针)被设置为一个新的有效模式块时,运行预计算和重放块308。控制从模式块阵列程控循环中跳到这里并在完成时返回到模式块阵列程控循环。如果一个startOfNweRecord(新记录开始)事件发生,则可以出现一个跳出。软件实现的状态机决定如何响应这样的情况。
表III
/*声明控制在块内*/playbackState=2 (开始预计算)playbackStateCnt=0 (递增计数器)/*如果被请求第一次初始化*/if(requestModeBlockReset)(firstRecord=1startingRecordCnt=recordMsec24recordCnt=0playbackCnt=0compareState=0blockStatus=0blockStatus 1=defined(OxO1)+started(OxO2)} |
else{firstRecord=0}/*每一次的更多的初始化*/recordStartingCompareState=compareState(不在模式块中)codeWindowCnt=0 (不在模式块中)freqCnt=0 (不在模式块中)mixFreq=carrierNcoValue (不在模式块中)codeGenReload=0 (不在模式块中)lastPlaybackOf Record=0codePhaseBug=0/*以下设置变量不在模式块中*/if(tSPMode=SEARCH){primingAdjust=31codeMemPrimingSclks=2vcgMemPrimingSclks=numHypothesesnumSvcgen=0 (svcgenstep未定义的许可的)}else if(if(bSPMode=WEAKMEAS){primingAdjust=62codeMemPrimingSclks=3vcgMemPrimingSclks=numHypothesesnumSvcgen=16svcgenStep=2}else if(*SPMode=TIMETRACK){primingAdjust=16*31=496codeMemPrimingSclks=17vcgMemPrimingSclks=0numSvcgen=numHypothesessvcgenStep=hypothesisSpacing}/*要跳向的循环点*/START_PRECOMPUTE,/**声明在频率预计算块内*/playbackState=3 (载波预计算)playbackStateCnt=0 (递增计数器) |
if(mixFreq<0){mixFreq=-mixFreqcodetopplerlsNegative=0 (不在模式块中)carriertopplerlsNegative=1 (不在模式块中)}else{codetopplerlsNegative=1 (不在模式块中)carriert*oppierlsNegative=0 (不在模式块中)}/*超级虚拟载波NCO预计算*/使用mixFreq和carrierbopplerlNegative作为输入,对于所有的10个VNCO预计算并加载RSCdivide offset与delay/*在码预计算模块内声明*/playbackState=4 (码预计算设置)playbackStateCnt=0 (递增计数器)if(firstRecord)(codebopplerNcoShift[freqCnt]=0codebopplerNco[freqCnt)=mixFreq/16}codebopplerNcoStep=(mixFreq+16)/32desiredCodePhase=startingCodePhase+codebopplerNcoShift[freqCnt]hwPhase=desiredCodePhase+primingAdjust startingChips=hwPhase>>6codeNcolnitialCondition=hwPhase & Ox3F if(codeNcolnitialCondition)startingChips+1playbackCompareState=recordStartingCompareStatefor(msec=0;msec<5;msec++){if(playbackCompareState)compareValue=11947else compare Value=11946if(codebopplerNco[freqCnt]>=compareValue)(codebopplerNcoShift[freqCnt]+=1codebopplerNco[freqCny]-=compareValue}vcgbelay=codebopplerNcoShift[freqCnt]for(sycg=1;sycgen<numSvcgen;svcg++){/*SVCGEN预计算*/ |
break vcgbelay into codeTap * 31+offset and initialize VCGen[svcg][msec]using vcgbelay and codebopplerlsNegative as inputvcgbelay+=sycgenStep(注意,如果是“搜索”模式,则此行无作用)}playbackCompareState+1if(playbackCompareState=3)playbackCompareState=0codebopplerNco[freqCnt]+codebopplerNcoStep}if(playbackCnt=0)compareState=playbackCompareStateif(numCodeWindows>1){codeGenStrobe=1 (不在模式块中)codeGenStrobeCnt=numHypotheses(不在模式块中)}elsecodeGenStrobe=0 (不在模式块中)/*声明进行CObE MEM填装*/playbackStatte=4for(playbackStateCnt=codeMemPriming;playbackStateCnt>0;playbaackckStateCnt--){primeCodeMem(run codeNco,codeGen,& codeMemonly,i_e_,no mix)}/*声明进行VCGMEM填装*/playbackState=5for(playbackStateCnt=vcgMemPriming;vcgMemPriming>0;vcgMemPriming--)(prime VcgMem(run codeNco,codeGen,codeMem,selected super virtual code generators,& vcgMem only)}/*要跳向的循环点*/START_PLAYBACK,只清除要被使用的相关器numLatchesAtive=number of active correlators(不在模式块中)如果计算它?{Search,numHypothesesWeakMeas,16*numHypothesesTimeTrack,function of numHyptheses,BTTmode,and BTTmsec}Reset carrier generation,initialize digitallocal oscillator,carrierNco,RSC data |
基于要调试的desiredCodePhsae来计算sclkEpoch和nocEpochsclkEpoch=function of(desiredCodePhase) (不在模式块中)ncoEpoch=function of(desiredCodePhase) (不在模式块中}noEpoch Yet=1(不在模式块中)/*声明进行重放*/PlaybackState=6for(playbackStateCnt=2112;playbackStateCnt<=0;playbackStateCnt-)(if(playbackStateCnt>0){1*进行混合*/与抽样数据(PCLKOn)混合if((codeGenStrobe)and(playbackStateCnt=codeGenStrobeCnt))选通codeGen并存储数据if(noEpoch Yet and(Gi epoch=1)){if(sclkEpoch 1=playbackStateCnt)or(sclkNco 1,codeNco)){if(codeGenReload)codePhaseBug+playbackCnt<4else codePhaseBug+=playbackCnt}noEpochYet=0}}else(/*锁存相关器*1/*查找仍处理锁存数据的差条件*/if(LAP<numModeBlocks){send event missedLatchData,data=LAP}playbackState=7LAP=modeBlockPointerplaybackState=8}}/*每一记录增加计数一次*/if(playbackCnt=0)recordCnt+1/*在每次重放上增加计数*/playbackCnt+=1codeWindowCnt+=1/*在“搜索”模式中的多个码窗口的循环控制*/if(codeWindowCnt<numCodeWindows){playbackState=9 |
将选通的codeGen块重新加载到块中codeGenReload=1desiredCodePhase+=numHypotheses*31goto START_PLAYBACK}/*来自多个频率的循环控制*/freqCnt+=1if(freqCnt<numFreq){playbackState=10mixFreq+=freqStepcodeWindowCnt=0 goto START_PRECOMPUTE}/*对于此模式块利用重放进行*/playbackState=11lastPlayback Of Record=1 |
锁存可用程控循环310对新的锁存数据进行响应。该锁存从不被清除,它们只被写到每个重放的末尾处。如果它们在下一重放之前没有被处理,则数据作为一个差错被丢失并且不被报告。在latchActivePointer(LAP)(锁存有效指针)被设置为小于numModeBlocks(模式块数目)的一个可用模式块值时,声明新的锁存数据的可用性。因此,锁存可用块的操作是事件驱动的。只要latchActivePointer(锁存有效指针)转为低于numModeBlocks(模式块数目)的一个数值,则该块就运行。可是,如果锁存可用处理的初始化花费较多的时钟,则在数据实际上变为可用之前必须进行初始化。
HypMem有一种新方法,它可以使用自动缠绕而不必实际使用存储器单元的组(bank)和单元地址块。以这种方式,进行户外模式不使用hypHem,可以仍使用这两个寄存器用于存储maxData(最大数据)的位置。这个方法加到了法国hypMem宏描述中。
如果maxData(最大数据)被请求,则每次记录它都被更新。因此,maxbataUpdateRate(最大数据更新率)变成一个一比特字并被一个工作maxbataUpdate(最大数据更新)代替。该maxbataUpdateRate(最大数据更新率)被移走并以软件处理。
假设当完成一个重放时,工作的相关器被复制到相关器锁存,latchAvail(锁存可用)被设置为一,并且锁存可用指针(LAP)被设置为工作模式块指针(MBP)。
如果maxData(最大数据)没有正被处理,则在一个模式块的所有重放都完成时报告任意新的重放。此检查可以在一个预计算和重放块中进行,但是最好只在一个部分中进行这个步骤。这在一个锁存可用块中进行,因为对于另一个记录我们想要等待maxData(最大数据)要在我们向软件实现的状态机宣布一个模式块已经对于另一个记录被处理之前被更新。
一旦开始一个新的模式块,则可能仍在处理来自前一模式块的锁存数据。因此,在正常预计算部分中与maxData(最大数据)分析相关的数据不能被初始化。所以对于每个记录处的每个模式块必须调用一个初始化程控循环。
表IV
/*对于新锁存可用初始化测试点*1测试锁存可用初始化 |
/* 对于当前模式块将锁存可用块初始化 */if((LAP=numModeBlocks)and (latchAvaillnit=0)and(MBP<numModeBlocks)and(MPB->maxDataUpdate)){/*在这部分中使用模式块指针MBP*//*在每个记录的第一重放上设置hypMem*/if(useHypMem){execute command,hypMemActivel bank AddressReg=bypMemBankbandAddressCell=hypMemCell execute command,loadHypMemAdd}else{execute command,hypMemActiveO bankAddressReg=0 bandAddressCell=0 executecommand,loadHypMemAdd}/*只在第一重放上清除maxData*/if((resetMaxbataEvery)or(firstRecord and(resetMaxDataFirst)))max1=max2=max3=max4=0/*把本地变量初始化*/bigPowerThisLatch=0overflowThisLatch=0/*声明已初始化*/latchAvaillnit=1}/*查找新锁存可用处理的测试点*/TEST_LATCH_AVAIL_PROC,if((LAP<numModeBlocks)and(maxDataUpdate)){/*现在分析锁存*/for(1=0;InumLatchesActive;)++){1*Analyze}and“Q”of current latch to look forbig power.(假设MSB=bitl3且LSBbit0)for}correlator,if((bti-13=1,and(bit-12 or biy-il or bit-1O is 0) |
or(bit-l3=0.and(bit-l2 or bit-il or bit-IO is 1))bigPowerThisLatch=1else for“Q”correlator,if((bit-l3=1,and(bit-l2 or bit-il or bit-IO is 0)or(bit-l3=0,and(bit-l2 or bit-il or bit-IO is 1))bigPowerThisLatch=1elsebigPowerThisLatch=0if(bigPowerThisLatch or largelomsecPower){compute thisPowerSum with only } and“Q”using method2if(largelomsecPower=0){largeIOmsecPower=1 maxi=thisPowerSummaxLocl=current bank and offset max2=max3=max4=0 gotoTHIS_LATCH_FINISHED}}else{if(useHypMem)(if(firstRecord and clearHypMem)thisPowerSum=0elsethisPowerSum=hypMem at current offset}else{thisPowerSum=0}thisPowerSum+=power computed using method 1if(overrlow detected){thisPowerSum=2*24-1if(hypMemOverf low=0){hypMemOverFlow=1 maxi=thisPowerSummaxLocl=current bank and offsetmax2=max3=max4=0 goto THIS_LATCH_FINISHED}}}/*如果新功率为LARGER则替代*/if(thisPowerSum>max1){max2=maxi maxLoc2=maxLocl max3=max2maxLoc3=maxLoc2 max4=max3 maxLoc4=maxLoc3 maxi=thisPowerSummaxLoc1=current cell and bank in hypMem}else if(thisPowerSum>max2){max3=max2 maxLoc3=maxLoc2 max4=max3maxLoc4=maxLoc3 max2=thisPowerSummaxLoc2=current cell and bank in hypMem} |
else if(thisPowerSum>max3)(max4=max3 maxLoc4=maxLoc3max3=thisPowcrSummaxLoc3=current cell and bank in hypMem}else if(thisPowerSum>max4){max4=thisPowerSummaxLoc4=current cell and bank in hypMem}THIS_LATCH_FINISHED}}if(LAP<numModeBlocks)(/*如果完成了所有重放,则报告新重放*/if(lastPlaybackOfRecord)(/*报告正常重放*/send newPlayback interruptnewPlaybackWord+=(OxOl<<LAP)/*报告由大功率所引起的记录终断*/if(largelomsecPower or hypMemOverf low)(/*更新模式块状态*/if(largelomsecPowcr)blockStatus+(finished+largelomsecPower)else if (haypMemOverflow)blockStatus+(finished+hypMemOverf low)}/*完成这个模式块的锁存数据*/LAP=numModeBlocksLatchAvaillnit=0}} |
当把LAP设置回到numModeBlocks(数字模式块)的静态(如果重放块也将在同一时钟上把LAP设置为当前MBP的话)时出现一个问题。在重放块中之上,就在写新LAP之前把playbackState(重放状态)设置为七。从而,如果palybackState=7,则对LAP的任何改变都必须等待。
为了得到高级的并行性,使用同一载波混合的一大组码假定被平行地实现。为了最灵活,虚拟码发生器最好用于为“搜索”模式合成一个大多数可能的码片间隔,并为“时间跟踪”模式合成一个较窄的间隔。可是,对于一个大数目的码假定,用虚拟码发生器的实现可能太昂贵了。
2.112MHz抽样时钟的周期大约是半个码片时间。精确地说,它是小于半个码片的六十四分之三十一或者六十四分之一。对于这个间隔,覆盖1023个码片范围的码假定数目为2112。这需要比一个理想的码片间隔所需要的2046个位置多百分之三(六十六个额外的码存储单元)的存储器空间。
最近测试数据指示具有温度模拟的一个典型晶体频率的先验最坏情况模拟差错是大约±0.5PPM(±787Hz)。为了守恒,并且为用户位置差错对频率的影响保留一些不确定度,对于第一卫星最好搜索±1000Hz的频率范围。如果对于在第一搜索中得到的有关频率信息有一个高级的置信度,则可以约束随后的卫星的频率搜索范围从而节省时间和努力。可替代地,这样的搜索时间节省可以交换一个在较低廉硬件中可找到的较慢时钟速度。
一个“预检测时间间隔”(PDI)是呼入的、本地地产生的信号的相干积分周期,其正好在平方以便得到幂之前结束。对于一个十毫秒预检测时间间隔,载波混合的频率响应是在±100Hz处为第一个零位的一个同步函数。通常,选择频率搜索步骤以便搜索的下一频率在前一频率的零位处具有它的峰值。在这种情况下,每一百个Hz被搜索并且每个频率搜索步骤的1.5dB带宽为±50Hz。为了覆盖±1000Hz的期望范围,需要二十个完整的码搜索。
在一个两缓冲RF抽样方案中,由一组相关器定义的每个码假定在正好2112个时钟中的一个完整的十毫秒预检测时间间隔被更新,例如,在一毫秒中的抽样时钟数。在所有十毫秒中以相同的子毫秒时间产生RF抽样。然后这些抽样被混合并在单个抽样时钟上相关,从而每一抽样时钟读取一个新的抽样组。在十毫秒中,并且在27.456HMz处,有27456个主时钟,其可以产生一百三十组的2112个抽样。一组2112个抽样混合一个特定码并且频率假定在此被称为一个“重放”。
如果在一百二十个重放中(在建立所需要的时钟上留下一些)进行二十个完整的码搜索,那么进行一个码频谱所需要的重放数目(N)为20*N=120。在这个例子中,N=6。因此“I”和“Q”相关器对的数目为2112/6=352,总数为704个相关器。这表示在图2中。
一个替代实施例通过一个系数2来增加主时钟速度,例如来产生总共二百六十个重放。重放的数目可以被增加到十二从而得到一个完整的码频谱。用这种方法,对于总共三百五十二个单独的相关器只需要一百七十六个相关器对。对于这个例子,选择具有重放速度为2*(在27.456MHz)=54.912MHz的一百七十六个相关器。
码NCO 206是一个六比特加法器,它把2.112MHz抽样时钟转换为1.023MHz。当对于一个码时钟需要三个抽样时钟而不是正常的两个抽样时钟时,它产生一个码时钟和一个div3信号。这里没有移位能力,但是通过指定一个初始条件变量“ncoInitialCondition”(nco初始条件)可以调整相位。
码发生器块208使用两个10比特移位寄存器来产生一个特定伪随机数序列。这个块包括三个查询表(其基于期望的码片相位和伪随机数),它们是G1、G2和G2偏移(offset)。
码和div3存储器210使用两个移位寄存器来选通或延迟在相同抽样时钟上的码发生器和div3输出端的信号。对于每个信号,延迟深度是最差情况十七个一比特状态。这里有输入信号到虚拟码发生器用于搜索或“meas-mode”(测量模式)。
虚拟码发生器块可以把与延迟寄存器中的码相关的±31个六十四码片的相对延迟进行合成。正延迟使用准时抽头和滞后抽头的组合。超前延迟使用准时抽头和超前抽头的组合。这里有一组五个虚拟码发生器使用在“搜索”模式中,并且同时另一组15*5个虚拟码发生器使用在“时间跟踪”模式中,总数为16*5=80。
在此,一组五个虚拟码发生器被称为一个“超级虚拟码发生器”。这样产生通过一个十毫秒记录所需要的相位来补偿多普勒轨迹。
虚拟码发生器存储器208包括一组五个一比特移位寄存器,其长度在“搜索”模式中对于十毫秒预检测时间间隔用来产生码多普勒的该五个虚拟码发生器的输出上为一百七十六。最早的状态0是虚拟码发生器的直接输出。最终状态,“一百七十五”,从状态0被延迟一百七十五个抽样时钟。
码移位存储器被用来选通在一个特定抽样时钟上的整个码产生块的状态。这个数据被重新加载到一个随后的重放上以便产生一个虚拟码移位。
数字本地振荡器(DLO)212把抽样时钟除以十六,并产生一个十六状态变量,称为dloState(dlo状态),其在一百三十二kHz处从零到十五进行计数。它被使用来产生从最终RF级输出的信号的最终IF。
载波NCO 214,或者主载波NCO,是一个二十四比特寄存器,同时把抽样时钟除以四作为它的输入(528kHz),这里四个最低有效位被解码为ncoState(nco状态),其在对应于carrierNcoValue(载波Nco值)的频率处从零到十五递增或递减地计数(如果频率为负则递减)。
sumState(和状态)是一个四比特数,它是dloState和ncoState之和。它表示由多普勒和最终IF之和产生的相位。
realStateCount(实际状态计数)变量对连续抽样时钟进行计数,这里主载波NCO的状态不改变。该变量也可以通过在增加该计数之前预分频该计数器被延迟。当多普勒很小时需要此来容纳四比特延迟的有限范围。
超级虚拟载波NCO是一组虚拟载波NCO,它产生与主载波NCO相同的频率,但是在相位偏移处它从主载波NCO相位延迟模数一毫秒。每个虚拟载波NCO有两个四比特寄存器,例如,“偏移”和“延迟”。每个虚拟载波NCO产生离sumState(和状态)相位的一个四比特相位偏移。该延迟变量在当前realStateCount(实际状态计数)超过该延迟变量时可以增加一个延迟增加比特,或者在多普勒为负时前进(advance)。
载波混合216把RF抽样与十个NCO的每一个产生的载波相位混合。这里只有一个载波混合器。所有十毫秒抽样以同一子毫秒相位同时被混合。
码混合器提供大量的平行性,“搜索”模式中每个混合可以产生多达一百七十六个不同的码假定。在“timeTrack”(时间跟踪)模式中,只有十六个是变量,因为需要七个相关器来在不同的出现时间隔离该混合。对于每个假定,有一个混合器和一个同相和正交积分器,例如“I”和“Q”相关器222。
假定锁存224正在为最后一个假定的“I”和“Q”锁定寄存器。锁存被使用,这样下一个混合不必等待RISC处理器258读取数据就可以开始。每一个新的混合将重写旧的数据,因此RISC处理器258读取不得不直到那时才取出被锁存的数据。
数字信号处理通过可以被写的多个不同变量来控制。写入卫星交通工具伪随机数(SV:PRN)变量来定义一个新的搜索。轨道GPS卫星使用伪随机数代码01-32。WAAS和pseudolites被定义在33-4x范围中。一个六比特字长是最低限度需要。码开始相位变量是“StartingCodePhase”(开始码相位)并定义一个码片的六十四部分中的相对开始相位。这是一个两字节无符号字,并表示“搜索”模式中的第一码窗口的右手侧和“测量模式”中的码窗口的左手侧的相位。码相位范围为0-(1023*64-1)=0到65471。当调整码相位时有六十四个未使用的值。可以容易地把StartingCodePhase(开始码相位)数断为码片和六十四分之一。
表V
startingPhaseChips=startingCodePhase>>6startingPhasesixty-fourths=startingCodePhase & Ox3F |
例如,一百个码片和一码片的六十四分之十七的码相位具有StartingCodePhase=6417。当通过增加多于1023*64而穿过上边界时,只有一个相位码片被增加,因为盲区在从大相位到小相位的一个滚动中借了一个整数码片。
类似地,当从一个小的开始码相位中减去一个正相位时,该方法向下滚动并占据盲区转到一个大的码相位。校正是减去一,因为未校正的相位是从小相位移到大相位太大的一个。
多普勒开始“carrierNcoValue”(载波Nco值)变量被定义在载波NCO单元的比特中。一个三字节带符号字被使用来以每秒的循环数表示载波多普勒。一百三十二kHz的最终中频(IF)不需要被包括在这个变量中,该最终IF由该载波NCO之外的一个十六状态数字本地振荡器来解调。载波NCO具有二十四比特,其输入时钟是被四频分的抽样时钟。把carrierNcoValue(载波Nco值)从比特转换成赫兹的比例因子为CARRIER_NCO_HZ_PER_BIT=2.112MHz/4/2^24=0.031471252Hz/bit。
为了把5000Hz的载波多普勒转换成NCO单元,把多普勒除以上面的常数以便得到比特单元,并产生一个carrierNcoValue=158875。因此,carrierNcoValue=以赫兹为单位的载波多普勒/CARRIER_NCO_HZ_PER_BIT。这个除法在导航处理器中进行,并且在一个正常的控制消息中被发送给DSP114。
典型地有三个DSP操作模式:(1)“search”(搜索)模式(非相干),(2)“weakMeas”(弱测量)模式(非相干),以及(3)“timeTrack”(时间跟踪)模式(相干)。利用DSPmode(DSP模式)变量来定义当前模式。当在DSPmode=“search”(搜索)模式中产生码时,一个最右相关器将产生由StartingCodePhase定义的一个相位。这样的惯例使最初操作简单化。
在两个模式中,只有一个频率混合假设,并且所有相关器利用十个VNCO形成的十个一毫秒载波混合的结果来工作。对于跨越一个十毫秒预检测时间间隔中的一个特定毫秒,虚拟载波NCO产生符号波的相干相位。
由于每一混合只有一个频率假定,所以利用多个平行的码相位假定来在码域中产生所需要的平行性。在这种情况下,每对相关器产生相同的载波混合输出,并随后混合一个不同的码相位假设。
在“搜索”模式(非相干模式)中,每个相关器向右或随后的码移位,通过把该码延迟一个抽样时钟来进行,例如,准确地为31/64。因此,在“搜索”模式中,hypothesisSpacing(假定间隔)是固定的并且是不可控制的。对于每个码假定有一个相关器对,其为一个完整的十毫秒相关保存同相和正交结果。
为了容纳在一个十毫秒混合上发生的码多普勒偏移以及所需要的相位跨度,五个虚拟码发生器与五个176状态一比特移位寄存器一起被使用。它们被一个抽样时钟计时以便产生31/64的码片间隔。
虚拟码发生器相对于主码NCO和码发生器定义的参考相位产生一个相位偏移。
每个虚拟码发生器产生跨越两毫秒的相位偏移以便覆盖五个虚拟码发生器的十毫秒跨度。两毫秒的载波混合将使用同一码混合。每一毫秒一个虚拟码发生器太过度了,因为如果码多普勒NCO被正确处理,则这里没有长期的偏移。
对于一个二十kHz的载波多普勒,虚拟码发生器只需要提供由于码多普勒在十毫秒上引起的一码片的±10个六十四分之一的相位改变。仅仅利用三个码模型就可获得这个相对相位偏移。直到一码片的六十四分之十的超前码偏移,在虚拟码发生器计数变量为零时将使用一个超前码抽头和准时抽头。同样,当虚拟码发生器计数变量为零时,利用准时码抽头和滞后抽头来产生滞后码偏移。
只有码和div3存储器块的三个状态被用于“搜索”模式。
五个虚拟码发生器每一个的输出被传递到它自己的一比特移位寄存器中,该移位寄存器有一百七十六个状态长,并且利用抽样时钟来计时。超前抽头实际上是发生器的输出。
详细地,在每个抽样时钟上并在codeNco和码发生器的状态的更新之后,移位寄存器被计时,导致寄存器的内容右移一个单元。在右边的先前的五个状态被抛弃。
虚拟码发生器的状态被认为是开始(最早的)相位并被直接传递到第一个相关器对中。用于“搜索”模式的码发生器块的填装(priming)包含两个步骤,填装码和div3存储器,然后填装作为虚拟码发生器的输出上的移位寄存器的那个存储器。填装的细节将在填装部分中讨论。
如果所期望的码相位是一百个码片和一码片的六十四分之十七,那么需要对硬件相位进行一个小的调整来适应超前、准时以及滞后延迟以使在重放的第一时钟上产生准时的所期望的码相位,并且还使得当重放开始时所有延迟都有效。为此,所期望的码相位通过填装效果来修改,当来自码和div3存储器块的仅仅三个状态被使用时的“搜索”模式的情况下,在所需要的时钟数之内运行码NCO和码发生器直到最早的三个寄存器被填充为止。
通过把寄存器在重放的第一抽样时钟上移位一,来把在一百七十六个状态中的准时码初始化。一百七十六深的延迟块按照两个步骤来填装。第一步将填装用来馈给虚拟码发生器的延迟块。第二步填装将随后填充使用虚拟码发生器输出的那个延迟块。
对于第二步填装,虚拟码发生器被计时在所需要的抽样时钟数上,以便填充第二延迟存储器。然后所期望的准时相位将在重放的第一抽样时钟上的最右边的延迟寄存器中。
在对一组卫星的一系列失败搜索之后采用“weakMeas(弱测量)”模式。各个搜索的功率峰值被再访问,这次利用一个更好的搜索解答。在“weakMeas(弱测量)”模式中,因为不确定度被降低,所以花费足够的时间来并行地搜索大量卫星。
另一种类型的相关器间隔可以被实现,以使结果足够精确来获得一个位置和速度固定。对于八个卫星的同时测量,例如,每个卫星的十五个频率可以被搜索,并使用一百三十个变量假定的其中一百二十个。这将节省足够的主时钟用于假定之间的预计算。中心频率可以放在搜索时间处的最佳频率处,同时在其每一边有八个频率。五十Hz的一个步长提供一个±425Hz的范围。对于一个1g(one-g)加速模型,即,然后在十秒中的10m/s2,速度的最大变化为g*10=100m/s=500Hz。五十Hz的一个步长产生二十五Hz的一个最差情况频率差错,其大约是5m/s的速度。这是在一个速度固定的可接受噪声性能的边界线上。因此,如果已知用户动态较小的话,则可以减小该步长。
在码域中,所有一百七十六个相关器被用来产生在每个码假定之间具有非常窄间隔的另一个码搜索。一个方案使用一码片间隔的六十四分之二,以使最差情况差错为一码片的六十四分之一,大约为4.5米。这符合弱信号的目标范围精度。
利用十六个超级虚拟码发生器、五个虚拟码发生器产生一个码假定间隔,从而提供给穿过整个十毫秒记录的码多普勒轮廓。虚拟码发生器的间隔为一码片的六十四分之二。以这种方法,产生码假定的窗口,其为来自一个参考码抽头的一码片的六十四分之0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30。虚拟码发生器的输出被延迟一个抽样时钟(三十一分之一部分),以便提供一个非常长的好的码假定窗口。
每个超级虚拟码发生器之间的偏移最好总是相同的。在每个超级虚拟码发生器中的第一虚拟码发生器输出1=一码片的六十四分之零,2=一码片的六十四分之二,3=一码片的六十四分之四,4=一码片的六十四分之六,5=一码片的六十四分之八,…,16=一码片的六十四分之三十。除了穿过十毫秒预检测时间间隔的多普勒轨迹,在每个超级虚拟码发生器中连续的虚拟码发生器的偏移与前一虚拟码发生器的相同。此数据被编程在一个虚拟码发生器预计算步骤中。
把每个虚拟码发生器的输出发送给一个十一比特移位寄存器。每个移位寄存器的最左边的状态是与当前虚拟码发生器输出相同的值,即,状态0具有延迟零。在右边的最后一个状态被从虚拟码发生器输出中延迟十个抽样时钟。
相关器被映射到码产生。
第一个相关器获得一个码,呈现在第一个超级虚拟码发生器延迟寄存器的第一状态中。第十六个相关器产生一个码,呈现在第十六个超级虚拟码发生器的第一延迟中。然后,第十七个相关器获得第一个超级虚拟码发生器的移位寄存器的第二状态,而第三十二个相关器获得第十六个超级虚拟码发生器的移位寄存器的第二状态,等等。
超级虚拟发生器被用来产生一码片间隔的六十四分之二。每个虚拟码发生器输出跨越十毫秒记录的码多普勒轨迹。全部十六个超级虚拟码发生器以两个六十四间隔提供一码片的六十四分之三十的一个相位范围。通过延迟每个超级虚拟码发生器的输出,在六十四分之三十一累加处产生的相位合并可以被复制。可能的最大延迟数被相关器的数目所限制。不可思议的数字是十一,为176=16*11。这给出了一个的最大范围。
通过多个抽样时钟来延迟超级虚拟码发生器的输出,从而产生一码片的搜索引擎的三十二分之一。当全部十一个延迟被使用时,总的范围是六十四分之三百四十(等于五个码片和一码片的六十四分之二十)。较大的线具有一个模31的偏移。所有大于六十四分之三十的延迟由延迟寄存器产生。在零和三十之间的所有延迟由延迟寄存器产生。
在“timeTrack(时间跟踪)”模式中,例如,对于最大为十六个单独的码假定,从六十四分之一到六十四分之三十二产生更好的六十四分之二相关器间隔。产生较少的假定,因此对于一个相干积分能力可以使用相关器。对于十个码出现时间的每一个可以分开混合,而不是把十个分开的毫秒分到不同的相关器中。
这样使得在GPS传输中能够对五十Hz导航数据同步,从而不在任何数据比特边缘积分。这使损耗最小化,并增强了整数毫秒定时能力。
可以把本发明的实施例做成看上去像一个具有无限个信道数的传统跟踪接收机。这在这里被称为“timeTrack(时间跟踪)”模式,通过观测数据比特以及随后解调导航数据来获得来自GPS的时间,从而可以确定时间。这在其它两种模式中是不可能的,因为信号太弱而不能观测导航数据。为了覆盖十毫秒,需要十一个相关器来提供一个导航数据的数据比特边缘的最佳检测。相关器对的最大数目是(15*2+11)=41,假设所有十六个码假定都被使用。在这种情况下,十五个码假设使用两个相关器对,并且一个码假设使用十一个对。在其它模式中,少到十六对和三十二对。
在传统跟踪中,一个码假定将通常被居中在一个码自动校正函数峰值上。相应的相关器对呈现出最佳信噪比并且是用于观测任何半周期载波相位改变的最佳运载工具。其他码假定也可以观测此类改变,但是软件实现的状态机必须读取的相关器的数目将过多。
在“timeTrack(时间跟踪)”模式中,每一重放只有一个码假定呈现一个十一相关器选项。这个码假定的相对位置是可变的。在峰值的任一侧要被使用的码假定数目可以是变化的。
在“timeTrack(时间跟踪)”模式中的其他码假定将把十毫秒记录分裂为一个或两个相关器对。对于两种相关器模式有两个选项。在第一个中,10毫秒被分裂为两个五毫秒块。在第二个中,按照导航数据相位反相的位置的一个估计来分裂十毫秒。
相关器非峰值被用于延迟锁定程控循环中。在中心码假定任一侧上的码假定之间检查功率差值以便形成控制信息。
来自搜索跟踪的进程利用搜索逻辑开始以便查找一个码峰值。“搜索”模式切换到“timeTrack(时间跟踪)”模式。所有的相关器都被配置来输出到两个五毫秒块直到码峰值被分解为止。一旦知道该码,则在频率峰值上进行一个旁瓣检测。十一相关器选项可以检测一毫秒输出中的大频率差错。在分解码峰值和频率峰值之后,该十一相关器码假定位于峰值上,并且时间被花在了搜索反向相位位置上。该结果识别发生比特转换的那毫秒。
其他相关器对保持在一个五毫秒块选项中,直到知道该比特转换为止。相关器切换来把比特转换任一侧上的数据输出到两个相关器中。
作为可折叠(accordion)模式的一个例子,对于八个码片的一个范围,具有由码片分开的十六个码假定。该范围码片间隔为两个码片。紧密的间隔可降到六十四分之一,并且可以使用多个重放来产生具有极窄间隔的较宽码混合。
一组附加的15*5个虚拟码发生器被用来产生穿过十六个码假定的可折叠偏移。一个相对相位偏移从一码片的六十四分之0-15*32中产生。然而,当六十四分之±10的码多普勒效应被包括时,这里有一个-10到15*32+10的最差情况范围,例如,从-10到490(<16*31)。因此只需要一个超前寄存器、一个准时寄存器和十六个滞后寄存器。码发生器状态被用作超前寄存器。
在“搜索”模式中,码和div3存储器寄存器被填装,以使完整的块在重放的第一抽样时钟上是可用的。“timeTrsck(时间跟踪)”模式的码产生与“搜索”模式的不同,在虚拟码发生器的输出上没有附加延迟。只有一个填装相位存在,因此很容易把准时相关器定义为第二延迟并且其它的为滞后延迟。作为超前延迟的第一实际延迟实际上直接是码发生器的输出。较低的相关器数目表示较超前的相位。
在“timeTrack(时间跟踪)”模式中有两个相关器模式。在“BTT检测前”(before BTT-detection)模式中,把十毫秒预检测间隔分为十一部分,其具有作为边界线的CA码出现时间而不是毫秒。由于只运行一毫秒,所以产生的出现时间发生在每一毫秒中的精确的相同时间处。对于每一毫秒可以延迟该出现时间以便进行补偿。这实际上是不需要的——因为—个差错仅仅发生在有导航数据引起的一个相位反相,并且这只影响该反相发生的毫秒积分中最差情况的五个抽样时钟时。
在建立导航数据比特的相位中该“BTT检测前(before BTT-detection)”模式很重要。在那之后足够把所期望比特周围的转换时间只相关到两个相关器对中。然后,第二种模式,“BTT检测后(afterBTT detection)”模式被激活。处理器固件把已识别的毫秒作为一个相关分界线导出并发送。在出现时间左手侧上的所有先前数据将去到左手侧(LHS)相关器中。在特定毫秒中的出现时间右手侧上的所有后续数据将去到右手侧(RHS)相关器中。在特定毫秒中的CA码出现时间之前的数据将去到LHS相关器中,而在CA码出现时间之后的数据将去到RHS相关器中。
一个BTTmode(BTT模式)变量只应用在“timeTrack(时间跟踪)模式中,即,DSPmode=3(“timeTrack(时间跟踪)”模式)。如果BTTmode=0,那么所有的码假定依据另一个变量只使用一个或两个相关器。如果BTTmode=1-15,那么一个码假定操作在检测前模式中。使用在码假定中的十一个相关器等于BTTmode。例如,如果BTTmode=7,那么具有索引七的码假定将操作在BTT检测前模式中。假设索引为0-15,这意味着第0个码假定不能运行在前模式中。这是可允许的,因为前选项被居中在一组BBT检测后模式相关器对之间。
一个BTT毫秒变量规定一个期望的数据比特转换点。如果BTT毫秒=0,或者11-14,那么在独立于一毫秒或出现时间的检测后模式中,只有一个相关器被用于码假定。如果BTT毫秒=1,10,那么在BTT检测后模式中,两个相关器被用于码假定。而且,该分离是以这个特定毫秒内的出现时间为基础的。例如,如果BTT毫秒=3,那么分裂点是第3毫秒中的出现时间。
如果BTT毫秒=15,则独立于出现时间位置,在十毫秒记录的中心把相关分裂为两个相关器。BTT模式、BTT毫秒产生六个“时间跟踪”模式处理选项。两个变量BTT模式和BTT毫秒可以产生五个不同类型的“时间跟踪”模式的混合。混合器有三个选项,混合数据可以全被加到一起、在两个相关器之间被分裂、或者被初始时间分开。在该配置中至少六个方法可以被使用。
第一种方法有最少的相关器需要读取,没有BTT,并且每个相关器一个十毫秒预检测时间间隔。BTTmode=0并且BTT毫秒=0。每个码假定被输出给一个相关器。这真正与搜索和“weakMeas(弱测量)”模式的混合相同。这个模式在一个户外“搜索”模式之后查看一个大的码窗口以便查找功率并且不用任何定时信息就可提供最少的要读取的相关器时很有用。
由于在一个十毫秒记录中导航数据相位反相可能发生,所以这里有一些数据丢失。可是,每隔十毫秒记录将不经受这种丢失。当一个相位反相精确地位于一个十毫秒周期的中心时,此记录将完全丢失。如果在一个记录中心中相位每二十毫秒就改变,则一半的可用功率将被丢失。
第二种方法有第二少的相关器要读取,没有BTT,并且每个相关器有两个五毫秒预检测时间间隔。BTTmode=0并且BTT毫秒=15。每个码假定被输出给两个相关器,每一个相关器持续时间精确为五毫秒。这种模式在查看一个大的码窗口来查找功率时很有用,例如,在一个户外“搜索”模式之后、当没有定时信息可用时、以及当由于相位反相所引起的损耗要被最小化时。
在某种意义上,可以进行五毫秒功率计算,或者可以发现相位反相以便不对其积分。一个五毫秒预检测时间间隔选项还用于查找由于一个更宽频率带宽引起的(例如,两百Hz代替一百Hz)一个频率峰值。
第三种方法搜索BTT检测前的BTT信息,每个相关器的两个五毫秒预检测时间间隔。BTTmode=(1到15)并且BTT毫秒=15。除了由BTTmode规定的那一个外的所有码假定被输出到两个相关器中,每个相关器持续时间精确为五毫秒。等于BTTmode的那个码假定被输出到十一个相关器。这种模式在码和频率峰值被分解之后以及在搜索任意相位导航数据相位反相时很有用。
第四种方法搜索BTT检测前的BTT信息,在每个相关器中使用一个十毫秒预检测时间间隔。BTTmode=(1到15)并且BTT毫秒=0。每个码假定都被输出到一个相关器,除了由BTTmode规定的那一个外的所有码假定之外。这种模式有点奇怪,但是它使要被软件实现的状态机读取的相关器的数目最小化。
第五种方法保持BTT,其具有在BTT毫秒的出现时间处分裂的相关器,BTTmode=(1-15)并且BTT毫秒=(1-10)。所有码假定,除了由BTTmode规定的那一个之外,都被输出到两个相关器。分裂点是由BTT毫秒规定的毫秒的出现时间。检测一个毫秒相关器数值以便观测出现时间何时绕回通过一个毫秒边界继续。这提供最佳整数毫秒范围性能。对于具有一个真的二十毫秒相干积分周期的最大弱信号跟踪能力,跟踪逻辑可以切换到一个二十毫秒预检测时间间隔。
第六种方法停止搜索BTT,其具有在BTT毫秒的出现时间处分裂的相关器。BTTmode=0并且BTT毫秒=(1-10),所有码假定都被输出到两个相关器,这里,分裂点是由BTT毫秒规定的毫秒的出现时间。
当使用这种模式来以极窄的间隔在峰值上放大时,这种模式很有用。为反射功率检测该峰值并验证一个较大射束不在邻域中。
由于一个真的二十毫秒相干积分周期,对于最大弱信号跟踪能力,跟踪逻辑可以切换到一个二十毫秒预检测时间间隔。
一个numHypotheses(假定数目)变量控制每个重放执行的码假定数目。这一个无符号字节是使用在混合中的相关器的数目。这个方法可以和检测后BBTmode一起使用以便产生一个低功率传统跟踪模式。
该numHypotheses(假定数目)在一个以上的模式中也是有效的。通过不搜索不可能的码假定,可以搜索一个更窄的范围以便节省时间和功率。对于“搜索”模式,它意味着多少移位延迟寄存器是有效的。在这种情况下,活动的相关器的数量等于numHypotheses(假定数目)。
对于“weakMeas(弱测量)”模式,它意味着在虚拟码发生器输出上的多少延迟是活动的。由于保持十六个超级虚拟码发生器是活动的,所以活动的相关器数目为(16*numHypotheses)。如果numHypotheses为一,则被搜索的范围为从startingCodePhase到startingCodePhase加一码片的六十四分之三十。对于“时间跟踪”模式,它意味着多少超级虚拟码发生器是活动的。活动的相关器的数目是上面讨论的BTT模式的函数。
一个hypothesisSpacing(假定间隔)变量控制每个码假定之间一码片的六十四分之一中的间隔。在“搜索”模式中,间隔是被硬布线到一码片的六十四分之三十一,因此这个变量可以忽略。在“弱测量”模式中,自动地把相关器间隔编程为一个码片的六十四分之二。因此hypothesisSpacing(假定间隔)变量主要被用在“时间跟踪”模式中。这是具有范围为1-32的一个五比特无符号数。
一个numCodeWindows(码窗口数)变量表示一个码假定孔径(aperture)被移位到一给定频率的一个新相位的次数。为了得到所有可能的码假定的完整码扫描,这个变量将具有一个值为十二。因此,这是具有范围为1-16的一个四比特数。它只被用在“搜索”模式中并且在“弱测量”以及“时间跟踪”模式中被忽略。
一个windowShift(窗口偏移)变量控制在numCodeWindows(码窗口数)大于一时发生在连续码窗口之间的码相位的偏移。由于在“搜索”模式中码窗口被重复,那么间隔仅是(numHypotheses*31)的乘积。这可以在DSP114中这样被简单地计算,即作为一个左移五的偏移并随后减去原始数,例如,(x*31=x*32-x)。timesTwoMode变量在需要时启动一个较快的重放能力,例如,在必须搜索一个较大的频率范围时。
在“时间跟踪”模式中,为了运行一个较低的时钟并节省操作功率可能需要一个分裂模式,如在只有一些重放需要被执行时。numRecords(记录数)变量是运行当前假定组的连续记录的数目。任何大于一的数值意味着我们实际上一次只搜索一个卫星,并且因此,我们可以停留在当前的假定组,因为我们没有切换到其他卫星。这只用在“搜索”模式中。例如,为了停留在一个卫星上一秒钟。在这种情况下,该变量将具有一个值为一百。对于一个达2.55秒的范围,这是一个无符号八比特数。
numFreq(频率数)变量是利用当前码假定要搜索的频率数。这是范围为1-20的一个无符号五比特数。它和一个步长变量一起工作来定义一个频率搜索。
freqStep(频率步)变量表示连续搜索频率之间的频率间隔。步长通常应该是相应于预检测时间间隔的频率。可是,较小尺寸可以使用在较好调谐到频率峰值的测量中。
在最小频率一侧开始一个搜索,并继续到最大频率。它覆盖了与在中心开始并然后在两个方向上移出的一个相同的范围。这样的方法在DSP114中易于实现。
例如,假设我们想要搜索1000Hz左右±400Hz。我们将使开始频率为650Hz,然后进行八步的一百Hz来产生如下所示的剩余频率。在这种情况下,carrierNcoValue对应于650Hz,numFreq=8,并且频率步长为一百Hz。
假设我们对于超级虚拟载波NCO变量的偏移和延迟不具有双精度存储,同样对于虚拟码发生器变量C1、C2比特,计数以及状态也是。它意味着DSP在计算它们时是空闲的,其意味着更长的建立时间,但是更少的门。如果它随后被确定加速并且可以提供另外额外的门,则当重放正被计算时应该考虑把预计算常量缓存。
这个当前的方法是可允许的,因为在运行时间上,±1000Hz的频率搜索需要极少的预计算。事实上,它只发生在第一个十毫秒记录上。在二十个剩余重放时钟中必须有足够的资源来进行二十个预计算。如果没有,则在真正把它们加载到目标寄存器中之前需要附加的存储器来存储预计算结果。
DSP114状态机设计通常将包括定义如何选择并控制一个重放时钟。一个startPlayback(开始重放)变量被用来开启一个重放时钟并开始一个重放混合。一个palybackSamplesToGoCount(重放抽样开始计数)变量定义在一个混合中要处理的剩余抽样的数目。它在2112处初始化,加上填装时钟的数目,并且处理一个抽样时钟后就减一。当初始值达到零时该处理完成。一个palybackClockSelector(重放时钟选择器)变量定义选择一个重放时钟速度。当其值为零时,主时钟直接被使用。当其值为一时,将主时钟乘以二。一个playbackClock(重放时钟)时钟被用来操作所有的运行时间块。一个primingComplete(填装完成)信号表示什么时候完成一个填装并准备开始混合。它在整个填装期间为零。一个playbackComplete(重放完成)信号表示什么时候完成一个完整的2112抽样混合,并且相关结果在保存锁存中有效。它在填装时、或者在RISC处理器258已经清除任何重放时也为零。
三个可能状态可使用相同的基础状态机。最典型的搜索是搜索一个多重频率范围上所有可能的码相位。这在拥有用户时间和位置之前被执行。状态机将在被定义范围的所有码和频率处自动地进行一个十毫秒混合。
每个搜索使用所有重放电位,因此阻止并行地进行其他假定。这样将另外破坏混合的连续性,除非在哪存储并恢复所有状态。此自治是需要的,以使可以全速运行一个块而不浪费任何时钟,通过等待来让微处理器来提供下一个状态。
可以通过定义开始码、每个码之间的间隔以及要被搜索的码数目来规定码搜索。基于具有一码片的六十四分之三十一的间隔的176相关器模型,我们可以在十二个步骤中搜索完整的1023个码片。对DSP114的命令是使用所有一百七十六个假定,并进行十二个连续混合,在此,在每个混合之间码被移位一百七十六个抽样时钟,以便搜索码频谱的另一部分。当第一重放完成时,DSP114自动对码进行移位,开始下一移位,并继续该处理直到在一个频率处的搜索数目用完为止。通过对一些频率重复该处理以及逐步安排(step)变量“numFreq”(频率数)和“freqStep”(频率级)来执行一个频率搜索。
第一种搜索技术对于一个卫星交通工具(SV)在所有码相位,±1000Hz处及一秒,使用所有的重放。另一种技术只搜索码频谱的一小部分,这样少于全部码假定的假定被使用。只有一个重放被用于一个宽的非相干扫描。这在近似码位置已知时保存运转功率,不需要比基于不确定度增长模型的必要搜索更进一步的搜索。
时间跟踪模式把一个重放用于一个窄相干扫描。这样的搜索利用一个导航数据比特相位反相来调整积分边界。该时间跟踪模式是一种传统类型,其中,积分周期同步到一个本地产生的进程捕获(CA)出现时间,而不是毫秒。目的是为了避免对过去的任何相位反相积分,并且在一个给定相位处需要更多的相关器来保存不同出现时间中的各个积分。对于一个十毫秒预检测时间间隔,需要十一个相关器来正确地保存十个出现时间的数据。所需要的码假定数目减少为十六,因为16*11=176。
“时间跟踪”模式可以像一个手风琴一样被收缩或扩大。每个码假定之间的间隔可以在一码片的六十四分之一和六十四分之三十二之间调整。这通过十六个虚拟码发生器来启动。不同的码假定从十七个码发生器输出延迟抽头中被模拟,而一个“div3”信号来自码NCO。“时间跟踪”模式可以选择一个十毫秒预确定时间间隔的所有出现时间用于分开的输出,或者关于该出现时间被分为两半的一个输出。
高级状态机最好具有三个主程控循环。一个记录程控循环只运行在“搜索”模式,并命令在一个大频率范围上进行搜索。它耗尽所有可变的假定间隔,而其它两个循环不可运行在之间。
一个频率程控循环在多个频率处重复同一码假定,并且是产生多个频率的最快的方法。处理器只介入来引导下一搜索频率。当与记录程控循环结合时,它提供非常强大的搜索机器。对于每个频率,可以独立更新码多普勒NCO。
一个码窗口程控循环被用来引导连续的码搜索。利用设置开始绝对相位的第一个查询表来定义第一码窗口,并且任意随后的搜索通过码的相对移位来产生一个码相位。
计算对于假定使用和DSPmode的填充效果(primingAdjust)codeGenStrobeCount=2112-numHypothesesif(search && numHypotheses=176 && numCodeWindows=12)fullCodeSearch=1 else 0for(recordCnt=0;recordCnt<numRecords;recordCnt++){mixFeq=carrierNcoValuefor(freq=0;freq<numFreq;freq++){if((recordCnt=0)‖(numFreq=0))/*第一次记录*/计算对于mixFreq的高级虚拟载波NCO数据,存储它,并加载到虚拟载波NCO中计算码多普勒NCO步长,存储它并加载到NCO中else/*不是第一次记录*/为来自存储器的数目的该频率复制高级虚拟载波NCO,并加载到高级虚拟载波NCO中对来自存储器的该频率复制码多普勒NCO频率,并加载desiredPhase=startingCodePhase+codeDopplerShiftmixPhase=desiredPhase运行codeDopplerNco以获得对于该记录的频移(更新codeDopplerShift)计算对于该码相位和十毫秒预检测时间间隔的虚拟码发生器数据compute hardware phase=desiredPhase+primingAdjust用硬件相位初始化codeNCO和码发生器复位carrlerNco和分频器开清除相关器if((recordCnt=0)‖(fullCodeSearch=0))/*运行填装时钟*/load primingClocks=codeGenStrobeCountset startPlayback=1wait till primingComplete=1else/*不是第一次记录或者不是完全搜索*/copy code generation state to initialize and set startPlayback=1for(codeWindow=0;codeWindow<numCodeWindows;codeWindow++){if(playbackClocksToGo>0)&&(playbackClocksToGo=codeGenStrobeCount)选通码发生并存储if(playbackComplete=1)/*混合完成*/buffer correlators(report mixCodePhase,mixFreq,etc...)if(numCodeWindows>1)复制码发生状态以初始化下一个相位mixPhase=mixPhase-windowShift复位carrierNco和分频器并清除相关器reset carrier NCO and dividers and clear correlators}/*结束码窗口重放*/}/*一个频率的结束*/mixFreq+=freqStepSize存储对于该频率的码多普勒NCO数据}/*一个记录的结束*/ |
虽然按照目前优选的实施例已经描述了本发明,但是应该理解,该公开不应该理解为一个限制。在阅读了上面的公开物之后,对于本领域的技术人员来说,各种替代和修改将毫无疑问变得显而易见。因此,企图用附加的权利要求解释为覆盖落入本发明实际精神和范围中的所有替代和修改。