This wiki page contains tutorials for open-access remotely-accessible full-duplex (FD) transceivers integrated in the ORBIT and COSMOS testbeds. The full-duplex transceivers are currently being integrated into COSMOS. All the source code can be found at [https://github.com/Wimnet/flexicon_orbit this GitHub page]. Authors: * Tingjun Chen, Columbia University: tc2668[at]columbia.edu * Manav Kohli, Columbia University: mpk2138[at]columbia.edu Last updated: October 7, 2019 == Full-Duplex Wireless in COSMOS == === Description === In this tutorial, we will use two FD transceivers equipped with USRP N210s and the Gen-2 frequency-domain equalization (FDE) based RF canceller. These transceivers may be accessed via a PC using ssh. The PC contains several example experiments, which showcase the capabilities of the FD transceivers. ==== Demo Abstract ==== For more information about the integration of the FDE-based FD transceivers in COSMOS, please read: ''Tingjun Chen, Jackson Welles, Manav Kohli, Mahmood Baraani Dastjerdi, Jakub Kolodziejski, Michael Sherman, Ivan Seskar, Harish Krishnaswamy, and Gil Zussman, “Experimentation with full-duplex wireless in the COSMOS testbed“, ICNP MERIT'19, Oct. 2019'' [https://icnp19.cs.ucr.edu/proceedings/Workshops/MERIT/paper_19.pdf (Demo Abstract)] ==== Updates ==== * [10/07/2019] - Baseline overview of initial COSMOS sandbox status and accessibility === Hardware / Software Resources Utilized === 1. 2x The Columbia FlexICoN Gen-2 RF Canceller, which is an FDE-based RF canceller implemented using discrete components on a PCB. The two FDE paths each contain a bandpass filter (BPF) with tunable centre frequency and quality factor, alongside amplitude and phase control. 2. The source code for the full-duplex transceiver examples, which can be found at [https://github.com/Wimnet/flexicon_orbit this GitHub page]. 3. 2x USRP N210 4. [https://github.com/EttusResearch/uhd, UHD] and [https://github.com/gnuradio/gnuradio, GNU Radio] are already installed on the PC. 5. [http://www.xdimax.com/sub20/sub20.html SUB-20] is a multi-interface USB adapter for providing popular interfaces between PC (USB host) and different hardware devices. Specifically, we use the SUB-20 SPI module to control and configure the Gen-1 RF canceller (see Fig. 1(a)). The user manual can be found [http://www.xdimax.com/sub20/doc/sub20-man.pdf here]. We are currently working on integration of the SUB-20 control with GNU Radio. 6. The {{{Eigen C++}}} Library is used for basic algebra used in channel estimation and digital self-interference cancellation. The Eigen releases can be found on the [http://eigen.tuxfamily.org/index.php?title=Main_Page this website]. We used the latest stable release Eigen 3.3.4 through our testings and experiments. === Tutorial === ==== Logging into PC ==== The PC has a simple user profile consisting of a few example GNU radio experiments. At this time, experimenters may create files, but they will be public to anyone who logs into the PC. Logging into the PC is done over {{{ssh}}}, with the username {{{sb2}}} and password {{{sandbox}}}. {{{ ssh -X sb2@128.59.87.24 }}} Note: if connecting from macOS, the {{{-Y}}} flag may be needed in the {{{ssh}}} connection instead of {{{-X}}}. ==== Running an example experiment ==== We can open GNU Radio using the following command: {{{ gnuradio-companion & }}} If X-forwarding is setup correctly for your {{{ssh}}} session, the GNU Radio GUI program should open. If X-forwarding is not setup correctly, an error will display saying that the GUI window cannot be opened. Open an example experiment from the {{{~/FD_Examples}}} directory: [[Image(FDExperimentSelection.png​,1000px)]] == Full-Duplex Wireless in ORBIT == === Description === In this tutorial, we'll use node11-10 in the main grid (equipped with a USRP N210) to transmit and receive a single tone over the air to demonstrate full-duplex wireless capability using the Columbia [http://flexicon.ee.columbia.edu/ FlexICoN]'s Gen-1 Frequency-Flat Amplitude- and Phase-based RF Canceller. Pictures of the FlexICoN RF canceller and node11-10 in the main grid equipped with full-duplex capability are below: ||||||Figure 1: The ORBIT-FlexICoN Full-Duplex Node|| || [[Image(FlexICoN-gen1-canceller.jpg, 325px)]] [[Image(FlexICoN-gen1-canceller-label.png, 350px)]] || [[Image(FlexICoN-gen1-node11-10.jpg, 400px)]] || || (a) The FlexICoN RF Canceller Box || (b) Full-Duplex SDR at node11-10 in the ORBIT grid || ==== Technical Report ==== For more information, please read: ''Tingjun Chen, Mahmood Baraani Dastjerdi, Guy Farkash, Jin Zhou, Harish Krishnaswamy, and Gil Zussman, “Open-access full-duplex wireless in the ORBIT testbed,” arXiv preprint: 1801.03069v2 [cs.NI], May 2018.'' [https://arxiv.org/abs/1801.03069 (arXiv report)] [http://wimnet.ee.columbia.edu/wp-content/uploads/2018/03/INFOCOM18Demo_FullDuplexORBIT.pdf (INFOCOM'18 Demo Abstract)] Please cite the above arXiv report if you use the hardware. Please email Tingjun Chen (tingjun [at] ee.columbia.edu) if you use (or plan to use) the full-duplex node or if you have any questions. ==== Updates ==== * [04/30/2019]: New full-duplex SDR image {{{flexicon-orbit-v3.ndz}}} released. Main new feature includes the implementation of a real-time OFDM-based full-duplex node. * [01/31/2019]: Developed real-time digital SIC as a GNU Radio OOT module. * [04/05/2018]: New full-duplex SDR image {{{flexicon-orbit-v2.ndz}}} released. New features include (1) GNU Radio OOT module that controls the SUB-20 controller, and (2) integrated full-duplex PSK examples. * [02/28/2018]: PSK examples based on GNU Radio is now available. For more details, please refer to the [http://wimnet.ee.columbia.edu/wp-content/uploads/2018/03/INFOCOM18Demo_FullDuplexORBIT.pdf, INFOCOM'18 Demo Abstract]. * [01/08/2018]: The baseline full-duplex SDR image {{{flexicon-orbit-v1.ndz}}} released. This node image includes an UHD benchmark full-duplex transciever example. For more details, please refer to the [https://arxiv.org/abs/1801.03069, arXiv report]. === Hardware / Software Resources Utilized === 1. The Columbia FlexICoN Gen-1 RF Canceller, which is a frequency-flat amplitude- and phase-based RF canceller implemented using discrete components on a PCB. The Gen-1 RF canceller is optimized to have a center operating frequency at 900MHz. 2. The source code for the full-duplex transceiver examples, which can be found at [https://github.com/Wimnet/flexicon_orbit this GitHub page]. We have also built an ORBIT node image {{{flexicon-orbit-v2.ndz}}} with all the required software installed to facilitate the experiments. 3. USRP N210 with {{{node11-10}}} in the ORBIT main grid. 4. [http://www.xdimax.com/sub20/sub20.html SUB-20] is a multi-interface USB adapter for providing popular interfaces between PC (USB host) and different hardware devices. Specifically, we use the SUB-20 SPI module to control and configure the Gen-1 RF canceller (see Fig. 1(a)). The user manual can be found [http://www.xdimax.com/sub20/doc/sub20-man.pdf here]. We also built a GNU Radio Out-Of-Tree (OOT) module to allow controlling the canceller from within the GNU Radio GUI. 5. [https://github.com/EttusResearch/uhd, UHD] and [https://github.com/gnuradio/gnuradio, GNU Radio] are already installed with the imaged SDR node. 6. The {{{Eigen C++}}} Library is used for basic algebra used in channel estimation and digital self-interference cancellation. The Eigen releases can be found on the [http://eigen.tuxfamily.org/index.php?title=Main_Page this website]. We used the latest stable release Eigen 3.3.4 through our testings and experiments. === Set Up === Before you can access the testbed, you need to [https://www.orbit-lab.org/schedule make a reservation] and get it approved. After receiving the reservation's confirmation (approval) email: * Login into reserved domain: {{{ssh -X username@conslole.grid.orbit-lab.org}}} (the {{{-X}}} option is for enabling the X11 tunneing) * Make sure that the full-duplex node is powered down for loading the desired image: {{{omf tell -a offh -t node11-10}}} * Load the most updated full-duplex node image (currently full-duplex SDR image {{{flexicon-orbit-v3.ndz}}} released) on the node (this process can take about a few minutes so please be patient): {{{omf load -i flexicon-orbit-v3.ndz -t node11-10}}} * Turn on the node: {{{omf tell -a on -t node11-10}}} * Login into the node: {{{ssh -X root@node11-10}}}. After login into the node, a {{{flexicon_orbit}}} folder should exist under the home directory of {{{node11-10:~/}}} which contains the source code of this example. You can also retrieve the most recently updated code from [https://github.com/Wimnet/flexicon_orbit the GitHub repository]. * Configure the USRP Ethernet interface: {{{ifconfig eth2 192.168.10.1 netmask 255.255.255.0 up}}} * Run {{{sudo sysctl -w net.core.rmem_max=50000000}}} and {{{sudo sysctl -w net.core.wmem_max=50000000}}} * Check the conection and serial number of the USRP N210: {{{uhd_find_devices}}}. The serial number should be {{{F331D4}}}. === Run the Experiments === You will need to login into the full-duplex node (by {{{ssh root@node11-10}}}) in two separate terminal windows lo for running the experiment: one for the main full-duplex transceiver UHD program and one for controlling the RF canceller. === Example Experiment 1: A Real-Time Full-Duplex Radio with OFDM PHY (GNU Radio + UHD) === * Within the FD node (i.e., {{{ssh -X root@node11-10}}}, open the GNU Radio flowgraph {{{~/flexicon_orbit/fd_transceiver_ofdm/grc/ofdm_node_fd.grc}}} in {{{gnuradio-companion}}}, as shown below. || [[Image(flexicon_orbit_grc_ofdm_node.png, 1000px)]] || || GNU Radio flowgraph of the OFDM-based FD radio example experiment. || * Run the experiments, three plots will show up: Time-domain Rx signal after RF SIC and digital SIC (@tab0), frequency-domain Rx signal after RF SIC and digital SIC (@tab1), and the estimated coefficients of the digital SI canceller taps (@tab2). || [[Image(flexicon_orbit_grc_ofdm_node_tab0.png, 333px)]] || [[Image(flexicon_orbit_grc_ofdm_node_tab1.png, 333px)]] || [[Image(flexicon_orbit_grc_ofdm_node_tab2.png, 333px)]] || ||||||Time-domain and frequency-domain Rx signal after RF and digital SIC, and estimated digital SI canceller coefficients on the packet-level. || === Example Experiment 2: A Simple Full-Duplex Radio Experiment (Terminal + UHD) === ==== In Terminal 1 ==== * Prepare the Eigen library (you can skip this step since the image already contains the Eigen library): {{{ cd ~/flexicon_orbit/fd_transceiver_simple/ sudo cp -r Eigen/ /usr/include/ }}} * Build the example (this is already done in the loaded image): {{{ cd ~/flexicon_orbit/fd_transceiver_simple/uhd/ mkdir build cd build cmake ../ make }}} * Run the example with IQ rate {{{rate}}}, carrier frequency {{{freq}}}, TX gain {{{tx-gain}}}, and RX gain {{{rx-gain}}}: {{{ cd ~/flexicon_orbit/fd_transceiver_simple/uhd/build/ ./fd_transceiver_simple --tx-args="serial=F331D4" --rx-args="serial=F331D4" --rate 1e6 --freq 900e6 --tx-gain 0 --rx-gain 10 }}} The default sine wave has an amplitude {{{ampl=0.3}}} and wave frequency of 100kHz {{{wave-freq=100e3}}}, which corresponds to a 0dBm TX power level. This terminal window will show the power level at RX baseband, after RF cancellation (before digital) and after digital cancellation, respetively. The UHD program is calibrated with {{{--rx-gain=10}}}, other RX gain values may results in inaccurate power level computation. * An example temrinal output is below: {{{ root@node11-10:~/flexicon_orbit/fd_transceiver_simple/uhd/build# ./fd_transceiver_simple --tx-args="serial=F331D4" --rx-args="serial=F331D4" --rate 1e6 --freq 900e6 --tx-gain 0 --rx-gain 10 linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.001.001-0-unknown Creating the transmit usrp device with: serial=F331D4... -- Opening a USRP2/N-Series device... -- Current recv frame size: 1472 bytes -- Current send frame size: 1472 bytes . . . Press Ctrl + C to stop streaming... TX Stream time was: 0 full secs, 0.100064 frac secs RX Signal Power: -44.093768 dBm (N_FFt = 2048) RX Res Signal Power: -98.570747 dBm (N_fft = 1024) Amount of Digital SIC: 54.476979 dB RX Signal Power: -44.232740 dBm (N_FFt = 2048) RX Res Signal Power: -98.113147 dBm (N_fft = 1024) Amount of Digital SIC: 53.880407 dB RX Signal Power: -43.959299 dBm (N_FFt = 2048) RX Res Signal Power: -93.406544 dBm (N_fft = 1024) Amount of Digital SIC: 49.447245 dB RX Signal Power: -44.179891 dBm (N_FFt = 2048) RX Res Signal Power: -101.593147 dBm (N_fft = 1024) Amount of Digital SIC: 57.413256 dB }}} In this example, since the TX power level is at 0dBm, a total amount of around 90dB self-interference cancellation is achieved, of which 45dB is obtained by the Gen-1 RF canceller, and 50dB is obtained by the digital cancellation. ===== In Terminal 2 (SUB-20) ===== * Build the RF canceller configuration code (this is already done in the loaded image): {{{ cd ~/flexicon_orbit/fd_transceiver_simple/sub20/ make }}} * Check the connection to the SUB-20 device using command {{{lbusb}}}. You should see a XDIMAX devices connected to the USB hub. * Program and configure the RF canceller with the desired values: {{{ cd ~/flexicon_orbit/fd_transceiver_simple/sub20/ ./rf_canc_gen1_config PS-CODE ATT-CODE C1-CODE C2-CODE C3-CODE }}} In particular, the {{{PS-CODE=0,1,2,...,255}}} and {{{ATT-CODE=0,1,2,...,127}}} codes are for configuring the 8-bit phase shifter and the 7-bit attenuator of the Gen-1 RF canceller, respectively. It is recommended to use {{{C1-CODE=16, C2-CODE=6, C3-CODE=6}}}, which provides 20dB isolation from the antenna-circulator interface. You can play with the values of {{{ATT}}} and {{{PS}}} until you see good cancellation profile (e.g., low residual self-interference power level) in Terminal 1. * An example temrinal output is below: {{{ root@node11-10:~/flexicon_orbit/fd_transceiver_simple/sub20# ./rf_canc_gen1_config 110 30 16 6 6 Started... Sub20 device found... Serial Number is 48AB Device Opened! ...Finished programming DAC with value 110! ...Finished programming ATT with value 30! ...Finished programming CAP1 with value 16! ...Finished programming CAP2 with value 6! ...Finished programming CAP3 with value 6! }}} ==== A Secondary Transmitter Using Node13-8 ==== Once the full-duplex node11-10 is up and running, you can turn on another SDR to transmit to the full-duplex node. Below, we use {{{node13-8}}} as an example in the 3rd terminal window (Terminal 3). * Load image, power on, and login into node13-8: {{{ omf tell -a offh -t node13-8 omf load -i baseline-sdr.ndz -t node13-8 omf tell -a on -t node13-8 ssh root@node13-8 }}} * Configure the USRP Ethernet interface: {{{ifconfig eth2 192.168.10.1 netmask 255.255.255.0 up}}} * Set up a secondary transmitter sending a sine wave at a different frequency (e.g., 200 kHz) than that of the full-duplex node: {{{ ./tx_waveforms --args="serial=F331D4" --rate 1e6 --freq 900e6 gain 10 --wave-type SINE --wave-freq 200e3 }}} Now by analyzing the RX baseband data at node11-10, you will observe the received tone at 200kHz while the self-interence tone at 100kHz is cancelled to the USRP noise floor, which is around -90dBm. ==== Acknowledgements ==== This work was supported in part by NSF grant ECCS-1547406, DARPA RF-FPGA program, DARPA SPAR program, a Qualcomm Innovation Fellowship, a National Instruments Academic Research Grant, Texas Instruments, and Intel. We thank Steven Alfano, Jelena Diakonikolas, Aishwarya Rajen, Jinhui Song, Mingyan Yu for their contributions to various aspects of the project. We thank Ivan Seskar, Jakub Kolodziejski, and Prasanthi Maddala from WINLAB, Rutgers University, for their help on the integration with the ORBIT testbed. We also thank Kira Theuer and Kendall Ruiz from NI and the NI technical support team for their help.