BeiDou Tracking Block for GNSS-SDR


Today, GNSS software receivers have achieved a level of considerable technological maturity and use, particularly in signal analysis and receiver engineering, and appear poised for much wider adoption in commercial equipment and applications. For that reason, GNSS-SDR project becomes a reality for the new paradigm in Software Defined Radio (SDR) GNSS receivers.

The GNSS-SDR open-source project is a GNSS SDR receiver intended to be a testbed for GNSS receiver designers and researchers, supporting them in the complex task of developing and testing new algorithms for the demanding multiband, multisystem GNSS receivers.

In GNSS-SDR the receiver is no longer understood as a black box, everything is configurable including signal sources, signal processing algorithms, interoperability with other systems and output formats, allowing also to log any kind of intermediate signal or parameter. Thanks to its modular nature, new algorithms can be easily accommodated with little changes. This process is described in deeper detail in the official website (

Currently, the open source GNSS-SDR is completely operational with GPS L1-C/A, GPS L2C (M), Galileo E1, Galileo E5a and hybrid GPS-Galileo signals. To go towards an effective multi-constellation software defined receiver, GNSS-SDR extension to the Chinese Navigation Satellite System (BeiDou) was proposed. Hence, the aim of this project is to implement a signal generator and a signal tracking block (already implemented for the GPS and Galileo signals) for BeiDou open service signals (B1l) in the framework of the GNSS-SDR project.

This work also opens the way to the interoperability between GPS-Galileo-BeiDou, in order to guarantee coverage (in terms of in view satellites) and increasing accuracy in positioning. In fact the BeiDou constellation is going to become a complete GNSS system. At the end of 2012 there were five Geostationary Earth Orbit (GEO) satellites, four Medium Earth Orbit (MEO) and five Inclined Geosynchronous Satellite Orbit (IGSO), but for the end of 2020 it is expected a fully operational constellation with five GEO, twenty-seven MEO and three IGSO. Such scenario explains why the extension to BeiDou is necessary.


As mentioned before, the main goals of this project were about the development of the BeiDou B1I Signal Generator and the Tracking Block following the work done by the last GSoC-2015 developer.

At the beginning of this project, a first approach of the BeiDou Acquisition Block was already implemented and integrated in the project. Also, a Matlab simulator of the Signal Generator Block for the BeiDou signal had been already developed. Nonetheless, the simulator were just a prove-of-concept and it was not tested and validated. Therefore, the first steps were to get insights and clearly understand these already existing features in order to develop the Tracking Block and to extend and integrate correctly the Signal Generator Block.


The Signal Generator integrated in the project was only able to generate and provide GPS and Galileo signals. Thus, part of the interest of this project was to implement an extension for the BeiDou signals.

The Signal Generator should be able to generate a BeiDou B1 In-phase signal. This means that the ranging code and NAV message should be modulated in carrier and a secondary code of Neumann-Hoffman (NH) code was modulated on ranging code. Additionally, the Signal Generator shall be able to set different parameters such as the Initial Doppler frequency, the delay of the ranging code or the PRN number. The configurability of the generator is an asset since it allow us to accomplish the battery of tests for validation. As follows, it can be seen an example about how the BeiDou signal is generated.

Captura de pantalla 2016-08-18 a las 18.38.17

Secondary code and its timing

Once the documentation step about the navigation radio signals was accomplished, and considering the Matlab signal generator, the BeiDou Signal Generator in C++ was successfully developed.

Therefore, the integration of the Signal Generator allows us to use fully multi-constellation signals without the need of carrying a real signal capture out.

signal_generator for beidou signal fixed

The most critical functions developed for this purpose was:

void beidou_b1i_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, signed int _fs, unsigned int _chip_shift);

This function is able to generate any desired PRN code for the BeiDou constellation. Moreover, the NH code was added later for the completely match with a real signal.

added NH code to beidou signal generation

As it was mentioned before, to test the new functionalities of the Signal Generator, some tests were carried out.

BeiDou Signal Generator GSoC2016 Test

For unit and integration testing GNSS-SDR uses the Google C++ Testing Framework, a software library that takes care of all the testing infrastructure, letting the developer focus in the content of the test.

Therefore, the was developed in order to test and validate the Signal Generator and check the correct operating of the BeiDou Acquisition Block.

The test was set with the following parameters:

  • Sampling Frequency: 16 MHz
  • Intermediate Frequency: 0 Hz
  • Doppler Frequency: 1650 Hz
  • Code Delay: 3767 samples
  • PRN: 20
  • Integration time: 1ms

Finally, the results obtained are presented in two images. Firstly, it is shown the Code Delay Samples and the Doppler Frequency provided by the test.

Captura de pantalla 2016-07-25 a las 16.19.28

Debug results for Acquisition Test

Secondly, a 3D plot is shown. This figure has been obtained by means of a developed MATLAB script (plot_acq_grid_beidou.m ) for the acquisition results.


Acquisition results for BeiDou B1I Signal

A battery of tests was carried out to check the proper functionality of the new implementations. For the sake of  brevity only one is shown in this report.


The acquisition block provides the initial estimates of the carrier Doppler and the code offset. After the acquisition, the control will be handed over to the tracking loops to track the variations of carrier phase and code offset due to the line of sight movement between the satellites and the receiver.

The main objective of signal tracking is to wipe off the code and the carrier. The carrier tracking loop synchronizes the carrier frequency and phase with that of the incoming signal. Therefore, the BeiDou Tracking Block implements two discriminators for the Carrier Tracking and the Code Tracking.

Regarding the BeiDou signal situation, with an extra tier of modulation on top of data bits, a Costas Phase Locked Loop (PLL) was implemented for the Carrier Tracking and a Narrow Correlator (NC) discriminator as Code Tracking loop (or Delay Locked Loop) with early, prompt and late correlator spacing of 0.5 chips (twhis is actually a totally configurable value).

On the following link, the developed files for the tracking block can be found.


Following the structure of this report, a test was developed in order to test the proper behaviour of the new implemented tracking block.

BeiDou Tracking Block GSoC2016 Test

Therefore, this section introduces the developed tracking block test for the BeiDou signal. The following link shows the implementation of the aforementioned test.

The test was set with the following parameters:

  • Sampling Frequency: 16 MHz
  • Intermediate Frequency: 0 Hz
  • Doppler Frequency: 1650 Hz
  • Code Delay: 3767 samples
  • PRN: 20
  • Number of Samples: 16e6 * 9
  • Space between chips: 0.5
  • PLL BW: 20 Hz
  • DLL BW: 4 Hz

For this case, the test was developed using a signal sample of 15 seconds obtained from the Signal Generator for the BeiDou B1I signal.

Additionally, a complementary test to cross-validate the correct behaviour of the Signal Generator was developed ( ). For simplicity, the results obtained with this test will not be shown in this report.

The following figure presents the final results obtained by tracking block. As it can be seen, the results were not as expected. Based in the different approaches carried out along the project, the error source could be the Signal Source File. To figure this hypothesis out a real capture should be made it. Unfortunately, this way was discarded due to the summer dates and the lack of equipment.


Tracking results for BeiDou B1I Signal


 This report shows part of the work done and the obtained results for the Google Summer of Code 2016 as part of the GNSS-SDR project. As the report shows, the goals of this project were not fully accomplished. Factors such as the complexity of the data or the availability of documentation were an important part of the carried project. Nonetheless, the project has been able to achieve several targets.

Firstly, a BeiDou B1 In-phase Signal Generator was developed, integrated and tested with great success. Secondly, the Tracking Block was implemented, integrated and tested but the results obtained were not conclusive. However, the tests were added to the project and the work is quite close to great results.

Further work is still needed. After the acquisition and the tracking blocks validation the Telemetry Decoded should be implemented for the BeiDou B1I Signal. Part of this development were carried out during this project.


GITHUB branch with the final commits and developed files during the GSoC2016 project can be found on the following.

Github project files


Un comentario

  1. Muhammad Shujjah Yamin · enero 12, 2019

    Dear All, I am trying to develop Galileo E1 and Beidou B1 Acquisition and tracking Algorithms on MATLAB. Can, anyone help me in carrier signal generation of Galileo E1 for Beidou B1 for input of tracking loops.

    I am done with Acquisition.

    Me gusta


Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de

Estás comentando usando tu cuenta de Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s