More Messages with Beamforming

All ADS-B signals can be up to twice as strong. I can’t say how many more planes this means can be tracked. It is the same unit used with a low noise amplifier. Each of your radio boards also has a LNA and usually you can adjust this. The beamforming adds up to 3dB to that final number.

Ok, 3-dB in signal level, So it’s like having 3-dB more antenna gain. Range should be increased by a factor of approximately 1.4.

I just had a quick look here. @kburtes42, you are probably aware of this part of the pysdr book: Beamforming & DOA | PySDR: A Guide to SDR and DSP using Python

Only up to the point where the aircraft drops below the horizon. This is at about 250 miles (400km) for a plane at 40,000ft. Beyond this point the loss will increase rapidly as the aircraft drop further below the horizon, so you will only get a marginal increase if you are already receiving to the radio horizon.

4 Likes

Oh, perfect. I love reading this stuff. I have not read this one yet. Thanks.

@LawrenceHill @jimMerk2 . The maximum range depends also on two other factors. Your observation height (and what horizon means from there) and the weather. “A plane flying at 40,000ft” is with respect to its barometric altitude. This is a plane currently flying over the south of Italy at FL400

this is another plane flying at FL400, but over Germany

You can see from the gps altitude (wgs84) that there is a difference of 1,000ft and the local pressure difference between Germany and Italy is actually not too extrem.

1 Like

I tried the minimum variance distortionless response (MVDR) beamformer for DOA with just two elements like I got but the results were exactly the same as with a conventional beamformer where you just calculate the theta and don’t rely on the spatial covariance matrix. I noticed the MVDR varies the amplitude of the antenna weights. Remember when I was varying the amplitude of the antennas? That is interesting.

My antennas also need to be outside. It’s no telling if my house is distorting the results via reflections and stuff.

However, the MVDR does have a sharper response with DOA making it better if I had more than one signal on the DOA. So, it’s doing some black magic but as far as applying it to searching for airplanes and tracking a target it’s not going to help unless I find out the right way to look at it. I will keep working on it but I might have to continue forward.

I might also try to wire up two of these boards so I can get four antennas going. Hooking up and using the clock sharing cable is easy but I’ve got to do some wiring on the pin headers to get the two cards to start streaming at the same clock. Otherwise, it’s like trying to get two RTL-SDR’s to stream at the same time using the USB bus - ignoring their clock differences.

I put together a little battle of the beamformers. I used the MVDR, a conventional beamformer, and the random method. I used a pre-recorded file so I wasn’t constrained by time to process and losing samples. I took a message as something that had a good preamble, using the antirez’s simple implementation, and it had to have a good checksum or a correctable one up to 2-bit errors.

Since it was written in Python it was slow so I couldn’t process as much as I would have liked. I don’t get a high message rate in the middle of nowhere and with my antenna setup so the numbers are not big but the difference in the methods was noticeable.

For the random, I used the rough equivalent of 16 threads and 19 cycles each. It was actually exactly 300 random probes per buffer processing. I normally use 16 threads and 20 cycles. This checked about 300 random directions per buffer.

For the MVDR and conventional I used 300 directions spread over [-PI/2, PI/2]. So that was 300 checks per buffer for each.

The program is:

The results after 40.9 seconds are:

MVDR 1395 CONV 1618 RANDOM 1500

Why the MVDR doesn’t perform better I don’t know but it’s still staying up there. The random is performing quite well but honestly it looks like for the processing power used it might be better to just split the search space up across the threads like obj was thinking.

It’s so slow I will have to let it run all night and see what it says.

It is too early to tell. I’ve got to analyze the data, but I may have got two BladeSDR cards sharing the same clock and triggering sample streaming at the same instant. If so that means I now have four coherent RX channels.

I’ve got four antennas in a 2D pattern.

I had to add the trigger functions to the Python library. I will let you guys know how it goes.

After two seconds of processing, I only got 126 good messages with just two antennas. With four antennas I got a total of 545 messages. An increase of 4x. So, that might be another 3dB for a total of 6dB of gain from the array doing that.

If anyone wants a sample file to play with just let me know.

In lieu of getting my antennas setup outside I’m going to try a bit of a radical experiment.

I’ve got my antennas picked out. I’m going to try to get 4 of the FlightAware omni outdoor antennas. I’ve just got to wait up to a month or maybe less. Plus, I’ve got to get a mast and mount them up. But in the mean time….

I’ve decided to use A.I. or a deep neural network to see if it can make sense of the steering vector for the antenna elements and the GPS coordinates. I’m hoping it might be able to translate coordinates and altitude into a steering vector. I’ve played with a DNN before and it was pretty good at figuring out functions.

I just wanted to leave this in case anyone had any thoughts, suggestions, ideas, criticisms, or what not on the venture. I’ve read they’ve used A.I. to solve problems related to beamforming and complex antenna arrangements so… what could it hurt to see what sense it makes of the data.

I’ve just got to amass up a sizable amount of data. I’ve already got the data mined for the coordinates and steering vector. I just have to get enough and apply it to a DNN.

1 Like

It failed at providing useful information. Training a model to take a steering vector and turning it into a GPS coordinate did not work. I just wanted to try to see if it might work.

Back to the drawing board…

May I ask how tall your antennas are above ground level?

Thanks.

They are on the floor of my house. It’s about 3 feet from the ground.

1 Like

I think ground/earth attenuates rf. Any chance of getting taller? I realize my Q’s are not directly on-topic, but the better the data, they say ….

“I’m going to try to get 4 of the FlightAware omni outdoor antennas. I’ve just got to wait up to a month or maybe less. Plus, I’ve got to get a mast and mount them up. But in the mean time….”

Gotcha! :smiley:

It’s fine. I don’t mind. Yeah, hopefully, if I get them up there, I can get a big boost to the signal. I am also using some antennas that are wideband and they likely pick up all sorts of interference from cell towers which I believe overloads the frontend. When I get these antennas that are tuned to 1090MHZ it should make a world of difference too.

And I’m hoping it straightens out the theta measurements for direction finding and signal tracking purposes. I’ve been suspect the house is playing tricks with the signal pushing it out of phase from this or that direction.

I am sorry, probably i am a bit of a noob here. But i will ask the question anyways:

What is the goal here? Simple answer: More messages. But i am very confused about all this word “gain”.

My very basic understanding is that a bladerf can do a serious sample rate. 60? So isn’t then the idea that you can sample 15 sectors at 4 MHz?

You’re just going to sample 60MHZ of bandwidth and then you’d have to filter that to knock out the interference if there is any. I’m not sure what all is beside 1090MHZ. I’ve read some stuff where a higher sampling rate can provide gain and even see signals on top of other signals.

If you want 15 sectors you can just beamform by doing 15 beamforming pipelines at whatever sample rate you want to use for whatever purposes. And each pipeline has a decoder because a message might pop out in one of the beams and in another beam, it might disappear letting a message that would have been smaller but on top of it pop out.

There are also nulls formed when beamforming so it’s possible an aircraft with a strong signal would be attenuated in certain beams making room for other messages to fit in. It essentially increases the bandwidth of the communication system. You know in terms of max messages that can be transmitted say back-to-back and in sequence at 1090MHZ is increased when forming beams because you form individual channels by splitting up space.

The word gain is coming from two antenna which could provide a gain of 3dB since the same signal constructively added can be twice in magnitude and might pop out of the noise. Then if you have four antennas you might have 6dB.

However, I could be wrong. Please do tell me if you think I am wrong. I might be missing something myself. The whole thing is rather complicated.

Another way to look at it is how the newer WIFI standards use beamforming. They can find channels/beams that have enough isolation between then in dB to support a modulation. The more isolation the higher the two modulations can be. It could start at BPSK with the lowest isolation between two beams and then upgrade. You get multiple channels dependent on how many antennas you have… I forgot why it’s dependent on that… which are at the same frequency, same bandwidth, and same time carrying different data streams that can be combined at the end into a single stream of higher throughput.

I should add another good example is two highly directive antennas each pointed as it’s other pair. The two antennas provide enough isolation between the two to support a modulation and this provides you with two data streams.

Just imagine two transmitting antennas and each of your receiving antennas are pointed at just one transmitting antenna. It can form two data channels that might support a higher total throughput than a single link running at a higher speed. Because, perhaps, the sampling rate is a limiting factor or the bandwidth (big one) and you can’t run it any faster.

Now, instead of having two physical antennas and a motor to move and aim you instead have an array that can be steered digitally. Since you could have an analog array which means you can’t form two separate beams. But in this case your digital. And you’re beams, dependent on the number of elements, form enough isolation between the two transmissions. Now, you got two data streams. But also consider that you might not always receive the best signal from a line-of-sight path. There might be a bounce somewhere, a reflection, and that forms another data channel. This is multi-pathing happening on the signal and that can be exploited.

Added a --ula-spacing-wavelength command line argument. It switches the program into uniform linear array mode instead of randomly probing the weights. It uses the --thread-count multiplied by the --cycle-countto govern the number of beams. So, if you were running say 4 threads and 10 cycles you would have 40 beams in total evenly spread across -PI/2 to PI/2 all listening for messages/frames/packets.

I’m not sure if the ULA mode or random mode is better. If anyone tests it, please let me know what you see. I don’t see much of a difference.

I’ve also made the program accept a variable number of streams so you can use 3, 4, 8, or whatever number of antennas. Unless you’re using a 2D or weird array configuration random might not do as well at those higher antenna counts.