Black Cat Systems
Follow our tweets!

Mac OS X Software
Mac OS 9 Software
Windows Software
Ham Radio iPhone/iPad
Linux Software
Update Policy
Lost Reg Code?

Radiation Detectors
USB Icom CI-V Interface
MIL-STD-188 Interface

General Interest Programs

  Atomic Mac/PC
  Audio Toolbox
  Black Cat Timer
  Diet Sleuth
  Graph Paper Maker
  Health Tracker
  Knitting Wizard
  Label Wizard
  Prog Audio Gen
  Sound Byte
  Synth 76477

Amateur Radio Programs
  Black Cat CW Keyer
  Cocoa 1090
  Cocoa RTL Server
  DGPS Decoding
  DX Toolbox
  eQSL Factory
  Morse Mania
  RF Toolbox

iPhone/iPad Apps
  Atoms To Go
  dB Calc
  Clik Trak
  DGPS Decoder
  Drill Calc
  DX Toolbox
  Elmer Extra
  Elmer General
  Elmer Tech
  Feld Hellschreiber
  Field Strength Calc
  Function Generator Pad
  HF Weather Fax
  Morse Mania
  Morse Pad
  Packet Pad
  PSK31 Pad
  SSTV Pad
  Photon Calc
  Rad Map Tracker
  RF Link Calc
  SelCall Tone Gen
  Sound Byte
  Sound Byte Control
  Spectrum Pad
  SWBC Schedules
  Synth 76477
  Synth Motion
  Transmission Line Calc
  Weather Calc
  Wire Calc

iPhone/iPad Bundles
  RF Calculator Apps
  Ham Radio Decoder Apps
  Audio Utility Apps
  Shortwave Weather Apps
  Ham Radio Exam Study Apps
  Shortwave Decoder Apps

Android Apps
  Audio Function Generator
DGPS Decoder
  HF Weather Fax
  Rad Map Tracker
  SelCall Tone Gen
  Sound Byte Control
  SWBC Schedules
  Wire Calc

About Black Cat Systems
Geiger Counter
Site Map
Our software for Mac OSX
Privacy Policy
Apple /// Emulator

Macintosh Links
Shortwave Radio
Pirate Radio
Spy Numbers Stations
Science and Electronics
Ham Radio Software
Geiger Counters


Amalgamated DGPS

Decode The Entire DGPS Band From live audio, WAVE, and I/Q Recording Files

For Windows and Macintosh

The Differential Global Positioning System (DGPS) transmits correction information that improves the accuracy of the GPS system, from 15 meters to as good as 10 cm. These transmissions are in the 283.5-325.0 kHz band, and are interesting DX targets.

Stations in the United States and Canada typically transmit on 1 kHz channel steps, while those outside of North America can also use 0.5 kHz channels. Transmissions are at 100 or 200 baud, using MFSK. DGPS Data packets contain a 10 bit ID. This ID is not unique, but using a combination of the ID along with the frequency and baud rate allows the specific station to be identified. Data transmissions are continuous, so it is possible to receive many messages per minute from strong stations, as well as the occasional message from more distant or weaker stations. DGPS stations can be used as propagation beacons, observing when messages from the various stations are being received.

Amalgamated DGPS can decode the entire 285 to 325 kHz DGPS beacon band at the same time, from I/Q recording files made by several SDR (Software Defined Radio) programs. Namely:

I do not have all of these SDR programs, so I rely on recording files made by others, and therefore cannot guarantee that all work correctly.

It can also decode from a normal WAVE file, as well as from live audio. For decoding from audio, you specify the frequency the radio is tuned to (in USB mode) and the audio bandwidth, and it will try to decode any DGPS stations in that bandwidth, so you can monitor multiple frequencies at the same time, as many as will fit in the passband.

NOTE: If you're running Windows, this is the first release of this version. It seems to work here based on my testing, but there are likely still some rough edges. Bug reports are welcome, please include step by step instructions for reproducing them.

This app creates up to 164 parallel DGPS demodulators and decoders in software, and processes the entire DGPS band at once, looking for DGPS transmissions, decoding them if they are found, and adding timestamps to a log.

Decoding From SDR I/Q Recording Files

Ideally, set your SDR up to record a 50 kHz bandwidth from 280 to 330 kHz.

To analyze a recording file, run the app, choose Open I/Q File from the File menu, select the file. The app will then process it. It sets up a thread for each decoder, so it will use all of the available cores on your computer. This will cause your fans to run at full speed and stress test your processor(s)! Use at your own risk.

As the app runs, it will update a list of received stations, with the columns containing the following information:

  • Count: the number of decodes of this station.
  • ID: The ID number of the station, stations transmit either the ID or one of the reference IDs.
  • RefID1: The first reference ID of the station.
  • RefID2: The second reference ID of the station.
  • kHz: Frequency.
  • Baud: The baud rate, 100 or 200.
  • City: Station Location
  • Country: Station Location
  • Lat: Station latitude
  • Lon: Station longitude
  • km: The distance to the station from your location (make sure you set your location!)
  • deg: The bearing to the station from your location (make sure you set your location!)

(Click on the image to view full size)

While running, a progress indicator will update, showing how far along the decoding process is. You can select Stop Processing File from the Edit menu to stop.

Note that you can queue multiple files to decode one after the other. Click load and select the first file. Once it starts decoding, click load again, and select the next file, and so on. After a first file is decoded, the app will start decoding the next file.

Save Decodes from the File menu will save the decode information to a special binary file, which Load Decodes, also in the File menu, can be used to re-load. This is useful because it takes a long time to process I/Q recording files, so you can save the results after decoding them, then load them again to re-examine.

Save Tab Delimited from the File menu will save the list of decoded stations as a tab delimit text file.

Clicking on a station line will bring up a tooltip, showing the times of the first and last decode.

Double clicking on a station line will bring up another window showing the timestamps of all of the received messages. Selecting Copy Formatted Text from the Edit menu will copy the list of decodes to the pasteboard, so you can paste it into an email, word processor, etc.

If a timestamp is selected, and you select Delete Timestamp from the edit menu, you can delete that time stamp.

Copy will copy the list of decodes to the pasteboard, so you can paste it into an email, word processor, etc.

Back to the main window:

Selecting a line and then picking Delete Timestamps from the Edit menu will delete all of the timestamps for that station. Be careful if doing this while a file is still decoding, as the selected line could change, and you might end up deleting timestamps for the wrong station!

Also from the Edit menu:

You can clear all of the timestamps for the entire window.

You can copy the text from the window, to paste elsewhere.

Selecting Graphing window will bring up a window showing times each station was received, this can be useful for looking at propagation effects, as well as determining whether decodes(s) were likely legitimate or corrupted messages. Note that the graphing window will not update if the file is still being processed, you need to close and re-open it if you want to see additional information that has been decoded.

At the far right of each bar of decode times, the total number of decodes will be displayed.

At the top of the window, in the area that shows the time axis, there is also a red bar graph. This shows the relative number of messages per minute that were decoded. It can be used to roughly gauge how many message were being received at any time, and observe how propagation is changing.

Whether it is daytime or nighttime for your location, as well as each of the decodes, is also displayed. For your location, this is via the background color at the very top of the graphing window, it is yellow when it is daytime at your location. For the station decodes, they are plotted in yellow if it is daytime at the station location, and blue if it is nighttime. I believe I have the correct algorithm for determining daytime vs nighttime, let me know if you see any discrepancies.

(Click on the image to view full size)

At the top of the window, in the area that shows the time axis, there is also a red bar graph. This shows the relative number of messages per minute that were decoded. It can be used to roughly gauge how many message were being received at any time, and observe how propagation is changing.

Decoding from An Audio File

You can also decode from an audio file. The file must be in WAVE format, 44.1 kHz, 16 bits, mono. No other formats are supported. After you select a file, you need to specify some things.

Your radio should be in the USB mode when you record. The app can decode multiple DGPS channels at the same time, as many as will fit in the audio bandwidth.

First, the starting minute and second, this is used for the Z-count calculations (explained below). If you do not know the start time, or don't wish to have Z-count checks performed, then first go to the preferences for the app, and change the Max Z-count error to 9999.

Next, you need to specify the frequency the radio was tuned to, and the bandwidth of the audio. The app will then configure as many DGPS decoders as can fit in that bandwidth.

Decoding From Live Audio

Select Audio Input Decoding from the File menu. Select the audio input source from the popup menu. Next enter the frequency the radio is tuned to, as well as the audio bandwidth. Enter both in kHz, and make sure your radio is tuned using USB mode. Click the Start button. The app will start decoding the audio, looking for any stations on frequencies within the audio bandwidth (up to about 7 kHz or so). These decodes appear in the main window of the app. You may want to set your radio frequency to about 0.5 kHz below the first DGPS channel of interest.

I have noticed that the app sometimes stops displaying new decodes after a time period, clicking Stop and Start again fixes that. I am not sure yet what the problem is.

Station Map

Amalgamated DGPS can display a map, showing station as they are received. This map updates if you are decoding live, as well as from a recording. Select Station Map from the File menu to display it. By default it will only show stations received within the last second, this can be changed to all stations via a preferences option.

You can use Zoom In and Zoom Out from the Edit menu to adjust the zoom level, and you can pan around with your cursor, click on the map and move your mouse. You can also resize the window as needed.

You can click on one of these images to view it full sized:

UNID Stations

Select UNID Window from the Edit menu. This window will show a list of all stations that have been decoded that do not match a known ID/frequency/baud rate combination. Note that for this option to work, you must have preferences option “Just message types 6 and 9” turned off. This can be handy if you are looking for stations that are not in the app's database of known DGPS stations.

Preferences and Settings

Selecting Preferences from the Amalgamated DGPS menu lets you set several important things:

The Longitude and Latitude fields are used to set your location, in decimal, negative is west and south, positive is east and north.

Max z-count error is the maximum number of seconds the z-count of the received message can vary from the actual time. Smaller numbers are more restrictive and more likely to reject bad messages, but could also reject valid messages. I find a value of 6 works well, but you need to experiment. Note that it extremely important that your computer's clock is correct for the z-count error check to work correctly! Make sure it is accurate to a second. This field will default to a large number, which effectively disables checking the z-count. You can reduce this down to a lower number, but if you find you no longer get decodes, then double check that the clock is correct on the machine that you record your I/Q files.

Z-count offset is the offset between the transmitted z-count for all messages and UTC, it is used to compensate between GPS and UTC time. Currently a value of 24 works well.

Minimum Counts To Display sets how many messages must be received before a station will be displayed in the list. This can be used to prevent display of stations with a low number of messages, which could be all false decodes.

A checkbox allows you to also decode the 0.5 kHz offset channels used outside the USA. Note that this means it takes almost twice as long to decode a file.

There is also a checkbox to have the program check for updated versions at launch.

Another checkbox tells the app to look at just message types 6 and 9. Turning this off usually produces more decodes, at the expense of more false decodes.

If the auto save checkbox is checked, and the decodes have already been saved to a file, then after each I/Q file is processed, the decodes will automatically be saved to that same file. The process is as follows:

Make sure the auto save checkbox is checked,

Save your decodes to a file (even if there aren’t any, and the decode list is empty)

Start processing your files. After each is processed, the decodes will be saved.

If you clear the list of decodes, or select a new file to save decodes to and then cancel, the saved file name will be forgotten, and the app will stop automatically saving decodes.

There are preferences options to display all stations on the map, not just those recently received, as well as to display the number of counts after the station location text.

Step Minus Limit / Step Plus Limit / Step Size: Amalgamated DGPS can further torture I/Q data by demodulating on a series of frequencies, rather than just the nominal channel frequency. You specify three numbers here, the minus and plus values are the starting and ending frequencies, in Hz, as an offset, the step size is, as you might imagine, the spacing between frequencies. For example, I tend to use settings of -15 / 15 / 5, which means to step from - 15 Hz to +15 Hz below and above the nominal channel frequency, in 5 Hz steps. I find this can help get a few more decodes from very weak stations. It also significantly increases processing time. If you don’t want to use this feature, set the values to 0 / 0 / 1 Hz.

User Defined Station List

There is a built in station list, but you may wish to use your own. You can do this by placing a text file named dgps_station_list.txt in the same directory as the application. If this file is found, it will be used and a message saying such will be displayed when the program is launched, as well as how many stations were loaded from the file. Otherwise, the built in list will be used.

There is a sample file (which contains the same stations as built in) named dgps_station_list.txt.bak that came with the download. You can use this file as a starter, just remove the .bak from the end of it. You might want to keep a copy of this file, in case you want to start over.

Each line of text in the file is a set of semicolon delimited fields, in this order:

  • Station ID
  • Reference ID 1
  • Reference ID 2
  • Frequency in kHz
  • Baud rate
  • Latitude (north is positive, south is negative, must be in decimal format)
  • Longitude (east is positive, west is negative, must be in decimal format)
  • Location
  • Country

An example line:
809;18;19;289.0;100;28.4672;-80.5539;Cape Canaveral, FL;United States


Support for other SDR recording file formats is possible, you'll need to work with me by providing sample files and details on the format.

Initial development was done on the Macintosh version. Now there is a Windows version as well. It is still in early development, so while it “works”, there are likely some bugs.

Questions or suggestions? If you're a member of the website, you can post your question to the Software forum there

Download Options:

Amalgamated DGPS 1.0.4 for Windows - Windows 10, probably 7 and 8, maybe Vista and XP?

Amalgamated DGPS 1.0.4 for Mac OS X - Mac OS X 10.6.8 through 10.12 Sierra, Intel only

Amalgamated DGPS is offered without any warranty at all. Use at your own risk. Guaranteed to blow up your computer, zap your radios, and destroy the ionosphere. Keep away from Al Fansome at all costs.

Email your comments and questions to

Last modified February 27, 2017