www.gusucode.com > wlan 源码程序 matlab案例代码 > wlan/VHTPacketRecoveryExample.m
%% VHT Packet Recovery % This example shows how to recover contents from a VHT format waveform. %% Generate 80 MHz VHT Waveform % Create a VHT configuration object. Set |APEPLength| to |3200| and |MCS| % to |5|. Later these settings are compared to recovered signal % information. Create a transmission bit stream for the data field. For a % VHT waveform, the data field is |PSDULength*8| bits. vht = wlanVHTConfig('APEPLength',3200,'MCS',5); txBits = randi([0 1],vht.PSDULength*8,1); %% % Create the PPDU fields individually. Create L-STF, L-LTF, L-SIG, % VHT-SIG-A, VHT-STF, VHT-LTF, and VHT-SIG-B preamble fields and the % VHT-Data field. lstf = wlanLSTF(vht); lltf = wlanLLTF(vht); lsig = wlanLSIG(vht); vhtSigA = wlanVHTSIGA(vht); vhtstf = wlanVHTSTF(vht); vhtltf = wlanVHTLTF(vht); vhtSigB = wlanVHTSIGB(vht); vhtData = wlanVHTData(txBits,vht); %% % Concatenate the individual fields to create a single PPDU waveform. txPPDU = [lstf; lltf; lsig; vhtSigA; vhtstf; vhtltf; vhtSigB; vhtData]; %% Pass VHT Waveform Through TGac SISO Channel % Create TGac SISO and AWGN channel objects. chBW = vht.ChannelBandwidth; fs = 80e6; tgacChan = wlanTGacChannel('SampleRate',fs,'ChannelBandwidth',chBW,... 'LargeScaleFadingEffect','Pathloss and shadowing'); 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 TGac channel. noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10) rxPPDU = awgnChan(tgacChan(txPPDU),noiseVar); %% Recover VHT 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(vht) %% % The stop index of VHT-SIG-B indicates the preamble length in samples. numSamples = fieldInd.VHTSIGB(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; fieldMarkers(fieldInd.VHTSIGA(2)-1,1) = peak; fieldMarkers(fieldInd.VHTSTF(2)-1,1) = peak; fieldMarkers(fieldInd.VHTLTF(2)-1,1) = peak; fieldMarkers(fieldInd.VHTSIGB(2)-1,1) = peak; plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers) xlabel ('Time (microseconds)') ylabel('Magnitude') title('VHT Format Preamble') %% % Demodulate the L-LTF and estimate the channel. rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:); demodLLTF = wlanLLTFDemodulate(rxLLTF,vht); chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,vht); %% % Extract the L-SIG field from the received PPDU, recover its information % bits and check the CRC. rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:); [recLSIG,failCRC] = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,chBW); failCRC %% % |failCRC = 0| indicates that CRC passed. %% % For the VHT format, the L-SIG rate bits are constant and set to |[1 1 0 % 1]|. Inspect the L-SIG rate information and confirm that this constant % sequence is recovered. For the VHT format, the MCS setting in VHT-SIG-A2 % determines the actual data rate. rate = recLSIG(1:4)' %% % Extract the VHT-SIG-A and confirm that the CRC check passed. rxVHTSIGA = rxPPDU(fieldInd.VHTSIGA(1):fieldInd.VHTSIGA(2),:); [recVHTSIGA,failCRC] = wlanVHTSIGARecover(rxVHTSIGA, ... chEstLLTF,noiseVar,chBW); failCRC %% % Extract the MCS setting from the VHT-SIG-A. For single user VHT, the MCS % is located in VHT-SIG-A2 bits 4 through 7. recMCSbits = (recVHTSIGA(29:32))'; recMCS = bi2de(double(recMCSbits)) isequal(recMCS,vht.MCS) %% % The recovered MCS setting matches the MCS value in the configuration % object. %% % Extract and demodulate the VHT-LTF. Use the demodulated signal to perform % channel estimation. Use the channel estimate to recover the VHT-SIG-B and % VHT-Data fields. rxVHTLTF = rxPPDU(fieldInd.VHTLTF(1):fieldInd.VHTLTF(2),:); demodVHTLTF = wlanVHTLTFDemodulate(rxVHTLTF,vht); chEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF,vht); %% % Extract and recover the VHT-SIG-B. rxVHTSIGB = rxPPDU(fieldInd.VHTSIGB(1):fieldInd.VHTSIGB(2),:); recVHTSIGB = wlanVHTSIGBRecover(rxVHTSIGB,chEstVHTLTF,noiseVar,chBW); %% % As described in IEEE Std 802.11ac-2013, Table 22-1, the value in the % VHT-SIG-B Length field multiplied by 4 is the recovered APEP length for % packets carrying data. Verify that the APEP length, contained in the % first 19 bits of the VHT-SIG-B, corresponds to the specified APEP length. sigbAPEPbits = recVHTSIGB(1:19)'; sigbAPEPlength = bi2de(double(sigbAPEPbits))*4 isequal(sigbAPEPlength,vht.APEPLength) %% % The recovered value matches the configured APEP Length. %% Recover VHT-Data Contents from PPDU % Construct a recovery configuration object. cfgRec = wlanRecoveryConfig; %% % Recover receive equalized symbols using channel estimates from VHT-LTF. recPSDU = wlanVHTDataRecover(rxPPDU(fieldInd.VHTData(1):fieldInd.VHTData(2),:),... chEstVHTLTF,noiseVar,vht,cfgRec); %% % Compare transmission and receive PSDU bits. numErr = biterr(txBits,recPSDU) %% % The number of bit errors is zero.