www.gusucode.com > wlan 源码程序 matlab案例代码 > wlan/HTPacketRecoveryExample.m
%% HT Packet Recovery % This example shows how to recover content from a HT format waveform. %% Generate 20 MHz HT Waveform % Create an HT configuration object and transmission PSDU. Set |MCS| to % |2|. Later these settings are compared to recovered signal information. % For an HT waveform, the data field is |PSDULength*8| bits. ht = wlanHTConfig('MCS',2); txPSDU = randi([0 1],ht.PSDULength*8,1); %% % Create the PPDU fields individually. Create L-STF, L-LTF, L-SIG, HT-SIG, % HT-STF, and HT-LTF preamble fields and the HT-Data field. lstf = wlanLSTF(ht); lltf = wlanLLTF(ht); lsig = wlanLSIG(ht); htsig = wlanHTSIG(ht); htstf = wlanHTSTF(ht); htltf = wlanHTLTF(ht); htData = wlanHTData(txPSDU,ht); %% % Concatenate the individual fields to create a single PPDU waveform. txPPDU = [lstf; lltf; lsig; htsig; htstf; htltf; htData]; %% Pass HT Waveform Through TGn SISO Channel % Create TGn SISO channel and AWGN channel objects. fs = 20e6; tgnChan = wlanTGnChannel('SampleRate',fs,'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 TGn channel. noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10); rxPPDU = awgnChan(tgnChan(txPPDU),noiseVar); %% Recover 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(ht) %% % The stop index of HT-LTF indicates the preamble length in samples. numSamples = fieldInd.HTLTF(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.HTSIG(2)-1,1) = peak; fieldMarkers(fieldInd.HTSTF(2)-1,1) = peak; fieldMarkers(fieldInd.HTLTF(2)-1,1) = peak; plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers) xlabel ('Time (microseconds)') ylabel('Magnitude') title('HT Format Preamble') %% % Demodulate the L-LTF and estimate the channel. rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:); demodLLTF = wlanLLTFDemodulate(rxLLTF,ht); chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,ht); %% % Extract the L-SIG field from the received PPDU and recover its % information bits. rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:); [recLSIG,failCRC] = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,ht.ChannelBandwidth); failCRC %% % |failCRC = 0| indicates that CRC passed. %% % For the HT 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 HT format, the MCS setting in HT-SIG % determines the actual data rate. rate = recLSIG(1:4)' %% % Extract the HT-SIG and confirm that the CRC check passed. recHTSIG = rxPPDU(fieldInd.HTSIG(1):fieldInd.HTSIG(2),:); [recHTSIG,failCRC] = wlanHTSIGRecover(recHTSIG,chEstLLTF,noiseVar,ht.ChannelBandwidth); failCRC %% % Extract the MCS setting from the HT-SIG. For HT, the MCS is located in % HT-SIG bits 0 through 6. recMCSbits = (recHTSIG(1:7))'; recMCS = bi2de(double(recMCSbits)) isequal(recMCS,ht.MCS) %% % The recovered MCS setting matches the MCS value in the configuration % object. %% % Extract and demodulate the HT-LTF. Use the demodulated signal to perform % channel estimation. Use the channel estimate to recover the HT-Data % field. rxHTLTF = rxPPDU(fieldInd.HTLTF(1):fieldInd.HTLTF(2),:); demodHTLTF = wlanHTLTFDemodulate(rxHTLTF,ht); chEstHTLTF = wlanHTLTFChannelEstimate(demodHTLTF,ht); %% Recover HT-Data Contents from PPDU % Create a recovery configuration object. cfgRec = wlanRecoveryConfig; %% % Recover the received equalized symbols using channel estimates from the % HT-LTF. [recPSDU] = wlanHTDataRecover(rxPPDU(fieldInd.HTData(1):fieldInd.HTData(2),:),... chEstHTLTF,noiseVar,ht,cfgRec); %% % Compare the transmitted and received PSDU bits, and confirm that the % number of bit errors is zero. numErr = biterr(txPSDU,recPSDU)