Decoding the Entire DGPS Band At Once

DGPS stations transmit the difference between positions indicated by GPS satellite systems and the known fixed position of the station. This allows higher accuracy. DGPS transmissions are 100 or 200 baud and are transmitted on frequencies from 285 kHz to 325 kHz in the longwave band. Hundreds of these stations are operated by the Coast Guard and other agencies around the world, and they can be interesting DX targets. Each station transmits a continuous stream of messages containing correction data for GPS. These messages also contain the station ID code, so they can be used to directly ID the station.

The usual way to DX these stations is to tune your receiver to a particular frequency, run your DGPS software (which I have for Android , iPad/iPhone and Mac OS X) set for one baud rate, and wait to see what station(s) are heard on that frequency. Then change baud rates, tune to the next frequency, and try again.

Since SDRs are capable of recording a chunk of the RF spectrum directly to a disk file, I realized that a decoder could be written to demodulate all of the DGPS channels at the same time, at both baud rates. They write this data as a I/Q file, storing the complex representation of a portion of the RF spectrum. A 50 kHz bandwidth is slightly more than enough to cover the entire DGPS band. I set my SDR software up to record overnight, then in the morning I can run the recordings through the software, and see what stations are present.

The software sets up 82 SSB demodulators, two for each of the DGPS channels, one is for decoding 100 baud and the other for 200 baud, that allows me to use a more narrow filter for the 100 baud case. The output of each demodulator goes to a DGPS decoder that looks for valid messages. A message is considered valid if it starts with the correct preamble byte, is of message type 6 or 9 (the most common sent), has a z-count (which is a time code offset from the hour) that is within a few seconds of what it should be, and passes the 6 bit parity word test. This eliminates the vast majority of bad message decodes, although every so often one will sneak through. This is because you can get multiple bit errors on a message that corrupt both the data and parity word in such a way that the parity check still passes. It is still necessary to visually inspect the decodes, and decide if a seemingly amazing DX catch is realistic, or more likely just a bad decode.

Below is a screenshot showing the output of approximately 24 hours of recordings of the DGPS band.

The columns containing the following information:
• Count: the number of decodes of this station.
• ID: 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.
• deg: The bearing to the station from your location.

Below is a text copy of the data:

   Count   ID ref1 ref2  kHz Baud                           City              Country      Lat      Lon     km Deg 
      22  918  310  311  286.0  200                    Wiarton, ON               Canada    44.75   -81.12    655 330 
   94810  804    8    9  286.0  200                 Sandy Hook, NJ        United States    40.47   -74.02    267  70 
     117  886  272  273  287.0  100               Fort Stevens, OR        United States    46.21  -123.96   3772 296 
   17277  942  340  341  288.0  200                   Cape Ray, NL               Canada    47.64   -59.24   1667  52 
     680  809   18   19  289.0  100             Cape Canaveral, FL        United States    28.47   -80.55   1288 195 
   43711  806   12   13  289.0  100                     Driver, VA        United States    36.96   -76.56    306 172 
    7955  869  168  169  290.0  200                 Louisville, KY        United States    38.02   -85.31    742 258 
   22384  799   44   45  290.0  200                  Penobscot, ME        United States    44.45   -68.78    858  49 
     318  836  112  113  292.0  200                  Cheboygan, MI        United States    45.66   -84.47    899 319 
   22854  778  192  193  292.0  100                 Kensington, SC        United States    33.49   -79.35    721 197 
   45542  803    6    7  293.0  100                   Moriches, NY        United States    40.79   -72.76    379  69 
     255  814   28   29  293.0  200               English Turn, LA        United States    29.89   -89.95   1601 231 
   44167  771  196  197  294.0  100                   New Bern, NC        United States    35.18   -77.06    502 180 
   25472  929  312  313  296.0  200          St Jean Richelieu, QC               Canada    45.32   -73.32    693  24 
    1519  830  100  101  296.0  100            Wisconsin, Point WI        United States    46.71   -92.03   1438 307 
   50006  792  136  137  297.0  200                       Bobo, MS        United States    34.13   -90.70   1361 247 
    2018  937  330  331  298.0  200              Hartlen Point, NS               Canada    44.58   -63.45   1237  59 
    9872  831  102  103  298.0  100             Upper Keweenaw, MI        United States    47.23   -88.63   1252 315 
   22843  866  162  163  299.0  200                   Sallisaw, OK        United States    35.37   -94.82   1635 258 
   20580  926  318  319  300.0  200            Riviere du Loop, QC               Canada    47.76   -69.61   1072  31 
     692  871  172  173  300.0  100                   Appleton, WA        United States    45.79  -121.33   3584 295 
       1  828  246  247  301.0  100                   Angleton, TX        United States    29.30   -95.48   2035 241 
   97637  847   58   59  301.0  200                  Annapolis, MD        United States    39.02   -76.61     82 156 
      42  972  901  902  302.0  200                     Miraflores               Panama    8.99    -79.58   3384 184 
      73  881  262  263  302.0  100                 Point Loma, CA        United States    32.68  -117.25   3613 270 
      10  816   32   33  304.0  100               Aransas Pass, TX        United States    27.84   -97.07   2255 240 
   43885  777  218  219  304.0  200                     Mequon, WI        United States    43.20   -88.07    998 296 
      64  919  308  309  306.0  200                   Cardinal, ON               Canada    44.78   -75.42    579  12 
   85388  772  198  199  306.0  200                   Acushnet, MA        United States    41.75   -70.89    562  64 
    1196  934  336  337  307.0  200                 Fox Island, NS               Canada    45.36   -61.10   1440  58 
     568  971  903  904  307.0  200                          Gatun               Panama    9.26    -79.94   3358 185 
     899  927  316  317  309.0  200                     Lauzon, QC               Canada    46.82   -71.17    920  28 
   88266  870  170  171  309.0  200                Reedy Point, DE        United States    39.57   -75.57    123  96 
    3939  944  342  343  310.0  200                Cape Norman, NL               Canada    51.51   -55.83   2082  44 
   33700  863  156  157  311.0  200                 Rock Island IL        United States    42.02   -90.23   1139 287 
    3263  935  334  335  312.0  200               Western Head, NS               Canada    43.99   -64.67   1123  60 
   18438  827  244  245  312.0  200                      Tampa, FL        United States    27.85   -82.54   1410 202 
    7487  925  320  321  313.0  200                      Moise, QC               Canada    50.20   -66.12   1440  32 
     269  764  210  211  314.0  200                    Lincoln, CA        United States    38.85  -121.36   3723 283 
   28554  808   16   17  314.0  200                 Card Sound, FL        United States    25.44   -80.45   1613 192 
    3502  940  338  339  315.0  200                  Cape Race, NL               Canada    46.66   -53.08   2068  60 
   14236  864  158  159  317.0  200             St Paul [Alma], MN        United States    44.31   -91.91   1328 297 
     115  936  332  333  319.0  200            Point Escuminac, NB               Canada    47.08   -64.80   1277  46 
   66589  838  116  117  319.0  200                    Detroit, MI        United States    42.31   -83.10    587 301 
   19514  865  160  161  320.0  200              Millers Ferry, AL        United States    32.10   -87.40   1258 231 
   14448  862  154  155  322.0  200                   St Louis, MO        United States    38.62   -89.76   1104 267 
    9262  839  118  119  322.0  100                 Youngstown, NY        United States    43.24   -78.97    426 337 
   83262  844   94   95  324.0  200               Hudson Falls, NY        United States    43.27   -73.54    490  34 

Most likely the Wiarton and Angleton decodes are corrupted messages, as the frequencies they use are both dominated by strong semi local signals.

Another way to look at the decoded data is with this graph, that shows the times that messages were received from each station (click to view full sized):

You can see the various times stations were decoded. There are cases where a single decode was received (just a thin line), which was possibly a garbled message. But there are also cases for DX stations where several messages in a row were received (a thicker line). It is quite improbable that many messages were garbled in a row, with exactly the necessary bit errors to change the ID of the station, but also preserve the parity word check.

It is interesting to observe how two stations on a given frequency will alternate reception, as one fades out and the other fades in.

A very preliminary beta version of this program, Amalgamated DGPS, is available for download for those who wish to try it. It is only for Mac OS X, and requires I/Q recording files made in either the RF Space or Perseus format (and note that I have only tested with the former, the latter should work, but you never know). While there is no Windows version available at present, I may have one available shortly, so stay tuned!

One thought on “Decoding the Entire DGPS Band At Once

  1. Pingback: Decoding the Entire DGPS Band At Once, Part 2 | RadioHobbyist.org

Leave a Reply

Your email address will not be published.


5 − four =