Skip to content
Thrifty is proof-of-concept SDR software for TDOA positioning using inexpensive SDR hardware such as the RTL-SDR.
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs Basic Sphinx documentation generation infrastrukture Jul 6, 2016
example Change default detector config values Oct 29, 2016
fastcard Disable software-controlled bias tee support by default Feb 20, 2018
fastdet Fix copy and paste mistake Mar 2, 2019
rpi Add Rpi3 installation guide Jan 2, 2017
scripts Misc Jan 2, 2017
thrifty Misc Jan 2, 2017
.gitignore Add example of a thrifty config file Jul 22, 2016
LICENSE.txt Add license Jan 2, 2017
Makefile Add 'make dev' and 'make venv' Jul 6, 2016
README.rst Update README.rst: remove `-o` from `thrifty capture` Mar 5, 2019
pylintrc Make pylintrc less irritable Oct 10, 2016
pytest.ini Add Jul 6, 2016
requirements.txt Add 'make dev' and 'make venv' Jul 6, 2016
setup.cfg Add Jul 6, 2016 Add centralized CLI interface with dispatcher Jul 19, 2016



Thrifty is proof-of-concept SDR software for TDOA positioning using inexpensive SDR hardware such as the RTL-SDR.



To install thrifty:

$ sudo apt-get install python-pip
$ sudo pip install .


$ sudo python install

In addition to installing thrifty into the system's Python environment, this will also download and install the Python module requirements from PyPI.

To install thrifty in developer mode, which creates a symbolic link from the source location to the user's install location:

$ make dev

Thrifty requires fastcard to capture data. Refer to fastcard/ for installation instructions. Furthermore, refer to fastdet/ for more information regarding fastdet, a fast replacement for thrifty detect.

Refer to rpi/ for instructions on configuring an Raspberry Pi 3 for use as an inexpensive TDOA receiver.


A command-line interface (CLI) is available through the thrifty command. Run thrifty help for a summary of the modules that are available through the CLI.

Typical CLI workflow:

$ cd example/
$ vim detector.cfg   # edit config

$ # On RX0:
$ thrifty capture rx0.card
$ thrifty detect rx0.card -o rx0.toad

$ # On RX1:
$ thrifty capture rx1.card
$ thrifty detect rx0.card -o rx1.toad

$ # On server:
$ thrifty identify rx0.toad rx1.toad
$ thrifty match
$ thrifty tdoa
$ thrifty pos

Alternatively, use the Makefile:

cd example/
vim detector.cfg   # edit config
thrifty capture cards/rxX.card

Detection on slow hardware: see fastcard and fastdet.


  • Live detection without capturing (for monitoring):

    thrifty capture - 2>/dev/null | thrifty detect - -o /dev/null
  • Parallel capture-and-detection:

    thrifty capture rx.card
    tail -f rx.card | thrifty detect -

For advanced use cases, use the thrifty API from Python or IPython, e.g.:

"""Plot histogram of SoA offsets for all detections from TX #0."""

import matplotlib.pyplot as plt

from thrifty import toads_data

toads = toads_data.load_toads(open('rx.toads', 'r'))
data = toads_data.toads_array(toads, with_ids=True)
tx0_data = data[data['txid'] == 0]
plt.hist(tx0_data['offset'], bins=20)


Thrifty forms part of the dissertation at Please cite this dissertation when using Thrifty in your work:

  title={An inexpensive hyperbolic positioning system for tracking wildlife using off-the-shelf hardware},
  author={Kr{\"u}ger, Schalk Willem},
  school={North-West University (South Africa), Potchefstroom Campus}

Refer to for contact information.

You can’t perform that action at this time.