Measure the power delay profile (PDP) of a wideband radio channel using an RFNoC-based
channel sounder on USRP X310s in the ORBIT/COSMOS massive-MIMO mini-racks.
Channel sounding is the process of evaluating the characteristics of a radio
environment. Evaluating the power delay profile (PDP) of a radio channel helps
in developing statistical models for channel simulation.
This tutorial demonstrates how to use the RFNoC channel sounder design for obtaining
the PDP of channels up to 100 MHz wide. An FPGA correlator module computes real-time
correlation power, and an averaging module averages contiguous sets of PDP over time
and sends the result to the host CPU. This design is compatible with 3rd-generation
Ettus USRP devices (USRP X310).
The experiment runs on the ORBIT grid, which houses USRP X310 devices in massive-MIMO
mini-racks (rows 23 and 24). A browser-based visualization page shows the live PDP
once the experiment is running.
After completing this tutorial you will be able to:
omf load.uhd_usrp_probe.uhd_image_loader.rfnoc_tx_mobicom / rfnoc_rx_mobicom).| Difficulty | Intermediate |
| Estimated time | 60 min |
| Domain / sandbox | grid.cosmos-lab.org |
| Topic group | Channel Sounding & MIMO |
| Last verified | Not re-tested (migrated 2026-06-20) |
Background knowledge
Account & access
Devices / nodes
| Resource | Role | Qty | Notes |
|---|---|---|---|
| node19-1 | Transmitter host | 1 | Connected to TX USRP X310 in MIMO rack |
| node20-1 | Receiver host | 1 | Connected to RX USRP X310 in MIMO rack |
| USRP X310 (e.g. 10.10.23.16) | Transmitter SDR | 1 | In massive-MIMO mini-rack, row 23 |
| USRP X310 (e.g. 10.10.24.16) | Receiver SDR | 1 | In massive-MIMO mini-rack, row 24 |
Disk images
| Image | Load onto | Provides |
|---|---|---|
| channel-sounder.ndz | node19-1, node20-1 | UHD libraries, rfnoc_tx_mobicom, rfnoc_rx_mobicom, run-websock, channel-sounding display tools |
Software components
| Component | Version | Source |
|---|---|---|
| UHD (USRP Hardware Driver) | 3.14 (compatible) | preinstalled in channel-sounder.ndz |
| rfnoc_tx_mobicom | TODO: verify | preinstalled in channel-sounder.ndz (/root/uhd/host/build/examples/) |
| rfnoc_rx_mobicom | TODO: verify | preinstalled in channel-sounder.ndz (./uhd/host/build/examples/) |
| FPGA bitfile: spreader_corr_specsense_uhd_3_14.bit | UHD 3.14 | preinstalled in channel-sounder.ndz |
| channel_sounding_display.html | TODO: verify | attached to this tutorial page — download to your local machine |
| run-websock | TODO: verify | preinstalled in channel-sounder.ndz |
Spectrum / RF / special
--freq 3e9) with up to 100 MHz bandwidth.Two grid host nodes each connect to a USRP X310 in the massive-MIMO mini-racks
(rows 23 and 24 of the ORBIT grid). The TX node (node19-1) drives USRP X310 at
10.10.23.16; the RX node (node20-1) drives USRP X310 at 10.10.24.16. Both nodes
are reachable from the grid console via SSH.
A WebSocket proxy (run-websock) on the console forwards the receive node's data
stream (port 5100) to your browser, which renders the live PDP via
channel_sounding_display.html.

Reserve the grid and log into the console:
ssh <username>@console.grid.cosmos-lab.org
Make sure the nodes are off before imaging:
omf tell -a offh -t system:topo:allres
Load the channel-sounder image. If you have specific nodes:
omf load -i channel-sounder.ndz -t node19-1,node20-1
Or, if you were assigned a topology (e.g. group-red):
omf load -i channel-sounder.ndz -t system:topo:group-red
Turn the nodes on:
omf tell -a on -t node19-1,node20-1
Or with a topology:
omf tell -a on -t system:topo:group-red
Check the node status and confirm they are POWERON:
omf stat -t node19-1,node20-1
Expected output:
-----------------------------------------------
Node: node19-1.grid.orbit-lab.org State: POWERON
Node: node20-1.grid.orbit-lab.org State: POWERON
-----------------------------------------------
Or with a topology:
omf stat -t system:topo:group-red
SSH to the transmitter node:
ssh root@node19-1
From node19-1 (TX host), probe the assigned TX USRP. Substitute the correct IP
address for your USRP (e.g. 10.10.23.16 for group-red):
root@node19-1:~# uhd_usrp_probe --args="addr=10.10.23.16"
At the end of the output, confirm that the following RFNoC blocks are present:
| | _____________________________________________________
| |/
| | RFNoC blocks on this device:
| |
| | * DmaFIFO_0
| | * Radio_0
| | * Radio_1
| | * DDC_0
| | * DUC_0
| | * Corrmag63avg8k_0
| | * Spreader_0
| | * SpecSense2k_0
| | * FIFO_0
| | * FIFO_1
Spreader_0 spreads the transmit signal; Corrmag63avg8k_0 is the correlator on
the receive side. If these blocks appear, the USRP is ready.
Repeat the probe on node20-1 for the RX USRP (e.g. addr=10.10.24.16).
If the required RFNoC blocks are not present in the probe output, load the
correct FPGA image using uhd_image_loader. Run this from the TX host node:
root@node19-1:~# uhd_image_loader --args="addr=10.10.23.16,type=x300" --fpga-path="spreader_corr_specsense_uhd_3_14.bit"
Run the same command on node20-1 for the RX USRP (addr=10.10.24.16). After
loading, reprobe with uhd_usrp_probe to confirm the blocks are present.
From the console, set up a WebSocket proxy for the receive node. This is required
for browser-based real-time PDP streaming:
prasanthi@console.grid:~$ run-websock 5100 10.10.20.1:5100 --daemon
Expected output:
WARNING: no 'numpy' module, HyBi protocol will be slower
WebSocket server settings:
- Listen on :5100
- Flash security policy server
- No SSL/TLS support (no cert file)
- Backgrounding (daemon)
Note: The RX node data-plane IP
10.10.20.1corresponds
to node20-1's connection to its USRP X310. Adjust if your node assignment differs.
On node19-1 (TX), start the channel-sounder transmit application.
If you were assigned a topology group, use the --group flag:
root@node19-1:~# /root/uhd/host/build/examples/rfnoc_tx_mobicom --group red
Alternatively, pass explicit parameters (100 MHz bandwidth, 3 GHz carrier):
root@node19-1:~# /root/uhd/host/build/examples/rfnoc_tx_mobicom --args"addr=10.10.23.16,type=x300,skip_ddc,skip_duc" --freq 3e9 --gain 20 --duc-args="input_rate=50000000.0,output_rate=200000000.0"
Open a new SSH session to node20-1 (RX) and start the receive application.
If you were assigned a topology group:
root@node20-1:~# ./uhd/host/build/examples/rfnoc_rx_mobicom --group red
Or with explicit parameters:
root@node20-1:~# ./uhd/host/build/examples/rfnoc_rx_mobicom --args"addr=10.10.24.16,type=x300,skip_ddc,skip_duc" --freq 3e9 --gain 10 --ddc-args="output_rate=50000000.0,input_rate=200000000.0"
Download channel_sounding_display.html (attached to this wiki page) to your local
machine. Open it in a browser and click the Start button. You should see the live
PDP of the channel updating in real time.

uhd_usrp_probe on both the TX and RX USRPs shows the full set of RFNoC blocksSpreader_0, Corrmag63avg8k_0, DmaFIFO_0, Radio_0, Radio_1, etc.).rfnoc_tx_mobicom) runs without errors on node19-1.rfnoc_rx_mobicom) runs without errors on node20-1.channel_sounding_display.html in a browser and clicking Start showsomf tell -a offh -t system:topo:allres
(No omf save needed unless you modified the disk image.)
| Symptom | Likely cause | Fix |
|---|---|---|
uhd_usrp_probe does not show Spreader_0 / Corrmag63avg8k_0 |
USRP has a different FPGA bitfile loaded | Run uhd_image_loader with spreader_corr_specsense_uhd_3_14.bit as shown in Step 2 |
rfnoc_tx_mobicom or rfnoc_rx_mobicom fails to connect |
Wrong USRP IP or type argument | Confirm USRP address with uhd_find_devices; check type=x300 and correct addr= |
| Browser PDP display shows no data after clicking Start | WebSocket proxy not running or wrong port/IP | Confirm run-websock is running on the console; verify RX node data-plane IP matches the proxy target |
| Nodes stuck in POWERON but not reachable via SSH | Image load did not complete | Re-run omf load and wait for completion before powering on |
omf stat shows nodes not in POWERON |
Nodes failed to boot | Power cycle with omf tell -a offh -t ... then omf tell -a on -t ... and check again |
Author(s): COSMOS team · Last verified: Not re-tested (migrated 2026-06-20) · Tested image/release: channel-sounder.ndz / UHD 3.14 compatible · Tags: sdr, usrp, x310, rfnoc, channel-sounding, pdp, mimo