QuadRF

A 4x4 MIMO SDR tile for spatial RF vision & beamforming that scales as a phased array

Crowdfunding now!

View Purchasing Options
Jul 15, 2026

Project update 4 of 4

Near-Field Sensing, Meshtastic, and Our Plans for Teardown 2026!

by Martin McCormick

Welcome to Week 3! Thanks to you, we just blew past 350% funding. This week, we’ll take a look at some examples of what QuadRF’s transmit capabilities enable.

Near-field sensing

Some backers have asked about close-range radar sensing capabilities of the QuadRF, so last night I coded up an example and posted it on our GitHub. Because QuadRF’s Tx and Rx chains are already perfectly synchronized, it’s very straightforward!

As an initial basic test, you can make a CW radar on the QuadRF using only a few blocks in the pre-installed GNU Radio. First, you drop in a Signal Source of type Sine with a frequency of your choice (e.g., +1 MHz). Then, you transmit it by connecting it to the Soapy Sink block. This signal is upconverted by the LO frequency you choose in the QuadRF GUI (e.g., +5 GHz), and with Tx enabled, it radiates out of the selected antennas.

The 5.001 GHz wave hits various objects in the room and bounces back. But just like a mirror, when a circularly polarized RF signal reflects, its polarization flips. It returns to the QuadRF with LHCP (Left-Hand Circular Polarization) instead of the RHCP that was transmitted. So, we simply set our receiver polarization to LHCP in the QuadRF GUI.

Back in GNU Radio, we drop in a Soapy Source to get the receiver samples. As long as we choose the same LO frequency (5 GHz) in the receive GUI, the full-duplex QuadRF gives us perfectly synchronized samples. We should see a +1 MHz tone return, but now with its phase shifted proportionally to the distance of the object (and a small frequency shift as well if the object is moving!).

To compare the received signal with what was transmitted, we use a Conjugate Multiply block, which effectively shifts the receive signal from +1 MHz back down to DC (0 MHz). To improve SNR, we add a low-pass filter or a simple Moving Average block to filter out noise and anything outside of near-DC. We now get a complex phasor (2D vector) that rotates proportionally to the reflecting object’s distance from the QuadRF. As a quick visualizer, I dropped in a Constellation Plot, which shows the phasor as an I/Q scatter plot with a red "+".

After adjusting the QuadRF Tx and Rx gains to avoid saturation, lo and behold, we get a plot that rotates just as much as we move our hand away from the QuadRF!

What you notice is the point moves in a circle around a non-zero location (not I,Q = 0,0). This is because there is some direct-path coupling between the Tx and Rx antennas that is relatively strong, but static. Our hand reflection adds a moving phasor to this static phasor, causing the rotation. In fact, that "static phasor" offset is a combination of everything in the room that contributes a reflection back but isn’t moving.

While this is a great start that proves the synchronization is working, tracking objects requires more information. One possibility is sending multiple frequencies, which allows us to resolve the ambiguity of how many integer times the phasor rotated, giving us actual total range information in meters (not just range modulo the wavelength). This is commonly done with FMCW chirps, pulse, or chipping sequences. Less common is our ability to use spatial information! Because we have four transmit and four receive antennas, we can determine the direction of the target by comparing ranges between all the different Tx/Rx antenna pairs!

4x4 MIMO radar

In the GNU Radio example above, we allowed the QuadRF FPGA to combine the receive antennas into a single Rx stream with automatic beamforming. But now, let’s stream the four separate Rx antennas’ independent I/Q data and perform a parallel CW ranging calculation for each receive path. In addition, we’ll cycle quickly through the four Tx antennas to measure all combinations and get the full 4x4 MIMO radar information!

Here we’ll switch to C code to visualize the 4x4 = 16 phasors of information. Full disclosure: we asked ChatGPT to implement this, and it did correctly on the second try, with only a few minutes of fiddling. The code is pretty easy to understand. It outputs four plots, each quadrant represents a different receive antenna, while the four colors represent the different Tx antennas. This gives us a total of 16 phasors of continuous ranging information.

The sensitivity is quite impressive! It can easily detect my breathing from a few meters away from millimeter-scale chest movement. As a new dad, I figured this could be a useful way to monitor baby’s breathing at night. Of course when I proposed this, my wife refused to let me test it. But I’m pretty sure it would work great! Also I think this means I shouldn’t mention the amount of RF radiation coming from our garage…

For a more interesting tracking demo, the next step is probably to send these phasors into an Extended Kalman Filter and estimate a reflector’s (X,Y,Z) coordinates in space (similar to what we do for phased-array calibration). Or we could feed it into a machine learning model. What I think is remarkable though is how quickly we can take QuadRF out of the box, and with just a little software, rapidly start building the foundation of what is typically pretty advanced research in RF sensing!

Meshtastic!

Another great open-source tool called Meshtastic is now running on the QuadRF and will come pre-installed with every unit. This is an off-grid, decentralized mesh network. No cell towers. No internet. Just pure peer-to-peer connectivity!

It uses LoRa, which utilizes Chirp Spread Spectrum (CSS) modulation. This provides excellent resilience to noise, multipath fading, and Doppler effects, allowing for very long-range (tens of kilometers) communication. Roy will be showing this off at Teardown 2026! Combined with AREDN, we think there is massive potential for using QuadRF as a robust and independent peer-to-peer emergency communications network.

That’s all for this week! If you’re heading to Portland for Teardown 2026, be sure to find Roy. We have just 3 weeks left before the campaign wraps up on August 6th. If you haven’t yet, join our Discord to talk projects, and please keep sharing the campaign with anyone who wants to explore the phased-array frontier. See you next week!


Sign up to receive future updates for QuadRF.

Subscribe to the Crowd Supply newsletter, highlighting the latest creators and projects