%% Recover VHT Data from 2x2 MIMO Channel
% Transmit a VHT-LTF and a VHT data field through a noisy 2x2 MIMO channel. Demodulate the received VHT-LTF to estimate the channel coefficients. Recover the VHT data and determine the number of bit errors.
% Set the channel bandwidth and corresponding sample rate.

bw = 'CBW160';
fs = 160e6;

%
% Create VHT-LTF and VHT data fields having two transmit antennas and two space-time streams.

cfg = wlanVHTConfig('ChannelBandwidth',bw, ...
    'NumTransmitAntennas',2,'NumSpaceTimeStreams',2);
txPSDU = randi([0 1],8*cfg.PSDULength,1);
txLTF = wlanVHTLTF(cfg);
txDataSig = wlanVHTData(txPSDU,cfg);

%
% Create a 2x2 MIMO TGac channel.

tgacChan = wlanTGacChannel('SampleRate',fs,'ChannelBandwidth',bw, ...
    'NumTransmitAntennas',2,'NumReceiveAntennas',2);

%
% Create an AWGN channel noise, setting SNR = 15 dB.

chNoise = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)',...
    'SNR',15);

%
% Pass the signals through the TGac channel and noise models.

rxLTF = chNoise(tgacChan(txLTF));
rxDataSig = chNoise(tgacChan(txDataSig));

%
% Create an AWGN channel for a 160 MHz channel with a 9 dB noise figure. The noise variance, nVar, is equal to kTBF, where k is Boltzmann's constant, T is the ambient temperature of 290 K, B is the bandwidth (sample rate), and F is the receiver noise figure.

nVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10);
rxNoise = comm.AWGNChannel('NoiseMethod','Variance','Variance',nVar);

%
% Pass the signals through the receiver noise model.

rxLTF = rxNoise(rxLTF);
rxDataSig = rxNoise(rxDataSig);

%
% Demodulate the VHT-LTF. Use the demodulated signal to estimate the channel coefficients.

dLTF = wlanVHTLTFDemodulate(rxLTF,cfg);
chEst = wlanVHTLTFChannelEstimate(dLTF,cfg);

%
% Recover the data and determine the number of bit errors.

rxPSDU = wlanVHTDataRecover(rxDataSig,chEst,nVar,cfg);
numErr = biterr(txPSDU,rxPSDU)

% Copyright 2012 The MathWorks, Inc.