This page has a download link for a Doppler display program, written for IBM compatible computers, including laptops which are suitable for mobile operation. Written and compiled in QuickBasic 4.0, the program size is 85K, and takes less than 2 minutes to download at 14.4K. Source code is available from me ( for free ) if you e-mail me and request it.

It has a simulation mode that allows the user to run the program with no input data.... you can download it and run it now... The COM port for the Doppler data can be either COM1 or COM2, at baud rates from 600 to 2400. ( my unit is 1200 ) It was deliberately written with an obsolete language, and features were kept to a minimum, ( monochrome ) so that it would be able to run on the greatest variety ( and oldest ) of computers. Anyway, it s free... Here is the download :

DOPPLER2.EXE ( non - compass display program for IBM PCs )


The figure below shows the display, running in a simulation mode. The length of the radial lines ( vectors ) is proportional to the number of DF readings obtained at a particular bearing. The range rings are set in increments of ten DF readings per ring. The scale auto - ranges to keep the longest displayed vector between the outside ( azimuth ) ring and the largest range ring.

The visual presentation is oriented for relative bearings , but you must keep the vehicle heading updated to ensure this remains true... The present DF bearing will always properly indicate relative bearing , even if the vehicle heading information is wrong. Vehicle heading is displayed at the 12 o clock position of the azimuth scale, and can be changed with the left / right arrows on the numeric keypad.

The various numeric readouts can be switched between magnetic and true degrees, except for the numeric readout of the DF itself... that was kept relative so that the readings on this display could be directly compared with the reading on the DF itself.

The last reported DF bearing is indicated with a large, empty circle ( the DF bug ) located just outside the azimuth scale. An adjustable cursor line ( with numeric readout in bottom left screen ) can be moved to any position with the up/down arrows on the numeric keypad.... it is also indicated by a small empty circle ( cursor bug ) outside the azimuth scale. Two more bugs indicate magnetic and true North.

Ten memory slots are available to save a display and recall it later. Each can be tagged with a 7 character name or identifier, entered by the user on the keyboard. Keyboard entries are made when required in the botton left corner of the display, which is ( otherwise ) kept empty, to minimize screen clutter.


Most of the features are fairly simple and obvious, and no explanation will be offered here, but there are three that are fairly subtle .

The SECTOR function causes individual DF readings to be painted in several adjacent bearings, as well as the proper ( DF - reported ) bearing... For example, if the sector width is set for 10 degrees, a DF report at bearing 035 will be painted at all bearings between 030 and 040. The sector size can be user - adjusted from 1 to 360 degrees. Default is 5 degrees.

This feature is provided because a single vector ten readings long is much more ( visually ) obvious than ten adjacent vectors one reading long , even though they are ( probably ) of equal significance. Ten separate readings ( on adjacent bearings ) should probably be treated as a single bearing, since they probably originate from a single ( common ) radio source.

This feature is non-destructive and reversible... the source data is not changed. You can try various sector values to see the results, and then restore the original display by returning the sector size to its original value.

The DECAY function provides a means to slowly erase old bearings. This is achieved by multiplying ALL the displayed vectors by a specific fraction, ( between 0 and 1 ) at regular time intervals. The fraction value and time interval is user adjustable.... default is 0.95 fraction, at 5 second intervals. ( 1.0 fraction = no decay ) This method results in a stepwise approximation of an exponential decay.

If the decay function causes the longest vector to fall inside the largest range ring , the auto - ranging function will automatically down - range to a lower scale. As a result, the remaining display will still fill the screen, but there will be fewer range rings. For learning purposes, try this : run the simulation until you get a display with 4 or 5 range rings, then turn off the acquire function and turn on the decay function.

The decay function is destructive... results of each decay operation replace the original source data. If you want to restore the original display, save a copy of it in memory before turning DECAY on.

The REDUCE function is similar, but operates by SUBTRACTING a specific number from all vectors, instead of MULTIPLYING them by a specific fraction. As a result, the differences between the peaks and nulls is enhanced, and ( more importantly) between major and minor peaks, as well. This occurs because subtracting a specific number from all vectors will have a larger percentage effect on small vectors.

The number used for subtration is related to the range of the azimuth scale, and changes whenever the azimuth scale changes.... in all cases, it equals 10 percent of the scale currently displayed. For example, if the azimuth scale displays 4 range rings, the display scale is 50 readings. ( 4 rings + az scale = 5 rings @ 10 readings / ring ) Under these conditions, invoking the REDUCE function will cause all displayed vectors to be reduced by 5 readings.

The REDUCE function is destructive... results of each reduce operation replace the original source data. If you want to restore the original data, save a copy of it in memory before invoking REDUCE. Typically, the REDUCE function must be invoked several times in succession until the display yields the desired result.

There are also two secret features, not identified on the display screen.... they were not important enough to display them. Both of them involve the simulation mode of operation. One I call FOCUS, and the other I call REVEAL.

The FOCUS function determines the amount of randomness of the simulated bearings. It is a number ranging from 0 to 1. A FOCUS value of 0 will cause a completely random display, and a FOCUS value of 1 will cause the random bearings to be very sharply focused around the main ( simulated ) bearing.

The default value for FOCUS is 0.8. You can adjust FOCUS to smaller and smaller values ( = more random ) as you learn to ( effectively ) use the other features to identify signal direction. It can accept two digits of fraction information, ( example : 1.25 ) and can be invoked by hitting the F key. The new value of FOCUS will not take effect until TEST has been turned off, and back on again. ( start another simulation )

The REVEAL function will reveal the main bearing for the simulation, and can be used to confirm or refute your choice for the correct signal direction. It is invoked by hitting the F key and entering R or r .... the correct bearing will briefly be displayed in the lower left corner. This value is expressed in RELATIVE degrees, so be sure to set the HEADING readout ( located at the 12 o'clock position of the azimuth scale ) to read "000" before you use the cursor to make your measurement of the "main lobe". Use the ( numeric keypad ) left and/or right arrow keys to do this.


Together, I believe these features ( and the basic display itself ) provide powerful tools for identifying the signal direction, even under adverse conditions... as the simulation runs, watch the bearing bug as it dances around the azimuth scale and ask yourself this question : If I had to identify the signal direction based on the information provided ONLY by this dancing bug , ( equivalent to an ordinary DF display ) could I do it ? ( I know I couldn t.... )

Still, there are ( almost certainly ) significant differences between randomness caused by a computer program, and randomness caused by multipath and signal reflections... the true effectiveness of these tools can be proven ONLY with field tests...

Even in the simulation mode, there is plenty of room for clever use of the tools, either individually, or in combination.

I find the REDUCE function seems to work best with a large set of accumulated data, ( 1000 readings or more ) in which there is no clear main lobe. Invoking the REDUCE function many times in succession will enhance the main lobe, significantly. The larger the data set, the less chance there is to make a mistake... statistically, the main lobe MUST ( eventually ) have more bearings ( however slight ) than all the others. The REDUCE function will enhance this slight difference, and make it obvious.

I find that the DECAY function can be used ( to some degree ) to measure the amount of randomness of the signal bearing... this happens because the azimuth scale auto-ranges up much more quickly if the signal tends to dwell around some specific bearing, ( within the window set by the value of SECTOR ) because the vector for that bearing will pump up more quickly, as a result.

As the scale auto-ranges up more and more, the spacing between adjacent rings becomes smaller and smaller, so it becomes harder and harder for a signal vector to ( consistantly ) remain in the area between the azimuth scale and the outermost ring...

Eventually, these two forces will achieve equilibrium, ( rate of vector growth and shrinking ring spacing ) and the display will tend to stabilize with a specific number of range rings...more rings implies greater DF bearing stability.

I also find that the SECTOR funcrtion is useful for revealing signal direction when used in a macroscopic way... setting the sector width to 30 degrees, 60 degrees, 90 degrees, or even higher will often reveal the general direction of a signal which appears completely random with a SECTOR value of only 5 or 10 degrees. In many cases, a general direction ( somewhere within 30 degrees of the real bearing ) is all that is really necessary to make a decision, since errors less than 90 degrees will ( eventually ) lead to success...


A few words about the simulations... each simulation generates a data set of 5000 bearings, so there are plenty of data points for each simulation. After 5000 bearings are plotted, the simulation repeats itself. Each time that TEST is turned off and back on, a different simulation is generated... The simulations appear to be repeatable from one session to the next.... simulation no. 1 always looks the same, simulation no. 2 always looks the same, etc.

The simulation runs at approximately the same speed as a real ( DF - generated ) display, which is approximately 7 to 8 DF readings per second. The acquisition speed is limited mostly by the math - intensive routines, such as the routines that generate the display vectors ( trig intensive ) and the SECTOR routines, especially if SECTOR is set to a large value.

... end of story...