A cell tower illuminated by a bright light.

Building a Monopulse Signal Tracker with ADALM-PLUTO

This will be the last post in this blog series!  Not because we’ve run out of things to do with our Pluto Beamformer, but instead it’s because we have an exciting new beamformer project to start for my next blog entry.  So, stay tuned for that.  You can always find all my blog postings here.

Last week, we got the Pluto two element digital beamformer working.  And now that it’s working, there are many cool things we could do with it.  For this final blog post, we’ll cover one of those by building an adaptive signal tracker.    We will scan the room, find the signal source, and then lock onto it so that even as the signal source moves, we never need to rescan. We will always have the perfect phase shift to give us the peak signal and maximum signal to noise ratio (SNR). 

Monopulse Tracking Introduction

Recall that in the last blog, we formed a receive beam and then determined in which direction the transmitter was.  That gave us the direction of arrival (DOA).  But to get that DOA, we had to scan all possible phase shifts and then pick the highest signal strength.  That means for a real radio system, we would have to periodically interrupt our download stream, and rescan.  Then pick the best optimal signal to noise ratio (SNR) phase shift, and then re-establish the link.  It's just not a very efficient communications link.  Thankfully, smart people have figured out better ways to do this.  And perhaps the most popular method to is to use “Monopulse Tracking.”    

Monopulse tracking is a very clever technique, first demonstrated in the 1940s, and still widely used today.  We’ll do one variation of that technique here—but there are many other types.  Let’s start at the beginning and walk through how this works.  From our last blog, we formed a receive beam and had a setup that looked like this:

Receive Beam setup

Let’s call that receive beam the “Sum” beam.  Because it is formed by the summation of RX1 and RX2.  And when we plotted it using Python, we saw something like this:

Python plot diagram

So that looks good, and the red line highlights the DOA.  But we could also subtract Rx2 from Rx1, and we’ll call that the “Delta” beam.  If you do this, you’ll see a very interesting shape emerge:

Python plot diagram 2

The Delta beam gives a sharp null at precisely the peak of the Sum beam.  Let’s plot one more thing:  the phase difference between the Sum beam and Delta beam.  If we do, we get this even more interesting curve:

Phase difference between the Sum beam and Delta beam

The phase difference goes from negative to positive exactly at that DOA point.  And with that curve, we now have all the information we need to explain the concept of monopulse tracking. 

How Monopulse Tracking Works

Let’s say the array was pointed at the blue dot below— you’re somewhere pointed off the Sum beam peak.  And of course, you want to get to the Sum beam peak because that’s where the highest SNR is going to be. 

 Phase difference diagram

How could you know, just from that one buffer of Pluto data (without seeing any of the other points on that curve), how much and in which direction you needed to adjust the phase shift?  Easy!  The difference from Sum to Delta (black arrow) is inversely proportional to the magnitude of your DOA error.  And the polarity of the phase difference tells which direction to shift the phase.  That’s the basic idea behind monopulse tracking.  Or at least that’s my quick explanation of it.  For a much better explanation, I recommend MIT’s “Introduction to Radar Systems” lecture #9.   But now let’s build it!

Monopulse Tracking in Python with Pluto

You can find the completed Python script, "Pluto_beamformer_MonopulseTracking.py",here.  And a video walkthrough of all this is located here:

Hopefully, by now that Python file is looking straightforward to you.  There are just 3 new functions added:  scan_for_DOA, monopulse_angle, and Tracking.  The “scan_for_DOA” function does one complete scan of all possible phases and then finds the peak response.  This gives us our starting point.  And at startup is the only time that we will do this scan. 

 Python code

The monopulse_angle function performs the phase subtraction between the Sum and Delta data points.  Many thanks to Dr. Travis Collins for suggesting I use the correlate function instead of simple time domain subtraction I was using previously

 Python code

Finally, the “Tracking” function takes a single buffer of Pluto data and decides if we need to increase or decrease the phase shift.

 Python code

Let’s Try It!

So now if you hit run, you should see a strip chart style display that updates the DOA versus time.  And as you move the transmitter around, it will stay perfectly centered—all without doing any beam scans!



With that monopulse tracking example, I’m going to conclude this two element digital beamforming blog series.  I hope it was interesting and helpful.  In my next blog post, I'll begin a series of beamforming projects using the newly released 8 element PHASER!  And there’s a lot more we can do with 8 elements!