# GPS signal acquisition

I have a set of GPS satellite signal data, the set is 1 ms long and has the information of two satellites (satellite number, code phase and frequency) buried in noise. This data has a carrier frequency of 4.309 Mhz and the sampling rate is 5.714 Mhz.I've been reading but I don't really have pretty clear what to do:

• which are the options to make the acquisition? As far as I've read, there are two options: time and frequency based acquisition. which is the best option to use?

• The set of data is noisy and continuous:

I have generated the C/A gold sequencies sampled at 5.714 Mhz in order to perform the correlation with the satellite data. How can I design a narrowband filter to get rid of the noise? The local coded I generated are sequencies of +1's and -1's. Do I need to convert this data also into -1's and +1's to perform the acquisition?

If the GPS signal is centered (carrier) at 4.309 MHz, and this is sampled at 5.714 MHz, then there would be an alias copy at 5.714-4.309 = 1.405 MHz. To acquire this signal, you would first "down-convert" the signal to baseband, or 0 frequency by multiplying by $exp(-j\omega t)$ where $\omega$ is $2\pi(1.405e6)$ Hz. The reason to use an exponential and complex downconverter such as this process instead of just multiplying with a sine, is that it will facilitate fine adjustments to carrier frequency and phase as you do your acquisition (which you can do manually to get a feel for how a carrier tracking system would work). After you multiply the signal as such to move it to 0 frequency, then correlate with the code for your specific SV of interest.

When correlating to a known code, the magnitude of the correlation will be proportional to the residual frequency offset of your carrier as a Sinc function with the first nulls located at $F= \frac1T$ where $T$ is the length in time of your correlation. (For example, if you choose to correlate over a full PRN which is 1 ms, the null to null width will be ± 1kHz, meaning you should be able to see an SV even if it is still ±500 Hz off. For this reason if I was doing a manual search with a full length PRN, I would step my frequency in steps of 500 Hz and do a correlation in each "frequency bin" until I stepped over the full possible Doppler range for my system. For your case to give a specific example, I would do a first correlation after multiplying by -1.405 MHz ($e^{-j2\pi1.405e6t}$), and know that I would see and SV if it was within 500 Hz (the null extends to 1kHz offset, but beyond 500 Hz and the correlated signal would start to compete with noise). If I didn't see anything for an SV that I knew was present, I would then step my frequency up 1 kHz (to -1.406 MHz) and try there, and I would continue this over all possible Doppler offsets (typically up to ±5 kHz). If I knew my signal was strong, I could correlate over 1/2 a sequence to double the "window" in which I would see a signal in Doppler offset. But this would reduce the processing gain by 3 dB but useful for an initial acquisition search.

Note, if needed see my code generator available here: https://www.mathworks.com/matlabcentral/fileexchange/14670-gps-c-a-code-generator which includes the ability to resample the code to any arbitrary frequency (in your case 5.7144 MHz).

And if you really want to get fancy (at the expense of resources associated with a 2D FFT), see my implementation for "one-shot" code delay and carrier phase here: https://www.mathworks.com/matlabcentral/fileexchange/26035-joint-frequency-and-delay-correlation This shows how to determine code delay and frequency offset from one block of data in one matrix operation, using the cross-correlation theorem to relate the fft to a circular correlation;

$\text{xcorr}= \text{ifft}\left(\text{fft}\left(a\right)\text{fft}\left(b\right)^*\right)$

combined with the property that a circularly rotated FFT of a time domain signal is the same as the time domain signal in a different Doppler bin. (So once one FFT is computed for the CDMA PRN, you have the FFT's for the PRN at all other Doppler bins just by rotating that one FFT!). The code provides a similar plot as shown below which is the correlation for an SV vs code and frequency offset.

• Any chance you have a python implementation of your matlab code? – Seth Oct 4 '18 at 15:28
• No but wouldn’t be too difficult to do using SciPy/Numpy given the similarities of the functions used. Are you referring to the joint code and delay acquisition or just a simple acquisition within a single Doppler frequency range l? – Dan Boschen Oct 4 '18 at 15:30
• I was thinking for either one. – Seth Oct 4 '18 at 15:31
• If you do code it I would start with the former (correlate in a Doppler bin, then step to the next Freq and search again —- or optionally correlate with use of a relatively slow frequency ramp (modulate the C/A code onto a ramp that goes over your full Doppler range over many PRN cycles and do a sliding correlation), it will provide more insight. Watch what I and Q do from one complex correlation peak to the next (will rotate at the Doppler offset rate). – Dan Boschen Oct 4 '18 at 15:42