Made some progress, per snr sweep is plotted now, the satellites orbital shift is used in calculated now, code is prepared for more than one mcs value

This commit is contained in:
ti_mo
2026-06-05 21:50:43 +02:00
parent 78b271247c
commit ec472a44e8
4 changed files with 76 additions and 32 deletions
+3 -5
View File
@@ -3,7 +3,6 @@ function [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerSh
include_free_space_pathloss, ... include_free_space_pathloss, ...
delay_model, ... delay_model, ...
carrier_frequency, ... carrier_frequency, ...
elevation_angle, ...
mobile_speed, ... mobile_speed, ...
mobile_altitude, ... mobile_altitude, ...
satellite_altitude, ... satellite_altitude, ...
@@ -11,8 +10,7 @@ function [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerSh
seed, ... seed, ...
tx_antenna_count, ... tx_antenna_count, ...
rx_antenna_count, ... rx_antenna_count, ...
apep, ... apep)
mcs)
switch bandwidth_mhz switch bandwidth_mhz
case 20 case 20
@@ -33,13 +31,13 @@ function [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerSh
cfgEHT.User{1}.APEPLength = apep; cfgEHT.User{1}.APEPLength = apep;
cfgEHT.NumTransmitAntennas = tx_antenna_count; cfgEHT.NumTransmitAntennas = tx_antenna_count;
cfgEHT.User{1}.NumSpaceTimeStreams = 1; cfgEHT.User{1}.NumSpaceTimeStreams = 1;
cfgEHT.User{1}.MCS = mcs; cfgEHT.User{1}.MCS = 0; % default to sweep later
fs = wlanSampleRate(chanBW); fs = wlanSampleRate(chanBW);
simParameters.IncludeFreeSpacePathLoss = include_free_space_pathloss; simParameters.IncludeFreeSpacePathLoss = include_free_space_pathloss;
simParameters.DelayModel = delay_model; simParameters.DelayModel = delay_model;
simParameters.CarrierFrequency = carrier_frequency; simParameters.CarrierFrequency = carrier_frequency;
simParameters.ElevationAngle = elevation_angle; simParameters.ElevationAngle = 0; % default to sweep later
simParameters.MobileSpeed = mobile_speed; simParameters.MobileSpeed = mobile_speed;
simParameters.MobileAltitude = mobile_altitude; simParameters.MobileAltitude = mobile_altitude;
simParameters.SatelliteAltitude = satellite_altitude; simParameters.SatelliteAltitude = satellite_altitude;
+49 -19
View File
@@ -2,12 +2,24 @@ carrier_frequency = 2.4e9;
wifi_be_subcarrier_spacing = 78.125e3; wifi_be_subcarrier_spacing = 78.125e3;
leo_altitude = 600e3; leo_altitude = 600e3;
bandwidth = 20; bandwidth = 20;
mcs = 2; mcs_values = [2];
apep = 1000; apep = 1000;
tx_antenna_count = 1; tx_antenna_count = 1;
rx_antenna_count = 1; rx_antenna_count = 1;
elevation_angle = 50; snrs = (0:1:40);
packets_per_snr = 250;
maxNumErrors = 50;
% elevation_angle = 50;
elevationAngles = [ ...
linspace(10, 90, ceil(packets_per_snr / 2)), ...
linspace(90, 10, floor(packets_per_snr / 2)) ...
];
meanElevationAngle = mean(elevationAngles);
slantRanges = arrayfun(@(el) slantRangeCircularOrbit(el, leo_altitude, 0), elevationAngles);
dopplerShifts = arrayfun(@(el) dopplerShiftCircularOrbit(el, leo_altitude, 0, carrier_frequency), elevationAngles);
random_stream = "mt19937ar with seed"; random_stream = "mt19937ar with seed";
seed = 666; seed = 666;
@@ -16,28 +28,46 @@ ntn_tdl_delay_profiles = ["A" "B" "C" "D"];
[cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerShift, chanBW] = ... [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerShift, chanBW] = ...
create_baseline_configuration(ntn_tdl_delay_profiles(3), bandwidth, false, "None", ... create_baseline_configuration(ntn_tdl_delay_profiles(3), bandwidth, false, "None", ...
carrier_frequency, elevation_angle, 0, ... carrier_frequency, 0, ...
0, leo_altitude, random_stream, ... 0, leo_altitude, random_stream, ...
seed, tx_antenna_count, ... seed, tx_antenna_count, ...
rx_antenna_count, apep, mcs); rx_antenna_count, apep);
normalized_cfo = satelliteDopplerShift / wifi_be_subcarrier_spacing; meanSlantRange = mean(slantRanges);
meanSatelliteDopplerShift = mean(dopplerShifts);
disp("Channel Info: ") meanNormalizedCFO = meanSatelliteDopplerShift / wifi_be_subcarrier_spacing;
disp(chInfo)
disp("Satellite Doppler Shift: " + satelliteDopplerShift)
disp("Normalized CFO: " + normalized_cfo)
disp("Mean Elevation Angle: " + meanElevationAngle + "°")
disp("Mean Slant Range: " + meanSlantRange + "m")
disp("Mean Satellite Doppler Shift: " + meanSatelliteDopplerShift + "Hz")
disp("Normalized CFO: " + meanNormalizedCFO)
snrs = (0:1:40); errorRates = zeros(numel(mcs_values), numel(snrs));
packets_per_snr = 250; for imcs = 1 : numel(mcs_values)
maxNumErrors = 10; cfgEHT.User{1}.MCS = mcs_values(imcs);
parfor snr_idx = 1 : length(snrs)
errorCounts = zeros(size(snrs)); local_channel = clone(channel)
for snrIndex = 1:length(snrs) [errorCount, packetCount] = simulateTransmission(cfgEHT, local_channel, maxChDelay, snrs(snr_idx), packets_per_snr, maxNumErrors, simParameters, chanBW, snr_idx, elevationAngles);
errorCounts(snrIndex) = simulateTransmission(cfgEHT, channel, snrs(snrIndex), packets_per_snr, maxNumErrors, simParameters, chanBW, snrIndex);
errorCounts(snr_idx) = errorCount;
packetCounts(snr_idx) = packetCount;
errorRates(imcs, snr_idx) = errorCount / packetCount;
end
end end
errorRate = errorCounts / packets_per_snr; markers = 'ox*sd^v><ph+ox*sd^v><ph+';
figure;
disp("ErrorRatePerSNR: " + errorRate); for imcs = 1 : numel(mcs_values)
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), 2, '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)]);
+14
View File
@@ -1,4 +1,18 @@
> This PDF will be a bit more 'well defined' > This PDF will be a bit more 'well defined'
## Reproducability
|reproducability factor | value |
|:---|---:|
| MATLAB Version | 26.1.0.3251617 (R2026a) Update 2 |
| Toolboxes/Version | 5G/26.1 |
|| WLAN/26.1 |
|| Communication/26.1 |
|| Parallel Computing/26.1 |
| random seed | 666 |
| SNR vector | 0:1:40dB |
| packet budget | 250 |
| maxNumErrors | 50 |
>
## Task1 ## Task1
For the baseline configuration with f_c = 2.4GHz, LEO altitude 600km, elevation angle 50° (like example), and static receiver, the computed satellite Doppler shift is approximately 35.56kHz. With the IEEE 802.11be subcarrier spacing of 78.125kHz, this corresponds to a normalized CFO of \epsilon \approx 0.455. Therefore, the Doppler shift is below one subcarrier spacing but still represents a significant fraction of the OFDM subcarrier spacing. For the baseline configuration with f_c = 2.4GHz, LEO altitude 600km, elevation angle 50° (like example), and static receiver, the computed satellite Doppler shift is approximately 35.56kHz. With the IEEE 802.11be subcarrier spacing of 78.125kHz, this corresponds to a normalized CFO of \epsilon \approx 0.455. Therefore, the Doppler shift is below one subcarrier spacing but still represents a significant fraction of the OFDM subcarrier spacing.
+10 -8
View File
@@ -1,5 +1,6 @@
function numPacketErrors = simulateTransmission(cfgEHT, channel, snr, packets, maxNumErrors, simParameters, chanBW, substreamIndex) function [numPacketErrors, numPacketsSimulated ]= simulateTransmission(cfgEHT, channel, maxChDelay, snr, maxNumPackets, maxNumErrors, simParameters, chanBW, substreamIndex, elevationAngles)
numPacketErrors = 0; numPacketErrors = 0;
numPacketsSimulated = 0;
ofdmInfo = wlanEHTOFDMInfo('EHT-Data', cfgEHT); ofdmInfo = wlanEHTOFDMInfo('EHT-Data', cfgEHT);
ind = wlanFieldIndices(cfgEHT); ind = wlanFieldIndices(cfgEHT);
@@ -14,15 +15,16 @@ function numPacketErrors = simulateTransmission(cfgEHT, channel, snr, packets, m
snrVal = convertSNR(snr, "snrsc", "snr", FFTLength=ofdmInfo.FFTLength, NumActiveSubcarriers=ofdmInfo.NumTones); snrVal = convertSNR(snr, "snrsc", "snr", FFTLength=ofdmInfo.FFTLength, NumActiveSubcarriers=ofdmInfo.NumTones);
for packetIdx = 1:packets while numPacketErrors < maxNumErrors && numPacketsSimulated < maxNumPackets
if numPacketErrors >= maxNumErrors numPacketsSimulated = numPacketsSimulated + 1;
break;
end packetElevationAngle = elevationAngles(numPacketsSimulated);
channel.SatelliteDopplerShift = dopplerShiftCircularOrbit(packetElevationAngle, simParameters.SatelliteAltitude, simParameters.MobileAltitude, simParameters.CarrierFrequency);
txPSDU = randi([0 1], psduLength(cfgEHT) * 8, 1); txPSDU = randi([0 1], psduLength(cfgEHT) * 8, 1);
tx = wlanWaveformGenerator(txPSDU, cfgEHT); tx = wlanWaveformGenerator(txPSDU, cfgEHT);
txPad = [tx; zeros(50, cfgEHT.NumTransmitAntennas)]; txPad = [tx; zeros(maxChDelay, cfgEHT.NumTransmitAntennas)];
reset(channel); reset(channel);
rx = awgn(channel(txPad), snrVal); rx = awgn(channel(txPad), snrVal);
@@ -37,12 +39,12 @@ function numPacketErrors = simulateTransmission(cfgEHT, channel, snr, packets, m
coarseFrequencyOffset = wlanCoarseCFOEstimate(lstf, chanBW); coarseFrequencyOffset = wlanCoarseCFOEstimate(lstf, chanBW);
rx = frequencyOffset(rx, simParameters.SampleRate, -coarseFrequencyOffset); rx = frequencyOffset(rx, simParameters.SampleRate, -coarseFrequencyOffset);
nonhtfields = rx(coarsePacketOffset + (ind.LSTF(1) : ind.LSTF(2)), :); nonhtfields = rx(coarsePacketOffset + (ind.LSTF(1) : ind.LSIG(2)), :);
finePacketOffset = wlanSymbolTimingEstimate(nonhtfields, chanBW); finePacketOffset = wlanSymbolTimingEstimate(nonhtfields, chanBW);
packetOffset = coarsePacketOffset + finePacketOffset; packetOffset = coarsePacketOffset + finePacketOffset;
if packetOffset > 50 if packetOffset > maxChDelay
numPacketErrors = numPacketErrors + 1; numPacketErrors = numPacketErrors + 1;
continue; continue;
end end