[[TracNav(WARPLab/TOC)]] = WARPLab 7 Example: SISO OFDM = File: [source:/ResearchApps/PHY/WARPLAB/WARPLab7/M_Code_Examples/wl_example_siso_ofdm_txrx.m wl_example_siso_ofdm_txrx.m] This WARPLab example implements a simple OFDM transmitter and receiver. The script can run with or without WARP hardware in the loop and does not require any extra MATLAB toolboxes. '''Important:''' this script is not intended as a tutorial of OFDM. If you're not already familiar with the basics of OFDM please start with one of the many good [https://www.google.com/search?q=ofdm+tutorial OFDM tutorials] available online. You will need to know the basics of OFDM before understanding the Tx and Rx processing in this example. == Transmitter == [[Image(wl_ofdm_blkDiag_Tx.png, nolink)]] The OFDM transmitter code implements the following functions: * Random data generation * Modulation of random data to complex constellation symbols * Mapping of symbols to data-bearing subcarriers * Insertion of pilot tones in pilot subcarriers * Inverse fast Fourier transform (IFFT) * Cyclic prefix insertion * Preamble construction and insertion * Interpolation by 2x == Receiver == [[Image(wl_ofdm_blkDiag_Rx.png, nolink)]] The OFDM receiver code implements the following functions: * LTS correlation for synchronization * CFO estimation and correcting use time-domain estimation from LTS * Cyclic prefix removal * Fast Fourier transform (FFT) * Channel estimation from frequency-domain LTS * Residual phase error estimation from frequency-domain pilot tones * Equalization of data-bearing subcarriers using channel estimates and phase error estimates * Demodulation of complex symbols to data values == Running the Example == The WARPLab OFDM example can be used in simulation only mode and in hardware-in-the-loop mode. === Simulation === To use the example in simulation mode set the top-level param {{{USE_WARPLAB_TXRX = 0;}}}, then run the m-script. When the script finishes 6 plots will show: ||||||= '''Simulation Plots''' =|| || [[Image(wl_ofdm_plots_sim_txIQ.png,width=250)]][[BR]]Transmitted waveform || [[Image(wl_ofdm_plots_sim_rxIQ.png,width=250)]] [[BR]]Received waveform || [[Image(wl_ofdm_plots_sim_ltsCorr.png,width=250)]] [[BR]]Preamble correlation results[[BR]](peaks indicate locations of preamble LTS) || || [[Image(wl_ofdm_plots_sim_chanEst.png,width=250)]] [[BR]]Channel estimate per subcarrier[[BR]](I/Q components and complex magnitude) || [[Image(wl_ofdm_plots_sim_phaseError.png,width=250)]] [[BR]]Phase error estimates[[BR]](per OFDM symbol) || [[Image(wl_ofdm_plots_sim_constellations.png,width=250)]] [[BR]]Tx and Rx constellations || ||||||= [[BR]] =|| By default the simulation script applies AWGN with an arbitrary fixed SNR. You can change the simulated propagation characteristics in the m-code. Search for {{{AWGN}}} and apply whatever Tx->Rx degradations you like. For example to simulate a perfect (noiseless) link, set the noise power to zero: {{{ rx_vec_air = tx_vec_air + 0*complex(randn(1,length(tx_vec_air)), randn(1,length(tx_vec_air))); }}} The script also prints statistics about the experiment to the MATLAB command prompt: {{{ Results: Num Bytes: 4560 Sym Errors: 0 (of 9120 total symbols) Bit Errors: 0 (of 36480 total bits) EVM: 3.779% LTS CFO Est: -0.07 kHz }}} === Hardware in the Loop === To use the example with WARP hardware you will need two WARP nodes each running WARPLab 7.3 (or later) and a WARPLab environment setup on your PC. Refer to the [wiki:../../QuickStart WARPLab Quick Start] if you have not yet setup WARPLab. To target WARP hardware set the top-level param {{{USE_WARPLAB_TXRX = 1;}}}, then run the m-script. When the script finishes 6 plots will show: ||||||= '''Hardware in the Loop Plots''' =|| || [[Image(wl_ofdm_plots_hw_txIQ.png,width=250)]][[BR]]Transmitted waveform || [[Image(wl_ofdm_plots_hw_rxIQ.png,width=250)]] [[BR]]Received waveform || [[Image(wl_ofdm_plots_hw_ltsCorr.png,width=250)]] [[BR]]Preamble correlation results[[BR]](peaks indicate locations of preamble LTS) || || [[Image(wl_ofdm_plots_hw_chanEst.png,width=250)]] [[BR]]Channel estimate per subcarrier[[BR]](I/Q components and complex magnitude) || [[Image(wl_ofdm_plots_hw_phaseError.png,width=250)]] [[BR]]Phase error estimates[[BR]](per OFDM symbol) || [[Image(wl_ofdm_plots_hw_constellations.png,width=250)]] [[BR]]Tx and Rx constellations || ||||||= [[BR]] =|| The script also prints statistics about the experiment to the MATLAB command prompt: {{{ Results: Num Bytes: 4560 Sym Errors: 0 (of 9120 total symbols) Bit Errors: 0 (of 36480 total bits) EVM: 4.541% LTS CFO Est: 2.64 kHz }}} == Limitations == This example is intended as a staring point for researchers wishing to use WARPLab to prototype a wireless communications link. This examples does not implement some some blocks common in deployed OFDM systems, such as scrambling, interleaving and error correcting coding. For an example of a real-time OFDM implementation that implements all of these subsystems, please see the PHY in the [wiki:802.11 802.11 Reference Design].