GPS is now a key technology for many diverse fields, from controlling autonomous vehicles, location aware games on cellphones to controlling continental power grids. I want to understand it.
One unique feature of GPS is the ability for it to provide a highly accurate time reference, and it was thinking about how this feature was implemented that started me wondering how GPS actually works. How can a small electronic device determine an accurate time, based on the transmission of satellites that are 20,200 km away?
After investigating on Google, I’ve reached the conclusion that one way to understand everything about it is to make my own functional GPS receiver.
In a act of serendipity I am just about to receive the hardware for this project – the KiwiSDR cape for the Beagle Bone. It handles the messy RF front-end, delivers the output of a Skyworks single chip GPS front-end to an Xilinx Spartan 6 FPGA for decoding. You can find the full details on the project’s web site – http://kiwisdr.com/kiwisdr/ including the full set of design files.
For this blog I will focus on the most primitive, understandable techniques I can find to decode this raw ADC output into usable navigation information. Rather than efficiency the focus will be on being understandable and testable with the minimal advanced maths skills I have.