Files
WirelessNetworkingTechnologies/lab_4/task1.m
T

119 lines
4.1 KiB
Matlab

if use_t1_as_t4
mcs_values_t1 = mcs_values;
progressTitle = "Task 4.1";
else
mcs_values_t1 = [2];
progressTitle = "Task 1";
end
[cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerShift, chanBW] = ...
create_baseline_configuration(ntn_tdl_delay_profiles(3), bandwidth, false, "None", ...
carrier_frequency, 0, ...
0, leo_altitude, random_stream, ...
seed, tx_antenna_count, ...
rx_antenna_count, apep);
meanSlantRange = mean(slantRanges);
meanSatelliteDopplerShift = mean(dopplerShifts);
meanNormalizedCFO = meanSatelliteDopplerShift / wifi_be_subcarrier_spacing;
disp("Mean Elevation Angle: " + meanElevationAngle + "°")
disp("Mean Slant Range: " + meanSlantRange + "m")
disp("Mean Satellite Doppler Shift: " + meanSatelliteDopplerShift + "Hz")
disp("Normalized CFO: " + meanNormalizedCFO)
errorCounts = zeros(numel(mcs_values_t1), numel(snrs));
packetCounts = zeros(numel(mcs_values_t1), numel(snrs));
errorRates = zeros(numel(mcs_values_t1), numel(snrs));
cfrMagnitudesBySnr = cell(numel(mcs_values_t1), numel(snrs));
progressStartText = "Starting MCS sweep";
f = waitbar(0, progressStartText, "Name", progressTitle);
progressTotal = numel(mcs_values_t1) * numel(snrs);
progressQueue = parallel.pool.DataQueue;
parfor_waitbar(f, progressTotal, progressStartText, true);
progressListener = afterEach(progressQueue, @(info) parfor_waitbar(f, progressTotal, info, false));
for imcs = 1 : numel(mcs_values_t1)
currentMcs = mcs_values_t1(imcs);
cfgEHT.User{1}.MCS = currentMcs;
errorCountsForMcs = zeros(1, numel(snrs));
packetCountsForMcs = zeros(1, numel(snrs));
errorRatesForMcs = zeros(1, numel(snrs));
cfrMagnitudesForMcs = cell(1, numel(snrs));
parfor snr_idx = 1 : length(snrs)
local_channel = clone(channel);
[errorCount, packetCount, cfrMagnitudes] = simulateTransmission(cfgEHT, local_channel, maxChDelay, snrs(snr_idx), packets_per_snr, maxNumErrors, simParameters, chanBW, snr_idx, elevationAngles);
errorCountsForMcs(snr_idx) = errorCount;
packetCountsForMcs(snr_idx) = packetCount;
errorRatesForMcs(snr_idx) = errorCount / packetCount;
cfrMagnitudesForMcs{snr_idx} = cfrMagnitudes;
send(progressQueue, sprintf("MCS %d | SNR %.1f dB", currentMcs, snrs(snr_idx)));
end
errorCounts(imcs, :) = errorCountsForMcs;
packetCounts(imcs, :) = packetCountsForMcs;
errorRates(imcs, :) = errorRatesForMcs;
cfrMagnitudesBySnr(imcs, :) = cfrMagnitudesForMcs;
end
delete(progressListener);
if ishandle(f)
close(f);
end
markers = 'ox*sd^v><ph+ox*sd^v><ph+';
figure;
for imcs = 1 : numel(mcs_values_t1)
semilogy(snrs, errorRates(imcs, :).', ['-' markers(imcs)]);
hold on;
end
grid on;
xlabel('SNR (dB)');
ylabel('PER');
% task 1
dataStr = arrayfun(@(x)sprintf('MCS %d', x), mcs_values_t1, 'UniformOutput', false);
% task 4
% dataStr = arrayfun(@(x)'MCS Sweep Values: [0 2 4 8 10 12 13]', 'UniformOutput', false);
legend(dataStr, 'Location', 'NorthEastOutside');
title(['PER (EHT MU), ' num2str(cfgEHT.ChannelBandwidth) ', NTN-TDL-C, ' num2str(tx_antenna_count) '-by-' num2str(rx_antenna_count)]);
cfrMagnitudes = [];
for snr_idx = 1 : numel(snrs)
cfrMagnitudes = [cfrMagnitudes cfrMagnitudesBySnr{1, snr_idx}];
end
%{
% for testing purposes
if ~isempty(cfrMagnitudes)
figure;
packetPlots = plot(cfrMagnitudes, 'Color', [0.75 0.75 0.75]);
hold on;
meanCfrPlot = plot(mean(cfrMagnitudes, 2), 'b', 'LineWidth', 2);
grid on;
xlabel("Subcarrier index");
ylabel("|H[k]|");
legend([packetPlots(1) meanCfrPlot], ["Packets" "Mean CFR"], 'Location', 'best');
title("CFR magnitude for collected packets");
end
%}
% extract a representative packet for cfr plot
representativeSnr = 25;
representativeSnrIdx = find(snrs == representativeSnr);
representativeCfrs = cfrMagnitudesBySnr{1, representativeSnrIdx};
representativeCfr = representativeCfrs(:, 1);
figure;
plot(representativeCfr);
grid on;
xlabel("Subcarrier index");
ylabel("|H[k]|");
title("CFR magnitude for representative packet at 25 dB SNR");