[[Include(WikiToC)]] = IBM 28GHz PAAM: Integration with USRPs with MIMO capability = === Description === In this tutorial, we demonstrate the integration of IBM 28GHz PAAM boars with USRPs. We present the MIMO capability with real-time baseband processing using the system. * The instructions for the RENEW Platform Agora software can be found [https://github.com/Agora-wireless/Agora/tree/develop here] under [https://docs.renew-wireless.org/license/ RENEW license]. * The COSMOS team contributes to adding the UHD support for the Agora software under the [https://github.com/EttusResearch/uhd/blob/master/LICENSE.md UHD license]. We thank the RENEW team for their support and help throughout the process. The following paper describes the integration of the IBM 28 GHz PAAMs with Agora-UHD in the COSMOS testbed. We would appreciate it if you cite this paper when publishing results obtained using the PAAMs deployed in COSMOS. * Z. Qi, Z. Gao, C. Tung, and T. Chen, "Programmable Millimeter-Wave MIMO Radios with Real-Time Baseband Processing". in Proc. ACM MobiCom'23 Workshop on Wireless Network Testbeds, Experimental evaluation & Characterization (WiNTECH '23), 2023 Authors: \\ Zhenzhou (Tom) Qi, Duke University \\ Zhihui Gao, Duke University \\ Chung-Hsuan Tung, Duke University \\ Tingjun Chen, Duke University Last updated: Oct. 04, 2023 === Prerequisites === In order to access COSMOS-SB2, create a reservation in COSMOS testbed 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 [https://wiki.cosmos-lab.org/wiki/GettingStarted started page] to get started. === Resources Required === * 2 USRP N310 SDRs ({{{sdr1-s1-lg1}}} and {{{sdr1-md1}}} in SB2) * 2 IBM 28GHz PAAMs ({{{rfdev2-1}}} and {{{rfdev2-2}}} in SB2 ) * 1 Server ({{{srv1-lg1}}}) The current hardware connection in SB2 as shown below * {{{sdr1-s1-lg1}}} RF2 TX/RX -- {{{rfdev2-1}}} IC0/TX/H, {{{sdr1-s1-lg1}}} RF2 RX2 -- {{{rfdev2-1}}} IC1/RX/H * {{{sdr1-s1-lg1}}} RF3 TX/RX -- {{{rfdev2-1}}} IC0/TX/V, {{{sdr1-s1-lg1}}} RF3 RX2 -- {{{rfdev2-1}}} IC1/RX/V * {{{sdr1-md1}}} RF2 TX/RX -- {{{rfdev2-2}}} IC0/TX/H, {{{sdr1-md1}}} RF2 RX2 -- {{{rfdev2-2}}} IC1/RX/H * {{{sdr1-md1}}} RF3 TX/RX -- {{{rfdev2-2}}} IC0/TX/V, {{{sdr1-md1}}} RF2 RX2 -- {{{rfdev2-2}}} IC1/RX/V || [[Image(PAAM-2_2 .png, 600px)]] || The required software components used in this demo are already loaded to the {{{IBMPAAM-USRP-RT-Baseband.ndz}}} node image, the node image includes: * Ubuntu 20.04, UHD 4.1.0 * PAAM Control to initialize the PAAM boards to integrate with USRPs. * PAAM CFO calibration. * Agora-UHD: An UHD-integrated real-time baseband processing pipeline. Please refer to **{{{Cubic23}}} branch** at [https://github.com/Agora-wireless/Agora/tree/Cubic23/ here] for more information. * Real-time visualization for the real-time DSP pipeline. === Tutorial Setup === Follow the steps below to gain access to the sandbox console and set up nodes with appropriate images. 1. If you don't have one already, sign up for a [https://www.cosmos-lab.org/portal-2/ COSMOS account] 1. [wiki:/GettingStarted#MakeaReservation Create a resource reservation] on COSMOS SB2 1. [Documentation/Short/Login Login] into sandbox console {{{console.sb2.cosmos-lab.org}}}) with **four** SSH sessions. 1. In **terminal 1**, make sure all the nodes and devices used in the experiment are turned off. Use the following command for SB2 {{{#!shell omf tell -a offh -t sdr1-s1-lg1,sdr1-md1,rfdev2-1,rfdev2-2,srv1-lg1 }}} 1. Load {{{IBMPAAM-USRP-RT-Baseband.ndz}}} on the server. {{{#!shell omf load -i IBMPAAM-USRP-RT-Baseband.ndz -t srv1-lg1 -r 0 }}} 1. Turn all the required resources on and check the status of all the resources. Use the following commands for SB2. {{{#!shell omf tell -a on -t sdr1-s1-lg1,sdr1-md1,rfdev2-1,rfdev2-2,srv1-lg1 }}} {{{#!shell omf stat -t all }}} 1. {{{ssh}}} to the server with option -Y for using GUI for our live demo. {{{#!shell ssh -Y root@srv1-lg1 }}} 1. In **all the ssh sessions** for {{{srv1-lg1}}}, use the following to source the correct environment. {{{#!shell source /opt/intel/oneapi/setvars.sh --force --config="/opt/intel/oneapi/renew-config.txt" }}} ==== Find and prepare USRPs ==== * Upon logging into the server, set up the 10G data interfaces DATA1, DATA2 in **terminal 1**. {{{#!shell ifconfig DATA1 10.117.1.1 netmask 255.255.0.0 mtu 9000 up ifconfig DATA2 10.118.1.1 netmask 255.255.0.0 mtu 9000 up }}} {{{#!shell sudo sysctl -w net.core.rmem_max=536870912 sudo sysctl -w net.core.wmem_max=536870912 }}} After running the above commands, you should see that the data interfaces have the appropriate IP addresses assigned. {{{#!shell root@srv1-lg1:~# ifconfig DATA1 DATA1: flags=4163 mtu 1500 inet6 fe80::1e34:daff:fe42:d4c prefixlen 64 scopeid 0x20 ether 1c:34:da:42:0d:4c txqueuelen 1000 (Ethernet) RX packets 21092 bytes 1881634 (1.8 MB) RX errors 0 dropped 19183 overruns 0 frame 0 TX packets 686 bytes 204975 (204.9 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 root@srv1-lg1:~# ifconfig DATA2 DATA2: flags=4163 mtu 1500 inet6 fe80::1e34:daff:fe42:d4d prefixlen 64 scopeid 0x20 ether 1c:34:da:42:0d:4d txqueuelen 1000 (Ethernet) RX packets 21091 bytes 1881530 (1.8 MB) RX errors 0 dropped 19184 overruns 0 frame 0 TX packets 690 bytes 226549 (226.5 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 }}} * Run {{{uhd_find_devices}}} to make sure that both USRP N310s can be reached: {{{#!shell [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_4.1.0.HEAD-0-g25d617ca -------------------------------------------------- -- UHD Device 3 -------------------------------------------------- Device Address: serial: 315A35A addr: 10.117.2.1 claimed: False fpga: XG mgmt_addr: 10.116.2.1 mgmt_addr: 10.117.2.1 product: n310 type: n3xx -------------------------------------------------- -- UHD Device 4 -------------------------------------------------- Device Address: serial: 3176DF7 addr: 10.118.3.1 claimed: False fpga: XG mgmt_addr: 10.116.3.1 mgmt_addr: 10.118.3.1 product: n310 type: n3xx }}} ==== Configure IBM 28GHz PAAM ==== COSMOS uses the IBM 28GHz PAAM API to configure and initialize the PAAM boards. Under {{{PAAM_Control}}}, use the following command to configure the PAAM boards in **terminal 1**: {{{#!shell root@srv1-lg1:~/PAAM_Control# python3 main.py }}} The following message will print out to indicate that the PAAM board is being successfully configured: {{{#!shell Opened port to FPGA Logged in to Petalinux Started command parser on Zynq sdpar_prog.py /version: Version is PAWR_v1.2.0 Using baseline FPGA control IP Reset the Phased Array Initialization of IC 0 was successful Initialization of IC 1 was successful Initialization of IC 2 was successful Initialization of IC 3 was successful IC0 current: 2.2629521016617793 status: On IC1 current: 1.3685239491691104 status: On IC2 current: 0.19550342130987292 status: Off IC3 current: 0.07820136852394917 status: Off Closed port to Zynq Opened port to FPGA Logged in to Petalinux Started command parser on Zynq sdpar_prog.py /version: Version is PAWR_v1.2.0 Using baseline FPGA control IP Reset the Phased Array Initialization of IC 0 was successful Initialization of IC 1 was successful Initialization of IC 2 was successful Initialization of IC 3 was successful IC0 current: 2.29227761485826 status: On IC1 current: 1.3587487781036167 status: On IC2 current: 0.15640273704789834 status: Off IC3 current: 0.16617790811339198 status: Off Closed port to Zynq Experiment Started! }}} Notice this program will **hang** there to indicate that the PAAM board is on, if you wish to turn off the ICs on the PAAM boards, please **press {{{CTRL+C}}} once**. === (Optional) CFO Calibration for PAAM boards === **This section introduces how to calibrate the CFO between the PAAM boards. It is not a necessary step for users who wants to run this tutorial.** \\ \\ Since each 28 GHz PAAM board is driven by its own on-board phase lock loop (PLL), the CFO between two 28 GHz PAAM boards needs to be calibrated in order to establish a 28 GHz communication link. \\ The following shows a coarse CFO calibration scheme: \\ * In **terminal 1**, change the {{{cfoBS}}} value to be **0** in line 15 as: {{{#!shell vim PAAM_Control/main.py }}} * Configure and bring up the PAAM board as described previously: {{{#!shell root@srv1-lg1:~/PAAM_Control# python3 main.py }}} * In **terminal 2**, fix MATLAB licensing issue: {{{#!shell cd /usr/local/MATLAB/R2022b/bin root@srv1-lg1:/usr/local/MATLAB/R2022b/bin# ./deactivate_matlab.sh root@srv1-lg1:/usr/local/MATLAB/R2022b/bin# ./activate_matlab.sh }}} At the last step, MATLAB will ask for a username for the computer. Enter **root**. * In **terminal 2**, direct to the CFO calibration folder and run the CFO estimation pipeline in {{{MATLAB}}}: {{{#!shell cd 5G_Pipeline root@srv1-lg1:~/5G_Pipeline# matlab }}} In the prompted {{{MATLAB}}} command line, type and run: {{{#!shell >>main }}} * An example output would appear as: {{{#!shell CFO: 9.8310e+03 SNR: 22.5722 EVM: 12.7090 BER: 0 }}} * Back to **terminal 1**, turn off PAAM board by pressing **{{{CTRL+C}}} once** * Applied the above estimated CFO value to {{{cfoBS}}} in {{{5G_Pipeline/main.py}}} and restart the PAAM boards: {{{#!shell root@srv1-lg1:~/PAAM_Control# python3 main.py }}} Based on the measurements we performed over 100+ times shown in the following probability density distributions of the estimated CFO values between the two PAAM boards, the CFO can be seen as a relatively constant value, hence, we pre-set the CFO to the PAAM board to be {{{97400}}} {{{#!td || [[Image(CFO_DL.png​, 400px)]] || }}} {{{#!td || [[Image(CFO_UL.png, 400px)]] || }}} === Experiment Execution === ==== Bring up real-time visualization ==== Please direct to the {{{~/Cubic23/Agora/files/log/csv}}} folder, where you will be able to see **3 types** Python visualization files. In **terminal 2**, use the following command to choose the visualization for the system. * {{{cubic_timeD.py}}}: This visualization tool helps to visualize the raw IQ samples captured by Agora-UHD and the corresponding FFT. {{{#!shell root@srv1-lg1:~/Cubic23/Agora/files/log/csv# taskset -c 31 python3 cubic_timeD.py }}} * {{{cubic_conste.py}}}: This visualization tool helps to visualize the constellation Agora-UHD system get after demodulating the received signals {{{#!shell root@srv1-lg1:~/Cubic23/Agora/files/log/csv# taskset -c 32 python3 cubic_conste.py --SISO --QAM16 }}} {{{--SISO/--MIMO}}} chooses the mode to plot for either SISO case or MIMO case, {{{--QAM16/--QAM64}}} plots the corresponding reference point for different modulation types. * {{{cubic_mimo.py}}} and {{{cubic.py}}}: This visualization tool helps to visualize the EVM, SNR, and BER readings for the Agora-UHD system. {{{#!shell root@srv1-lg1:~/Cubic23/Agora/files/log/csv# taskset -c 33 python3 cubic_mimo.py }}} We use {{{taskset}}} to specify dedicated cores to run the visualization tools to improve the Agora-UHD performance. ==== Run the experiment ==== In **terminal 3**, bring up the UE as: {{{#!shell root@srv1-lg1:~/Cubic23/Agora# ./build/user --conf_file files/config/examples/ul-usrp-cubic.json }}} Once the UE finishes initializing, UE will be in waiting mode constantly checking for beacon signals send out by BS. \\ \\ In **terminal 4**, bring up BS as: {{{#!shell root@srv1-lg1:~/Cubic23/Agora# ./build/agora --conf_file files/config/examples/ul-usrp-cubic.json }}} You will be able to see the BS starts to receive and process the signals, while UE is able to detect BS and UE starts to transmit. {{{#!shell BS end [02:095853][I] Main [frame 6399 + 0.56 ms]: Completed LDPC decoding (4 UL symbols) [02:095876][I] Frame 6399 Summary: FFT (8 tasks): 0.0116162 ms (~0.000452769 + 0.00189833 + 0.00862035 ms), CSI (4 tasks): 0.0105033 ms (~0.000363756 + 0.00249357 + 0.00756129 ms), Beamweights (768 tasks): 0.085955 ms (~0.0107782 + 0.00207422 + 0.0715803 ms), Demul (3072 tasks): 0.190205 ms (~0.001613 + 0.12422 + 0.00181191 ms), Decode (8 tasks): 0.0964143 ms (~2.69174e-05 + 0.0958194 + 0 ms), Total: 0.394694 ms [02:095887][I] Main [frame 6400 + 0.60 ms since last frame]: Received first packet. Remaining packets in prev frame: 0 [02:095900][I] Main [frame 6400 + 0.01 ms]: Received all pilots frame_id 6400, ul_symbol_id 0, ant_id 0 [02:095946][I] Main [frame 6400 + 0.06 ms]: FFT-ed all pilots [02:095951][I] Frame 6400 Pilot Signal SNR (dB) Range at BS Antennas: User 0: [-6.0,27.2] (Possible bad antenna 1) User 1: [-4.0,28.5] (Possible bad antenna 0) frame_id 6400, ul_symbol_id 0, ant_id 1 [02:096012][I] Main [frame 6400 + 0.12 ms]: Received all packets [02:096109][I] Main [frame 6400 + 0.22 ms]: Completed ZF beamweight calc [02:096446][I] Main [frame 6400 + 0.56 ms]: Completed demodulation symbol id is: 6 [02:096463][I] Frame 6400 Constellation: EVM 13.3263 11.3116 , SNR 17.5058 18.9295 True SNR is: 29.4157 }}} {{{#!shell UE End: [02:552790][I] PhyUe [frame 6767 + 0.84 ms since last frame]: Received first packet. Remaining packets in prev frame: 0 [02:552793][I] PhyUe [frame 6767 + 0.00 ms]: Received all packets [02:552834][I] PhyUe [frame 6767 + 0.04 ms]: Completed encoding [02:552838][I] PhyUe [frame 6767 + 0.05 ms]: Completed modulation [02:552874][I] PhyUe [frame 6767 + 0.08 ms]: Completed iFFT [02:552955][I] PhyUe [frame 6767 + 0.17 ms]: Completed TX }}} ==== Observe the results ==== Figures below show the result of our visualization tools. {{{#!td Raw IQ and the corresponding FFT || [[Image(16QAM-FFT.png​, 600px)]] || }}} {{{#!td EVM, SNR and BER || [[Image(16QAM-EVM-SNR.png​, 600px)]] || }}} \\ {{{#!td MIMO with 16QAM || [[Image(16QAM-MIMO.png​, 600px)]] || }}} {{{#!td SISO with 64QAM || [[Image(64QAM-SISO.png​, 600px)]] || }}} ==== Finish the experiments ==== When the experiments are completed, make sure to clean up and turn off the PAAMs, Agora-UHD and the visualizations.[**{{{CTRL+C}}}** in **terminal 1, 2, 3 & 4**]