As you know, I am studying GNSS technologies for my master’s degree. The topic I choose to focus on is GNSS receiver technology, especially SDR based. The reason for choosing this topic is my Bachelor’s background, I am an electronics engineer and have experience in software/hardware developments.

Before I choose this topic, I really would like to work on FPGA for signal processing and learn more about FPGAs, because of their power for signal processing, and they are accepted as cutting-edge and important for future core works. However, I have only basic knowledge of experience in FPGA development and I do not know anything about GNSS signals. Now I have basic knowledge in both of them but still, I am not sure if I can imply a receiver on an FPGA like in my head. I heard about an interesting technology combining FPGA and ARM abilities into a bundle. Maybe I can use it for my study, so I will gain experience in embedded development and signal processing at the same time.

First of all, I will analyze the SoftGNSS implementation to get a better understanding of the processing of GNSS signals. It is a MATLAB program developed by Dennis M. Akos. During my analysis, I will share my progress here, so I will take notes for anyone who is a beginner in this topic at least for myself for future use 🙂

Let’s dive… I am also a newbie, consider it, please 🙂 The sample file I use for this program is “GPSdata-DiscreteComponents-fs38_192-if9_55.bin”, its size 1.78 GB. “fs38_192” illustrates sampling frequency and “if9_55” represents IF frequency.

init.m
This code block is used to initialize the system, to get the parameters we set in the file called “initSettings.m”.
When you look at the code, you’ll see “probeData” function which is used to provide the graphs of the input signal.

Run “init” from the command line.

probeData.m

  • This function reads the input signal file during the first 10 spreading code, it means 10ms. To do this, the function needs to know how many samples will be read. The reason why the code calculates “samplesPerCode” variable is this one. To find the exact samples for 10ms signal.
  • After getting 10ms of the input signal, the first plotting is on the time domain. However, the code plots only 0.2ms length of the signal.
  • For frequency domain plotting, the code uses pwelch function. I don’t know what the exact point of using pwelch, but it can be obtaining a smoother plotting comparing to the full FFT.
  • The default histogram range seems too large to me. So I narrowed it down a bit. The range of bins were -128:128, there was a lot of empty space at the extreme points. So I use the range -16:16, it seems better.
“init” calls “probeData” function and plots these graphs.