MIMO Channel Sounding


In this tutorial, we demonstrate the TDD 2x2 MIMO channel sounding procedure using the USRP-2974s in the COSMOS Sandbox2 (sb2) and the RENEW Sounder software

  • The instructions of the RENEW Platform Sounder software can be found here under RENEW license.
  • The COSMOS team contributes to adding the UHD support for the Sounder software under the UHD license.

Author: Tingjun Chen, Duke University / Columbia University (tingjun.chen [at] duke [dot] edu)

Last updated: Sept. 21, 2020


In order to access sb2, create a reservation in sb2 and have it approved by the reservation service. Access to the resources is granted after the reservation is confirmed. Please follow the process shown on the COSMOS getting started page to get started.

Resources Required

  • 2 USRP-2974 (sdr2-s1-lg1 and sdr2-md1)
  • 1 Server (srv2-lg1)

Tutorial Setup

Follow the steps below to gain access to the sb2 console and set up nodes with appropriate images.

  1. If you don't have one already, sign up for a COSMOS account
  2. Create a resource reservation on COSMOS sb2
  3. Login into sb2 console ( with two SSH sessions.
  4. Make sure all the nodes and devices used in the experiment are turned off:
    omf tell -a offh -t sdr2-s1-lg1,sdr2-md1,srv2-lg1
  5. Use the baseline-gr.ndz node image (see here for the list of pre-defined images) with Ubuntu 18.04, UHD 3.15, and gnuradio 3.8. Load baseline-gr.ndz on the server.
    omf load -i baseline-gr.ndz -t srv2-lg1
  6. Turn all the required resources on and check the status
    omf tell -a on -t sdr2-s1-lg1,sdr2-md1,srv2-lg1
    omf stat -t system:topo:allres
  7. ssh to the the same server from two terminals, use option -Y for using GUI.
    [Terminal 1] ssh -Y root@srv2-lg1,
    [Terminal 2] ssh -Y root@srv2-lg1

Experiment Execution

Find and prepare USRPs and the Sounder software

  • The IP addresses for Ethernet Port 1(10G) on sdr2-s1-lg1 and sdr2-md1 were hard-coded to and respectively. To access them from srv2-lg1, configure the network interface eno2 as follows:
    root@srv2-lg1:~# ifconfig eno2 netmask mtu 9000 up
    root@srv2-lg1:~# sudo sysctl -w net.core.wmem_max=24862979
    net.core.wmem_max = 24862979
    root@srv2-lg1:~# sudo sysctl -w net.core.rmem_max=24862979
    net.core.rmem_max = 24862979
    root@srv2-lg1:~# ifconfig 
    eno2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
            inet  netmask  broadcast
            inet6 fe80::9a03:9bff:fe61:9609  prefixlen 64  scopeid 0x20<link>
            ether 98:03:9b:61:96:09  txqueuelen 1000  (Ethernet)
            RX packets 4053772  bytes 17770502341 (17.7 GB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1727950  bytes 2972166223 (2.9 GB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • Run und_find_device to make sure that the USRP-2974s can be reached:
    root@srv2-lg1:~# uhd_find_devices --args="addr="
    [INFO] [UHD] linux; GNU C++ version 7.5.0; Boost_106501; UHD_3.15.0.HEAD-0-gaea0e2de
    -- UHD Device 0
    Device Address:
        serial: 318F20F
        fpga: XG
        product: NI-2974
        type: x300
    root@srv2-lg1:~# uhd_find_devices --args="addr="
    [INFO] [UHD] linux; GNU C++ version 7.5.0; Boost_106501; UHD_3.15.0.HEAD-0-gaea0e2de
    -- UHD Device 0
    Device Address:
        serial: 3165747
        fpga: XG
        product: X310
        type: x300
  • Download and build the RENEW Sounder software on the develop branch at here and follow the instructions to build it. Note that the master branch does not have UHD support.
  • Include in files/usrp-bs-serials.txt the IP address, i.e., use sdr2-s1-lg1 as the base station (BS). In files/usrp-bs-only.json, set "channel" : "AB", to enable dual-channel on sdr2-s1-lg1.
  • Similarly, in files/usrp-client-only.json, set "sdr_id" : [ "" ] (i.e., use sdr2-md1 as the user) and "channel" : "AB", to enable dual-channel on sdr2-md1.


Run the experiment

  • In the first terminal [Terminal 1], start the client:
    root@srv2-lg1:~/git/renew-software/CC/Sounder# ./sounder files/usrp-client-only.json
    pinning client thread 0 to core 1
    scheduling TX 13 Frames (41.08 ms) in the future!
    1 uplink symbols will be sent per frame...
    Beacon detected at Time 32476200, sync_index: 13100
    Start main client txrx loop...
  • In the second terminal [Terminal 2], start the BS:
    root@srv2-lg1:~/git/renew-software/CC/Sounder# ./sounder files/usrp-bs-only.json 
    Set HDF5 File to logs/trace-2020-9-21-18-46-29_1x2x2.hdf5 and group to /
    task thread 0 starts
    pinning thread 0 to core 1
    Recv Thread 0: waiting for release
    receiver thread 0 has 1 radios
    Sync BS host and FPGA timestamp...
    Start BS main recv loop... 
    Saving HDF5, 2000 frames saved.

Analyze the results

  • Once the hdf5 file is recorded (in this case, logs/trace-2020-9-21-18-46-29_1x2x2.hdf5), follow the Analyze the HDF5 dataset step here to analyze the results. For example, we can show the pilot sequence for computing the 2x2 channel matrix H = [h00, h01; h10, h11] as follows:
    root@srv2-lg1:~/git/renew-software/PYTHON/IrisUtils# python3 ../../CC/Sounder/logs/trace-2020-9-21-18-46-29_1x2x2.hdf5 --ref-ant 0 --ref-user 0 --ref-frame 1500

where --ref-ant = 0, 1 represents the BS antenna index, and --ref-user = 0, 1 represents the user index.

Last modified 7 days ago Last modified on Apr 11, 2021, 8:53:21 PM

Attachments (4)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.