Files
2026-06-08 16:45:41 +02:00

90 lines
3.5 KiB
Matlab

function [numPacketErrors, numPacketsSimulated, cfrMagnitudes]= simulateTransmission(cfgEHT, channel, maxChDelay, snr, maxNumPackets, maxNumErrors, simParameters, chanBW, substreamIndex, elevationAngles, enablePilotTracking)
% assure backwards compatibility
if nargin < 11
enablePilotTracking = false;
end
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);
if enablePilotTracking
demodSym = wlanEHTTrackPilotError(demodSym, chanEstimate, cfgEHT, "EHT-Data");
end
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