81 lines
3.3 KiB
Matlab
81 lines
3.3 KiB
Matlab
function [numPacketErrors, numPacketsSimulated, cfrMagnitudes]= simulateTransmission(cfgEHT, channel, maxChDelay, snr, maxNumPackets, maxNumErrors, simParameters, chanBW, substreamIndex, elevationAngles)
|
|
numPacketErrors = 0;
|
|
numPacketsSimulated = 0;
|
|
cfrMagnitudes = [];
|
|
|
|
ofdmInfo = wlanEHTOFDMInfo('EHT-Data', cfgEHT);
|
|
ind = wlanFieldIndices(cfgEHT);
|
|
|
|
if nargin < 9
|
|
substreamIndex = 1;
|
|
end
|
|
if nargin < 10
|
|
elevationAngles = simParameters.ElevationAngle * ones(1, maxNumPackets);
|
|
end
|
|
|
|
stream = RandStream('combRecursive', Seed=simParameters.Seed);
|
|
stream.Substream = substreamIndex;
|
|
RandStream.setGlobalStream(stream);
|
|
|
|
snrVal = convertSNR(snr, "snrsc", "snr", FFTLength=ofdmInfo.FFTLength, NumActiveSubcarriers=ofdmInfo.NumTones);
|
|
|
|
while numPacketErrors < maxNumErrors && numPacketsSimulated < maxNumPackets
|
|
numPacketsSimulated = numPacketsSimulated + 1;
|
|
|
|
packetElevationAngle = elevationAngles(numPacketsSimulated);
|
|
channel.SatelliteDopplerShift = dopplerShiftCircularOrbit(packetElevationAngle, simParameters.SatelliteAltitude, simParameters.MobileAltitude, simParameters.CarrierFrequency);
|
|
|
|
txPSDU = randi([0 1], psduLength(cfgEHT) * 8, 1);
|
|
tx = wlanWaveformGenerator(txPSDU, cfgEHT);
|
|
|
|
txPad = [tx; zeros(maxChDelay, cfgEHT.NumTransmitAntennas)];
|
|
|
|
reset(channel);
|
|
rx = awgn(channel(txPad), snrVal);
|
|
|
|
coarsePacketOffset = wlanPacketDetect(rx, chanBW);
|
|
if isempty(coarsePacketOffset)
|
|
numPacketErrors = numPacketErrors + 1;
|
|
continue;
|
|
end
|
|
|
|
lstf = rx(coarsePacketOffset + (ind.LSTF(1) : ind.LSTF(2)), :);
|
|
coarseFrequencyOffset = wlanCoarseCFOEstimate(lstf, chanBW);
|
|
rx = frequencyOffset(rx, simParameters.SampleRate, -coarseFrequencyOffset);
|
|
|
|
nonhtfields = rx(coarsePacketOffset + (ind.LSTF(1) : ind.LSIG(2)), :);
|
|
finePacketOffset = wlanSymbolTimingEstimate(nonhtfields, chanBW);
|
|
|
|
packetOffset = coarsePacketOffset + finePacketOffset;
|
|
|
|
if packetOffset > maxChDelay
|
|
numPacketErrors = numPacketErrors + 1;
|
|
continue;
|
|
end
|
|
|
|
rxLLTF = rx(packetOffset + (ind.LLTF(1) : ind.LLTF(2)), :);
|
|
fineFrequencyOffset = wlanFineCFOEstimate(rxLLTF, chanBW);
|
|
rx = frequencyOffset(rx, simParameters.SampleRate, -fineFrequencyOffset);
|
|
|
|
rxHELTF = rx(packetOffset + (ind.EHTLTF(1) : ind.EHTLTF(2)), :);
|
|
heltfDemod = wlanEHTDemodulate(rxHELTF, "EHT-LTF", cfgEHT);
|
|
[chanEstimate, pilotEstimate] = wlanEHTLTFChannelEstimate(heltfDemod, cfgEHT);
|
|
|
|
cfrMagnitudes(:, end + 1) = abs(chanEstimate(:, 1, 1));
|
|
|
|
rxData = rx(packetOffset + (ind.EHTData(1) : ind.EHTData(2)), :);
|
|
demodSym = wlanEHTDemodulate(rxData, "EHT-Data", cfgEHT);
|
|
|
|
nVarEst = wlanEHTDataNoiseEstimate(demodSym(ofdmInfo.PilotIndices, :, :),pilotEstimate, cfgEHT);
|
|
|
|
demodDataSym = demodSym(ofdmInfo.DataIndices, :, :);
|
|
chanEstimateData = chanEstimate(ofdmInfo.DataIndices, :, :);
|
|
|
|
[eqSym, csi] = wlanEHTEqualize(demodDataSym, chanEstimateData, nVarEst, cfgEHT, 'EHT-Data');
|
|
|
|
rxPSDU = wlanEHTDataBitRecover(eqSym, nVarEst, csi, cfgEHT);
|
|
|
|
numPacketErrors = numPacketErrors + any(biterr(txPSDU, rxPSDU));
|
|
end
|
|
end
|