www.gusucode.com > wlan 源码程序 matlab案例代码 > wlan/NonHTPacketRecoveryExample.m

    %% Non-HT Packet Recovery
% This example steps through recovery of non-HT format waveform content.
%% Generate 20 MHz Non-HT Waveform
% Create a non-HT configuration object and transmission PSDU. Set |MCS| to
% |4|. Later these settings are compared to recovered signal information.
% For a non-HT waveform, the data field is |PSDULength*8| bits.
nht = wlanNonHTConfig('MCS',4);
txPSDU = randi([0 1],nht.PSDULength*8,1);
%%
% Create the PPDU fields individually. Use the non-HT-Data contents to
% check the bit error rate after recovery.  Create L-STF, L-LTF, and L-SIG
% preamble fields and non-HT data field.
lstf = wlanLSTF(nht);
lltf = wlanLLTF(nht);
lsig = wlanLSIG(nht);
nhtData = wlanNonHTData(txPSDU,nht);
%%
% Concatenate the individual fields to create a single PPDU waveform.
txPPDU = [lstf; lltf; lsig; nhtData];
%% Pass Non-HT Waveform Through 802.11g SISO Channel
% Calculate the free-space path loss for a transmitter-to-receiver
% separation distance of 3 meters. Create an 802.11g channel with a 3 Hz
% maximum Doppler shift and an RMS path delay equal to two times the sample
% time. Create an AWGN channel.
dist = 3;
pathLoss = 10^(-log10(4*pi*dist*(2.4e9/3e8)));
fs = 20e6;
trms = 2/fs;
ch802 = stdchan(1/fs,3,'802.11g',trms);
awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');
%%
% Calculate the noise variance for a receiver with a 9 dB noise figure. The
% noise variance, |noiseVar|, 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. Pass the transmitted
% waveform through the noisy, lossy 802.11g channel.
noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10);
rxPPDU = awgnChan(filter(ch802,txPPDU),noiseVar) * pathLoss;
%% Recover Non-HT Preamble Contents from PPDU
% In general, the L-STF and L-LTF are processed to perform frequency offset
% estimation and correction, and symbol timing. For this example, the
% carrier frequency is not offset and the packet timing is 'on-time'.
% Therefore, for accurate demodulation, determination of carrier frequency
% offset and symbol timing is not required.

%%
% Find the start and stop indices for the PPDU fields.
fieldInd = wlanFieldIndices(nht)
%%
% The stop index of the L-SIG field indicates the preamble length in
% samples.
numSamples = fieldInd.LSIG(2);
%%
% Plot the preamble and the beginning of the packet data. Add markers to
% and plot to delineate the packet field boundaries.
time = ([0:double(numSamples)-1]/fs)*1e6;
peak = 1.2*max(abs(rxPPDU(1:numSamples)));
fieldMarkers = zeros(numSamples,1);
fieldMarkers(fieldInd.LSTF(2)-1,1)  = peak;
fieldMarkers(fieldInd.LLTF(2)-1,1) = peak;
fieldMarkers(fieldInd.LSIG(2)-1,1) = peak;
plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers)
xlabel ('Time (microseconds)')
ylabel('Magnitude')
title('Non-HT Format Preamble')

%%
% Demodulate the L-LTF and estimate the channel.
rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:);
demodLLTF = wlanLLTFDemodulate(rxLLTF,nht);
chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,nht);
%%
% Extract the L-SIG field from the received PPDU and recover its
% information bits.
rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:);
recLSIG = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,'CBW20');
%%
% The first four bits of the L-SIG field, bits 0 through 3, contain the
% rate information. Confirm that the sequence |[1 0 0 1]| is recovered.
% This sequence corresponds to the 24 MHz data rate for the non-HT MCS
% setting of |4|.
rate = recLSIG(1:4)'

%%
% Extract and demodulate the L-LTF. Use the demodulated signal to perform
% channel estimation. Use the channel estimate to recover the non-HT-Data
% field.
rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:);
demodLLTF = wlanLLTFDemodulate(rxLLTF,nht);
chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,nht);

%% Recover Non-HT-Data Contents from PPDU
% Create a recovery configuration object, with its equalization method set
% to zero forcing.
cfgRec = wlanRecoveryConfig('EqualizationMethod','ZF');
%%
% Recover equalized symbols using channel estimates from HT-LTF.
rxPSDU = rxPPDU(fieldInd.NonHTData(1):fieldInd.NonHTData(2),:);
[recPSDU,~,eqSym] = wlanNonHTDataRecover(rxPSDU,chEstLLTF,noiseVar,nht,cfgRec);
%%
% Compare the transmitted and received PSDU bits, and confirm that the
% number of bit errors is zero.
numErr = biterr(txPSDU,recPSDU)