www.gusucode.com > wlan 源码程序 matlab案例代码 > wlan/EndtoEndVHTSimulationExample.m
%% End-to-End VHT Simulation with Frequency Correction % This example shows how to generate, transmit, recover and view a VHT MIMO % waveform. %% % Steps in the example: % % * Transmit a VHT waveform through a MIMO channel with AWGN % * Perform a two-stage process to estimate and correct for a frequency offset % * Estimate the channel response % * Recover the VHT data field % * Compare the transmitted and received PSDUs to determine if bit errors occurred % %% % Set the parameters used throughout the example. cbw = 'CBW160'; % Channel bandwidth fs = 160e6; % Sample rate (Hz) ntx = 2; % Number of transmit antennas nsts = 2; % Number of space-time streams nrx = 2; % Number of receive antennas %% % Create a VHT configuration object that supports a 2x2 MIMO transmission % and has an APEP length of 2000. vht = wlanVHTConfig('ChannelBandwidth',cbw,'APEPLength',2000, ... 'NumTransmitAntennas',ntx,'NumSpaceTimeStreams',nsts, ... 'SpatialMapping','Direct','STBC',false); %% % Generate a VHT waveform containing a random PSDU. txPSDU = randi([0 1],vht.PSDULength*8,1); txPPDU = wlanWaveformGenerator(txPSDU,vht); %% % Create a 2x2 TGac channel and an AWGN channel. tgacChan = wlanTGacChannel('SampleRate',fs,'ChannelBandwidth',cbw, ... 'NumTransmitAntennas',ntx,'NumReceiveAntennas',nrx, ... 'LargeScaleFadingEffect','Pathloss and shadowing', ... 'DelayProfile','Model-C'); awgnChan = comm.AWGNChannel('NoiseMethod','Variance', ... 'VarianceSource','Input port'); %% % Create a phase/frequency offset object. pfOffset = comm.PhaseFrequencyOffset('SampleRate',fs,'FrequencyOffsetSource','Input port'); %% % Calculate the noise variance for a receiver with a 9 dB noise figure. % Pass the transmitted waveform through the noisy TGac channel. nVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10); rxPPDU = awgnChan(tgacChan(txPPDU), nVar); %% % Introduce a frequency offset of 500 Hz. rxPPDUcfo = pfOffset(rxPPDU,500); %% % Find the start and stop indices for all component fields of the PPDU. ind = wlanFieldIndices(vht); %% % Extract the L-STF. Estimate and correct for the carrier frequency offset. rxLSTF = rxPPDUcfo(ind.LSTF(1):ind.LSTF(2),:); foffset1 = wlanCoarseCFOEstimate(rxLSTF,cbw); rxPPDUcorr = pfOffset(rxPPDUcfo,-foffset1); %% % Extract the L-LTF from the corrected signal. Estimate and correct for the % residual frequency offset. rxLLTF = rxPPDUcorr(ind.LLTF(1):ind.LLTF(2),:); foffset2 = wlanFineCFOEstimate(rxLLTF,cbw); rxPPDU2 = pfOffset(rxPPDUcorr,-foffset2); %% % Extract and demodulate the VHT-LTF. Estimate the channel coefficients. rxVHTLTF = rxPPDU2(ind.VHTLTF(1):ind.VHTLTF(2),:); dLTF = wlanVHTLTFDemodulate(rxVHTLTF,vht); chEst = wlanVHTLTFChannelEstimate(dLTF,vht); %% % Extract the VHT data field from the received and frequency-corrected % PPDU. Recover the data field. rxVHTData = rxPPDU2(ind.VHTData(1):ind.VHTData(2),:); rxPSDU = wlanVHTDataRecover(rxVHTData,chEst,nVar,vht); %% % Calculate the number of bit errors in the received packet. numErr = biterr(txPSDU,rxPSDU)