We have developed several demo projects to provide users a quick start into designing their own experiments:
SISO OFDM TX/RX:
SISO_OFDM.py - Generates, transmits, and receives and OFDM signal. The user can select one of the following modulation schemes BPSK/QPSK/16QAM/64QAM It requires two Iris boards (chained or unchained). The TX board will transmit the signal from RF chain A and the RX board will receive it at RF chain A as well (script can be extended to support both chains). The script can be run in two modes:
- SIM (simulation using an AWGN channel)
- OTA (over-the-air transmission)
SISO SIMPLE TX/RX:
SISO_TX.py - Simple transmitter. Generate signal and transmit it from one of the antennas in the Iris Board. Supported signal types: LTE, WiFi LTS, WiFi STS, and Sine. Relies on the Block RAM pre-loaded-signal transmission mode.
SISO_RX.py - Simple receiver. Receive signal and plot it continuously. Signal can be recorded and stored in HDF5 format. Alternatively, RX samples can be recorded into a binary file using the “write_to_file” function. AGC can be enabled by the user, if desired.
Run both the SISO_TX.py script and SISO_RX.py script at the same time.
SISO TDD TX/RX
SISO_TXRX_TDD.py - This script is useful for testing the TDD operation. It programs two Irises in TDD mode with the following framing schedule:
- Iris 1: PGRG
- Iris 2: RGPG
where P means a pilot or a pre-loaded signal, G means Guard band (no Tx or Rx action), R means Rx, and T means Tx, though not used in this script.
The above determines the operation for each frame and each letter determines one symbol. Although every 16 consecutive frames can be scheduled separately. The pilot signal in this case is a sinusoid which is written into FPGA buffer (TX_RAM_A & TX_RAM_B for channels A & B) before the start trigger.
The script programs the Irises in a one-shot mode, i.e. they run for just one frame. This means that each frame starts with a separate trigger. After the end of the frame, the script plots the two Rx symbols which are supposedly what each of the Iris boards received from each other (as shown in the schedule above).
SOUNDER_TXRX.py - Basic channel sounding test. It program two Irises in TDD mode (one as a base station node, and the other as a UE/client node) to transmit and receive according to a specific schedule/frame where the BS is required to first send a beacon signal (initial “P”). This beacon consists of a signal that has been pre-loaded to the BS FPGA buffer. Similarly, the conjugate of the beacon signal has been pre-loaded to the UE’s buffer in order to enable any correlation operation on the UE side.
MIMO AND MASSIVE MIMO
MMIMO_RECEIVER.py - Simple “Offline” Massive MIMO receiver. Used to post-process data obtained from Sounder. The output of the Sounder consists of an HDF5 file with metadata and TX/RX IQ samples. This script takes the HDF5 file as input and allows users to analyze its contents. If uplink data is transmitted, the script shows the RX constellation. Two modes are currently supported: (a) Sim - where the TX samples provided in the HDF5 file are passed through an AWGN channel and (b) Replay - where the RX IQ samples in the HDF5 file are fully processed.
MMIMO_DOWNLINK.py - Script to test the effects of reciprocity calibration on downlink signal.
BEACON_SWEEP.py - Generate beacon and precode signal in order to create a beamsweep.
NB_CAL_DEMO.py - Sample script showing a basic reciprocity calibration procedure that runs at the Base Station (eNodeB).
WB_CAL_DEMO.py - Wideband calibration demo. It implements the Argos calibration method among anntennas within a base station, and plots the magnitude and phase of the calibration vector on 4 select subcarriers for all antennas.
AGC_SIM_DEMO.py - Non-realtime script designed to demonstrate the operation of the AGC State machine. This AGC runs on the host machine and therefore it implements a VERY coarse version of the AGC (non-real time). That is, only one gain adjustment occurs at each buffer read. It requires two Iris boards. One TX and one RX. The TX is continuously transmitting and we use the digital RSSI measurements obtained from the LMS7 in order to adapt the RX amplifiers. As of this moment, there is no way of synchronizing a received frame to the reading of the RSSI. Therefore, we need to keep the TX continuously sending a signal (e.g., by running SISO_TX.py on one of the boards).