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:
@@ -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
@@ -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)]);
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user