Skip to main content

A small library to calculate the bearing of a VOR signal from a WAV file.

Project description

Python VOR Decoder

This repository contains a pure Python implementation of a VOR (VHF Omnidirectional Range) radio navigation signal decoder. The code is based on and adapted from the work of martinber, with additional comments, explanations, and minor modifications for clarity and usability.

Overview

VOR is a type of radio navigation system for aircraft, allowing pilots to determine their position and bearing relative to a ground-based VOR station. This decoder processes a WAV file recording of a VOR signal and extracts the bearing information using digital signal processing techniques.

Features

  • Pure Python implementation using NumPy, SciPy, and Matplotlib
  • Signal processing pipeline including:
    • Lowpass and bandpass FIR filtering
    • Sample rate decimation
    • FM subcarrier demodulation and phase extraction
    • Cross-correlation for phase comparison
  • Visualization of signals in both time and frequency domains at each processing step
  • Calibration support for phase alignment

Testing

I tested the code using the signal from the VRN airport in Verona, Italy. The code successfully decoded the VOR signal and displayed the correct bearing with a small approximation.

Test points

Map of the test points

The following test points were used, with their respective bearings:

  • 45.377740N 10.880124E: Measured 211° - Displays 208°
  • 45.392627N 10.905900E: Measured 181° - Displays 176°
  • 45.409503N 10.883784E: Measured 275° - Displays 270°
  • 45.412321N 10.900993E: Measured 322° - Displays 315°
  • 45.418328N 10.930478E: Measured 58° - Displays 52°

Usage

WAV recording

Record a VOR signal as a WAV file (mono or stereo). The recording should capture both the AM reference and FM variable signals.

  • The receiver should be set to AM mode with a bandwidth of 22KHz
  • Recording should be saved with a minimum sample rate of 48KHz (96KHz preferred)
  • There is no need to record more than 1 second of audio, as the decoder processes the signal in chunks.

Calculating using Jupyter Notebook

The Jupyter Notebook at VOR_Decoder.ipynb provides an interactive environment to process the recorded WAV file and extract the bearing.

It displays the decoding steps, including the original signal, filtered signals, and the final bearing result with visualizations.

  1. Set the FILENAME variable in the notebook or script to point to your WAV file.
  2. Run the notebook or script to process the signal and extract the bearing.

Calculating using Python library

  1. Install the library using pip: pip install python-vor
  2. Import the get_bearing function from the library: from python_vor import get_bearing
  3. Call the function with the WAV file path and optional parameters:
from python_vor import get_bearing
offset = 216  # Optional offset to add in the VOR calculation
bearing = get_bearing(str(wav_file), offset=offset)
print(f"Bearing for {wav_file.name}: {bearing:.2f}°")

Processing details

The processing steps include:

  • Loading and displaying audio statistics
  • Filtering and decimating the reference and variable signals
  • Demodulating the FM subcarrier
  • Extracting and filtering the variable signal phase
  • Comparing phases to compute the bearing

Dependencies

  • numpy
  • scipy
  • matplotlib (only for the Jupyter Notebook visualization)

Install them via pip if needed:

pip install scipy==1.16.0
pip install numpy==2.3.1

Contributing

Please refer to the CONTRIBUTING.md file for guidelines on contributing to this project.

Attribution

Original code and algorithm by martinber.
This repository provides a cleaned-up and commented version for educational and practical use.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_vor-0.0.1.tar.gz (11.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_vor-0.0.1-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file python_vor-0.0.1.tar.gz.

File metadata

  • Download URL: python_vor-0.0.1.tar.gz
  • Upload date:
  • Size: 11.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for python_vor-0.0.1.tar.gz
Algorithm Hash digest
SHA256 eff1474011993169c19de8d774d3de9fd2e202e30cfa2dd777917fffa1069165
MD5 4fd963184d4da26e253bbcd8350ae70b
BLAKE2b-256 0504d3c1603898e12ae9a697fbe76813adcefd57fcbab30bba61ff8608f3a5e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_vor-0.0.1.tar.gz:

Publisher: publish.yml on iu2frl/PythonVOR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_vor-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: python_vor-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for python_vor-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ad63b3f2ed2bfd96563d13889f21170c2812e236845b465f5170562b6284dd68
MD5 a7a9f3480b3a1fab478c766b1ee0cb0f
BLAKE2b-256 b59a9e042d780949b304f8fa2ac74000cd1e73472c2428c9b9368e6fac98f603

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_vor-0.0.1-py3-none-any.whl:

Publisher: publish.yml on iu2frl/PythonVOR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page