In depth study of the VOR signals (part 1)

[this post is a complete rewrite of the initial article , lost in my blog crash]

I. Introduction : What is a VOR, my motivation

The VHF Omni Range (VOR) system was designed in 1937 and deployed by 1946 to provide a solution for airplanes to estimate their position and to follow their route by indicating bearing angle towards ground radio transmitters. At that time the system had to be completely based on analogue hardware and the design engineers created a sophisticated modulation scheme for easy processing at the receiver. There are now around 3000 VOR transmitters over the world, and this number is now decreasing, progressively replaced by GNSS systems like GPS or the coming European Galileo. Operating in the 108 to 118 MHz band, these transmitters have been broadcasting their dual-modulation signals towards the aircrafts for more than 50 years and are still widely used by all types of aircrafts (see [1]). For several works on passive radar [see refs 2,3 and 4]  I had to study in depth the signal transmitted by this system. One can find different details on the signal structure, my motivation was to check how accurate they were. In this post I will describe the technique I used to process the signals acquired using a DVB-T SDR dongle and MATLAB.

II. Signal model – How it works

A typical VOR transmitter is shown in figure 1 (image from Wikipedia)

Figure 1 - VOR ground transmitter

Figure 1 – VOR ground transmitter

A central antenna transmits the REF signal, with a 30 Hz frequency-modulated signal. Meanwhile, other antennas (initially mechanically rotating and now using phase shifting techniques) transmit on a second carrier an amplitude modulated signal so that, from a given angle, the aircraft receives the two signals with a phase difference proportional to bearing to the station (figure 2).

Figure 2

Figure 2

Figure 3 shows the internal structure of a VOR receiver, as they were built in the “analogue era” before using digital signal processing. An envelope detector extracts the AM modulation at Intermediate Frequency (IF). The resulting signal is split in two branches:

Figure 3

Figure 3

  • A first branch, containing the REF signal (showing the North direction) is band-pass filtered and the FM sub carrier extracted,
  • A second branch, containing the VAR signal (indicating the current angle to the VOR) is low-pass filtered.

The two resulting signals phases are then compared and the resulting difference is amplified to drive the instrument needle. We can find in the literature the following equation (see figure 4) to describe the time domain signals transmitted by the VOR ground station:

Figure 4 - VOR equation

Figure 4 – VOR equation

To check this model is accurate… lets find a signal, analyse it and compare with this equation !

III Field validation – collecting RF data and analysis

I leave a few miles away the Rambouillet VOR transmitter (callsign is RBT), active on 114.7 MHz. I decided to go next to it with a RTL-SDR dongle and collect some samples to see what’s inside the signal. Figure 5 shows my car location respective to the transmitter.

Figure 5 - VOR transmitter position

Figure 5 – VOR transmitter position

I used HDSDR and the small antenna shipped with the dongle. Figure 6 below shows the waterfall spectrum I got :

Figure 6 - HDSDR VOR Waterfall

Figure 6 – HDSDR VOR Waterfall

The VOR signals were acquired using the 1M samples per second setting, I manually set the gain to have a good SNR but no saturation (I was very close to the VOR, usually the transmitters use around 200 Watts).


What can we say from the waterfall (from center to side bands) ?

  1. We have one narrow band signal in the middle, consistent with the VAR signal definition;
  2. We have one audio carrier, amplitude modulated (symmetric). Use the waterfall to decode the signal ;-) “BT” is the end of the VOR callsign very slow keying
  3. One other ‘multi trace’ symmetric carrier approx 9600 Hz away from central peak, should be the REF signal.

Let’s see how we can decode and process this signal with Matlab (or Octave).

First, we need to load the audio (RF) samples from the wav file into the working space :

this loads (be patient…) the complete file, processes the Left and Right to complex samples and plots the spectrum of the complete file. You should get something like this:

VOR spectrum

VOR spectrum

We collected much more than required, and the file is huge… but lets zoom around 114.7:

VOR spectrum - zoom

VOR spectrum – zoom

Okay, consistent with HDSDR display. Next step is to remove extra band and just keep the useful bandwidth. If the math showed before is correct, we should only keep from -9600+REF_WIDTH to +9600+REF_WIDTH. That’s around 30 KHz wide.

We will use a 15 KHz low pass filter, it will remove all but what we want to keep. Let’s go and see what we get (we start with a simple 128 taps filter)

at first glance that looks nice… but zoom in the center, you should have that :

After low-pass filtering

After low-pass filtering

It looks like we are a bit off the center of the spectrum, so we are also removing wanted signal… we have to “shift left” the spectrum, so we need to mix it (multiply) with a complex signal of frequency -offset. I estimated visually on spectrum the offset to be 9950 Hz. Our software mixer is like follows:

apply our filtering like before, plot and look what it is now:

VOR spectrum after mixing - zoom

VOR spectrum after mixing – zoom

That’s much better, but it seems :

  1. The removal of extra signals is not that good,
  2. The shape of the noise is not that flat …

this is because our initial filter cutting at 15 KHz with 128 taps is not sharp enough. As we have time and we are rich … we change the settings of the filter to :

(feel free to try other values of taps, you’ll see how long it takes ;-)). This leads to:

Zoom after extending the FIR low-pass filter number of taps

Zoom after extending the FIR low-pass filter number of taps

As our signal is now band-limited, we have in fact too much samples… we can “downsample” (lower sampling rate) and trash most of them. In fact we have an initial sampling rate of 1028571 samples per second, but we only need 30000 samples per second (our useful bandwidth). this means we can keep only 30000/1028571 samples. To make it simple, we’ll keep 1/32 of the band.

OK ! we have our base band samples, and now Matlab breathes again…

Here is the final Matlab code for the VOR signal extraction :

Stay tuned for tutorial continuation !



[1]     Nordian – VOR and Doppler VOR” –

[2] Automatic real-time collection of RCS of airplanes in a real bistatic low-frequency configuration using a software defined passive radar based on illuminators of opportunity, J. Pisane, S. Azarian

[3] Experimental RCS acquisition system: Using software defined radio to build a classification datasetSylvain Azarian, Jonathan Pisane, Radar (Radar), 2013 International Conference on

[4] Automatic Target Recognition for Passive Radar; J. Pisane, S. Azarian, Aerospace and Electronic Systems, IEEE Transactions on, 2014/1