Run an OFDM link at 28 GHz between two mobile phased-array antenna modules (PAAMs), each paired with a USRP-2974 SDR, using GNU Radio Companion flowgraphs for transmit and receive.
This tutorial demonstrates a 28 GHz millimeter-wave OFDM link using two mobile PAAMs — each consisting of an IBM 28 GHz Phased Array Antenna Module and a USRP-2974 SDR. The phased arrays are configured via the COSMOS array-management REST service, and the baseband is implemented in GNU Radio. When not in use outdoors, the mobile PAAMs are housed in sb1.cosmos-lab.org.
The tutorial is based on the MobiCom 2024 demonstration:
P. Maddala, J. Kolodziejski, A. Adhikari, K. Hermstein, D. Chen, L. Zhu, T. Chen, I. Seskar, and G. Zussman, "Demo: Experimentation with Mobile 28 GHz Phased Array Antenna Modules", in Proc. ACM MobiCom'24, Washington D.C., Nov. 2024.
After completing this tutorial you will be able to:
| Difficulty | Intermediate |
| Estimated time | TODO: verify |
| Domain / sandbox | sb1.cosmos-lab.org |
| Topic group | mmwave-paam |
| Last verified | Not re-tested (migrated 2026-06-20) |
Background knowledge
Account & access
Devices / nodes
| Resource | Role | Qty | Notes |
|---|---|---|---|
| mob4-1 | Transmitter (TX PAAM) | 1 | IBM 28 GHz PAAM + USRP-2974; mob4-3 may substitute |
| mob4-2 | Receiver (RX PAAM) | 1 | IBM 28 GHz PAAM + USRP-2974; mob4-3 may substitute |
Disk images
| Image | Load onto | Provides |
|---|---|---|
| mob-paam-ofdm-tutorial.ndz | mob4-1, mob4-2 | Ubuntu 20.04, UHD 4.1, GNU Radio 3.9, TX_OFDM.grc and RX_OFDM.grc example flowgraphs |
Software components
| Component | Version | Source |
|---|---|---|
| UHD (USRP Hardware Driver) | 4.1 | preinstalled in mob-paam-ofdm-tutorial.ndz |
| GNU Radio | 3.9 | preinstalled in mob-paam-ofdm-tutorial.ndz |
| Array management REST service | TODO: verify | local instance running on each mobile PAAM node |
Spectrum / RF / special
Two mobile PAAM nodes (mob4-1 and mob4-2) are connected to the sb1 control network. Each node is a USRP-2974 host with an attached IBM 28 GHz PAAM. mob4-1 acts as the OFDM transmitter and mob4-2 as the OFDM receiver. The 28 GHz RF link is over the air (or bench-top, depending on placement) between the two phased arrays. A local array-management REST service runs on each node at http://rfdev-mob:3000/.
Reserve sb1.cosmos-lab.org resources (see Prerequisites) and open four SSH sessions to the console — one for array control of each node, and one for GNU Radio for each node:
ssh <username>@console.sb1.cosmos-lab.org
Turn off all target nodes before imaging:
omf tell -a offh -t mob4-1,mob4-2
Load the tutorial image onto each mobile PAAM. Run these in separate console sessions so they execute in parallel:
omf load -i mob-paam-ofdm-tutorial.ndz -t mob4-1
omf load -i mob-paam-ofdm-tutorial.ndz -t mob4-2
Turn all required resources on and check their status:
omf tell -a on -t mob4-1,mob4-2
omf stat -t all
SSH to each mobile PAAM. Use the -Y flag on at least one session per node to enable the GNU Radio GUI:
ssh -Y root@mob4-1
ssh -Y root@mob4-2
At this point you should have 4 sessions open: 2 connected to mob4-1 (at least one with -Y) and 2 connected to mob4-2 (at least one with -Y).
The COSMOS array-management service supports two paradigms:
connect, steer with steer during the experiment, then disconnect.configure command.Enable mob4-1 as the transmitter using all ICs, 16 elements, V-polarization, steered to broadside (θ=0°, φ=0°):
root@mob4-1:~# curl "http://rfdev-mob:3000/array_mgmt/enable?dev_name=Local&ics=all&num_elements=16&txrx=tx&pol=v&theta=0&phi=0"
Enable mob4-2 as the receiver with the same parameters:
root@mob4-2:~# curl "http://rfdev-mob:3000/array_mgmt/enable?dev_name=Local&ics=all&num_elements=16&txrx=rx&pol=v&theta=0&phi=0"
Open GNU Radio Companion in the sessions initialized with -Y:
root@mob4-1:~# gnuradio-companion
root@mob4-2:~# gnuradio-companion
On mob4-1, open the TX_OFDM.grc file.
On mob4-2, open the RX_OFDM.grc file.
Not re-tested (migrated 2026-06-20). The source tutorial ends without content for this section. Refer to the MobiCom 2024 paper for expected results and beam-steering methodology.
Not applicable — the source tutorial did not include verification steps. After migration/re-test, add: expected GNU Radio output (constellation, EVM), confirmation that the array-management enable command returns HTTP 200, and observed link quality metrics.
omf tell -a offh -t mob4-1,mob4-2
(No omf save needed unless you modified the image.)
| Symptom | Likely cause | Fix |
|---|---|---|
curl to http://rfdev-mob:3000/ returns connection refused |
Local array-management service not running on node | Verify the service is up: systemctl status array-mgmt (or equivalent); check node booted the correct image |
| GNU Radio companion does not open (X11 error) | SSH session started without -Y |
Re-connect with ssh -Y root@mob4-N |
| No USRP device found in GNU Radio | USRP-2974 interface not configured | Run uhd_find_devices; if empty, check the node↔USRP interface (see UHD USRP tutorial) |
| OFDM link shows no signal / all-noise constellation | Arrays not aligned or beam not steered correctly | Confirm both enable curl commands succeeded; try broadside (θ=0°, φ=0°) first, verify physical alignment of arrays |
| mob4-3 substitution needed | mob4-1 or mob4-2 unavailable | Replace the unavailable node with mob4-3 in all commands; configuration steps are identical |
Author(s): COSMOS team (tutorial by Kevin Hermstein, Columbia University) · Last verified: Not re-tested (migrated 2026-06-20) · Tested image/release: mob-paam-ofdm-tutorial.ndz / Ubuntu 20.04 · Tags: mmwave, paam, 28ghz, ofdm, gnuradio, usrp-2974, phased-array