== Full-Duplex Wireless using USRP N210 == === Description === In this tutorial, we'll use node11-10 in the main grid (equipped with a USRP N210) to transmit and receive a single frequency 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, 300px)]] || [[Image(FlexICoN-gen1-node11-10.jpg, 400px)]] || || (a) The FlexICoN RF Canceller || (b) Full-Duplex SDR at node11-10 in the ORBIT grid || ==== Paper ==== For more information, please read: ''T. Chen, J. Zhou, N. Grimwood, R. Fogel, J. Marasevic, H. Krishnaswamy, and G. Zussman, “Demo: Full-duplex Wireless based on a Small-Form-Factor Analog Self-Interference Canceller,” in Proc. ACM MobiHoc'16, 2016.'' [http://wimnet.ee.columbia.edu/wp-content/uploads/2016/06/full_duplex_demo_mobihoc16.pdf (PDF)] [https://dl.acm.org/citation.cfm?id=2942397&CFID=829383168&CFTOKEN=81447061 (DOI)] Please cite the above paper if you are using the hardware. Please email Tingjun Chen (tingjun [at] ee.columbia.edu) if you are using (or plan to use) the full-duplex node, or if you have any questions. We also thank Mahmood Baraani Dasterjerdi for his contributions. ==== Supports ==== This project is supported by NSF grant ECCS-1547406, DARPA RF-FPGA program, the People Programme (Marie Curie Actions) of the European Union’s Seventh Framework Programme (FP7/2007-2013) under REA grant agreement no [PIIF-GA-2013-629740].11, and a Qualcomm Innovation Fellowship. === 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. USRP N210 with node11-10 in the ORBIT main grid. 3. [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]. 4. [https://github.com/EttusResearch/uhd, UHD] is already installed with the imaged SDR node. 5. 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. All the source code is also publicly available at [https://github.com/Wimnet/flexicon_orbit here]. === Set Up === Before you can access the testbed, you need to [https://www.orbit-lab.org/schedule make a reservation] and get it approved by the [wiki:Documentation/Scheduler reservation service]. After receiving the reservation's confirmation (approval) email: * Login into reserved domain: {{{ssh username@conslole.grid.orbit-lab.org}}} * Make sure that the full-duplex node is powered down for loading the desired image: {{{omf tell -a offh -t node11-10}}} * Load an image on the node (this process can take about a few minutes so please be patient): {{{omf load -i orbit-flexicon.ndz -t node11-10}}} * Turn on the node: {{{omf tell -a on -t node11-10}}} * Login into the node: {{{ssh 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 always retrieve the most recently updated code from [https://github.com/Wimnet/flexicon_orbit here]. === 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 ==== In Terminal 1 (UHD) ==== * Build the example: {{{ cd ~/flexicon_orbit/fd_transceiver_simple/uhd/ mkdir build cd build cmake ../ make }}} * Check the conection and serial number of the USRP N210 using command {{{uhd_find_devices}}}. The serial number should be {{{F331D4}}}. * Run the example with IQ rate {{{rate}}}, carrier frequency {{{freq}}}, TX gain {{{tx-gain}}}, and RX gain {{{rx-gain}}}: {{{ ./fd_transceiver_simple --tx-args="serial=F331D4" --rx-args="serial=F331D4" --rate 1e6 --freq 900e6 --tx-gain 10 --rx-gain 10 }}} The default sine wave has an amplitude {{{ampl=0.3}}} and wave frequency of 100kHz {{{wave-freq=100e3}}}. This terminal window will show the power level at RX baseband, after RF cancellation (before digital) and after digital cancellation, respetively. ==== In Terminal 2 (SUB-20) ==== * Build the RF canceller configuration code: {{{ 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: {{{ ./rf_canc_config ATT-CODE PS-CODE C1-CODE C2-CODE C3-CODE }}} In particular, the {{{ATT-CODE=0,1,2,...,127}}} and {{{PS-CODE=0,1,2,...,255}}} codes are for configuring the 7-bit attenuator and 8-bit phase shifter of the Gen-1 RF canceller. It is recommended to use {{{C1-CODE=16, C2-CODE=3, C3-CODE=9}}}. 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. ==== 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.