2018-05-09 18:20:57 +00:00
[![ ](./docs/doxygen/images/gnss-sdr_logo.png )](https://gnss-sdr.org "GNSS-SDR website")
2017-11-13 21:21:47 +00:00
[![License: GPL v3 ](https://img.shields.io/badge/License-GPL%20v3-blue.svg )](https://www.gnu.org/licenses/gpl-3.0)
2014-04-23 19:18:20 +00:00
2020-02-27 18:50:08 +00:00
<!-- prettier - ignore - start -->
2020-02-08 09:55:11 +00:00
[comment]: # (
SPDX-License-Identifier: GPL-3.0-or-later
)
2020-02-08 09:52:42 +00:00
2020-02-08 09:55:11 +00:00
[comment]: # (
SPDX-FileCopyrightText: 2011-2020 Carles Fernandez-Prades < carles.fernandez @ cttc . es >
)
2020-02-27 18:50:08 +00:00
<!-- prettier - ignore - end -->
2018-08-12 21:58:16 +00:00
2014-04-22 18:37:40 +00:00
**Welcome to GNSS-SDR!**
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
This program is a software-defined receiver which is able to process (that is,
to perform detection, synchronization, demodulation and decoding of the
navigation message, computation of observables and, finally, computation of
position fixes) the following Global Navigation Satellite System's signals:
2018-01-27 11:09:27 +00:00
2018-06-17 21:02:37 +00:00
In the L1 band:
2020-02-27 17:42:43 +00:00
- 🛰 GLONASS L1 C/A (centered at 1602.00 MHz) :white_check_mark:
- 🛰 GPS L1 C/A (centered at 1575.42 MHz) :white_check_mark:
- 🛰 Galileo E1b/c (centered at 1575.42 MHz) :white_check_mark:
- 🛰 BeiDou B1I (centered at 1561.098 MHz) :white_check_mark:
2018-01-27 11:09:27 +00:00
2018-06-17 21:03:44 +00:00
In the L2 band:
2020-02-27 17:42:43 +00:00
- 🛰 BeiDou B3I (centered at 1268.520 MHz) :white_check_mark:
- 🛰 GLONASS L2 C/A (centered at 1246.00 MHz) :white_check_mark:
- 🛰 GPS L2C (centered at 1227.60 MHz) :white_check_mark:
2018-01-27 11:09:27 +00:00
2018-06-17 21:02:37 +00:00
In the L5 band:
2018-01-27 11:09:27 +00:00
2020-02-27 17:42:43 +00:00
- 🛰 GPS L5 (centered at 1176.45 MHz) :white_check_mark:
- 🛰 Galileo E5a (centered at 1176.45 MHz) :white_check_mark:
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
GNSS-SDR provides interfaces for a wide range of radio frequency front-ends and
raw sample file formats, generates processing outputs in standard formats,
allows for the full inspection of the whole signal processing chain, and offers
a framework for the development of new features. Please visit
[https://gnss-sdr.org ](https://gnss-sdr.org "GNSS-SDR website" ) for more
information about this open source software-defined GNSS receiver.
2016-09-23 08:44:27 +00:00
2014-04-22 18:33:11 +00:00
# How to build GNSS-SDR
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
This section describes how to set up the compilation environment in GNU/Linux or
[macOS / Mac OS X ](#macosx ), and to build GNSS-SDR. See also our
[build and install page ](https://gnss-sdr.org/build-and-install/ "GNSS-SDR's Build and Install" ).
## GNU/Linux
- Tested distributions: Ubuntu 14.04 LTS and above; Debian 8.0 "jessie" and
above; Arch Linux; CentOS 7; Fedora 26 and above; OpenSUSE 42.3 and above.
- Supported microprocessor architectures:
- i386: Intel x86 instruction set (32-bit microprocessors).
- amd64: also known as x86-64, the 64-bit version of the x86 instruction set,
originally created by AMD and implemented by AMD, Intel, VIA and others.
- armel: ARM embedded ABI, supported on ARM v4t and higher.
- armhf: ARM hard float, ARMv7 + VFP3-D16 floating-point hardware extension +
Thumb-2 instruction set and above.
- arm64: ARM 64 bits or ARMv8.
- mips: MIPS architecture (big-endian, such as those manufactured by SGI).
- mipsel: MIPS architecture (little-endian, such as Loongson 3).
- mips64el: 64-bit version of MIPS architecture.
- powerpc: the RISC 32-bit microprocessor architecture developed by IBM,
Motorola (now Freescale) and Apple.
- ppc64: 64-bit big-endian PowerPC architecture.
- ppc64el: 64-bit little-endian PowerPC architecture.
- s390x: IBM System z architecture for mainframe computers.
Older distribution releases might work as well, but you will need GCC 4.7 or
newer.
Before building GNSS-SDR, you need to install all the required dependencies.
There are two alternatives here: through software packages or building them from
the source code. It is in general not a good idea to mix both approaches.
2016-05-21 10:31:46 +00:00
### Alternative 1: Install dependencies using software packages
2020-02-27 17:42:43 +00:00
If you want to start building and running GNSS-SDR as quick and easy as
possible, the best option is to install all the required dependencies as binary
packages.
2018-02-23 23:56:03 +00:00
#### Debian / Ubuntu
2020-02-27 17:42:43 +00:00
If you are using Debian 8, Ubuntu 14.10 or above, this can be done by copying
and pasting the following line in a terminal:
2014-12-11 21:44:53 +00:00
2020-02-27 17:42:43 +00:00
```
2019-10-12 11:23:57 +00:00
$ sudo apt-get install build-essential cmake git pkg-config libboost-dev libboost-date-time-dev \
2014-12-21 21:46:57 +00:00
libboost-system-dev libboost-filesystem-dev libboost-thread-dev libboost-chrono-dev \
2018-02-09 13:32:13 +00:00
libboost-serialization-dev liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr \
libblas-dev liblapack-dev libarmadillo-dev libgflags-dev libgoogle-glog-dev \
2019-11-30 11:23:14 +00:00
libgnutls-openssl-dev libpcap-dev libmatio-dev libpugixml-dev libgtest-dev \
libprotobuf-dev protobuf-compiler python3-mako python3-six
2020-02-27 17:42:43 +00:00
```
2014-12-11 21:44:53 +00:00
2020-02-27 17:42:43 +00:00
Please note that the required files from `libgtest-dev` were moved to
`googletest` in Debian 9 "stretch" and Ubuntu 18.04 "bionic", and moved back
again to `libgtest-dev` in Debian 10 "buster" and Ubuntu 18.10 "cosmic" (and
above).
2018-02-06 06:36:22 +00:00
2020-02-27 17:42:43 +00:00
**Note for Ubuntu 14.04 LTS "trusty" users:** you will need to build from source
and install GNU Radio manually, as explained below, since GNSS-SDR requires
`gnuradio-dev` >= 3.7.3, and Ubuntu 14.04 came with 3.7.2. Install all the
packages above BUT EXCEPT `libuhd-dev` , `gnuradio-dev` and `gr-osmosdr` (and
remove them if they are already installed in your machine), and install those
dependencies using PyBOMBS. The same applies to `libmatio-dev` : Ubuntu 14.04
came with 1.5.2 and the minimum required version is 1.5.3. Please do not install
the `libmatio-dev` package and install `libtool` , `automake` and `libhdf5-dev`
instead. A recent version of the library will be downloaded and built
automatically if CMake does not find it installed.
2016-04-25 14:48:01 +00:00
2020-02-27 17:42:43 +00:00
In distributions older than Ubuntu 16.04 or Debian 9, `python3-mako` and
`python3-six` must be replaced by `python-mako` and `python-six` .
2019-11-30 11:23:14 +00:00
2020-02-27 17:42:43 +00:00
**Note for Debian 8 "jessie" users:** please see the note about `libmatio-dev`
above. Install `libtool` , `automake` and `libhdf5-dev` instead.
2016-04-25 14:48:01 +00:00
2020-02-27 17:42:43 +00:00
Once you have installed these packages, you can jump directly to
[download the source code and build GNSS-SDR ](#download-and-build-linux ).
2016-04-25 14:48:01 +00:00
2019-03-23 10:28:50 +00:00
#### Arch Linux
2016-04-25 14:48:01 +00:00
2019-03-23 10:28:50 +00:00
If you are using Arch Linux:
2014-12-11 21:44:53 +00:00
2020-02-27 17:42:43 +00:00
```
2019-10-12 11:23:57 +00:00
$ pacman -S gcc make cmake pkgconf git boost boost-libs log4cpp libvolk gnuradio \
2019-08-24 15:39:36 +00:00
blas lapack gflags google-glog openssl pugixml \
2019-04-20 20:01:40 +00:00
python-mako python-six libmatio libpcap gtest protobuf
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
Once you have installed these packages, you can jump directly to
[download the source code and build GNSS-SDR ](#download-and-build-linux ).
2019-03-23 10:28:50 +00:00
2018-02-24 11:02:11 +00:00
#### CentOS
2018-02-23 23:56:03 +00:00
2020-02-27 17:42:43 +00:00
If you are using CentOS 7, you can install the dependencies via Extra Packages
for Enterprise Linux ([EPEL](https://fedoraproject.org/wiki/EPEL)):
2018-02-23 23:56:03 +00:00
2020-02-27 17:42:43 +00:00
```
2018-02-24 11:02:11 +00:00
$ sudo yum install wget
$ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo rpm -Uvh epel-release-latest-7.noarch.rpm
2018-03-01 21:14:58 +00:00
$ sudo yum install make automake gcc gcc-c++ kernel-devel libtool \
2018-02-24 11:02:11 +00:00
hdf5-devel cmake git boost-devel boost-date-time boost-system \
boost-filesystem boost-thread boost-chrono boost-serialization \
log4cpp-devel gnuradio-devel gr-osmosdr-devel blas-devel lapack-devel \
2018-11-10 18:16:13 +00:00
armadillo-devel openssl-devel libpcap-devel python-mako python-six pugixml-devel
2020-02-27 17:42:43 +00:00
```
2018-02-23 23:56:03 +00:00
2020-02-27 17:42:43 +00:00
Once you have installed these packages, you can jump directly to
[download the source code and build GNSS-SDR ](#download-and-build-linux ).
2018-02-23 23:56:03 +00:00
2019-03-23 10:28:50 +00:00
#### Fedora
2020-02-27 17:42:43 +00:00
If you are using Fedora 26 or above, the required software dependencies can be
installed by doing:
2018-02-23 23:56:03 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-23 10:28:50 +00:00
$ sudo yum install make automake gcc gcc-c++ kernel-devel cmake git boost-devel \
boost-date-time boost-system boost-filesystem boost-thread boost-chrono \
boost-serialization log4cpp-devel gnuradio-devel gr-osmosdr-devel \
blas-devel lapack-devel matio-devel armadillo-devel gflags-devel \
2019-11-30 18:56:38 +00:00
glog-devel openssl-devel libpcap-devel python3-mako python3-six \
2019-05-01 08:18:57 +00:00
pugixml-devel protobuf-devel protobuf-compiler
2020-02-27 17:42:43 +00:00
```
2019-03-23 10:28:50 +00:00
2020-02-27 17:42:43 +00:00
Once you have installed these packages, you can jump directly to
[download the source code and build GNSS-SDR ](#download-and-build-linux ).
2019-03-23 10:28:50 +00:00
#### openSUSE
If you are using openSUSE Leap:
2020-02-27 17:42:43 +00:00
```
2019-05-01 08:18:57 +00:00
zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \
libboost_system-devel libboost_filesystem-devel libboost_chrono-devel \
libboost_thread-devel libboost_serialization-devel log4cpp-devel \
gnuradio-devel pugixml-devel libpcap-devel armadillo-devel libtool \
2019-11-30 18:56:38 +00:00
automake hdf5-devel openssl-devel python3-Mako python3-six protobuf-devel
2020-02-27 17:42:43 +00:00
```
2019-05-01 08:18:57 +00:00
If you are using openSUSE Tumbleweed:
2020-02-27 17:42:43 +00:00
```
2019-03-23 10:28:50 +00:00
zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \
libboost_system-devel libboost_filesystem-devel libboost_date_time-devel \
libboost_thread-devel libboost_chrono-devel libboost_serialization-devel \
log4cpp-devel gtest gnuradio-devel pugixml-devel libpcap-devel \
2019-05-01 08:18:57 +00:00
armadillo-devel libtool automake hdf5-devel libopenssl-devel \
python3-Mako python3-six protobuf-devel
2020-02-27 17:42:43 +00:00
```
2019-03-23 10:28:50 +00:00
2020-02-27 17:42:43 +00:00
Once you have installed these packages, you can jump directly to
[download the source code and build GNSS-SDR ](#download-and-build-linux ).
2019-03-23 10:28:50 +00:00
2016-05-21 10:31:46 +00:00
### Alternative 2: Install dependencies using PyBOMBS
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
This option is adequate if you are interested in development, in working with
the most recent versions of software dependencies, want more fine tuning on the
installed versions, or simply in building everything from the scratch just for
the fun of it. In such cases, we recommend to use
[PyBOMBS ](https://github.com/gnuradio/pybombs "Python Build Overlay Managed Bundle System" )
(Python Build Overlay Managed Bundle System), GNU Radio's meta-package manager
tool that installs software from source, or whatever the local package manager
is, that automatically does all the work for you. Please take a look at the
configuration options and general PyBOMBS usage at
https://github.com/gnuradio/pybombs. Here we provide a quick step-by-step
tutorial.
2016-05-21 10:31:46 +00:00
2016-05-22 07:07:30 +00:00
First of all, install some basic packages:
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
```
2019-11-14 14:52:50 +00:00
$ sudo apt-get install git python3-pip
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
Download, build and install PyBOMBS:
2020-02-27 17:42:43 +00:00
```
2019-11-14 14:52:50 +00:00
$ sudo pip3 install --upgrade git+https://github.com/gnuradio/pybombs.git
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
2017-11-04 23:30:13 +00:00
Apply a configuration:
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
```
2017-11-04 23:30:13 +00:00
$ pybombs auto-config
2020-02-27 17:42:43 +00:00
```
2017-11-04 23:30:13 +00:00
Add list of default recipes:
2020-02-27 17:42:43 +00:00
```
2017-11-04 23:30:13 +00:00
$ pybombs recipes add-defaults
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
Download, build and install GNU Radio, related drivers and some other extra
modules into the directory `/path/to/prefix` (replace this path by your
preferred one, for instance `$HOME/sdr` ):
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
$ pybombs prefix init /path/to/prefix -a myprefix -R gnuradio-default
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
This will perform a local installation of the dependencies under
`/path/to/prefix` , so they will not be visible when opening a new terminal. In
order to make them available, you will need to set up the adequate environment
variables:
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
$ cd /path/to/prefix
$ . ./setup_env.sh
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
Now you are ready to use GNU Radio and to jump into building GNSS-SDR after
installing a few other dependencies. Actually, those are steps that PyBOMBS can
do for you as well:
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
$ pybombs install gnss-sdr
2020-02-27 17:42:43 +00:00
```
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
By default, PyBOMBS installs the ‘ next’ branch of GNSS-SDR development, which is
the most recent version of the source code. This behaviour can be modified by
altering the corresponding recipe at
`$HOME/.pybombs/recipes/gr-recipes/gnss-sdr.lwr`
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
In case you do not want to use PyBOMBS and prefer to build and install GNSS-SDR
step by step (i.e., cloning the repository and doing the usual
`cmake .. && make && make install` dance), Armadillo, GFlags, Glog and GnuTLS
can be installed either by using PyBOMBS:
2016-05-21 10:31:46 +00:00
2020-02-27 17:42:43 +00:00
```
2016-05-21 11:51:40 +00:00
$ pybombs install armadillo gflags glog gnutls
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
or manually as explained below, and then please follow instructions on how to
[download the source code and build GNSS-SDR ](#download-and-build-linux ).
2014-04-22 16:24:04 +00:00
2014-12-11 21:44:53 +00:00
### Manual installation of other required dependencies
2014-04-22 16:24:04 +00:00
2016-05-21 10:31:46 +00:00
#### Install [Armadillo](http://arma.sourceforge.net/ "Armadillo's Homepage"), a C++ linear algebra library:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2018-06-15 20:40:29 +00:00
$ sudo apt-get install libblas-dev liblapack-dev # For Debian/Ubuntu/LinuxMint
2015-07-12 08:47:33 +00:00
$ sudo yum install lapack-devel blas-devel # For Fedora/CentOS/RHEL
$ sudo zypper install lapack-devel blas-devel # For OpenSUSE
2018-06-15 20:40:29 +00:00
$ sudo pacman -S blas lapack # For Arch Linux
2020-02-16 11:38:34 +00:00
$ wget https://sourceforge.net/projects/arma/files/armadillo-9.850.1.tar.xz
$ tar xvfz armadillo-9.850.1.tar.xz
$ cd armadillo-9.850.1
2014-04-22 16:24:04 +00:00
$ cmake .
$ make
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
2020-02-27 17:42:43 +00:00
The full stop separated from `cmake` by a space is important.
[CMake ](https://cmake.org/ "CMake's Homepage" ) will figure out what other
libraries are currently installed and will modify Armadillo's configuration
correspondingly. CMake will also generate a run-time armadillo library, which is
a combined alias for all the relevant libraries present on your system (eg.
BLAS, LAPACK and ATLAS).
2014-04-27 20:27:38 +00:00
2015-03-24 20:44:03 +00:00
#### Install [Gflags](https://github.com/gflags/gflags "Gflags' Homepage"), a commandline flags processing module for C++:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2018-11-12 10:03:50 +00:00
$ wget https://github.com/gflags/gflags/archive/v2.2.2.tar.gz
$ tar xvfz v2.2.2.tar.gz
$ cd gflags-2.2.2
2015-03-24 18:53:10 +00:00
$ cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=OFF -DBUILD_gflags_nothreads_LIB=OFF .
2014-04-22 16:24:04 +00:00
$ make
$ sudo make install
$ sudo ldconfig
2020-02-27 17:42:43 +00:00
```
2014-04-27 20:27:38 +00:00
2015-03-24 20:44:03 +00:00
#### Install [Glog](https://github.com/google/glog "Glog's Homepage"), a library that implements application-level logging:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-22 12:45:52 +00:00
$ wget https://github.com/google/glog/archive/v0.4.0.tar.gz
$ tar xvfz v0.4.0.tar.gz
$ cd glog-0.4.0
$ ./autogen.sh
2014-04-22 16:24:04 +00:00
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig
2020-02-27 17:42:43 +00:00
```
2014-04-27 20:27:38 +00:00
2019-10-05 22:05:41 +00:00
#### Download the [Google C++ Testing Framework](https://github.com/google/googletest "Googletest Homepage"), also known as Google Test:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2019-10-04 12:46:46 +00:00
$ wget https://github.com/google/googletest/archive/v1.10.x.zip
$ unzip v1.10.x.zip
2020-02-27 17:42:43 +00:00
```
Please **DO NOT build or install** Google Test. Every user needs to compile
tests using the same compiler flags used to compile the Google Test libraries;
otherwise he or she may run into undefined behaviors (_i.e._, the tests can
behave strangely and may even crash for no obvious reasons). The explanation is
that C++ has the One-Definition Rule: if two C++ source files contain different
definitions of the same class/function/variable, and you link them together, you
violate the rule. The linker may or may not catch the error (in many cases it is
not required by the C++ standard to catch the violation). If it does not, you
get strange run-time behaviors that are unexpected and hard to debug. If you
compile Google Test and your test code using different compiler flags, they may
see different definitions of the same class/function/variable (_e.g._, due to
the use of `#if` in Google Test). Therefore, for your sanity, GNSS-SDR does not
make use of pre-compiled Google Test libraries. Instead, it compiles Google
Test's source code itself, such that it can be sure that the same flags are used
for both Google Test and the tests. The building system of GNSS-SDR manages the
compilation and linking of Google Test's source code to its own tests; it is
only required that you tell the system where the Google Test folder that you
downloaded resides. Just type in your terminal (or add it to your
`$HOME/.bashrc` file for a permanent solution) the following line:
```
2019-10-04 12:46:46 +00:00
export GTEST_DIR=/home/username/googletest-1.10.x
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
changing `/home/username/googletest-1.10.x` by the actual path where you
unpacked Google Test. If the CMake script does not find that folder, or the
environment variable is not defined, or the source code is not installed by a
package, then it will download a fresh copy of the Google Test source code and
will compile and link it for you.
2014-04-27 20:27:38 +00:00
2018-05-21 22:07:06 +00:00
#### Install the [GnuTLS](https://www.gnutls.org/ "GnuTLS's Homepage") or [OpenSSL](https://www.openssl.org/ "OpenSSL's Homepage") libraries:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2015-09-15 09:26:30 +00:00
$ sudo apt-get install libgnutls-openssl-dev # For Debian/Ubuntu/LinuxMint
2018-03-02 10:18:16 +00:00
$ sudo yum install openssl-devel # For Fedora/CentOS/RHEL
2018-06-15 20:40:29 +00:00
$ sudo zypper install openssl-devel # For OpenSUSE
$ sudo pacman -S openssl # For Arch Linux
2020-02-27 17:42:43 +00:00
```
2016-05-21 11:51:40 +00:00
2020-02-27 17:42:43 +00:00
In case the GnuTLS library with openssl extensions package is not available in
your GNU/Linux distribution, GNSS-SDR can also work well with OpenSSL.
2014-04-27 20:27:38 +00:00
2019-04-20 20:01:40 +00:00
#### Install [Protocol Buffers](https://developers.google.com/protocol-buffers/ "Protocol Buffers' Homepage"), a portable mechanism for serialization of structured data:
2020-02-27 17:42:43 +00:00
GNSS-SDR requires Protocol Buffers v3.0.0 or later. If the packages that come
with your distribution are older than that (_e.g._, Ubuntu 16.04 Xenial and
Debian 8 Jessie came with older versions), then you will need to install it
manually. First, install the dependencies:
2019-04-21 09:51:49 +00:00
2020-02-27 17:42:43 +00:00
```
2019-04-21 09:51:49 +00:00
$ sudo apt-get install autoconf automake libtool curl make g++ unzip
2020-02-27 17:42:43 +00:00
```
2019-04-21 09:51:49 +00:00
and then:
2020-02-27 17:42:43 +00:00
```
2020-02-16 11:25:27 +00:00
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-cpp-3.11.4.tar.gz
$ tar xvfz protobuf-cpp-3.11.4.tar.gz
$ cd protobuf-3.11.4
2019-04-20 20:01:40 +00:00
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
2019-04-21 09:51:49 +00:00
$ sudo ldconfig
2020-02-27 17:42:43 +00:00
```
2019-04-20 20:01:40 +00:00
2014-12-11 21:44:53 +00:00
### <a name="download-and-build-linux">Clone GNSS-SDR's Git repository</a>:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2015-09-30 20:20:05 +00:00
$ git clone https://github.com/gnss-sdr/gnss-sdr
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
Cloning the GNSS-SDR repository as in the line above will create a folder named
gnss-sdr with the following structure:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
|-gnss-sdr
2015-07-16 18:07:57 +00:00
|---build < - where gnss-sdr is built .
|---cmake < - CMake-related files .
|---conf < - Configuration files . Each file defines one particular receiver .
2014-04-22 16:24:04 +00:00
|---data < - Populate this folder with your captured data .
2015-07-16 18:07:57 +00:00
|---docs < - Contains documentation-related files .
2016-09-23 08:44:27 +00:00
|---install < - Executables will be placed here .
2015-07-16 18:07:57 +00:00
|---src < - Source code folder .
|-----algorithms < - Signal processing blocks .
2015-07-16 22:37:27 +00:00
|-----core < - Control plane , interfaces , systems ' parameters .
|-----main < - Main function of the C + + program .
|-----tests < - QA code .
|-----utils < - some utilities ( e . g . Matlab scripts ) .
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
By default, you will be in the 'master' branch of the Git repository, which
corresponds to the latest stable release. If you want to try the latest
developments, you can use the 'next' branch by going to the newly created
gnss-sdr folder doing:
2015-07-16 18:07:57 +00:00
2020-02-27 17:42:43 +00:00
```
2015-07-16 18:07:57 +00:00
$ git checkout next
2020-02-27 17:42:43 +00:00
```
2015-07-16 18:07:57 +00:00
2020-02-27 17:42:43 +00:00
More information about GNSS-SDR-specific Git usage and pointers to further
readings can be found at our
[Git tutorial ](https://gnss-sdr.org/docs/tutorials/using-git/ "Using Git" ).
2014-04-22 16:24:04 +00:00
2014-11-06 20:36:43 +00:00
### Build and install GNSS-SDR
2014-04-27 20:27:38 +00:00
2014-08-23 00:38:26 +00:00
Go to GNSS-SDR's build directory:
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
```
2014-08-23 00:38:26 +00:00
$ cd gnss-sdr/build
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2014-08-23 00:38:26 +00:00
Configure and build the application:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake ..
2014-04-22 16:24:04 +00:00
$ make
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
By default, CMake will build the Release version, meaning that the compiler will
generate a fast, optimized executable. This is the recommended build type when
using an RF front-end and you need to attain real time. If working with a file
(and thus without real-time constraints), you may want to obtain more
information about the internals of the receiver, as well as more fine-grained
logging. This can be done by building the Debug version, by doing:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake -DCMAKE_BUILD_TYPE=Debug ..
2014-08-23 00:38:26 +00:00
$ make
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
This will create four executables at gnss-sdr/install, namely `gnss-sdr` ,
`run_tests` , `front-end-cal` and `volk_gnsssdr_profile` . You can run them from
that folder, but if you prefer to install `gnss-sdr` on your system and have it
available anywhere else, do:
2014-11-06 20:36:43 +00:00
2020-02-27 17:42:43 +00:00
```
2014-11-06 20:36:43 +00:00
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2014-11-06 20:36:43 +00:00
2020-02-27 17:42:43 +00:00
This will also make a copy of the conf/ folder into
/usr/local/share/gnss-sdr/conf for your reference. We suggest to create a
working directory at your preferred location and store your own configuration
and data files there.
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
You could be interested in creating the documentation (requires:
`sudo apt-get install doxygen-latex` in Ubuntu/Debian) by doing:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-08-23 00:38:26 +00:00
$ make doc
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
from the gnss-sdr/build folder. This will generate HTML documentation that can
be retrieved pointing your browser of preference to build/docs/html/index.html.
2014-08-23 00:38:26 +00:00
If a LaTeX installation is detected in your system,
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-08-23 00:38:26 +00:00
$ make pdfmanual
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2016-05-12 17:35:55 +00:00
will create a PDF manual at build/docs/GNSS-SDR_manual.pdf. Finally,
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-08-23 00:38:26 +00:00
$ make doc-clean
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2014-08-23 00:38:26 +00:00
will remove the content of previously-generated documentation.
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
GNSS-SDR comes with a library which is a module of the Vector-Optimized Library
of Kernels (so called
[VOLK_GNSSSDR ](./src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md ))
and a profiler that will build a config file for the best SIMD architecture for
your processor. Run `volk_gnsssdr_profile` that is installed into `$PREFIX/bin` .
This program tests all known VOLK kernels for each architecture supported by the
processor. When finished, it will write to
`$HOME/.volk_gnsssdr/volk_gnsssdr_config` the best architecture for the VOLK
function. This file is read when using a function to know the best version of
the function to execute. It mimics GNU Radio's [VOLK ](https://www.libvolk.org/ )
library, so if you still have not run `volk_profile` , this is a good moment to
do so.
If you are using Eclipse as your development environment, CMake can create the
project for you. Type:
```
2017-10-30 19:15:12 +00:00
$ cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DECLIPSE_GENERATE_SOURCE_PROJECT=TRUE -DCMAKE_ECLIPSE_VERSION=4.5 .
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2014-08-23 00:38:26 +00:00
and then import the created project file into Eclipse:
2014-04-23 19:18:20 +00:00
2014-08-23 00:38:26 +00:00
1. Import project using Menu File -> Import.
2. Select General -> Existing projects into workspace.
2020-02-27 17:42:43 +00:00
3. Browse where your build tree is and select the root build tree directory.
Keep "Copy projects into workspace" unchecked.
4. You get a fully functional Eclipse project.
2014-04-27 20:27:38 +00:00
2014-04-22 17:21:29 +00:00
###### Build GN3S V2 Custom firmware and driver (OPTIONAL):
2014-04-22 16:24:04 +00:00
2016-06-09 17:10:24 +00:00
Install the GNU Radio module:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2016-06-10 09:29:31 +00:00
$ git clone https://github.com/gnss-sdr/gr-gn3s
2016-06-09 17:10:24 +00:00
$ cd gr-gn3s/build
2019-03-23 12:15:25 +00:00
$ cmake ..
2014-04-22 16:24:04 +00:00
$ make
$ sudo make install
$ sudo ldconfig
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2016-09-23 08:44:27 +00:00
Then configure GNSS-SDR to build the `GN3S_Signal_Source` by:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2016-06-10 09:29:31 +00:00
$ cd gnss-sdr/build
2019-03-23 12:15:25 +00:00
$ cmake -DENABLE_GN3S=ON ..
2014-11-06 20:36:43 +00:00
$ make
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
In order to gain access to USB ports, gnss-sdr should be used as root. In
addition, the driver requires access to the GN3S firmware binary file. It should
be available in the same path where the application is called. GNSS-SDR comes
with a pre-compiled custom GN3S firmware available at
gr-gn3s/firmware/GN3S_v2/bin/gn3s_firmware.ihx. Please copy this file to the
application path.
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
(in order to disable the `GN3S_Signal_Source` compilation, you can pass
`-DENABLE_GN3S=OFF` to cmake and build GNSS-SDR again).
2014-04-22 16:24:04 +00:00
2016-06-09 17:10:24 +00:00
More info at https://github.com/gnss-sdr/gr-gn3s
2016-09-23 08:44:27 +00:00
2014-12-15 16:39:22 +00:00
###### Build OSMOSDR support (OPTIONAL):
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
Install the [OsmoSDR ](https://osmocom.org/projects/sdr "OsmoSDR's Homepage" )
library and GNU Radio's source block:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
$ git clone git://git.osmocom.org/osmo-sdr.git
$ cd osmo-sdr/software/libosmosdr
$ mkdir build
$ cd build/
2019-03-23 12:15:25 +00:00
$ cmake ..
2014-04-22 16:24:04 +00:00
$ make
$ sudo make install
$ sudo ldconfig
2019-03-23 12:15:25 +00:00
$ cd ../..
2014-04-22 16:24:04 +00:00
$ git clone git://git.osmocom.org/gr-osmosdr
$ cd gr-osmosdr
$ mkdir build
$ cd build
2019-03-23 12:15:25 +00:00
$ cmake .. -Wno-dev
2014-04-22 16:24:04 +00:00
$ make
$ sudo make install
$ sudo ldconfig
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2016-09-23 08:44:27 +00:00
Then, configure GNSS-SDR to build the `Osmosdr_Signal_Source` by:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake -DENABLE_OSMOSDR=ON ..
2014-11-06 20:36:43 +00:00
$ make
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
(in order to disable the `Osmosdr_Signal_Source` compilation, you can pass
`-DENABLE_OSMOSDR=OFF` to cmake and build GNSS-SDR again).
2014-04-23 19:18:20 +00:00
2017-10-29 05:51:22 +00:00
###### Build FMCOMMS2 based SDR Hardware support (OPTIONAL):
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
Install the [libiio ](https://github.com/analogdevicesinc/libiio.git ) (>=v0.11),
[libad9361 ](https://github.com/analogdevicesinc/libad9361-iio.git ) (>=v0.1-1)
libraries and [gr-iio ](https://github.com/analogdevicesinc/gr-iio.git ) (>v0.3)
gnuradio block:
2017-10-29 05:51:22 +00:00
2020-02-27 17:42:43 +00:00
```
2017-11-01 19:50:20 +00:00
$ sudo apt-get install libxml2-dev bison flex
2017-10-29 05:51:22 +00:00
$ git clone https://github.com/analogdevicesinc/libiio.git
$ cd libiio
$ mkdir build
$ cd build
$ cmake ..
2017-11-01 19:50:20 +00:00
$ make & & sudo make install & & sudo ldconfig
$ cd ../..
2017-10-29 05:51:22 +00:00
$ git clone https://github.com/analogdevicesinc/libad9361-iio.git
$ cd libad9361-iio
$ mkdir build
$ cd build
$ cmake ..
2017-11-01 19:50:20 +00:00
$ make & & sudo make install & & sudo ldconfig
$ cd ../..
2017-10-29 05:51:22 +00:00
$ git clone https://github.com/analogdevicesinc/gr-iio.git
$ cd gr-iio
$ mkdir build
$ cd build
2017-11-01 19:50:20 +00:00
$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
$ make & & sudo make install & & sudo ldconfig
$ cd ../..
2020-02-27 17:42:43 +00:00
```
2017-10-29 05:51:22 +00:00
2017-11-13 22:46:43 +00:00
Then configure GNSS-SDR to build the `Fmcomms2_Signal_Source` implementation:
2020-02-27 17:42:43 +00:00
```
2017-11-13 22:46:43 +00:00
$ cd gnss-sdr/build
2019-03-23 12:15:25 +00:00
$ cmake -DENABLE_FMCOMMS2=ON ..
2017-10-30 15:17:53 +00:00
$ make
2017-10-29 05:51:22 +00:00
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2017-11-01 19:50:20 +00:00
or configure it to build `Plutosdr_Signal_Source` :
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake -DENABLE_PLUTOSDR=ON ..
2017-10-30 15:17:53 +00:00
$ make
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2017-10-30 15:17:53 +00:00
2020-02-27 17:42:43 +00:00
With `Fmcomms2_Signal_Source` you can use any SDR hardware based on
[FMCOMMS2 ](https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz ),
including the ADALM-PLUTO (PlutoSdr) by configuring correctly the .conf file.
The `Plutosdr_Signal_Source` offers a simpler manner to use the ADALM-PLUTO
because implements only a subset of FMCOMMS2's parameters valid for those
devices.
2014-04-23 19:18:20 +00:00
2014-08-23 00:49:37 +00:00
###### Build OpenCL support (OPTIONAL):
2014-04-23 19:18:20 +00:00
2014-08-23 00:49:37 +00:00
In order to enable the building of blocks that use OpenCL, type:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake -DENABLE_OPENCL=ON ..
2014-11-06 20:36:43 +00:00
$ make
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2015-08-25 17:01:02 +00:00
###### Build CUDA support (OPTIONAL):
2020-02-27 17:42:43 +00:00
In order to enable the building of blocks that use CUDA, NVIDIA's parallel
programming model that enables graphics processing unit (GPU) acceleration for
data-parallel computations, first you need to install the CUDA Toolkit from
[NVIDIA Developers Download page ](https://developer.nvidia.com/cuda-downloads "CUDA Downloads" ).
Make sure that the SDK samples build well. Then, build GNSS-SDR by doing:
2015-08-25 17:01:02 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake -DENABLE_CUDA=ON ..
2015-08-25 17:01:02 +00:00
$ make
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2015-08-25 17:01:02 +00:00
2020-02-27 17:42:43 +00:00
Of course, you will also need a GPU that
[supports CUDA ](https://developer.nvidia.com/cuda-gpus "CUDA GPUs" ).
2015-08-25 17:01:02 +00:00
2014-09-07 17:35:41 +00:00
###### Build a portable binary
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
In order to build an executable that not depends on the specific SIMD
instruction set that is present in the processor of the compiling machine, so
other users can execute it in other machines without those particular sets, use:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake -DENABLE_GENERIC_ARCH=ON ..
2016-09-23 08:44:27 +00:00
$ make
2014-11-06 20:36:43 +00:00
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
Using this option, all SIMD instructions are exclusively accessed via VOLK,
which automatically includes versions of each function for different SIMD
instruction sets, then detects at runtime which to use, or if there are none,
substitutes a generic, non-SIMD implementation.
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
More details can be found in our tutorial about
[GNSS-SDR configuration options at building time ](https://gnss-sdr.org/docs/tutorials/using-git/ "Configuration options at building time" ).
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
## <a name="macosx">macOS</a>
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
GNSS-SDR can be built on macOS (or the former Mac OS X), starting from 10.9
(Mavericks) and including 10.15 (Catalina). If you still have not installed
[Xcode ](https://developer.apple.com/xcode/ "Xcode" ), do it now from the App
Store (it's free). You will also need the Xcode Command Line Tools. Launch the
Terminal, found in /Applications/Utilities/, and type:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-08-23 01:06:12 +00:00
$ xcode-select --install
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2016-09-23 08:44:27 +00:00
Agree to Xcode license:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-08-23 18:08:07 +00:00
$ sudo xcodebuild -license
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
Software pre-requisites can be installed using either [Macports ](#macports ) or
[Homebrew ](#homebrew ).
2015-08-09 21:23:10 +00:00
2017-05-18 06:24:05 +00:00
#### <a name="macports">Macports</a>
2015-08-09 21:23:10 +00:00
2020-02-27 17:42:43 +00:00
First, [install Macports ](https://www.macports.org/install.php ). If you are
upgrading from a previous installation, please follow the
[migration rules ](https://trac.macports.org/wiki/Migration ).
2014-04-22 16:24:04 +00:00
In a terminal, type:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
$ sudo port selfupdate
$ sudo port upgrade outdated
2020-01-20 23:31:50 +00:00
$ sudo port install armadillo cmake gnuradio gnutls lapack libad9361-iio libiio \
2020-02-01 10:18:08 +00:00
matio pkgconfig protobuf3-cpp pugixml google-glog +gflags
$ sudo port install py37-mako py37-six
2020-01-20 23:31:50 +00:00
$ sudo port install doxygen +docs
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
You also might need to activate a Python installation. The list of installed
versions can be retrieved with:
2015-03-27 14:56:52 +00:00
2020-02-27 17:42:43 +00:00
```
2019-04-08 22:43:09 +00:00
$ port select --list python
2020-02-27 17:42:43 +00:00
```
2015-03-27 14:56:52 +00:00
2018-10-20 17:39:14 +00:00
and you can activate a certain version by typing:
2015-03-27 14:56:52 +00:00
2020-02-27 17:42:43 +00:00
```
2019-10-30 15:09:43 +00:00
$ sudo port select --set python python37
2020-02-27 17:42:43 +00:00
```
2015-03-27 14:56:52 +00:00
2015-08-09 21:23:10 +00:00
#### <a name="homebrew">Homebrew</a>
2017-11-13 22:38:04 +00:00
First, install [Homebrew ](https://brew.sh/ ). Paste this in a terminal prompt:
2020-02-27 17:42:43 +00:00
```
2017-11-13 22:38:04 +00:00
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2020-02-27 17:42:43 +00:00
```
2017-11-13 22:38:04 +00:00
2020-02-27 17:42:43 +00:00
The script explains what it will do, and then it pauses before doing it. There
are more installation options [here ](https://docs.brew.sh/Installation.html ).
2017-11-13 22:38:04 +00:00
2019-11-30 11:23:14 +00:00
Install pip3:
2017-11-13 22:38:04 +00:00
2020-02-27 17:42:43 +00:00
```
2019-11-30 11:23:14 +00:00
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python3 get-pip.py
2020-02-27 17:42:43 +00:00
```
2015-08-09 21:23:10 +00:00
2017-11-13 22:38:04 +00:00
Install the required dependencies:
2015-08-09 21:23:10 +00:00
2020-02-27 17:42:43 +00:00
```
2020-01-20 23:31:50 +00:00
$ brew update & & brew upgrade
$ brew install armadillo cmake hdf5 gflags glog gnuradio lapack libmatio log4cpp \
openssl pkg-config protobuf pugixml
2019-11-30 11:23:14 +00:00
$ pip3 install mako
$ pip3 install six
2020-01-20 23:31:50 +00:00
$ brew cask install mactex # when completed, restart Terminal
$ brew install graphviz doxygen
2020-02-27 17:42:43 +00:00
```
2019-02-05 20:10:48 +00:00
2015-08-09 21:23:10 +00:00
#### Build GNSS-SDR
2020-02-27 17:42:43 +00:00
Finally, you are ready to clone the GNSS-SDR repository, configure and build the
software:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2015-10-07 16:51:14 +00:00
$ git clone https://github.com/gnss-sdr/gnss-sdr
2014-04-22 16:24:04 +00:00
$ cd gnss-sdr/build
2019-03-23 12:15:25 +00:00
$ cmake ..
2014-04-22 16:24:04 +00:00
$ make
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
This will create three executables at gnss-sdr/install, namely `gnss-sdr` ,
`run_tests` and `volk_gnsssdr_profile` . You can install the software receiver on
your system by doing:
2014-11-06 20:36:43 +00:00
2020-02-27 17:42:43 +00:00
```
2014-11-06 20:36:43 +00:00
$ sudo make install
2020-02-27 17:42:43 +00:00
```
2014-11-06 20:36:43 +00:00
2015-08-09 21:23:10 +00:00
Note, it is advisable not to run the install step in a homebrew environment.
2014-11-06 20:36:43 +00:00
The documentation can be built by:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-22 16:24:04 +00:00
$ make doc
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2014-04-22 16:24:04 +00:00
and can be viewed doing:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2016-05-12 17:35:55 +00:00
$ open ./docs/html/index.html
2020-02-27 17:42:43 +00:00
```
GNSS-SDR comes with a library which is a module of the Vector-Optimized Library
of Kernels (so called
[VOLK_GNSSSDR ](./src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md ))
and a profiler that will build a config file for the best SIMD architecture for
your processor. Run `volk_gnsssdr_profile` that is installed into `$PREFIX/bin` .
This program tests all known VOLK kernels for each architecture supported by the
processor. When finished, it will write to
`$HOME/.volk_gnsssdr/volk_gnsssdr_config` the best architecture for the VOLK
function. This file is read when using a function to know the best version of
the function to execute. It mimics GNU Radio's [VOLK ](https://www.libvolk.org/ )
library, so if you still have not run `volk_profile` , this is a good moment to
do so.
2014-04-27 20:27:38 +00:00
2016-09-23 08:44:27 +00:00
###### Other package managers
2015-08-28 18:06:24 +00:00
2020-02-27 17:42:43 +00:00
GNU Radio and other dependencies can also be installed using other package
managers than Macports, such as [Fink ](http://www.finkproject.org/ "Fink" ) or
[Homebrew ](https://brew.sh/ "Homebrew" ). Since the version of Python that ships
with OS X is great for learning but it is not good for development, you could
have another Python executable in a non-standard location. If that is the case,
you need to inform GNSS-SDR's configuration system by defining the
`PYTHON_EXECUTABLE` variable as:
2015-08-28 18:06:24 +00:00
2020-02-27 17:42:43 +00:00
```
2020-02-05 20:24:46 +00:00
cmake -DPYTHON_EXECUTABLE=/path/to/bin/python3 ..
2020-02-27 17:42:43 +00:00
```
2015-08-28 18:06:24 +00:00
2016-01-06 10:18:26 +00:00
In case you have installed Macports in a non-standard location, you can use:
2020-02-27 17:42:43 +00:00
```
2019-03-23 12:15:25 +00:00
$ cmake -DCMAKE_PREFIX_PATH=/opt/local -DUSE_MACPORTS_PYTHON=/opt/local/bin/python ..
2020-02-27 17:42:43 +00:00
```
2016-01-06 10:18:26 +00:00
2019-09-27 22:09:42 +00:00
changing `/opt/local` by the base directory in which your software is installed.
2016-01-06 10:18:26 +00:00
2020-02-27 17:42:43 +00:00
The CMake script will create Makefiles that download, build and link Armadillo,
Gflags, Glog, Matio, Protocol Buffers, PugiXML and Google Test on the fly at
compile time if they are not detected in your machine.
## Other builds
2014-04-22 16:24:04 +00:00
2020-02-27 17:42:43 +00:00
- **Docker image**: A technology providing operating-system-level virtualization
to build, ship, and run distributed applications, whether on laptops, data
center VMs, or the cloud. Visit
[https://github.com/carlesfernandez/docker-gnsssdr ](https://github.com/carlesfernandez/docker-gnsssdr )
or
[https://github.com/carlesfernandez/docker-pybombs-gnsssdr ](https://github.com/carlesfernandez/docker-pybombs-gnsssdr )
for instructions.
2017-01-05 15:03:59 +00:00
2020-02-27 17:42:43 +00:00
- **Snap package**: [Snaps ](https://snapcraft.io ) are universal Linux packages
aimed to work on any distribution or device, from IoT devices to servers,
desktops to mobile devices. Visit
[https://github.com/carlesfernandez/snapcraft-sandbox ](https://github.com/carlesfernandez/snapcraft-sandbox )
for instructions, or directly
[get the software from the Snap Store ](https://snapcraft.io/gnss-sdr-next ):
2019-06-02 15:44:06 +00:00
< p align = "center" >
< a href = "https://snapcraft.io/gnss-sdr-next" > < img src = "https://snapcraft.io/static/images/badges/en/snap-store-white.svg" alt = "Get GNSS-SDR from the Snap Store" > < / a >
< / p >
2017-01-05 15:03:59 +00:00
2020-02-27 17:42:43 +00:00
- **GNSS-SDR in embedded platforms**: we provide a Software Development Kit
(SDK) based on [OpenEmbedded ](http://www.openembedded.org/wiki/Main_Page ) for
cross-compiling GNSS-SDR in your desktop computer and for producing
executables that can run in embedded platforms, such as a Zedboard or a
Raspberry Pi 3. Visit
[Cross-compiling GNSS-SDR ](https://gnss-sdr.org/docs/tutorials/cross-compiling/ )
for instructions.
2017-01-05 15:03:59 +00:00
2020-02-27 17:42:43 +00:00
# Updating GNSS-SDR
2014-04-22 18:40:51 +00:00
2020-02-27 17:42:43 +00:00
If you cloned or forked GNSS-SDR some time ago, it is possible that some
developer has updated files at the Git repository. If you still have not done
so, add the `upstream` repository to the list of remotes:
2016-12-25 13:46:33 +00:00
2020-02-27 17:42:43 +00:00
```
2016-12-25 13:46:33 +00:00
$ git remote add upstream https://github.com/gnss-sdr/gnss-sdr.git
2020-02-27 17:42:43 +00:00
```
2016-12-25 13:46:33 +00:00
and then you can update your working copy by doing:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2016-12-25 13:46:33 +00:00
$ git checkout master # Switch to branch you want to update
$ git pull upstream master # Download the newest code from our repository
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2016-09-23 08:44:27 +00:00
or, if you want to test the latest developments:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
$ git checkout next
2016-12-25 13:46:33 +00:00
$ git pull upstream next
2020-02-27 17:42:43 +00:00
```
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
Before rebuilding the source code, it is safe (and recommended) to remove the
remainders of old compilations:
2014-04-23 19:18:20 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-22 18:40:51 +00:00
$ rm -rf gnss-sdr/build/*
2020-02-27 17:42:43 +00:00
```
If you are interested in contributing to the development of GNSS-SDR, please
check out
[how to do it ](https://gnss-sdr.org/contribute/ "How to contribute to GNSS-SDR source code" ).
There is a more controlled way to upgrade your repository, which is to use the
Git commands `fetch` and `merge` , as described in our
[Git Tutorial ](https://gnss-sdr.org/docs/tutorials/using-git/ "Using Git" ).
# Getting started
1. After building the code, you will find the `gnss-sdr` executable file at
gnss-sdr/install. You can make it available everywhere else by
`sudo make install` . Run the profilers `volk_profile` and
`volk_gnsssdr_profile` for testing all available VOLK kernels for each
architecture supported by your processor. This only has to be done once.
2. In post-processing mode, you have to provide a captured GNSS signal file. 1.
The signal file can be easily recorded using the GNU Radio file sink in
`gr_complex<float>` mode. 2. You will need a GPS active antenna, a
[USRP ](https://www.ettus.com/products/ ) and a suitable USRP daughter board to
receive GPS L1 C/A signals. GNSS-SDR require to have at least 2 MHz of
bandwidth in 1.57542 GHz. (remember to enable the DC bias with the daughter
board jumper). We use a [DBSRX2 ](https://www.ettus.com/all-products/DBSRX2/ )
to do the task, but you can try the newer Ettus' daughter boards as well. 3.
The easiest way to capture a signal file is to use the GNU Radio Companion
GUI. Only two blocks are needed: a USRP signal source connected to complex
float file sink. You need to tune the USRP central frequency and decimation
factor using USRP signal source properties box. We suggest using a decimation
factor of 20 if you use the USRP2. This will give you 100/20 = 5 MSPS which
will be enough to receive GPS L1 C/A signals. The front-end gain should also
be configured. In our test with the DBSRX2 we obtained good results with
`G=50` . 4. Capture at least 80 seconds of signal in open sky conditions.
During the process, be aware of USRP driver buffer underruns messages. If
your hard disk is not fast enough to write data at this speed you can capture
to a virtual RAM drive. 80 seconds of signal at 5 MSPS occupies less than 3
Gbytes using `gr_complex<float>` . 5. If you have no access to an RF
front-end, you can download a sample raw data file (that contains GPS and
Galileo signals) from
[here ](https://sourceforge.net/projects/gnss-sdr/files/data/ ).
3. You are ready to configure the receiver to use your captured file among other
parameters:
1. The default configuration file resides at
[/usr/local/share/gnss-sdr/conf/default.conf ](./conf/gnss-sdr.conf ).
2. You need to review/modify at least the following settings:
- `SignalSource.filename=` (absolute or relative route to your GNSS signal
captured file)
- `GNSS-SDR.internal_fs_sps=` (captured file sampling rate in samples per
second)
- `SignalSource.sampling_frequency=` (captured file sampling rate in
samples per second)
- `SignalConditioner.sample_freq_in=` (captured file sampling rate in
samples per second)
- `SignalConditioner.sample_freq_out=` (captured file sampling rate in
samples per second)
3. The configuration file has in-line documentation, you can try to tune the
number of channels and several receiver parameters. Store your .conf file
in some working directory of your choice.
2014-11-06 20:36:43 +00:00
4. Run the receiver invoking the configuration by
2020-02-27 17:42:43 +00:00
`$ gnss-sdr --config_file=/path/to/my_receiver.conf` The program reports the
current status in text mode, directly to the terminal window. If all goes
well, and GNSS-SDR is able to successfully track and decode at least 4
satellites, you will get PVT fixes. The program will write .kml, .geojson and
RINEX files in the folder from which `gnss-sdr` was run. In addition to the
console output, GNSS-SDR also writes log files at /tmp/ (configurable with
the commandline flag `./gnss-sdr --log_dir=/path/to/log` ).
For more information, check out our
[quick start guide ](https://gnss-sdr.org/quick-start-guide/ ).
# Using GNSS-SDR
With GNSS-SDR, you can define your own receiver, work with captured raw data or
from an RF front-end, dump into files intermediate signals, or tune every single
algorithm used in the signal processing. All the configuration is done in a
single file. Those configuration files reside at the [gnss-sdr/conf/ ](./conf/ )
folder (or at /usr/local/share/gnss-sdr/conf if you installed the program). By
default, the executable `gnss-sdr` will read the configuration available at
`gnss-sdr/conf/gnss-sdr.conf` (or at (usr/local/share/gnss-sdr/conf/default.conf
if you installed the program). You can edit that file to fit your needs, or even
better, define a new `my_receiver.conf` file with your own configuration. This
new receiver can be generated by invoking gnss-sdr with the `--config_file` flag
pointing to your configuration file:
```
2014-11-06 20:36:43 +00:00
$ gnss-sdr --config_file=/path/to/my_receiver.conf
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
You can use a single configuration file for processing different data files,
specifying the file to be processed with the `--signal_source` flag:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-11-06 20:36:43 +00:00
$ gnss-sdr --config_file=../conf/my_receiver.conf --signal_source=../data/my_captured_data.dat
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
This will override the `SignalSource.filename` specified in the configuration
file.
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
## Control plane
2014-04-27 19:46:23 +00:00
![](./docs/doxygen/images/GeneralBlockDiagram.png)
2020-02-27 17:42:43 +00:00
GNSS-SDR's main method initializes the logging library, processes the command
line flags, if any, provided by the user and instantiates a
[ControlThread ](./src/core/receiver/control_thread.h ) object. Its constructor
reads the configuration file, creates a control queue and creates a flowgraph
according to the configuration. Then, the program's main method calls the run()
method of the instantiated object, an action that connects the flowgraph and
starts running it. After that, and until a stop message is received, it reads
control messages sent by the receiver's modules through a safe-thread queue and
processes them. Finally, when a stop message is received, the main method
executes the destructor of the ControlThread object, which deallocates memory,
does other cleanup and exits the program.
The [GNSSFlowgraph ](./src/core/receiver/gnss_flowgraph.h ) class is responsible
for preparing the graph of blocks according to the configuration, running it,
modifying it during run-time and stopping it. Blocks are identified by its role.
This class knows which roles it has to instantiate and how to connect them. It
relies on the configuration to get the correct instances of the roles it needs
and then it applies the connections between GNU Radio blocks to make the graph
ready to be started. The complexity related to managing the blocks and the data
stream is handled by GNU Radio's `gr::top_block` class. GNSSFlowgraph wraps the
`gr::top_block` instance so we can take advantage of the `gnss_block_factory`
(see below), the configuration system and the processing blocks. This class is
also responsible for applying changes to the configuration of the flowgraph
during run-time, dynamically reconfiguring channels: it selects the strategy for
selecting satellites. This can range from a sequential search over all the
satellites' ID to other more efficient approaches.
The Control Plane is in charge of creating a flowgraph according to the
configuration and then managing the modules. Configuration allows users to
define in an easy way their own custom receiver by specifying the flowgraph
(type of signal source, number of channels, algorithms to be used for each
channel and each module, strategies for satellite selection, type of output
format, etc.). Since it is difficult to foresee what future module
implementations will be needed in terms of configuration, we used a very simple
approach that can be extended without a major impact in the code. This can be
achieved by simply mapping the names of the variables in the modules with the
names of the parameters in the configuration.
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
### Configuration
2020-02-27 17:42:43 +00:00
Properties are passed around within the program using the
[ConfigurationInterface ](./src/core/interfaces/configuration_interface.h ) class.
There are two implementations of this interface:
[FileConfiguration ](./src/core/receiver/file_configuration.h ) and
[InMemoryConfiguration ](./src/core/receiver/in_memory_configuration.h ).
FileConfiguration reads the properties (pairs of property name and value) from a
file and stores them internally. InMemoryConfiguration does not read from a
file; it remains empty after instantiation and property values and names are set
using the set property method. FileConfiguration is intended to be used in the
actual GNSS-SDR application whereas InMemoryConfiguration is intended to be used
in tests to avoid file-dependency in the file system. Classes that need to read
configuration parameters will receive instances of ConfigurationInterface from
where they will fetch the values. For instance, parameters related to
SignalSource should look like this:
```
2014-04-27 19:46:23 +00:00
SignalSource.parameter1=value1
SignalSource.parameter2=value2
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
The name of these parameters can be anything but one reserved word:
implementation. This parameter indicates in its value the name of the class that
has to be instantiated by the factory for that role. For instance, if our signal
source is providing data already at baseband and thus we want to use the
implementation [Pass_Through ](./src/algorithms/libs/pass_through.h ) for module
SignalConditioner, the corresponding line in the configuration file would be
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
SignalConditioner.implementation=Pass_Through
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
2020-02-27 17:42:43 +00:00
Since the configuration is just a set of property names and values without any
meaning or syntax, the system is very versatile and easily extendable. Adding
new properties to the system only implies modifications in the classes that will
make use of these properties. In addition, the configuration files are not
checked against any strict syntax so it is always in a correct status (as long
as it contains pairs of property names and values in the
[INI format ](https://en.wikipedia.org/wiki/INI_file )).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
### GNSS block factory
2020-02-27 17:42:43 +00:00
Hence, the application defines a simple accessor class to fetch the
configuration pairs of values and passes them to a factory class called
[GNSSBlockFactory ](./src/core/receiver/gnss_block_factory.h ). This factory
decides, according to the configuration, which class needs to be instantiated
and which parameters should be passed to the constructor. Hence, the factory
encapsulates the complexity of blocks' instantiation. With that approach, adding
a new block that requires new parameters will be as simple as adding the block
class and modifying the factory to be able to instantiate it. This loose
coupling between the blocks' implementations and the syntax of the configuration
enables extending the application capacities in a high degree. It also allows
producing fully customized receivers, for instance a testbed for acquisition
algorithms, and to place observers at any point of the receiver chain.
More information can be found at the
[Control Plane page ](https://gnss-sdr.org/docs/control-plane/ ).
## Signal Processing plane
GNU Radio's class `gr::basic_block` is the abstract base class for all signal
processing blocks, a bare abstraction of an entity that has a name and a set of
inputs and outputs. It is never instantiated directly; rather, this is the
abstract parent class of both `gr::hier_block2` , which is a recursive container
that adds or removes processing or hierarchical blocks to the internal graph,
and `gr::block` , which is the abstract base class for all the processing blocks.
2014-04-27 19:46:23 +00:00
![](./docs/doxygen/images/ClassHierarchy.png)
2020-02-27 17:42:43 +00:00
A signal processing flow is constructed by creating a tree of hierarchical
blocks, which at any level may also contain terminal nodes that actually
implement signal processing functions.
Class `gr::top_block` is the top-level hierarchical block representing a
flowgraph. It defines GNU Radio runtime functions used during the execution of
the program: run(), start(), stop(), wait(), etc. A subclass called
[GNSSBlockInterface ](./src/core/interfaces/gnss_block_interface.h ) is the common
interface for all the GNSS-SDR modules. It defines pure virtual methods, that
are required to be implemented by a derived class.
Subclassing GNSSBlockInterface, we defined interfaces for the GNSS receiver
blocks depicted in the figure above. This hierarchy provides the definition of
different algorithms and different implementations, which will be instantiated
according to the configuration. This strategy allows multiple implementations
sharing a common interface, achieving the objective of decoupling interfaces
from implementations: it defines a family of algorithms, encapsulates each one,
and makes them interchangeable. Hence, we let the algorithm vary independently
of the program that uses it.
Internally, GNSS-SDR makes use of the complex data types defined by
[VOLK ](https://www.libvolk.org/ "Vector-Optimized Library of Kernels home" ).
They are fundamental for handling sample streams in which samples are complex
numbers with real and imaginary components of 8, 16 or 32 bits, common formats
delivered by GNSS (and generic SDR) radio frequency front-ends. The following
list shows the data type names that GNSS-SDR exposes through the configuration
file:
- **`byte`**: Signed integer, 8-bit two's complement number ranging from -128
to 127. C++ type name: `int8_t` .
- **`short`**: Signed integer, 16-bit two's complement number ranging from
-32768 to 32767. C++ type name: `int16_t` .
- **`float`**: Defines numbers with fractional parts, can represent values
ranging from approx. 1.5e-45 to 3.4e+38 with a precision of 7 digits (32
bits). C++ type name: `float` .
- **`ibyte`**: Interleaved (I& Q) stream of samples of type `byte` . C++ type
name: `int8_t` .
- **`ishort`**: Interleaved (I& Q) stream of samples of type `short` . C++ type
name: `int16_t` .
- **`cbyte`**: Complex samples, with real and imaginary parts of type `byte` .
C++ type name: `lv_8sc_t` .
- **`cshort`**: Complex samples, with real and imaginary parts of type `short` .
C++ type name: `lv_16sc_t` .
- **`gr_complex`**: Complex samples, with real and imaginary parts of type
`float` . C++ type name: `std::complex<float>` .
More information about the available processing blocks and their configuration
parameters can be found at the
[Signal Processing Blocks documentation page ](https://gnss-sdr.org/docs/sp-blocks/ ).
### Signal Source
The input of a software receiver are the raw bits that come out from the
front-end's analog-to-digital converter (ADC). Those bits can be read from a
file stored in the hard disk or directly in real-time from a hardware device
through USB or Ethernet buses.
The Signal Source module is in charge of implementing the hardware driver, that
is, the portion of the code that communicates with the RF front-end and receives
the samples coming from the ADC. This communication is usually performed through
USB or Ethernet buses. Since real-time processing requires a highly optimized
implementation of the whole receiver, this module also allows reading samples
from a file stored in a hard disk, and thus processing without time constraints.
Relevant parameters of those samples are the intermediate frequency (or baseband
I& Q components), the sampling rate and number of bits per sample, that must be
specified by the user in the configuration file.
This module also performs bit-depth adaptation, since most of the existing RF
front-ends provide samples quantized with 2 or 3 bits, while operations inside
the processor are performed on 32- or 64-bit words, depending on its
architecture. Although there are implementations of the most intensive
computational processes (mainly correlation) that take advantage of specific
data types and architectures for the sake of efficiency, the approach is
processor-specific and hardly portable. We suggest to keep signal samples in
standard data types and letting the compiler select the best library version
(implemented using SIMD or any other processor-specific technology) of the
required routines for a given processor.
**_Example: File Signal Source_**
The user can configure the receiver for reading from a file, setting in the
configuration file the data file location, sample format, and the sampling
frequency and intermediate frequency at what the signal was originally captured.
```
2014-04-27 19:46:23 +00:00
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=File_Signal_Source
SignalSource.filename=/home/user/gnss-sdr/data/my_capture.dat
SignalSource.item_type=gr_complex
2018-01-27 11:41:08 +00:00
SignalSource.sampling_frequency=4000000 ; Sampling frequency in samples per second (Sps)
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
Type `gr_complex` refers to a GNU Radio typedef equivalent to
`std::complex<float>` . In order to save some storage space, you might want to
store your signal in a more efficient format such as an I/Q interleaved `short`
integer sample stream. In that case, change the corresponding line to:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2018-01-27 11:38:05 +00:00
SignalSource.item_type=ishort
2020-02-27 17:42:43 +00:00
```
In this latter case, you will need to convert the interleaved I/Q samples to a
complex stream via Data Type Adapter block (see below).
**_Example: Two-bit packed file source_**
Sometimes, samples are stored in files with a format which is not in the list of
_native_ types supported by the `File_Signal_Source` implementation (i.e, it is
not among `byte` , `ibyte` , `short` , `ishort` , `float` or `gr_complex` ). This is
the case of 2-bit samples, which is a common format delivered by GNSS RF
front-ends. The `Two_Bit_Packed_File_Signal_Source` implementation allows
reading two-bit length samples from a file. The data is assumed to be packed as
bytes `item_type=byte` or shorts `item_type=short` so that there are 4 two bit
samples in each byte. The two bit values are assumed to have the following
interpretation:
| **b_1** | **b_0** | **Value** |
| :-----: | :-----: | :-------: |
| 0 | 0 | +1 |
| 0 | 1 | +3 |
| 1 | 0 | -3 |
| 1 | 1 | -1 |
Within a byte the samples may be packed in big endian `big_endian_bytes=true`
(if the most significant byte value is stored at the memory location with the
lowest address, the next byte value in significance is stored at the following
memory location, and so on) or little endian `big_endian_bytes=false` (if the
least significant byte value is at the lowest address, and the other bytes
follow in increasing order of significance). If the order is big endian then the
most significant two bits will form the first sample output, otherwise the least
significant two bits will be used.
Additionally, the samples may be either real `sample_type=real` , or complex. If
the sample type is complex, then the samples are either stored in the order:
real, imag, real, imag, ... `sample_type=iq` or in the order: imag, real, imag,
real, ... `sample_type=qi` .
Finally, if the data is stored as shorts `item_type=short` , then it may be
stored in either big endian `big_endian_items=true` or little endian
`big_endian_items=false` . If the shorts are big endian then the 2nd byte in each
short is output first.
The output data type is either `float` or `gr_complex` depending on whether or
not `sample_type` is real. Example:
```
2015-10-17 11:30:28 +00:00
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=Two_Bit_Packed_File_Signal_Source
SignalSource.filename=/data/my_capture.datz
SignalSource.item_type=short
2016-09-23 08:44:27 +00:00
SignalSource.sampling_frequency=60000000
SignalSource.freq=1575468750
2015-10-17 11:30:28 +00:00
SignalSource.samples=6000000000 ; Notice that 0 indicates the entire file.
SignalSource.repeat=false
SignalSource.dump=false
SignalSource.dump_filename=./signal_source.dat
SignalSource.enable_throttle_control=false
SignalSource.sample_type=iq
SignalSource.big_endian_items=true
SignalSource.big_endian_bytes=false
2020-02-27 17:42:43 +00:00
```
2015-10-17 11:30:28 +00:00
2020-02-27 17:42:43 +00:00
**_Example: UHD Signal Source_**
2015-10-17 11:30:28 +00:00
2020-02-27 17:42:43 +00:00
The user may prefer to use a [UHD ](https://files.ettus.com/manual/ )-compatible
RF front-end and try real-time processing. For instance, for a USRP1 + DBSRX
daughterboard, use:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=UHD_Signal_Source
SignalSource.item_type=gr_complex
SignalSource.sampling_frequency=4000000 ; Sampling frequency in [Hz]
2016-09-23 08:44:27 +00:00
SignalSource.freq=1575420000 ; RF front-end center frequency in [Hz]
2014-04-27 19:46:23 +00:00
SignalSource.gain=60 ; Front-end gain in dB
SignalSource.subdevice=B:0 ; UHD subdevice specification (for USRP1 use A:0 or B:0, for USRP B210 use A:0)
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
**_Example: Configuring the USRP X300/X310 with two front-ends for receiving
signals in L1 and L2 bands_**
2015-09-01 22:38:46 +00:00
2020-02-27 17:42:43 +00:00
```
2015-09-01 22:38:46 +00:00
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=UHD_Signal_Source
SignalSource.device_address=192.168.40.2 ; Put your USRP IP address here
SignalSource.item_type=gr_complex
SignalSource.RF_channels=2
SignalSource.sampling_frequency=4000000
SignalSource.subdevice=A:0 B:0
2015-07-12 07:36:46 +00:00
2015-09-01 22:38:46 +00:00
;######### RF Channels specific settings ######
SignalSource.freq0=1575420000
SignalSource.gain0=50
SignalSource.samples0=0
SignalSource.dump0=false
SignalSource.freq1=1227600000
SignalSource.gain1=50
SignalSource.samples1=0
SignalSource.dump1=false
2020-02-27 17:42:43 +00:00
```
**_Example: OsmoSDR-compatible Signal Source_**
[OsmoSDR ](https://osmocom.org/projects/sdr ) is a small form-factor, inexpensive
software defined radio project. It provides a driver for several front-ends,
such as [RTL-based dongles ](https://www.rtl-sdr.com/tag/v3/ ),
[HackRF ](https://greatscottgadgets.com/hackrf/ ),
[bladeRF ](https://www.nuand.com/ ),
[LimeSDR ](https://myriadrf.org/projects/limesdr/ ),
[etc ](https://github.com/osmocom/gr-osmosdr/blob/master/README ). Note that not
all the OsmoSDR-compatible devices can work as radio frequency front-ends for
proper GNSS signal reception, please check the specifications. For suitable RF
front-ends, you can use:
```
2015-10-17 16:29:45 +00:00
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=Osmosdr_Signal_Source
SignalSource.item_type=gr_complex
SignalSource.sampling_frequency=2000000
2016-09-23 08:44:27 +00:00
SignalSource.freq=1575420000
2015-10-17 16:29:45 +00:00
SignalSource.rf_gain=40
SignalSource.if_gain=30
SignalSource.enable_throttle_control=false
2018-01-27 11:38:05 +00:00
SignalSource.osmosdr_args=hackrf,bias=1
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
2020-02-27 17:42:43 +00:00
For [RTL-SDR Blog V3 ](https://www.rtl-sdr.com/tag/v3/ ) dongles, the arguments
are:
2018-02-05 18:05:24 +00:00
2020-02-27 17:42:43 +00:00
```
2018-02-05 18:05:24 +00:00
SignalSource.osmosdr_args=rtl,bias=1
2020-02-27 17:42:43 +00:00
```
2018-02-05 18:05:24 +00:00
and for [LimeSDR ](https://myriadrf.org/projects/limesdr/ ):
2020-02-27 17:42:43 +00:00
```
2018-02-05 18:05:24 +00:00
SignalSource.osmosdr_args=driver=lime,soapy=0
2020-02-27 17:42:43 +00:00
```
2018-02-05 18:05:24 +00:00
2020-02-27 17:42:43 +00:00
In case of using a Zarlink's RTL2832 based DVB-T receiver, you can even use the
`rtl_tcp` I/Q server in order to use the USB dongle remotely. In a terminal,
type:
2018-02-05 18:05:24 +00:00
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
$ rtl_tcp -a 127.0.0.1 -p 1234 -f 1575420000 -g 0 -s 2000000
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
and use the following configuration:
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=RtlTcp_Signal_Source
SignalSource.item_type=gr_complex
SignalSource.sampling_frequency=1200000
SignalSource.freq=1575420000
SignalSource.gain=40
SignalSource.rf_gain=40
SignalSource.if_gain=30
SignalSource.AGC_enabled=false
SignalSource.samples=0
SignalSource.enable_throttle_control=false
SignalSource.address=127.0.0.1
SignalSource.port=1234
SignalSource.swap_iq=false
SignalSource.repeat=false
SignalSource.dump=false
SignalSource.dump_filename=../data/signal_source.dat
2020-02-27 17:42:43 +00:00
```
2015-10-17 11:30:28 +00:00
2015-11-27 12:32:21 +00:00
Example for a dual-frequency receiver:
2020-02-27 17:42:43 +00:00
```
2015-11-27 12:32:21 +00:00
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=UHD_Signal_Source
SignalSource.device_address=192.168.40.2 ; Put your USRP IP address here
SignalSource.item_type=gr_complex
SignalSource.RF_channels=2
SignalSource.sampling_frequency=4000000
SignalSource.subdevice=A:0 B:0
;######### RF Channels specific settings ######
SignalSource.freq0=1575420000
SignalSource.gain0=50
SignalSource.samples0=0
SignalSource.dump0=false
SignalSource.freq1=1227600000
SignalSource.gain1=50
SignalSource.samples1=0
SignalSource.dump1=false
2020-02-27 17:42:43 +00:00
```
2015-11-27 12:32:21 +00:00
2020-02-27 17:42:43 +00:00
More documentation and examples are available at the
[Signal Source Blocks page ](https://gnss-sdr.org/docs/sp-blocks/signal-source/ ).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
### Signal Conditioner
![](./docs/doxygen/images/SignalConditioner.png)
2020-02-27 17:42:43 +00:00
The signal conditioner is in charge of resampling the signal and delivering a
reference sample rate to the downstream processing blocks, acting as a facade
between the signal source and the synchronization channels, providing a
simplified interface to the input signal. In case of multiband front-ends, this
module would be in charge of providing a separated data stream for each band.
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
If your signal source is providing baseband signal samples of type `gr_complex`
at 4 Msps, you can bypass the Signal Conditioner block by:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
SignalConditioner.implementation=Pass_Through
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
If you need to adapt some aspect of your signal, you can enable the Signal
Conditioner and configure three internal blocks: a data type adapter, an input
signal and a resampler.
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks
SignalConditioner.implementation=Signal_Conditioner
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
2020-02-27 17:42:43 +00:00
More documentation at the
[Signal Conditioner Blocks page ](https://gnss-sdr.org/docs/sp-blocks/signal-conditioner/ ).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
#### Data type adapter
2020-02-27 17:42:43 +00:00
This block changes the type of input data samples. If your signal source
delivers data samples of type `short` , you can use this block to convert them to
`gr_complex` like this:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;######### DATA_TYPE_ADAPTER CONFIG ############
;#implementation: [Pass_Through] disables this block
DataTypeAdapter.implementation=Ishort_To_Complex
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
More documentation at the
[Data Type Adapter Blocks page ](https://gnss-sdr.org/docs/sp-blocks/data-type-adapter/ ).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
#### Input filter
2020-02-27 17:42:43 +00:00
This block filters the input data. It can be combined with frequency translation
for IF signals. The computation of the filter taps is based on parameters of GNU
Radio's function
[pm_remez ](https://www.gnuradio.org/doc/doxygen/pm__remez_8h.html ), that
calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse
response given a set of band edges, the desired response on those bands, and the
weight given to the error in those bands.
2014-04-27 19:46:23 +00:00
The block can be configured like this:
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;######### INPUT_FILTER CONFIG ############
;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter]
;#[Pass_Through] disables this block
;#[Fir_Filter] enables a FIR Filter
;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz.
InputFilter.implementation=Freq_Xlating_Fir_Filter
InputFilter.dump=false ; #dump: Dump the filtered data to a file.
InputFilter.dump_filename=../data/input_filter.dat ; #dump_filename: Log path and filename.
InputFilter.input_item_type=gr_complex
InputFilter.output_item_type=gr_complex
InputFilter.taps_item_type=float
InputFilter.number_of_taps=5 ; #number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time
InputFilter.number_of_bands=2 ; #number_of_bands: Number of frequency bands in the filter.
; Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2)
; The number of band_begin and band_end elements must match the number of bands
InputFilter.band1_begin=0.0
InputFilter.band1_end=0.85
InputFilter.band2_begin=0.90
InputFilter.band2_end=1.0
;#ampl: desired amplitude at the band edges.
;#The number of ampl_begin and ampl_end elements must match the number of bands
InputFilter.ampl1_begin=1.0
InputFilter.ampl1_end=1.0
InputFilter.ampl2_begin=0.0
InputFilter.ampl2_end=0.0
;#band_error: weighting applied to each band (usually 1).
;#The number of band_error elements must match the number of bands
InputFilter.band1_error=1.0
InputFilter.band2_error=1.0
2016-09-23 08:44:27 +00:00
;#filter_type: one of "bandpass", "hilbert" or "differentiator"
2014-04-27 19:46:23 +00:00
InputFilter.filter_type=bandpass
;#grid_density: determines how accurately the filter will be constructed.
;The minimum value is 16; higher values are slower to compute the filter.
InputFilter.grid_density=16
;#The following options are used only in Freq_Xlating_Fir_Filter implementation.
;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz
InputFilter.sampling_frequency=4000000
InputFilter.IF=0
InputFilter.decimation_factor=1
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
More documentation at the
[Input Filter Blocks page ](https://gnss-sdr.org/docs/sp-blocks/input-filter/ ).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
#### Resampler
2020-02-27 17:42:43 +00:00
This block resamples the input data stream. The `Direct_Resampler` block
implements a nearest neighbourhood interpolation:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;######### RESAMPLER CONFIG ############
;#implementation: Use [Pass_Through] or [Direct_Resampler]
;#[Pass_Through] disables this block
Resampler.implementation=Direct_Resampler
Resampler.dump=false ; Dumps the resampled data to a file.
Resampler.dump_filename=../data/resampler.dat ; log path and filename.
2016-09-23 08:44:27 +00:00
Resampler.item_type=gr_complex
2014-04-27 19:46:23 +00:00
Resampler.sample_freq_in=8000000 ; sample frequency of the input signal
Resampler.sample_freq_out=4000000 ; desired sample frequency of the output signal
2020-02-27 17:42:43 +00:00
```
More documentation at the
[Resampler Blocks page ](https://gnss-sdr.org/docs/sp-blocks/resampler/ ).
### Channel
A channel encapsulates all signal processing devoted to a single satellite.
Thus, it is a large composite object which encapsulates the acquisition,
tracking and navigation data decoding modules. As a composite object, it can be
treated as a single entity, meaning that it can be easily replicated. Since the
number of channels is selectable by the user in the configuration file, this
approach helps to improve the scalability and maintainability of the receiver.
Each channel must be assigned to a GNSS signal, according to the following
identifiers:
| **Signal** | **Identifier** |
| :------------- | :------------: |
| GPS L1 C/A | 1C |
| Galileo E1b/c | 1B |
| Glonass L1 C/A | 1G |
| Beidou B1I | B1 |
| Beidou B3I | B3 |
| GPS L2 L2C(M) | 2S |
| Glonass L2 C/A | 2G |
| GPS L5 | L5 |
| Galileo E5a | 5X |
2018-01-24 00:00:40 +00:00
2015-07-12 07:36:46 +00:00
Example: Eight GPS L1 C/A channels.
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;######### CHANNELS GLOBAL CONFIG ############
2015-07-12 07:36:46 +00:00
Channels_1C.count=8 ; Number of available GPS L1 C/A channels.
Channels_1B.count=0 ; Number of available Galileo E1B channels.
2014-04-27 19:46:23 +00:00
Channels.in_acquisition=1 ; Number of channels simultaneously acquiring
2016-09-23 08:44:27 +00:00
Channel.signal=1C ;
2020-02-27 17:42:43 +00:00
```
2015-07-12 07:36:46 +00:00
Example: Four GPS L1 C/A and four Galileo E1B channels.
2020-02-27 17:42:43 +00:00
```
2015-07-12 07:36:46 +00:00
;######### CHANNELS GLOBAL CONFIG ############
Channels_1C.count=4 ; Number of available GPS L1 C/A channels.
Channels_1B.count=4 ; Number of available Galileo E1B channels.
Channels.in_acquisition=1 ; Number of channels simultaneously acquiring
Channel0.signal=1C ;
Channel1.signal=1C ;
Channel2.signal=1C ;
Channel3.signal=1C ;
Channel4.signal=1B ;
Channel5.signal=1B ;
Channel6.signal=1B ;
Channel7.signal=1B ;
2020-02-27 17:42:43 +00:00
```
This module is also in charge of managing the interplay between acquisition and
tracking. Acquisition can be initialized in several ways, depending on the prior
information available (called cold start when the receiver has no information
about its position nor the satellites' almanac; warm start when a rough location
and the approximate time of day are available, and the receiver has a recently
recorded almanac broadcast; or hot start when the receiver was tracking a
satellite and the signal line of sight broke for a short period of time, but the
ephemeris and almanac data is still valid, or this information is provided by
other means), and an acquisition process can finish deciding that the satellite
is not present, that longer integration is needed in order to confirm the
presence of the satellite, or declaring the satellite present. In the latter
case, acquisition process should stop and trigger the tracking module with
coarse estimations of the synchronization parameters. The mathematical
abstraction used to design this logic is known as finite state machine (FSM),
that is a behavior model composed of a finite number of states, transitions
between those states, and actions.
The abstract class [ChannelInterface ](./src/core/interfaces/channel_interface.h )
represents an interface to a channel GNSS block. Check
[Channel ](./src/algorithms/channel/adapters/channel.h ) for an actual
implementation.
More documentation at the
[Channels page ](https://gnss-sdr.org/docs/sp-blocks/channels/ ).
2016-09-23 08:44:27 +00:00
2014-04-27 19:46:23 +00:00
#### Acquisition
2020-02-27 17:42:43 +00:00
The first task of a GNSS receiver is to detect the presence or absence of
in-view satellites. This is done by the acquisition system process, which also
provides a coarse estimation of two signal parameters: the frequency shift with
respect to the nominal frequency, and a delay term which allows the receiver to
create a local code aligned with the incoming code.
[AcquisitionInterface ](./src/core/interfaces/acquisition_interface.h ) is the
common interface for all the acquisition algorithms and their corresponding
implementations. Algorithms' interface, that may vary depending on the use of
information external to the receiver, such as in Assisted GNSS, is defined in
classes referred to as _adapters_ . These adapters wrap the GNU Radio blocks
interface into a compatible interface expected by AcquisitionInterface. This
allows the use of existing GNU Radio blocks derived from `gr::block` , and
ensures that newly developed implementations will also be reusable in other GNU
Radio-based applications. Moreover, it adds still another layer of abstraction,
since each given acquisition algorithm can have different implementations (for
instance using different numerical libraries). In such a way, implementations
can be continuously improved without having any impact neither on the algorithm
interface nor the general acquisition interface.
Check
[GpsL1CaPcpsAcquisition ](./src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h )
and
[GalileoE1PcpsAmbiguousAcquisition ](./src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h )
for examples of adapters from a Parallel Code Phase Search (PCPS) acquisition
block, and
[pcps_acquisition_cc ](./src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.h )
for an example of a block implementation. The source code of all the available
acquisition algorithms is located at:
```
2014-04-27 19:46:23 +00:00
|-gnss-sdr
|---src
|-----algorithms
|-------acquisition
|---------adapters < - Adapters of the processing blocks to an AcquisitionInterface
|---------gnuradio_blocks < - Signal processing blocks implementation
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
The user can select a given implementation for the algorithm to be used in each
receiver channel, as well as their parameters, in the configuration file. For a
GPS L1 C/A receiver:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;######### ACQUISITION GLOBAL CONFIG ############
2015-11-17 22:19:50 +00:00
Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ; Acquisition algorithm selection for this channel
2015-07-12 07:36:46 +00:00
Acquisition_1C.item_type=gr_complex
2018-06-15 16:58:55 +00:00
Acquisition_1C.coherent_integration_time_ms=1 ; Signal block duration for the acquisition signal detection [ms]
2020-02-05 21:15:50 +00:00
Acquisition_1C.threshold=2.5 ; Acquisition threshold
Acquisition_1C.pfa=0.01 ; Acquisition false alarm probability. This option overrides the threshold option.
2015-07-12 07:36:46 +00:00
Acquisition_1C.doppler_max=10000 ; Maximum expected Doppler shift [Hz]
Acquisition_1C.doppler_step=500 ; Doppler step in the grid search [Hz]
2016-09-23 08:44:27 +00:00
Acquisition_1C.dump=false ; Enables internal data file logging [true] or [false]
2015-11-17 22:19:50 +00:00
Acquisition_1C.dump_filename=./acq_dump.dat ; Log path and filename
2020-02-27 17:42:43 +00:00
```
2015-11-17 22:19:50 +00:00
and, for Galileo E1B channels:
2020-02-27 17:42:43 +00:00
```
2015-11-17 22:19:50 +00:00
;######### GALILEO ACQUISITION CONFIG ############
Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition
Acquisition_1B.item_type=gr_complex
2018-06-15 16:58:55 +00:00
Acquisition_1B.coherent_integration_time_ms=4
2020-01-21 23:40:42 +00:00
Acquisition_1B.pfa=0.008
2015-11-17 22:19:50 +00:00
Acquisition_1B.doppler_max=15000
Acquisition_1B.doppler_step=125
Acquisition_1B.dump=false
Acquisition_1B.dump_filename=./acq_dump.dat
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
More documentation at the
[Acquisition Blocks page ](https://gnss-sdr.org/docs/sp-blocks/acquisition/ ).
2015-11-17 22:19:50 +00:00
2014-04-27 19:46:23 +00:00
#### Tracking
2020-02-27 17:42:43 +00:00
When a satellite is declared present, the parameters estimated by the
acquisition module are then fed to the receiver tracking module, which
represents the second stage of the signal processing unit, aiming to perform a
local search for accurate estimates of code delay and carrier phase, and
following their eventual variations.
Again, a class hierarchy consisting of a
[TrackingInterface ](./src/core/interfaces/tracking_interface.h ) class and
subclasses implementing algorithms provides a way of testing different
approaches, with full access to their parameters. Check
[GpsL1CaDllPllTracking ](./src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h )
or
[GalileoE1DllPllVemlTracking ](./src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h )
for examples of adapters, and
[Gps_L1_Ca_Dll_Pll_Tracking_cc ](./src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.h )
for an example of a signal processing block implementation. There are also
available some useful classes and functions for signal tracking; take a look at
[cpu_multicorrelator.h ](./src/algorithms/tracking/libs/cpu_multicorrelator.h ),
[lock_detectors.h ](./src/algorithms/tracking/libs/lock_detectors.h ),
[tracking_discriminators.h ](./src/algorithms/tracking/libs/tracking_discriminators.h )
or
[tracking_2nd_DLL_filter.h ](./src/algorithms/tracking/libs/tracking_2nd_DLL_filter.h ).
2014-04-27 19:46:23 +00:00
The source code of all the available tracking algorithms is located at:
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
|-gnss-sdr
|---src
|-----algorithms
|-------tracking
|---------adapters < - Adapters of the processing blocks to a TrackingInterface
|---------gnuradio_blocks < - Signal processing blocks implementation
|---------libs < - libraries of tracking objects ( e . g . correlators , discriminators , and so on )
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
The user can select a given implementation for the algorithm to be used in all
the tracking blocks, as well as its parameters, in the configuration file. For
instance, for GPS l1 channels:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
;######### TRACKING GPS L1 CONFIG ############
2015-07-12 07:36:46 +00:00
Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking
Tracking_1C.item_type=gr_complex
Tracking_1C.pll_bw_hz=50.0 ; PLL loop filter bandwidth [Hz]
Tracking_1C.dll_bw_hz=2.0 ; DLL loop filter bandwidth [Hz]
2019-06-02 18:26:05 +00:00
Tracking_1C.pll_filter_order=3 ; PLL loop filter order [2] or [3]
Tracking_1C.dll_filter_order=2 ; DLL loop filter order [1], [2] or [3]
2016-09-23 08:44:27 +00:00
Tracking_1C.early_late_space_chips=0.5 ; correlator early-late space [chips].
Tracking_1C.dump=false ; Enable internal binary data file logging [true] or [false]
2015-10-17 16:29:45 +00:00
Tracking_1C.dump_filename=./tracking_ch_ ; Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number.
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2015-10-17 16:29:45 +00:00
and, for Galileo E1B channels:
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
;######### TRACKING GALILEO E1B CONFIG ############
Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking
Tracking_1B.item_type=gr_complex
Tracking_1B.pll_bw_hz=15.0;
Tracking_1B.dll_bw_hz=2.0;
2019-06-02 18:26:05 +00:00
Tracking_1B.pll_filter_order=3 ; PLL loop filter order [2] or [3]
Tracking_1B.dll_filter_order=2 ; DLL loop filter order [1], [2] or [3]
2015-10-17 16:29:45 +00:00
Tracking_1B.early_late_space_chips=0.15;
Tracking_1B.very_early_late_space_chips=0.6;
Tracking_1B.dump=false
Tracking_1B.dump_filename=../data/veml_tracking_ch_
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
2020-02-27 17:42:43 +00:00
More documentation at the
[Tracking Blocks page ](https://gnss-sdr.org/docs/sp-blocks/tracking/ ).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
#### Decoding of the navigation message
2020-02-27 17:42:43 +00:00
Most of GNSS signal links are modulated by a navigation message containing the
time the message was transmitted, orbital parameters of satellites (also known
as ephemeris) and an almanac (information about the general system health, rough
orbits of all satellites in the network as well as data related to error
correction). Navigation data bits are structured in words, pages, subframes,
frames and superframes. Sometimes, bits corresponding to a single parameter are
spread over different words, and values extracted from different frames are
required for proper decoding. Some words are for synchronization purposes,
others for error control and others contain actual information. There are also
error control mechanisms, from parity checks to forward error correction (FEC)
encoding and interleaving, depending on the system. All this decoding complexity
is managed by a finite state machine.
The common interface is
[TelemetryDecoderInterface ](./src/core/interfaces/telemetry_decoder_interface.h ).
Check
[GpsL1CaTelemetryDecoder ](./src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h )
for an example of the GPS L1 NAV message decoding adapter, and
[gps_l1_ca_telemetry_decoder_cc ](./src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h )
for an actual implementation of a signal processing block. Configuration
example:
```
2014-04-27 19:46:23 +00:00
;######### TELEMETRY DECODER CONFIG ############
2015-07-12 07:36:46 +00:00
TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder
TelemetryDecoder_1C.dump=false
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
In case you are configuring a multi-system receiver, you will need to decimate
the one with the fastest code rate in order to get both data streams
synchronized. For instance, for hybrid GPS L1 / Galileo E1B receivers:
2015-10-17 16:29:45 +00:00
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
;######### TELEMETRY DECODER GPS L1 CONFIG ############
TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder
TelemetryDecoder_1C.dump=false
;######### TELEMETRY DECODER GALILEO E1B CONFIG ############
TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder
TelemetryDecoder_1B.dump=false
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
2020-02-27 17:42:43 +00:00
More documentation at the
[Telemetry Decoder Blocks page ](https://gnss-sdr.org/docs/sp-blocks/telemetry-decoder/ ).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
#### Observables
2020-02-27 17:42:43 +00:00
GNSS systems provide different kinds of observations. The most commonly used are
the code observations, also called pseudoranges. The _pseudo_ comes from the
fact that on the receiver side the clock error is unknown and thus the
measurement is not a pure range observation. High accuracy applications also use
the carrier phase observations, which are based on measuring the difference
between the carrier phase transmitted by the GNSS satellites and the phase of
the carrier generated in the receiver. Both observables are computed from the
outputs of the tracking module and the decoding of the navigation message. This
module collects all the data provided by every tracked channel, aligns all
received data into a coherent set, and computes the observables.
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
The common interface is
[ObservablesInterface ](./src/core/interfaces/observables_interface.h ).
2014-04-27 19:46:23 +00:00
2017-08-19 07:44:07 +00:00
Configuration example:
2015-10-17 16:29:45 +00:00
2020-02-27 17:42:43 +00:00
```
2015-10-17 16:29:45 +00:00
;######### OBSERVABLES CONFIG ############
Observables.implementation=Hybrid_Observables
Observables.dump=false
Observables.dump_filename=./observables.dat
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
2020-02-27 17:42:43 +00:00
More documentation at the
[Observables Blocks page ](https://gnss-sdr.org/docs/sp-blocks/observables/ ).
2014-04-27 20:27:38 +00:00
2014-04-27 19:46:23 +00:00
#### Computation of Position, Velocity and Time
2020-02-27 17:42:43 +00:00
Although data processing for obtaining high-accuracy PVT solutions is out of the
scope of GNSS-SDR, we provide a module that can compute position fixes (stored
in GIS-friendly formats such as [GeoJSON ](https://tools.ietf.org/html/rfc7946 ),
[GPX ](https://www.topografix.com/gpx.asp ) and
[KML ](https://www.opengeospatial.org/standards/kml ), or transmitted via serial
port as [NMEA 0183 ](https://en.wikipedia.org/wiki/NMEA_0183 ) messages), and
leaves room for more sophisticated positioning methods by storing observables
and navigation data in [RINEX ](https://en.wikipedia.org/wiki/RINEX ) files (v2.11
or v3.02), and generating
[RTCM ](https://www.rtcm.org/ "Radio Technical Commission for Maritime Services" )
3.2 messages that can be disseminated through the Internet in real time.
2014-04-27 19:46:23 +00:00
2016-09-23 08:44:27 +00:00
The common interface is [PvtInterface ](./src/core/interfaces/pvt_interface.h ).
2015-11-17 22:19:50 +00:00
2017-08-19 07:44:07 +00:00
Configuration example:
2014-04-27 19:46:23 +00:00
2020-02-27 17:42:43 +00:00
```
2014-04-27 19:46:23 +00:00
;######### PVT CONFIG ############
2017-08-19 07:44:07 +00:00
PVT.implementation=RTKLIB_PVT
PVT.positioning_mode=Single ; options: Single, Static, Kinematic, PPP_Static, PPP_Kinematic
PVT.iono_model=Broadcast ; options: OFF, Broadcast
PVT.trop_model=Saastamoinen ; options: OFF, Saastamoinen
PVT.rinex_version=2 ; options: 2 or 3
PVT.output_rate_ms=100 ; Period in [ms] between two PVT outputs
PVT.display_rate_ms=500 ; Position console print (std::out) interval [ms].
2015-10-17 16:29:45 +00:00
PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea ; NMEA log path and filename
2017-08-19 07:44:07 +00:00
PVT.flag_nmea_tty_port=false ; Enables the NMEA log to a serial TTY port
2015-10-17 16:29:45 +00:00
PVT.nmea_dump_devname=/dev/pts/4 ; serial device descriptor for NMEA logging
2017-08-19 07:44:07 +00:00
PVT.flag_rtcm_server=true ; Enables or disables a TCP/IP server dispatching RTCM messages
PVT.flag_rtcm_tty_port=false ; Enables the RTCM log to a serial TTY port
2015-12-25 10:38:08 +00:00
PVT.rtcm_dump_devname=/dev/pts/1 ; serial device descriptor for RTCM logging
2017-08-19 07:44:07 +00:00
PVT.rtcm_tcp_port=2101
PVT.rtcm_MT1019_rate_ms=5000
PVT.rtcm_MT1045_rate_ms=5000
PVT.rtcm_MT1097_rate_ms=1000
PVT.rtcm_MT1077_rate_ms=1000
2020-02-27 17:42:43 +00:00
```
2015-11-17 22:19:50 +00:00
**Notes on the output formats:**
2020-02-27 17:42:43 +00:00
- **GeoJSON** is a geospatial data interchange format based on JavaScript Object
Notation (JSON) supported by numerous mapping and GIS software packages,
including [OpenLayers ](https://openlayers.org ),
[Leaflet ](https://leafletjs.com ), [MapServer ](https://mapserver.org/ ),
[GeoServer ](http://geoserver.org ), [GeoDjango ](https://www.djangoproject.com ),
[GDAL ](https://gdal.org/ ), and [CartoDB ](https://cartodb.com ). It is also
possible to use GeoJSON with [PostGIS ](https://postgis.net/ ) and
[Mapnik ](https://mapnik.org/ ), both of which handle the format via the GDAL
OGR conversion library. The
[Google Maps Javascript API ](https://developers.google.com/maps/documentation/javascript/ )
v3 directly supports the
[integration of GeoJSON data layers ](https://developers.google.com/maps/documentation/javascript/examples/layer-data-simple ),
and
[GitHub also supports GeoJSON rendering ](https://github.com/blog/1528-there-s-a-map-for-that ).
- **KML** (Keyhole Markup Language) is an XML grammar used to encode and
transport representations of geographic data for display in an earth browser.
KML is an open standard officially named the OpenGIS KML Encoding Standard
(OGC KML), and it is maintained by the Open Geospatial Consortium, Inc. (OGC).
KML files can be displayed in geobrowsers such as
[Google Earth ](https://www.google.com/earth/ ),
[Marble ](https://marble.kde.org ), [osgEarth ](http://osgearth.org ), or used
with the [NASA World Wind SDK for Java ](https://worldwind.arc.nasa.gov/java/ ).
- **GPX** (the GPS Exchange Format) is a light-weight XML data format for the
interchange of GPS data (waypoints, routes, and tracks) between applications
and Web services on the Internet. The format is open and can be used without
the need to pay license fees, and it is supported by a
[large list of software tools ](https://www.topografix.com/gpx_resources.asp ).
- **NMEA 0183** is a combined electrical and data specification for
communication between marine electronics such as echo sounder, sonars,
anemometer, gyrocompass, autopilot, GPS receivers and many other types of
instruments. It has been defined by, and is controlled by, the U.S.
[National Marine Electronics Association ](https://www.nmea.org/ ). The NMEA
0183 standard uses a simple ASCII, serial communications protocol that defines
how data are transmitted in a _sentence_ from one _talker_ to multiple
_listeners_ at a time. Through the use of intermediate expanders, a talker can
have a unidirectional conversation with a nearly unlimited number of
listeners, and using multiplexers, multiple sensors can talk to a single
computer port. At the application layer, the standard also defines the
contents of each sentence (message) type, so that all listeners can parse
messages accurately. Those messages can be sent through the serial port (that
could be for instance a Bluetooth link) and be used/displayed by a number of
software applications such as
[gpsd ](https://gpsd.gitlab.io/gpsd/index.html "The UNIX GPS daemon" ),
[JOSM ](https://josm.openstreetmap.de/ "The Java OpenStreetMap Editor" ),
[OpenCPN ](https://opencpn.org/ "Open Chart Plotter Navigator" ), and many
others (and maybe running on other devices).
- **RINEX** (Receiver Independent Exchange Format) is an interchange format for
raw satellite navigation system data, covering observables and the information
contained in the navigation message broadcast by GNSS satellites. This allows
the user to post-process the received data to produce a more accurate result
(usually with other data unknown to the original receiver, such as better
models of the atmospheric conditions at time of measurement). RINEX files can
be used by software packages such as [GPSTk ](https://github.com/SGL-UT/GPSTk ),
[RTKLIB ](http://www.rtklib.com/ ) and [gLAB ](https://gage.upc.edu/gLAB/ ).
GNSS-SDR by default generates RINEX version
[3.02 ](ftp://igs.org/pub/data/format/rinex302.pdf ). If
[2.11 ](ftp://igs.org/pub/data/format/rinex211.txt ) is needed, it can be
requested through the `rinex_version` parameter in the configuration file:
```
2017-08-19 07:44:07 +00:00
PVT.rinex_version=2
2020-02-27 17:42:43 +00:00
```
- **RTCM SC-104** provides standards that define the data structure for
differential GNSS correction information for a variety of differential
correction applications. Developed by the Radio Technical Commission for
Maritime Services
([RTCM](https://www.rtcm.org/ "Radio Technical Commission for Maritime Services")),
they have become an industry standard for communication of correction
information. GNSS-SDR implements RTCM version 3.2, defined in the document
_RTCM 10403.2, Differential GNSS (Global Navigation Satellite Systems)
Services - Version 3_ (February 1, 2013), which can be
[purchased online ](https://ssl29.pair.com/dmarkle/puborder.php?show=3 "RTCM Online Publication Order Form" ).
By default, the generated RTCM binary messages are dumped into a text file in
hexadecimal format. However, GNSS-SDR is equipped with a TCP/IP server, acting
as an NTRIP source that can feed an NTRIP server. NTRIP (Networked Transport
of RTCM via Internet Protocol) is an open standard protocol that can be freely
downloaded from
[BKG ](https://igs.bkg.bund.de/root_ftp/NTRIP/documentation/NtripDocumentation.pdf "Networked Transport of RTCM via Internet Protocol (Ntrip ) Version 1.0"),
and it is designed for disseminating differential correction data (_e.g._ in
the RTCM-104 format) or other kinds of GNSS streaming data to stationary or
mobile users over the Internet. The TCP/IP server can be enabled by setting
`PVT.flag_rtcm_server=true` in the configuration file, and will be active
during the execution of the software receiver. By default, the server will
operate on port 2101 (which is the recommended port for RTCM services
according to the Internet Assigned Numbers Authority,
[IANA ](https://www.iana.org/assignments/service-names-port-numbers/ "Service Name and Transport Protocol Port Number Registry" )),
and will identify the Reference Station with ID=1234. This behaviour can be
changed in the configuration file:
```
2016-05-21 10:31:46 +00:00
PVT.flag_rtcm_server=true
PVT.rtcm_tcp_port=2102
PVT.rtcm_station_id=1111
2020-02-27 17:42:43 +00:00
```
2015-12-25 10:38:08 +00:00
2015-11-17 22:19:50 +00:00
**Important note:**
2020-02-27 17:42:43 +00:00
In order to get well-formatted GeoJSON, KML and RINEX files, always terminate
`gnss-sdr` execution by pressing key `q` and then key `ENTER` . Those files will
be automatically deleted if no position fix have been obtained during the
execution of the software receiver.
More documentation at the
[PVT Blocks page ](https://gnss-sdr.org/docs/sp-blocks/pvt/ ).
# About the software license
GNSS-SDR is released under the
[General Public License (GPL) v3 ](https://www.gnu.org/licenses/gpl.html ), thus
securing practical usability, inspection, and continuous improvement by the
research community, allowing the discussion based on tangible code and the
analysis of results obtained with real signals. The GPL implies that:
1. Copies may be distributed free of charge or for money, but the source code
has to be shipped or provided free of charge (or at cost price) on demand.
The receiver of the source code has the same rights meaning he can share
copies free of charge or resell.
2. The licensed material may be analyzed or modified.
3. Modified material may be distributed under the same licensing terms but _do
not_ have to be distributed.
That means that modifications only have to be made available to the public if
distribution happens. So it is perfectly fine to take the GNSS-SDR source code,
modify it heavily and use it in a not distributed application / library. This is
how companies like Google can run their own patched versions of Linux for
example.
But what this also means is that non-GPL code cannot use GPL code. This means
that you cannot modify / use GNSS-SDR, blend it with non-GPL code, and make
money with the resulting software. You cannot distribute the resulting software
under a non-disclosure agreement or contract. Distributors under the GPL also
grant a license for any of their patents practiced by the software, to practice
those patents in GPL software. You can sell a device that runs with GNSS-SDR,
but if you distribute the code, it has to remain under GPL.
# Publications and Credits
If you use GNSS-SDR to produce a research paper or Thesis, we would appreciate
if you reference the following article to credit the GNSS-SDR project:
- C. Ferná ndez-Prades, J. Arribas, P. Closas, C. Avilé s, and L.
Esteve,
[GNSS-SDR: an open source tool for researchers and developers ](http://www.cttc.es/publication/gnss-sdr-an-open-source-tool-for-researchers-and-developers/ ),
in Proceedings of the 24th International Technical Meeting of The Satellite
Division of the Institute of Navigation (ION GNSS), Portland, Oregon, Sept.
19-23, 2011, pp. 780-794.
2016-09-23 08:44:27 +00:00
2016-12-25 13:46:33 +00:00
For LaTeX users, this is the BibTeX entry for your convenience:
2016-09-23 08:44:27 +00:00
2020-02-27 17:42:43 +00:00
```
2016-09-23 08:44:27 +00:00
@INPROCEEDINGS {GNSS-SDR11,
AUTHOR = {C.~{Fern\'{a}ndez--Prades} and J.~Arribas and P.~Closas and C.~Avil\'{e}s and L.~Esteve},
TITLE = {{GNSS-SDR}: An Open Source Tool For Researchers and Developers},
2017-03-13 20:05:38 +00:00
BOOKTITLE = {Proc. 24th Intl. Tech. Meeting Sat. Div. Inst. Navig.},
2016-09-23 08:44:27 +00:00
YEAR = {2011},
2017-03-13 20:01:07 +00:00
PAGES = {780--794},
ADDRESS = {Portland, Oregon},
MONTH = {Sept.} }
2020-02-27 17:42:43 +00:00
```
There is a list of papers related to GNSS-SDR in our
[publications page ](https://gnss-sdr.org/publications/ "Publications" ).
# Ok, now what?
In order to start using GNSS-SDR, you may want to populate `gnss-sdr/data`
folder (or anywhere else on your system) with raw data files. By "raw data" we
mean the output of a Radio Frequency front-end's Analog-to-Digital converter.
GNSS-SDR needs signal samples already in baseband or in passband, at a suitable
intermediate frequency (on the order of MHz). Prepare your configuration file,
and then you are ready for running
`gnss-sdr --config_file=your_configuration.conf` , and seeing how the file is
processed.
Another interesting option is working in real-time with an RF front-end. We
provide drivers for UHD-compatible hardware such as the
[USRP family ](https://www.ettus.com/product ), for OsmoSDR and other front-ends
(HackRF, bladeRF, LimeSDR), for the GN3S v2 USB dongle and for some DVB-T USB
dongles. Start with a low number of channels and then increase it in order to
test how many channels your processor can handle in real-time.
You can find more information at the
[GNSS-SDR Documentation page ](https://gnss-sdr.org/docs/ ) or directly asking to
the
[GNSS-SDR Developers mailing list ](https://lists.sourceforge.net/lists/listinfo/gnss-sdr-developers ).
You are also very welcome to contribute to the project, there are many ways to
[participate in GNSS-SDR ](https://gnss-sdr.org/contribute/ ). If you need some
special feature not yet implemented, the Developer Team would love to be hired
for developing it. Please do not hesitate to
[contact them ](https://gnss-sdr.org/team/ ).
2014-04-27 19:46:23 +00:00
2014-04-27 21:58:32 +00:00
**Enjoy GNSS-SDR!**
2014-04-27 19:46:23 +00:00
The Developer Team.