GPS接收机如何决定user position?这是终极目标。找user position难点是:一、需要根据satellite constellation来解方程,但方程是non-linear的,直接求解比较困难;二、user clock inaccuracy. 用户时钟精度不够,导致的时钟漂移。结合上面两点,对non-linear的方程求解,是通过linearization and iteration求解。求解是在cartesian coordinate system, and then the result will be converted into a spherical coordinate system. Gps性能要求,10~30m rms error; real time;worldwide coverage, including the polar regions; tolerate interference, such as harmonics from narrowband signals; acuqusition should be in minutes not hours; can tolerate the inaccuracy of the user clock; antenna should be small.以上要求,导致了gps的载频是L band(1-2ghz).用GPS信号决定user position需要的卫星数:如果是一维的坐标,那么为了确定这个坐标,一颗卫星不能,需要两颗卫星;同理,确定二维坐标,两颗卫星会给出两个位置,所以需要3颗卫星才能唯一确定user position; 同样的,确定三维坐标,就需要4颗卫星提供的距离。这也好理解,如果要确定3维坐标,则把卫星信号到达的区域看成是一个以卫星位置为中心的球,也不是主观这样看成,而是这么看问题更接近真实的情况。那么两个球相交得到一个圆,再添加一个球,可以看成是这个球和之前两个球相交得到的圆之间再相交,得到两个交点,也就是三个球还是不能唯一确定相交的位置坐标,因此需要再增加一个球,才能确定两个交点中那一个才是user position. 一句话,卫星的数量需要比空间的维度多1才能唯一确定空间的位置! 现在继续讨论卫星的个数:如果一切理想的话,四颗卫星就可以确定三维坐标。但实际中,由于user clock inaccuracy,所以还需要一颗卫星来排除时钟的漂移导致的错误。因此,需要5颗卫星!但是,如果强行用4颗卫星的话,由于有时钟误差,计算结果有两个位置,一个close to the surface,一个在space,而在space的可以容易排除,因此也能用4颗,说得比较绕!下图就说明为啥是二次方程组了,为啥需要四颗卫星了,因为有四个未知数:xu,yu,zu, and bu(时钟误差) 通常接受的卫星信号来自4~11颗,有两种方法,一种是全部使用,另一种是选用4颗,选用的标准是四颗卫星位置越独立越好,见Fig.2.8.所谓越独立,就是四个位置的连线组成的四边形面积越大越好,所以图(a)就不好,三个卫星在一条线,图(b)就好,能形成一个四边形!
捕获,就是检测是否有c/a信号存在,或者具体说,c/a码的开始和载波的频率。这两个信号同时获取。然后把这些信息pass to tracking procedure. 前面提到过,捕获需要搜索+/-10khz的频率范围,这个范围就是多普勒频偏的范围。问题是: 捕获的带宽是指什么?由谁决定的?书上说,窄带的捕获带宽要用很多步骤才能cover +/-10khz的范围,比较time consuming;而宽带的呢,就存在poor sensitivity的问题,但是由于tracking的带宽很窄,可以保证high sensitivity。所以,还是需要用wide bandwidth for searching.本章会讨论三种捕获的方法:传统的,基于fft, delay and multiplication的。传统的和fft效果一样,fft可以降低运算复杂度;delay and multiplication的速度更快,但是会lower snr,可以看成是一个速度和性能的tradeoff.所谓捕获,就是去找到c/a code的开始的相位,同时需要确定输入信号的载频。这个载频是考虑了doppler effect的,每颗卫星都不同。这两个参数就会pass到tracking procedure. 本章后面的讨论是基于IF=21.25MHZ, 采样率是5MHZ,因此基带信号的中心频率就是1.25mhz. 关于中频和采样率的问题需要看第6章的内容。所谓传统的方法:就是用硬件来对每个卫星的c/a码在时域捕获,这个方法就不如用软件的方法,可以保存数据,然后在数字域处理。考虑这本书是写于90年代,估计硬件手段很有限,比如用fpga一样可以来做信号处理,速度还快!捕获,理论上是数据时间越长,信噪比越高。但两个因素限制了数据长度:一是该数据中是否有navigation data transition;另一个是c/a码的doppler effect. 由于navigation data速率是50hz,也就是每20ms一次数据相位的transition。考虑到这个transition是在时域上和c/a码相乘,所以频域就是卷积运算,或者说是频域就是调制,把c/a码左右移位50hz再相加,也就是说频谱展宽了,由于有混跌,因此性能下降了。那怎么办呢?在时域上,每20ms才变一次,所以捕获的时间设为10ms,这是因为,连续的两次捕获最多一次transition, 也就是说连续两次的捕获中有一次是不受navigation data transition影响的。由于c/a码的周期是1023码片,时长1ms,所以1ms的数据就可以包含c/a码的全部信息,理论上,1ms的数据就可以用来捕获,但是如果这1ms中出现了navigation data transition,那么信噪比就会衰减很大,因此为了保险起见,用两个连续的1ms数据就可以做捕获了。在工程中,用10ms来做捕获,那么连续两个10ms中也最多一个transition.上面说c/a码的多普勒会影响捕获的时长。由于多普勒,数据不能完全对齐,如果有half chip off,那么相关峰就从理想的1衰减到0.5,因此就是6db的幅度衰减。假设:码片速率1.023mhz,最大多普勒是6.4hz,因此漂移一个码片就需要1/6.4=156ms,漂移半个码片就是78ms,也就是说捕获时长必须低于78ms. 上面已经讨论了,10ms最理想,因此10ms也满足多普勒的要求。frequency steps in acquisition: 这一章开始就讨论捕获的带宽的问题,说带宽如果太小,那么就需要很多步骤才能cover载波的+/-10khz的频偏;带宽太大,又出现精度不够的问题。现在稍微理解了捕获带宽的物理意义:就是每1秒捕获的次数,是不是很简单,按照上面的讨论,每10ms的数据做一次捕获,那捕获带宽就是100hz。这个就是前文提到的捕获带宽太小的情况,所以需要很多steps才能cover 10khz的带宽。为什么呢?怎么cover的?C/A码的乘积和FFT: c/a码捕获就是找到c/a码的初始相位,然后用这个c/a码去乘以射频信号,得到射频连续信号,从而得到载频值,如下图:图中最上面的信号是连续输入的c/a码被射频信号调制的波形;中间的图是捕获中得到的c/a码初始相位,是本地产生的;下面图表示的用本地的c/a码乘以输入的c/a coded input signal,即:把c/a的影响从载波里strip out最后就得到纯的载波信号,这就可以求载频的频率。 一旦得到上图的载波,就可以用fft来求频率。如果数据长度是1ms,那么fft的分辨率就是1khz。为什么呢?这样好理解啊。1ms的时间,可以表示的周期最长的信号也是1ms,也就是说如果有一个信号周期是2ms,那么在1ms的时间内只有半个周期,因此能表示的最小频率就是1/1ms=1khz,这也是fft的分辨率,所谓分辨率就是最小可以表示的频率。继续讨论FFT找载波频率。如果采样率5mhz,那么在1ms中就包含了5000个采样点,因此就需要5000-point FFT。由于是实数输入,那么这5000个FFT就是complex conjungate的,即:前面2500个点就包含了所有的信息。由于频率分辨率是1khz,那么2500个点就可以表示2.5mhz的信息,这么看fft还是线性的,如果有的频率变化快,有的频率变化慢,这就不行了。突然感觉自己以前对dsp的理解太low了,只知道记公式,公式是美丽,但是物理意义才更美丽,这是题外话!刚才说可以表示2.5mhz的信息,但是我们其实关心的只是多普勒频偏,而不是整个载频,也就是20khz的范围,那么显然2.5mhz就太多了,因此:直接的方法就是只需要计算21个输出值,用dft即可。这样做的话,可以节省大量时间和能量,比如:输入的c/a码和本地的c/a码在1ms内需要做乘法,由于有5000个采样点,每移动一次就要做5000次乘法和55000-point FFT,所以需要做5000×5000次FFT,这么看数据量就太大了,而如果只做21-point DFT,那么就只需要5000*21次DFT。用上面的dft的方法,由于需要用本地产生的c/a码和输入的c/a码每移动一位都做乘法和fft,然后找频率的超过pre-defined threshold中的最大值,如果找到最大值,就可以把现在的本地的c/a码的位置记录下来,这就是c/a码的开头。而且,由于码片的length是200ns,也就是说找到的c/a码的开头有200ns的分辨率,或者说200ns的误差,而且由于整个data的长度是1ms,所以多普勒频率的分辨率就是1khz. 这个思路可以很容易generalize: 现在我们考虑10ms的data,那么由于采样率不变,所以时间分辨率还是200ns,但是由于10ms和1ms相比,允许周期更长的信号出现,即:最多可以有10ms为周期的信号,因此频率分辨率就是100hz,能得到这个100hz的是要付出很大代价的,因为现在我们需要做50,000-pointFFT, 而之前只需要5000-point FFT,而fft长度增加10倍,复杂度增加会超过10倍,所以整个复杂度不是线性增加的!time domain correlation:这才是第二种方法,除了用fft来做,还可以用时域相关的方法来做。这个方法本地产生的c/a码不再是简单的c/a码,还把RF信号加入在里面。由于采样后的信号的载波是1.25mhz,那么考虑频偏在+/-10khz,那么就有21中可能的RF信号可能性,所以本地产生的信号就是如下: 其中,Cs代表24颗卫星中某一颗的c/a码,注意:这里都是认为已知卫星的c/a码,只是不知道初始相位,fi代表不同的射频频率,如:1250-10,1250-9,1250-8,…,1250+10khz,也就是这些不同的频率是考虑了多普勒。产生了这个本地信号后,仍然需要数字化成5mhz的数据,即:每1ms仍然是5000-point,这些点和输入数据相关,所谓相关,就是乘累加,如果本地的c/a码包含正确的c/a码和正确的频率,那么相关结果就会成高,产生一个峰值。如下图: 这个过程是这样的,每200ns,输入的数据就多收到一个,就把现在的5000个输入的复数和local的5000个复数做相关得到的一个复数,把这个复数的幅度计算出来就代表现在的相关结果。所以,5000个数据输入,就需要做5000次的这样的乘法,也得到5000个幅度值,那么21路并行的处理,就得到21*5000个幅度值,选取最大并cross the threshold的值,此时对应的fi就是接收到的信号的fi,此时的数据的起始相位就是Cs的相位。相位这个,怎么理解?由于已知24颗卫星的c/a码初始相位,所以上面的Cs的初始相位都是已知的固定的,所以需要移动接收到的射频数据和本地的c/a码做所有可能的尝试,确实很傻,不过1ms内最多尝试5000次,总能试出来找到正确的相位,如果相关出现峰值,就说明此时接收到的信号的c/a码的相位和本地的对齐,且接收到的c/a码的初始相位就是我们实验用的Cs的初始相位。继续讨论time domain correlation.这个方法本质就是做dft,和fft相比,这个方法更快,因为只需要遍历所有可能的相位和所有可能的频率偏移的组合,按照边界说,这个方法就是先找到解空间的具体的边界,然后遍历每一个可能的解,而之前基于FFT的方法则是盲计算,导致计算复杂度很高,所以好的方法总是搞清楚问题的边界,就在边界内求解!由于时域相关的方法得到的结果频率分辨率只有1khz,因为只用1ms的数据做dft,所以只有1khz.书上说,这个频率还不够精确,不能直接送到tracking program,还需要提高进度,如何进一步提高进度?在section 7.10讨论。拭目以待!继续讨论捕获。现在介绍关于相关的一些基本知识:circular convolution and circular correlation. 圆周卷积和圆周相关。在连续时间域,有如下关系: 也就是说:时域卷积,频率相称;频域卷积,时域就相称。你看,为啥叫卷积,因为还是个积,只是换了一个域,或者说换了一个观察问题的角度。这个性质在离散时间域也有类似的,但又不一样,不是线性卷积,而是圆周卷积。相关和卷积也很相似,如下图: 稍微一看,就知道,卷积和相关就差一个符号,所以在频域也很相似。再看下面公式,有个疑问,即使下面成立,也不能认为相位关系也是这样的吧,因为下面公式只表示了幅度关系。 现在利用circular correlation来完成前面的time-domain相关。很简单: 根据上面的公式,把输入的1ms的5000点数据当成x[n],用FFT得到X(k),然后得到X(k)∗然后产生local的射频信号,一共21个可能的频率值,前文已经讨论过,然后把这21路信号做FFT,这里这个信号就相当于上面公式中的H(k)在频域相乘,根据对偶原理,频域乘,等效时域卷积,由于我们使用的不是X(k),而是X(k)∗,所以就等效与时域的相关。但是,这里我们reap FFT的efficiency,而不用像前面计算时域相关需要5000*5000次乘法,做了FFT,只需要5000*21次乘法,而FFT的复杂度只有o(nlgn)。相乘后得到频率值,还需要用iFFT都转换成时域值,并求最值,根据最值得到相应的频偏和c/a相位。section 7.9没细看,下次再看!前面分别介绍了基于fft和基于time-domain correlation的方法,在time-domain correlation中又介绍了用circular correlation的概念,利用FFT加快运算速度。这一节将介绍一个新的方法,delay and multiplication. 这个方法的目的是:首先eliminate the frequency information in the input signal, 然后问题就变成了去找c/a码开始的位置,等c/a码开始的位置找到了,频率就可以通过dft或fft来计算。或者说,这个方法就是decouple解空间。前面介绍的时候,我就说了time-domain correlation的方法就是首先明确了解空间是5000点的时域位移和21个不同的频率值,这样就组合重21*5000个可能性,这种方法由于同时explore时间和频率空间,也将同时得到c/a码起始值和载频值的解,所以导致复杂度高。因此,有人就提出先消除频率信息的影响,然后找到c/a开头,最后再找载频。这样复杂度大大降低,因为只需要做5000次相关,然后就是用载频做dft.两个操作从并行变成了顺序操作!delay and multiplication:顾名思义,就是把接收到的信号先delay一段时间,然后在把两个信号相乘,如下图。有意思的是,正是相乘把频率成分给消除了,你看(7-15)公式里,Cn(t)变成了一个新的gold码,但仍然是gold码,而且周期和初始位置都和原来的相等,这个性质真是没想到,最重要的是,两个序列相乘后,就立刻消除了频率成分,变成了一个新的gold码。需要注意的是,这个码有一个常系数,e2πfτ.对这个delay的时间τ有一定限制。 继续讨论delay and multiplication的方法,为了说明问题,下面截图就说明了delay如何选择的问题,把复数信号换成实信号,指数就变成cos(),在(7-19)中,高频可以滤波,最后剩下cos(2πfτ),因此为了使得到的新的gold 码幅度够大,信噪比够高,需要让这个|cos(2πfτ)|接近1。好在这个问题很实际,f随不知道,但f的范围还是知道的,1250+/-10khz.所以,当f=1250khz,τ=400ns,也就是delay两个samples就可以满足条件;当f=1250+10khz,带入计算,|cos(2πfτ)|=0.9997也很接近1.所以2个sample delay就可以首先消除频率的影响,果然很简单高效! 现在来看这种delay乘的方法主要问题:由于上面表达式只表示了信号部分,没有表示噪声,实际上,噪声也是要相乘的,所以结果是噪声和噪声相乘,引入更多的噪声,也就是noise floor increase,信噪比就下降!因此,不能只依靠1ms的数据,在实际中,需要更长的数据。还有一个特性,如下图。就是delay相乘后的新code对navigation data transition不再敏感,你看新的code只有2个bit受到影响,也就是2/5000的数据受到影响,因此影响可以忽略了。因此,不再受到之前讨论的10ms数据长度的限制了,由于navigation data transition对新的code的影响变小,因此这个方法可以做到精度更高。 理论上,1ms的数据就包含了完整的信息,就可以用来得到c/a码的初始相位和载波多普勒频偏。但实际中,都会通过采集处理长时间的信息来增加信号snr,提高频率分辨率等。书上介绍了两种方式: 第一种是non-coherent的,这个就简单粗暴了。如果用2ms的数据,那么对每1ms分别处理,然后再求和。但是怎么相加?把谁和谁相加?这个没讲清楚,就说这么一加,信号功率变成两倍,但噪声功率只变成2√,所以最后snr还是增加了2√,即:1.5dB。我个人猜测是,等两个1ms都找到了c/a开始,然后despread后,再相加。第二种是,coherent处理。这个很有意思!用更长的数据可以提高频率分辨率,我们已经知道,但更长数据更重要是可以提高信噪比,这个就不容易理解了。书上解释说,因为更长的数据对应更高的频率分辨率,或者更长的数据,相当于低通滤波器,当这个低通只会让噪声功率减少,信号功率不会变化,因为信号经过despread后的带宽比频率分辨率肯定还要窄。因为噪声的带宽减少,噪声功率也就减少,所以snr就提高。举例:如果2ms的长度,snr就提高3dB现在考虑,如果从1ms变成10ms的data,就不能直接用fft的方法来做了,因为10ms的数据有50000个数据点,做50000-point的FFT就比较不现实了!好在方法总是有的:可以做更少点的fft。始终记住我们的目标是找到多普勒频偏,即:+/-10khz,但是我们前面都是处理的1250+/-10khz这样的数据,这里再次在这里做文章,之前产生的local信号有21种可能,从1250-10,1250-9,…1250+10khz.然后同时乘了相关求最大值。这里变化的地方是,只用一个载波1250khz来乘以输入的信号,那么就得到一个低频信号+/-10khz,还有一个镜像的高频,假设高频可以滤波,那么就一个20khz的基带信号了,面对这个信号,我们就不用这么高的采样率了,我们不用之前的5mhz采样,用50khz就够了,因为50khz>2*20khz,满足nyquist定律。由于数据已经用5mhz采样了,那么我们直接对每100个相临的数据求平均即可,这样还可以滤除高频镜像信号。把以上方法描述如下:第一步,把10ms的输入信号和本地产生的复数的1.25mhz的信号(digitized at 5mhz)相乘,输出的信号最大频率就是10khz,目前我们一共得到50000个点;第二步,把第一步的输出和c/a码点对点相乘,得到50000个点;第三步,则是每100个数据求和平均,这个过程相当于低通滤波,因此在高频2.5mhz附近的镜像就被滤除。补充一句,所谓求平均后,时间分辨率就变成了200ns*100=20us,所以最大的频率就是1/(20*2us)=25khz,因此高频自然就不能表示了;第四步,做500-point的FFT,找出最大的频率幅度;第五步,由于是用c/a信号和20khz的低频信号乘,所以需要移位5000次尝试所有可能,所以最终只需要5000*500次的操作即可!和直接做50000-point FFT省事多了。注意,由于10ms的频率分辨率是100hz,因此上面的操作就是100hz分辨率,这就可以送给tracking loop了。上面只是介绍了直接的实现方法,这个思路一样可以用circular correlation的方法来做,即:后面移位的过程可以在频域做。到底如何做?有点晕! 第二次看,不晕了。就是用FFT来做circular correlation,节约时间!Basic concept of fine frequency estimation: 精确的频率估计。如果用1ms来做捕获的话,只能得到1khz的分辨率,这个精度送去tracking不合适,the desired 分辨率应该within a few tens of hertz,因为tracking loop的频率分辨率只有a few hertz。 用dft或fft来提高分辨率,显然不合适,比如:用10ms的数据做fft前面已经讨论了,运算量还是很大,而且只能得到100hz的分辨率。不用dft和fft,还有没有别的方法呢?肯定是有的:通过相位关系,一旦c/a码stripped off from the input signal, the input becomes a cw signal。也就是计算短时间内的相位变化,然后除以时间就得到这段时间的频率。如下图: 首先θm(k)表示在第m秒这1ms内对输入信号(c/a码被stripped off)做fft,最大频率分量的相位,θn(k)表示在第n秒这1ms内对输入信号(c/a码被stripped off)做fft,最大的频率分量的相位。提取这两个频率分量对应的相位值,然后计算相位的变化就是这个多普勒。这样的做法,就可以得到精度更高的频率值。因为直接计算相位,不像之前的是直接计算幅度值。由于相位都是confined within 2π的范围内,而任意两个时间的实际相位变化很可能超过2π,这就存在相位模糊,即:phase ambiguous. 书上介绍了很详细如何防止相位模糊的方法,没看太懂。以后再看!(section 7.14!)
第7章总结
介绍三种捕获方法: 第一种是FFT的,就是先从输入信号remove 可能的c/a码,然后把得到的射频信号去做fft,得到频率,由于不知道c/a的可能初始相位,所以要把c/a的所有可能都遍历一遍,也就是5000种(1ms周期有5000个采样点),每遍历一次,就要做5000-point的FFT,因此就要做5000次5000-point的fft,把这些数据中找到最大幅度的点,复杂度很高。原因就是先strip off the effect of c/a码,而c/a码可能性这么多。 第二种基于dft. 上面方法是先strip off the c/a code,然后去找频率,而频率其实只有+/-10khz的范围,所以没有必要去盲找,完全可以缩小范围,就是值计算这个范围内的21个值,即:1250-10,…1250+10khz,因此没必要计算fft,完全可以计算21点的dft。这个方法是这样的: 先把21中可能的载波产生,然后用5mhz采样也得到5000点,然后把这个21中载波分别和c/a码相乘,以消除载波的影响,然后再去和输入的c/a码做circular correlation. 这样复杂度就是有21次的5000-point FFT。注意对比上面两个方法:前一个方法是先strip off the c/a码,然后去盲估频率;这个方法是先strip off 载波,然后去盲估c/a开始位置。 第三种,delay and multiplication. 前两种的复杂度还是高,原因就是同时在遍历载波可能解空间和c/a起始位置解空间,因此复杂度就是这两个解空间的乘积。现在这个方法就可以decouple两个空间,通过delay 输入信号,并把delay前后的两个信号相乘就可以先消除载波的影响,得到一个新的c/a码,因此就可以用circular correlation的方法,也就是5000-point FFT来找最大值,等确定c/a初始相位后,再用这个c/a码乘以输入得到载波,对载波做dft或FFT就可以得到频率。你看现在复杂度就变成了一次5000-point FFT找c/a开头,一次21-point DFT找载波。太美妙了!
这一节将PLL,这是重点。包括:transfer function, error transfer function, the noise bandwidth, and two types of input signal.PLL的主要作用就是来调整时钟产生的频率,让本地的产生的载波和输入信号的载波频率尽可能相等,以便做相关解调,做相关解调的原因是提高解调信噪比。下图就是PLL在连续时间上的结构,其主要组成为:phase comparator, 低通滤波,vco,增益控制四部分。 4.用laplace变换是为了计算状态转移。需要复习为啥laplace变换可以这么牛!如下图,H(s)就是传递函数,所谓传递函数,就是输出/输入,结果就是系统的传递函数,你看用H表示,表示就是系统的冲击响应的laplace变换;He(s)就是错误传递函数。 为了研究pll的性质,书里采用了两种不同的输入如下图。一种是输入为阶跃函数;另一种为调频信号。
数据如果功率弱,可以用更长的时间来track,例如用20ms,那么就可以得到13db的增益(10log(20/1))。但不能更长了,更长就要处理这段数据里面出现的navigation data transition,复杂度就高了。现在的疑问是,如何找到navigation data transition,如何消除呢?
8.16本章总结
本章介绍了两个方法来做tracking.一种是传统的基于loop的方法;另一种是bass,从时域来做。bass确实简单,没有反馈,但是bass在worst case下会由于本地产生的c/a码和接收到的c/a码之间misalignment 100ns(半个采样周期),从而相关峰值达不到1023这么大,会小一些(918),所以性能会差大约1dB。再比较一下两种在c/a码同步上的区别,结构上都有early and late码,重要的区别是: 传统的方法是没1ms都会出来一个early/late比较结果,根据这个结果来决定prompt往前移动一个码片还是往后移动一个码片;而BASS则会根据early和late相关的具体值,来计算得到prompt code偏移的时间的具体值,由于考虑噪声的影响,所以并不是每1ms就更新,而是通常10 or 20ms计算一个平均值,把这个平均值和门限比较,决定往前还是往后移动。也就是说,BASS没有实时的去更新,所以简单!继续。计算出来的prompt code和input code之间的时间的差值,应该很精确,所以这个方法在时间同步上可以精度更高,而传统的做法就是比较相对值,来左右移动,因此精度很小。但另一个角度思考,则是算出的这个相对值每10ms用一次,这10ms中间就可能出现prompt code和input code相差大于100ns的情况,这样导致BASS的相关峰总是比传统的方法得到相关峰小!