Download as pdf or txt
Download as pdf or txt
You are on page 1of 34

WARPLab ver 7.

0 Documentation
by Thundluck Sereevoravitgul, Sirindhorn International Institute of Technology, Thammasat University

supervisor: Prof. Dr.-Ing.Marius Pesavento , Christian Steffens, Technische Universitt Darmstadt

Date 10 May 2013

Contents
Introduction-----------------------------------------------------------------------------------------------------------------------------2 WARP Platform Framework---------------------------------------------------------------------------------------------------------2 -Hardware Components---------------------------------------------------------------------------------------------------3 -Design Architecture-------------------------------------------------------------------------------------------------------5 -Specification----------------------------------------------------------------------------------------------------------------7 WARPLab Framework----------------------------------------------------------------------------------------------------------------9 Command Reference----------------------------------------------------------------------------------------------------------------11 -Node Commands---------------------------------------------------------------------------------------------------------11 -Interface Commands----------------------------------------------------------------------------------------------------12 -Baseband Commands---------------------------------------------------------------------------------------------------15 -Transport Commands---------------------------------------------------------------------------------------------------20 -Trigger Manager Commands-----------------------------------------------------------------------------------------21 Example of usage--------------------------------------------------------------------------------------------------------------------22 -Result-----------------------------------------------------------------------------------------------------------------------26 Appendix-------------------------------------------------------------------------------------------------------------------------------29 -Binary Phase Shift Keying (BPSK)-------------------------------------------------------------------------------------29 -Cross Correlation---------------------------------------------------------------------------------------------------------30 -MATLAB function Reference-------------------------------------------------------------------------------------------31 References-----------------------------------------------------------------------------------------------------------------------------33

Introduction
WARP or Wireless Open-Access Research Platform is a programmable wireless platform available for researchers to develop into advance wireless research. The platform preserved for four main requirements. First, the platform is capable of implementing advance wireless algorithm. Second, the platform is scalable, allowing additional processing resource to be allocated. Third, it is extensible by providing peripheral and interface expansion for future application. Fourth, it is considered as a long term usage, supporting the evolution of some components without compromising others function.

WARP Platform Framework

Figure 1: WARP v3 (Virtex-6)

Mango Communications WARP v3 is the latest generation of WARP hardware, integrating a Virtex-6 FPGA, two programmable RF interfaces and a variety of peripherals. The block diagram in Figure 2 gives an overview of the hardware design.

Figure 2 : Block diagram of the hardware design

For wireless transmission, digital I and Q values from the FPGA are taken through digital-to-analog converters and are delivered to the transceiver for upconversion. Wireless reception follows the reciprocal process where I and Q analog streams are taken from the transceiver through analog-to-digital conversion and are delivered to the FPGA.

Hardware Components

Figure 3 : Hardware Components

The major hardware components of WARP v3 platform are indicated as shown in the Figure 3 and are described below:

User I/O: This collection of push buttons, LEDs, hexadecimal displays, dip switches, and debug header pins is used for interacting with the board. Designs can read values from the switches and push buttons and can write values to the displays and LEDs. The DIP switch setting is explained in Figure 4. The debug header can be used for any number of purposes, such as providing a convenient way for one WARP board to trigger the action of another board over a wire.

Figure 4 : DIP Switch Setting

Radio Interfaces A & B: There interfaces provide the radios that allow designs to communicate at the 2.4GHz and 5GHz bands.. The interfaces are labeled "RF A" and "RF B" on the board and in our reference designs. SDRAM: This DDR3 SO-DIMM provides extra memory beyond the block RAM inside the FPGA. The WARP v3 kit ships with a pre-tested 2GB SO-DIMM. Device label: This label shows the FPGA device on the WARP v3 board. This device is used in a number of places during the development process (such as exporting a peripheral core from Xilinx System Generator), so this label is present for convenient lookup. Virtex-6 FPGA: Under the fan, the FPGA serves as the central processing system for the WARP board. FMC HPC Slot: The FPGA Mezzanine Card High Pin Count slot provides connectivity to an existing ecosystem of hardware as well as future WARP-specific modules. 3

Serial #: This is the unique serial number for the WARP board. This number is also programmed into an EEPROM on the board prior to shipping, allowing software running on the hardware to read this information. Ethernet A/B: The two 10/100/1000 Ethernet ports provide high-speed connectivity between the board and a wired network. The ports are labeled "ETH A" and "ETH B" on the WARP v3 board and in our reference designs. JTAG: The JTAG connector allows direct programming of the Virtex-6 FPGA using a Digilent or Xilinx JTAG cable. SD Card: An alternative to programming the board over JTAG is to use the SD card. This allows nonvolatile storage of programs that will automatically download and execute upon insertion of the SD card. UART: The micro-USB connector on the board allows programs on the board to print messages to a terminal running on a computer. Power Switch: The power switch controls power to the board. The "off" position is where the switch is furthest away from the power jack. The "on" position is where the switch is closest to the power jack. Power Jack: The power jack is where the 12V power supply that comes with the WARP hardware should be plugged in. Note: the power switch should be in the "off" position whenever the power plug is inserted or removed. This allows the circuitry controlled by the switch to properly sequence the power regulators on the board.

Caution: WARP v3 is designed as a prototyping platform. As such, the hardware is shipped as an exposed board, with the various connectors and interfaces ready for access by user designs. This also means that sensitive circuits on the hardware are exposed and can be damaged by misuse. You must take care when handling the WARP v3 board Warning: The WARP v3 board is sensitive to electrostatic discharge (ESD). You must take ESD precautions when handling the hardware. Always ensure you are grounded before touching the board. Damage due to ESD is not covered by warranty. Using the CM-MMCX with WARP v3 WARP v3 users can use the CM-MMCX clock module to share sampling and/or RF clocks between multiple WARP v3 kits. The SIP switches on the CM-MMCX board are used to configure the board into a number of different states (shown in Figure 5). For example, the switches can be used to configure the board to act as a host of sample and RF clocks by enabling the MMCX clock outputs on the board. Using MMCX cables to connect this host board to a different WARP v3 node with the CM-MMCX that is configured for offboard clocking allows clocks to be shared.

Figure 5 : CM-MMCX configuration

Design Architecture
Transmission (Tx) and Reception (Rx) paths for one antenna are shown in the Figure 6, blocks in the Tx Path are highlighted in pink and blocks in the Rx path are highlighted in blue. The blocks are described below.

Figure 6 : SISO wireless communication architecture Blocks on transmitter path:


Tx I/Q Buffers: In-Phase samples to be transmitted are stored in the Tx I Buffer and Quadrature samples to be transmitted are stored in the Tx Q Buffer. DAC I/Q: Digital-to-Analog Converters for In-Phase/Quadrature samples. Tx BB Amplifiers: Transmitter Base Band Amplifiers. There are two amplifiers, one for the I signal and one for the Q signal. These are variable Gain Amplifiers both set to the same gain value which can be input by the user from MATLAB workspace. Upconversion: Converts the base band signal to an RF signal. Carrier frequency depends on PLL setting. Tx RF Amplifiers: Transmitter RF amplifier, variable gain amplifier, gain value can be input by the user from MATLAB worksapce.

Blocks on receiver path:


Rx RF Amplifier: Receiver RF amplifier, variable gain amplifier, gain value can be input by the user from MATLAB worksapce. Downconversion: Converts the RF signal to base band In-Phase/Quadrature signals. Downconversion from RF depends on PLL setting. Rx BB Amplifiers: Receiver Base Band Amplifiers. There are two amplifiers, one for the I signal and one for the Q signal. These are variable Gain Amplifiers both set to the same gain value which can be input by the user from MATLAB workspace. RSSI: Received Signal Strength Indicator. This block measures the RSSI. ADC I/Q: Analog-to-Digital Converters for In-Phase/Quadrature samples. ADC RSSI: Analog-to-Digital Converter for the measured RSSI. The RSSI data is available at 1/4th the rate of the I/Q data. Rx I/Q Buffers: Received In-Phase samples are stored in the Rx I Buffer and Received Quadrature samples are stored in the Rx Q Buffer. RSSI Buffer: RSSI data is stored in the this buffer.

PLL block: Setting of the PLL determines the carrier frequency which can be set to any of the 14 channels in the Wi-Fi 2.4 GHz band or 23 channels in the 5 GHz band. The carrier channel can be set directly from the MATLAB workspace. NOTE: Receiver RF and BB gains can be set using Manual Gain Control (MGC) or Automatic Gain Control (AGC). In MGC mode the user picks the values for these gains and sets the gains on the boards using functions available in the WARPLab Reference M-Code. In AGC mode the board is configured so that it automatically sets receiver gains based on measured RSSI. The WARPLab framework provides examples that illustrate how to use MGC and AGC modes.

Specification for WARPLab


Tx/Rx I/Q Buffers

Independent Tx/Rx I/Q Buffers. Each buffer can store a maximum of 215 samples. Buffers persist between triggers. Samples are read from Tx I/Q Buffers to I/Q DACs at 40 MHz. Samples are written from I/Q ADCs to Rx I/Q buffers at 40MHz.

Tx Signal Requirements

Amplitude of real part (In-Phase signal: I) in [-1,1] and amplitude of imaginary part (Quadrature signal: Q) in [-1,1]. I/Q signals on transmitter path are represented in the FPGA using Fixed Point 16_15. Lowest Frequency: 30 kHz. Radios filter DC. Highest Frequency: Depends on the Tx/Rx Low Pas Filter (LPF) Corner Frequency Setting. By default, Tx and Rx LPF are set to nominal mode. Possible Tx/Rx LPF settings are the following. Tx LPF corner frequency: Mode 0: Undefined, Mode 1: 12 MHz (Nominal Mode), Mode 2: 18 MHz (Turbo Mode 1), Mode 3: 24 MHz (Turbo Mode 2). Rx LPF corner frequency: Mode 0: 7.5 MHz, Mode 1: 9.5 MHz (Nominal Mode), Mode 2: 14 MHz (Turbo Mode 1), Mode 3: 18 MHz (Turbo Mode 2). 40 MHz sampling frequency.

I/Q ADC/DAC

Are always clocked at 40 MHz. DAC I/Q input signals are represented using Fixed Point 16_15. ADC I/Q output signals are represented using Fixed Point 14_13.

Tx/Rx Amplifiers

The Tx path applies gain at three amplifiers: Tx Base Band (Tx BB), Tx RF, and Tx RF PA. The Tx RF PA is always fixed at 30 dB gain. The Tx BB and Tx RF amplifiers are adjusted digitally, the range of gains is the following. Tx BB: In [0, 3] applies 1.5 dB/step. Tx RF: In [0, 63] applies 0.5 dB/step. The Rx path applies gain at two amplifiers: Rx Base Band (Rx BB) and Rx RF. Rx amplifiers are adjusted digitally, the range of gains is the following. Rx BB: In [0, 31] applies 2 dB/step. Rx RF: In [1, 3] applies 15 dB/step. A signal with I/Q that span full [-1,1] range of I/Q DAC input (e.g a complex exponential exp(j*2*pi*f*t) with f in passband of Tx/Rx LPFs) will be transmitted at RF with a peak power of approximately 19 dBm when Tx gains are set at maximum values (Tx BB = 3 and Tx RF =63 ), the average power will depend on the waveform.

Received Signal Strength Indicator (RSSI)


RSSI reading is a 10-bit number linear in dB that can be converted to received power in dBm. The RSSI is measured after the Rx RF amplifier, so the digital RSSI to Rx Power conversion depends on the Rx RF gain setting. The numbers below are approximate, based on plots from the MAX2829 datasheet. For a more precise mapping, you would need to take measurements using a transmitter with known output power (like an RF signal generator). For high gain (Rx RF = 3), RSSI=0 is -100dBm; RSSI=1023 is -30dBm. For medium gain (Rx RF = 2), RSSI=0 is -85dBm; RSSI=1023 is -15dBm. For low gain (Rx RF = 1), RSSI=0 is -70dBm; RSSI=1023 is 0dBm. MAX2829 specifies the RSSI bandwidth is 3MHz but we have observed that RSSI bandwidth spans nearly the full bandwidth of the RF path (RF path bandwidth is determined by Tx/RF LPFs corner frequency settings). Users are recommended to test RSSI bandwidth directly in their setup to see its characteristics directly; try transmitting a chirp (sweeping sinusoid) and plotting the RSSI vs. time. See WARPLab example 'warplab_siso_example_TxRx_BandwidthChange.m'. The RSSI signal is sampled by its own ADC (independent of I/Q ADCs). In WARPLab, the RSSI ADC is clocked at 10 MHz (1/4 of the rate of the I/Q ADCs).

WARPLab Framework
WARPLab is a framework which brings together WARP and MATLAB. With WARPLab, you can interact with WARP nodes directly from the MATLAB workspace and signals generated in MATLAB can be transmitted in real-time over the air using WARP nodes. This facilitates rapid prototyping of physical layer (PHY) algorithms directly in MATLAB M-Code. The WARPLab architecture is shown in the Figure 7. It is very flexible, supporting any combination of WARP v1, v2, or v3 hardware. Furthermore, any number of radios on each WARP board are also supported.

Figure 7 : The WARPLab setup.

The design flow for a new PHY is the following:


The user creates the samples to be transmitted in MATLAB. The samples are downloaded to buffers in the nodes assigned as transmitters. The user sends a trigger to transmitter and receiver nodes. Upon reception of this trigger, samples are transmitted over-the-air and captured in real-time. The user reads captured samples from the receiver nodes to the MATLAB workspace. Received samples are processed offline in MATLAB

Setup
Setting up the WARPLab is shown in Figure 8. Up to 16 WARP nodes and a host computer running MATLAB are connected to a switch via Ethernet links. The Ethernet links are used to transfer data to and from the WARP nodes. While the transmission is real-time, the communication between the PC and the boards takes longer. The way to set up the WARPLab : 1. Download the latest WARPLab Reference Design Release and unzip it. 2. Open MATLAB and change the current path to the M_Code_Reference directory from the downloaded archive. 3. Run wl_setup on the MATLAB command line. 4. Follow the prompts to configure your WARPLab environment You can download the latest WARPLab Reference Design and update the development by this link: http://warpproject.org/trac/wiki/WARPLab/Changelog

Figure 8 : Setting up WARPLab

Example 1. Confirm everything is ready by copying and pasting the following lines to the MATLAB command line:
clear N = 1; nodes = wl_initNodes(N); wl_nodeCmd(nodes,'identify'); disp(nodes)

Note: N can be changed to the number of nodes in your network. When you run these lines of code, you should see the User I/O LEDs on your N nodes blink as a result of the identify command.
2. If the previous stepped work, you should try one of the example code.

10

Command Reference
Node Commands
Node commands are selected as string input to the wl_nodeCmd method. These string are each individual cases of the switch statement in procCmd. Syntax MATLAB allows two valid forms of syntax for calling methods Let N be a scalar or vector of wl_node objects Let command_string be a string containing a particular command Let arg be an argument for that command (optional)

Syntax 1: wl_nodeCmd(N, command_string, arg1, arg2, ..., argN) Syntax 2: N.wl_nodeCmd(command_string, arg1, arg2, ..., argN) These two different forms of syntax are identical and either may be used for issuing commands to WARP nodes. Command List get_hardware_info Reads details from the WARP hardware and updates node object parameters Arguments: none Returns: none (access updated node parameters if needed)
get_fpga_temperature

Reads the temperature (in Celsius) from the FPGA Arguments: none Returns: (double currTemp), (double minTemp), (double maxTemp) currTemp - current temperature of FPGA in degrees Celsius minTemp - minimum recorded temperature of FPGA in degrees Celsius maxTemp - maximum recorded temperature temperature of FPGA in degrees Celsius initialize Initializes the node; this must be called at least once per power cycle of the node Arguments: none Returns: none identify Blinks the user LEDs on the WARP node, to help identify MATLAB node-to-hardware node mapping Arguments: none Returns: none

11

Interface Commands
Interface commands are selected as string inputs to the wl_interfaceCmd method. These string are each individual cases of the switch statement in procCmd. Syntax MATLAB allows two valid forms of syntax for calling methods Let N be a scalar or vector of wl_node objects Let command_string be a string containing a particular command
Let interface_selection be a collection of interfaces or the string 'RF_ALL'

Let arg be an argument for that command (optional)

Syntax 1: wl_interfaceCmd(N, command_string, arg1, arg2, ..., argN) Syntax 2: N.wl_interfaceCmd(command_string, arg1, arg2, ..., argN) These two different forms of syntax are identical and either may be used for issuing commands to WARP nodes. Command List tx_en Enable transmit mode for selected interfaces Arguments: none Returns: none rx_en Enable receive mode for selected interfaces Arguments: none Returns: none tx_rx_dis Disable transmit and receive for selected interfaces (standby mode) Arguments: none Returns: none rx_gain_mode Sets the gain selection mode Arguments: (string MODE) MODE: 'automatic' for AGC, or 'manual' for manual gain control Returns: none

12

channel Tune selected interfaces to the specified band and channel Arguments: (float BAND, int CHAN) BAND: Must be 2.4 or 5, to select 2.4GHz or 5GHz channels CHAN: Must be integer in [1,11] for BAND=2.4, [1,23] for BAND=5 Returns: none BAND and CHAN must be scalars (same values for all specified interfaces) or 1-D vectors (one value per interface) with length equal to the length of the interface ID vector Band/Channel - Center Frequency Map:
2.4GHz Chan Freq 1 2 3 4 5 6 7 8 9 10 11 5GHz Chan Freq 5180 5200 5220 5240 5260 5280 5300 5320 5500 5520 5540 5560 5580 5600 5620 5640 5660 5680 5700 5745 5765 5785 5805

2412 1 2417 2 2422 3 2427 4 2432 5 2437 6 2442 7 2447 8 2452 9 2457 10 2462 11 12 13 14 15 16 17 18 19 20 21 22 23

13

tx_gains Sets the gains for the variable gain amplifiers in the MAX2829 Tx path Refer to MAX2829 datasheet for curves of gain value vs actual gain at 2.4 and 5 GHz Arguments : (int BB_GAIN, int RF_GAIN) BB_GAIN: Must be integer in [0,1,2,3] for approx ![-5, -3, -1.5, 0]dB baseband gain RF_GAIN: Must be integer in [0:63] for approx [0:31]dB RF gain Returns: none BB_GAIN and RF_GAIN must be scalars (same values for all specified interfaces) or 1-D vectors (one value per interface) with length equal to the length of the interface ID vector rx_gains Sets the gains for the variable gain amplifiers in the MAX2829 Rx path Refer to MAX2829 datasheet for curves of gain value vs actual gain at 2.4 and 5GHz Arguments: (int BB_GAIN, int RF_GAIN) BB_GAIN: Must be integer in [0:31] for approx [0:63]dB baseband gain RF_GAIN: Must be integer in [1,2,3] for approx [0,15,30]dB RF gain Returns: none BB_GAIN and RF_GAIN must be scalars (same values for all specified interfaces) or 1-D vectors (one value per interface) with length equal to the length of the interface ID vector tx_lpf_corn_freq Sets the corner frequency for the MAX2829 Tx path low pass filter Refer to MAX2829 datasheet for curves of the frequency response with each setting Arguments: (int FILT) FILT: Must be integer in [1,2,3] for approx [12,18,24]MHz corner frequencies ([24,36,48]MHz bandwidths) Returns: none FILT must be scalar (same value for all specified interfaces) or 1-D vector (one value per interface) with length equal to the length of the interface ID vector rx_lpf_corn_freq Sets the corner frequency for the MAX2829 Rx path low pass filter Refer to MAX2829 datasheet for curves of the frequency response with each setting Arguments: (int FILT) FILT: Must be integer in [0,1,2,3] for approx ![7.5,9.5,14,18]MHz corner frequencies ([15,19,28,36]MHz bandwidths) Returns: none FILT must be scalar (same value for all specified interfaces) or 1-D vector (one value per interface) with length equal to the length of the interface ID vector

14

Baseband Commands
Baseband commands are selected as string inputs to the wl_basebandCmd method. These string are each individual cases of the switch statement in procCmd. Syntax MATLAB allows two valid forms of syntax for calling methods Let N be a scalar or vector of wl_node objects Let command_string be a string containing a particular command Let arg be an argument for that command (optional)

Syntax 1: wl_basebandCmd(N, command_string, arg1, arg2, ..., argN) Syntax 2: N.wl_basebandCmd(command_string, arg1, arg2, ..., argN) These two different forms of syntax are identical and either may be used for issuing commands to WARP nodes. Optional Buffer Selection Syntax
Some baseband commands require the selection of one or more buffers. This requirement is specified in the below documentation with Requires BUFF_SEL:. If a command requires a buffer selection, then the following syntaxes are valid: Let buffer_selection be a collection of interfaces or the string 'RF_ALL'

Syntax 1: wl_interfaceCmd(N, buffer_selection, command_string, arg1, arg2, ..., argN) Syntax 2: N.wl_interfaceCmd(buffer_selection, command_string, arg1, arg2, ..., argN)

Command List tx_delay Transmit delay- gets or sets the number of sample periods the baseband waits between the trigger and starting the transission Requires BUFF_SEL: No Arguments: none or (uint32 TX_DLY) Returns: (uint32 TX_DLY) or none If an argument is specified, this command enters a write mode where that argument is written to the board. If no argument is specified, the current value of TX_DLY is read from the board. tx_length Transmit length- reads or sets the duration of each transmit cycle, in sample periods Requires BUFF_SEL: No Arguments: none or (uint32 TX_LEN) Returns: (uint32 TX_LEN) or none If an argument is specified, this command enters a write mode where that argument is written to the board. If no argument is specified, the current value of TX_LEN is read from the board.

15

rx_length Receive length- reads or sets the duration of each receive cycle, in sample periods Requires BUFF_SEL: No Arguments: none or (uint32 RX_LEN) Returns: (uint32 RX_LEN) or none If an argument is specified, this command enters a write mode where that argument is written to the board. If no argument is specified, the current value of RX_LEN is read from the board. continuous_tx Enable/disable continuous transmit mode Requires BUFF_SEL: No Arguments: (boolean CONT_TX) CONT_TX: true enables continuous transmit mode false disable continuous transmit mode Returns: none tx_buff_en Enable transmit buffer for one or more interfaces. When a buffer is enabled it will drive samples into its associated interface when a trigger is received. The interface itself must also be enabled (wl_interfaceCmd(...,'tx_en')) to actually transmit the samples Requires BUFF_SEL: Yes Arguments: none Returns: none rx_buff_en Enable receive buffer for one or more interfaces. When a buffer is enabled it will capture samples from its associated interface when a trigger is received. The interface itself must also be enabled (wl_interfaceCmd(...,'rx_en')) Requires BUFF_SEL: Yes Arguments: none Returns: none tx_rx_buff_dis Disable the Tx and Rx buffers for one or more interfaces. When a buffer is disabled it will not output/capture samples when a trigger is received, even if the associated interface is enabled Requires BUFF_SEL: Yes Arguments: none Returns: none

16

tx_buff_clk_freq Read the transmit sample clock frequency out of the buffer core. Requires BUFF_SEL: No Arguments: none Returns: (uint32 Fs_Tx) Fs_Tx: Tx sample frequency of buffer core in Hz rx_buff_clk_freq Read the receive sample clock frequency out of the buffer core. Requires BUFF_SEL: No Arguments: none Returns: (uint32 Fs_Rx) Fs_Rx: Rx sample frequency of buffer core in Hz rx_rssi_clk_freq Read the receive RSSI sample clock frequency out of the buffer core. Requires BUFF_SEL: No Arguments: none Returns: (uint32 Fs_RxRSSI) Fs_RxRSSI: Rx RSSI sample frequency of buffer core in Hz write_iq Write I/Q samples to the specified buffers. The dimensions of the buffer selection and samples matrix must agree. The same samples can be written to multiple buffers by combining buffer IDs Requires BUFF_SEL: Yes (combined BUFF_SEL values ok) Arguments: (complex double TX_SAMPS, int OFFSET) TX_SAMPS: matrix of complex samples. The number of columns must match the length of BUFF_SEL OFFSET: buffer index of first sample to write (optional; defaults to 0) read_iq Read I/Q samples from the specified buffers. The elements of the buffer selection must be scalers which identify a single buffer. To read multiple buffers in one call, pass a vector of individual buffer IDs Requires BUFF_SEL: Yes (combined BUFF_SEL values not allowed) Arguments: (int OFFSET, int NUM_SAMPS) OFFSET: buffer index of first sample to read (optional; defaults to 0) NUM_SAMPS: number of complex samples to read (optional; defaults to length(OFFSET:rxIQLen-1))[[BR]] read_rssi Read RSSI samples from the specified buffers. The elements of the buffer selection must be scalers which identify a single buffer. To read multiple buffers in one call, pass a vector of individual buffer IDs. See 'read_iq' for arguments/returns

17

agc_state Read AGC state from the specified buffers. The elements of the buffer selection must be scalers which identify a single buffer. To read multiple buffers in one call, pass a vector of individual buffer IDs Requires BUFF_SEL: Yes (combined BUFF_SEL values not allowed) Arguments: none Returns: agc_state -- column vector per buffer BUFF_SEL agc_state(1): RF gain chosen by AGC agc_state(2): BB gain chosen by AGC agc_state(3): RSSI observed by AGC at time of lock agc_thresh Read or write AGC threshold. Requires BUFF_SEL: No Arguments: none or (int32 thresh1), (int32 thresh2), (int32 thresh3) Returns: (int32 thresh1), (int32 thresh2), (int32 thresh3) or none If arguments are specified, this command enters a write mode where those arguments are written to the board. If no arguments are specified, the current values of agc thresholds are read from the board. thresh1: receive power (in dBm) under which AGC will not attempt to change gains default value: -90 thresh2: receive power (in dBm) under which AGC will select high RF gain (RF Gain 3) default value: -53 thresh3: receive power (in dBm) under which AGC will select medium RF gain (RF Gain 2). Above this receive power the AGC will select low RF gain (RF Gain 1) default value: -43 Default known-good values for this threshold are derived from the MAX2829 datasheet (bottom, middle plot on page 16). These default values are (-90,-53,-43)dBm. There is no reason to call this command unless changing from these defaults is desired. agc_target Set the AGC target Requires BUFF_SEL: No. Values apply to all RF paths Arguments: (int32 target) target: target receive power (in dBm) default value: -10 Returns: none This command is the best way to tweak AGC behavior to apply more or less gain. For example, a target of -5dBm will apply more gain thatn a target of -10dBm, so the waveform will be larger at the inputs of the I and Q ADCs.

18

agc_noise_est Set the AGC noise estimate Requires BUFF_SEL: No. Values apply to all RF paths Arguments: (int32 noise_estimate) noise_estimate: rx noise power (in dBm) default value: -95 Returns: none agc_dco Enable/disable DC offset correction Requires BUFF_SEL: No Arguments: (boolean DCO) DCO: true enables DC offset correction false disable DC offset correction Returns: none agc_trig_delay Sets the AGC trigger delay. The argument specifies a delay (in number of cycles) that the AGC should wait before beginning its processing after the node receives a trigger. Requires BUFF_SEL: No. Values apply to all RF paths Arguments: (uint16 trigger_delay) trigger_delay: # if cycles of delay after trigger valid range: [0,511] Returns: none agc_reset Resets the AGC to its default state Requires BUFF_SEL: No. Values apply to all RF paths Arguments: none Returns: none agc_done_addr Sample index where AGC finished Requires BUFF_SEL: No. Values apply to all RF paths Arguments: Returns: (uint32) sample_index

19

Transport Commands
Transport commands are selected as string inputs to the wl_transportCmd method. These string are each individual cases of the switch statement in procCmd. Syntax MATLAB allows two valid forms of syntax for calling methods Let N be a scalar or vector of wl_node objects Let command_string be a string containing a particular command Let arg be an argument for that command (optional)

Syntax 1: wl_transportCmd(N, command_string, arg1, arg2, ..., argN) Syntax 2: N.wl_transportCmd(command_string, arg1, arg2, ..., argN) These two different forms of syntax are identical and either may be used for issuing commands to WARP nodes. Command List ping Test to make sure node can be accessed via this transport Arguments: none Returns: true if board responds; raises error otherwise payload_size_test Determine's objects maxPayload parameter Arguments: none Returns: none

20

Trigger Manager Commands


Trigger commands are selected as string inputs to the wl_transportCmd method. These string are each individual cases of the switch statement in procCmd.Syntax MATLAB allows two valid forms of syntax for calling methods Let N be a scalar or vector of wl_node objects Let command_string be a string containing a particular command Let arg be an argument for that command (optional)

Syntax 1: wl_transportCmd(N, command_string, arg1, arg2, ..., argN) Syntax 2: N.wl_transportCmd(command_string, arg1, arg2, ..., argN) These two different forms of syntax are identical and either may be used for issuing commands to WARP nodes. Command List add_trigger_input Associates node to a trigger input Arguments: (wl_trigger_manager TRIGGER) Returns: none delete_trigger_input Deassociates node to a trigger input Arguments: (wl_trigger_manager TRIGGER) Returns: none clear_trigger_input Clears all trigger associations in the node Arguments: none Returns: none get_trigger_input Reads current trigger association from node Arguments: node Returns: (uint32 TRIGGER_ASSOCIATION) TRIGGER_ASSOCIATION: bit-wise AND of associated trigger IDs test_trigger Sends a test trigger Arguments: none Returns: none

21

Example of usage
Digital Communication
An application of the WARPLab is SISO Digital Communication. We generate the data bit and compress with the carrier signal before transmit. We need to find the bit error rate of the transmission by comparing the transmitted bit and the received bit. The experiment can be divided into 4 parts. First, we have to set up the WARPLab by initialize the nodes object, create a UDP broadcast trigger and tell each other to be ready for transmission. In this case, we deal with the SISO transmission, so the number of nodes are 2.
NUMNODES = 2; nodes = wl_initNodes(NUMNODES); trig = wl_trigger_eth_udp_broadcast; wl_triggerManagerCmd(nodes,'add_trigger_input',[trig]);

Next, getting IDs for the interfaces on the boards and set up the interface for the experiment. In this example, we assumes each board has the same interface capabilities, we only need to get the IDs from one of the boards. The gain control can be setting manually by assigning USE_AGC = false, then you can set the gain of receiver for the baseband and radio frequency. Otherwise it will be automatically setting.
[RFA,RFB,RFC,RFD] = wl_getInterfaceIDs(nodes(1)); wl_interfaceCmd(nodes,RFA,'tx_gains',1,10); wl_interfaceCmd(nodes,RFA,'channel',2.4,11); USE_AGC = false; if(USE_AGC) wl_interfaceCmd(nodes,RFA,'rx_gain_mode','automatic'); wl_basebandCmd(nodes,'agc_target',-10); wl_basebandCmd(nodes,'agc_trig_delay', 500); wl_basebandCmd(nodes,'agc_dco', true); else wl_interfaceCmd(nodes,RFA,'rx_gain_mode','manual'); RxGainRF = 1; %Rx RF Gain in [1:3] RxGainBB = 10; %Rx Baseband Gain in [0:31] wl_interfaceCmd(nodes,RFA,'rx_gains',RxGainRF,RxGainBB); end

After that, we will use the transmitters I/Q buffer size to determine how long our transmission can be and set up the baseband for the experiment.
txLength = nodes(1).baseband.txIQLen; wl_basebandCmd(nodes,'tx_delay',0); wl_basebandCmd(nodes,'tx_length',txLength);

22

Second, we need to generate the transmit signal. The transmit signal consist of 2 parts, the preamble for AGC which corresponds to the short symbols from the 802.11a PHY standard and the payload which is our data
shortSymbol_freq = [0 0 0 0 0 0 0 0 1+i 0 0 0 -1+i 0 0 0 -1-i 0 0 0 1-i 0 0 0 -1-i 0 0 0 1-i 0 0 0 0 0 0 0 1-i 0 0 0 -1-i 0 0 0 1-i 0 0 0 -1-i 0 0 0 -1+i 0 0 0 1+i 0 0 0 0 0 0 0].'; shortSymbol_freq = [zeros(32,1);shortSymbol_freq;zeros(32,1)]; shortSymbol_time = ifft(fftshift(shortSymbol_freq)); shortSymbol_time = (shortSymbol_time(1:32).')./max(abs(shortSymbol_time)); shortsyms_rep = repmat(shortSymbol_time,1,30); preamble = shortsyms_rep; preamble = preamble(:); Ts = 1/(wl_basebandCmd(nodes(1),'tx_buff_clk_freq')); % Create time vector(Sample Frequency is Ts (Hz)) t = [0:Ts:((txLength-length(preamble)-1))*Ts].';

This example, we deal with the BPSK communication, a digital modulation that convey the data by modulating the phase of the reference signal. The digital data bits are randomly generated from the function randi([0 1], NSym, 1). The data bit are sent as an impulse, bandlimit in time-domain but unlimited bandwidth in frequency domain. So we need to convolve with some bandlimited pulse in frequency domain. The pulse shaping is setting by a function mypulseshape (...).
NZeros = 3; nsamp = NZeros+1; % --------------------------- BPSK -------------------------------NSym = ((2^15)-length(preamble)-200)/(NZeros+1);% number of symbols b = randi([0 1], NSym, 1); % random data bit x0 = [x.'; zeros(NZeros,NSym)]; % zero expansion x0 = x0(:); % ----------------------- pulse shaping---------------------------g = mypulseshape(NZeros,Ts,'rc'); xTx = conv(x0,g,'same'); payload_A = xTx; txData_A = [preamble; payload_A]; txData = [txData_A]; node_tx = nodes(1); node_rx = nodes(2);

23

Command Reference: mypulseshape() set the shape of the pulse that we need to compress with the data bits. inputs: (number_of_zero, time, type_of_pulse) Returns: pulse signal Type of pulse rectangular raise cosine sinc Gaussian value of type_of_pulse rect rc sinc gaussian

Pulse shaping is a method to reduce sidelobe energy relative to the pulse and must be done in such a way that intersymbol interference (ISI) between pulse in the received signal is not introduced.

Third, transmit and receive signal using WARPLab. The commands refer to reference design in WARPLab Framework part.
wl_basebandCmd(node_tx,[RFA], 'write_IQ', txData); wl_interfaceCmd(node_tx,RFA,'tx_en'); wl_interfaceCmd(node_rx,RFA,'rx_en'); wl_basebandCmd(node_tx,RFA,'tx_buff_en'); wl_basebandCmd(node_rx,RFA,'rx_buff_en'); trig.send(); rx_IQ = wl_basebandCmd(node_rx,[RFA],'read_IQ', 0, txLength); rx_RSSI = wl_basebandCmd(node_rx,[RFA],'read_RSSI'); wl_basebandCmd(nodes,RFA,'tx_rx_buff_dis'); wl_interfaceCmd(nodes,RFA,'tx_rx_dis');

Forth, after we received the data, we need to checking the bit error rate by applied the cross correlation technique, comparing the transmit and received signal, to find the range of the preamble and the payload. We extract the data bits by sampling every nsamp.
c = myxcorr(rx_IQ,preamble); [cMax,startPreamble] = max(c); p = angle(cMax); % compute the phase of the preamble startPayload = startPreamble + length(preamble) + 1; y = exp(-1i*p)*rx_IQ(startPayload:end); yData = y(1:nsamp:4*NSym); % sampling for extract the data bit bEst = (1-sign(real(yData)))/2; % bit estimate ber = sum(abs(b(1:length(bEst))-bEst))/length(bEst)% bit error rate

24

Command Reference: myxcorr() compute the cross correlation technique to find the range of preamble and payload inputs: (received_signal, preamble) Returns: value and index from the calculation

Finally, we compute the bandwidth of the transmission from the function mybandwidth()
MyBW = mybandwidth(xTx,y,NZeros,fA,'rc')

Command Reference: mybandwidth() compute the bandwidth of the transmission inputs: (transmit_signal, received_signal, number_of_zero, frequency, type_of_pulse) Returns: bandwidth of the transmission Type of pulse rectangular raise cosine sinc gaussian value of type_of_pulse rect rc sinc gaussian

25

Result

(a.)

(b.)

Figure 9 : Visualize of the transmission using raise cosine pulse (a.) 3 number of zeros (b.) 15 number of zero

26

(a.)

(b.)

Figure 10 : Visualize of the transmission using sinc pulse (a.) 3 number of zeros (b.) 15 number of zero

27

Figure 9 and Figure 10 show the transmit and receive signals, the spectrum of the transmit and receive signals, and the pulse shape used for BPSK. According to the result, we can prove the theory that a raise cosine function in time-domain will be a sinc function in frequency-domain and a sinc function in timedomain is a rectangular function in frequency-domain. Refer to the second row of the figures, the spectrum of transmit and receive signal, the black color is a spectrum of the transmit signal, the blue color is the spectrum of the receive signal and the red line is a theoretical signal. We also learn that the more number of zero, the less bandwidth of transmission, that means the less bits can be sent and received as shown in Table 1. Table 1 is an observation of the effect in number of zero with each pulse shape to the bandwidth and accuracy of transmission.

Table 1: The statistic of the result for each pulse shape and sample number of zeros. rectangular 3 5 15 7902 5268 1975 7902 3512 494 100 66.7 25 0 20.1 0 13.4 0 raise cosine 3 5 15 7902 5268 1975 7902 3512 494 100 66.7 25 0 20.1 0 13.5 0 sinc 5 5268 3512 66.7 0.001 7.9 gaussian 3 5 15 7902 5268 1975 7902 3512 494 100 66.7 25 0.02 16.2 0.04 12.6 0.08 -

no. Zero Bit sent Bit received


Percentage of transmission

3 7902 7902 100 0 13.8

15 1975 494 25 0 -

error Bandwidth

28

Appendix
Binary Phase Shift Keying (BPSK)
Binary Phase Shift Keying(BPSK or 2PSK) or Phase reversal Keying(PRK) is one of the simplest form of digital modulation. It uses two phases which are separated by 180 and so can also be termed 2-PSK. It does not particularly matter exactly where the constellation points are positioned, and in this Figure A1 they are shown on the real axis, at 0 and . This modulation is the most robust of all the PSKs since it takes the highest level of noise or distortion to make the demodulator reach an incorrect decision. However, only able to modulate at 1 bit/symbol (as seen in the figure) and so is unsuitable for high data-rate applications.

In the presence of an arbitrary phase-shift introduced by the communications channel, the demodulator is unable to tell which constellation point is which. As a result, the data is often differentially encoded prior to modulation. BPSK is functionally equivalent to 2-QAM modulation. Implementation The general form for BPSK follows the equation:

where fc is the frequency of the carrier-wave. Bit error rate of BPSK The bit error rate (BER) of BPSK in AWGN can be calculated as:

or
Since there is only one bit per symbol, this is also the symbol error rate.

29

Cross Correlation
Cross correlation is a technique of checking similarity of two waveforms as a function of a time-lag applied to one of them. This is also known as a sliding dot product or sliding inner-product. The crosscorrelation is similar in nature to the convolution of two functions.

For continuous functions, f and g, the cross-correlation is defined as:

where f *() denotes the complex conjugate of f().

Similarly, for discrete functions, the cross-correlation is defined as:

30

MATLAB Function Reference


mypulseshape()
function ps = mypulseshape(NZeros,Ts,shape) % number of sampling nsamp = NZeros+1; % rectangular if strcmp(shape,'rect') nt = ones(nsamp,1); ps = [zeros(nsamp/4,1); nt;zeros(nsamp/4,1)]; end % raise cosine if strcmp(shape,'rc') filtorder = nsamp*4; delay = filtorder/(nsamp*2); rolloff = 1; rrcfilter = rcosine(1,nsamp,'fir/normal',rolloff,delay); ps = rrcfilter; end % sinc if strcmp(shape,'sinc') fsinc = 1/nsamp; % number of periods Np = 100; tsinc = (-Np*(nsamp-1):Np*(nsamp-1))*Ts; T0 = NZeros*Ts; ps = sinc(tsinc/T0); end % gaussian if strcmp(shape,'gaussian') bt = 0.2; % 3-dB bandwidth-symbol time (b is the one-sided bandwidth in Hz. Smaller bt, larger pulse widths.) o = nsamp; % Oversampling factor (number of samples per symbol) n = 2; % number of symbol periods between the start of impulse response and its peak. ps = gaussfir(bt,n,o); end

myxcorr()
function c = myxcorr(x,y) N = length(x); M = length(y); for k=1:N c(k) = 0; for l=1:M c(k) = c(k) + x(min(N,k+l))*conj(y(min(M,l))); end end

31

mybandwidh()
function bw = mybandwidth(xTx,y,NZeros,fA,type) TA = 1/fA; TTx = length(xTx)*TA;TRx = length(y)*TA; fTx = -1/2/TA+1/TTx:1/TTx:1/2/TA; fRx = -1/2/TA+1/TRx:1/TRx:1/2/TA; temp = 0; if strcmp(type,'rect') num = 1000; x = sinc(fTx*TA*(NZeros+1)); else if strcmp(type,'rc') num = 500; x = sinc(fTx*TA*(NZeros+1)); else if strcmp(type,'sinc') num = 300; x = rectangularPulse(fTx*TA*(NZeros)); temp = 1; else if strcmp(type,'gaussian') num = 1000; x = sinc(fTx*TA*(NZeros+1)); end end end end if temp == 1 x_smooth = x; M = length(x_smooth); idx = find(x_smooth); z_idx = idx(1); y_idx = idx(end); else if temp == 0 x_smooth = 20*log10(abs(x)); M = length(x_smooth); [my,m] = max(x_smooth); for i=m+5000:M-num a(i) = mean(x_smooth(i-num/2:i)); b(i) = mean(x_smooth(i:i+num/2)); if a(i)-b(i) < 0 y = x_smooth(i); y_idx = i; break end end for j=m-5000:-1:num c(j) = mean(x_smooth(j:j+num/2)); d(j) = mean(x_smooth(j-num/2:j)); if c(j)-d(j) < 0 z = x_smooth(j); z_idx = j; break end end end end fB1 = fRx(z_idx); fB2 = fRx(y_idx); bw = fB2-fB1;

32

Reference
http://warp.rice.edu/trac John B. Anderson, Digital Transmission Engineering, 2nd Edition, Wiley-Interscience, 2005 V. Chandra Sekar, Communication systems, Oxford University Press, 2012 David Tse and Pramod Viswanath, Fundamentals of Wireless Communication, Cambridge University Press, 2005 http://www2.siit.tu.ac.th/prapun/ecs455/index.html http://www2.siit.tu.ac.th/prapun/ecs332/index.html http://en.wikipedia.org/wiki/Phase-shift_keying#timing http://en.wikipedia.org/wiki/Cross-correlation http://en.wikipedia.org/wiki/Bandwidth

33

You might also like