From ec472a44e869b4fd8709bc8cd69b00e91dccebfc Mon Sep 17 00:00:00 2001 From: ti_mo Date: Fri, 5 Jun 2026 21:50:43 +0200 Subject: [PATCH] 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 --- lab_4/create_baseline_configuration.m | 8 ++-- lab_4/lab_4.m | 68 +++++++++++++++++++-------- lab_4/link_level_measurements.md | 14 ++++++ lab_4/simulateTransmission.m | 18 +++---- 4 files changed, 76 insertions(+), 32 deletions(-) diff --git a/lab_4/create_baseline_configuration.m b/lab_4/create_baseline_configuration.m index dd21a9f..1bcd69a 100644 --- a/lab_4/create_baseline_configuration.m +++ b/lab_4/create_baseline_configuration.m @@ -3,7 +3,6 @@ function [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerSh include_free_space_pathloss, ... delay_model, ... carrier_frequency, ... - elevation_angle, ... mobile_speed, ... mobile_altitude, ... satellite_altitude, ... @@ -11,8 +10,7 @@ function [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerSh seed, ... tx_antenna_count, ... rx_antenna_count, ... - apep, ... - mcs) + apep) switch bandwidth_mhz case 20 @@ -33,13 +31,13 @@ function [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerSh cfgEHT.User{1}.APEPLength = apep; cfgEHT.NumTransmitAntennas = tx_antenna_count; cfgEHT.User{1}.NumSpaceTimeStreams = 1; - cfgEHT.User{1}.MCS = mcs; + cfgEHT.User{1}.MCS = 0; % default to sweep later fs = wlanSampleRate(chanBW); simParameters.IncludeFreeSpacePathLoss = include_free_space_pathloss; simParameters.DelayModel = delay_model; simParameters.CarrierFrequency = carrier_frequency; - simParameters.ElevationAngle = elevation_angle; + simParameters.ElevationAngle = 0; % default to sweep later simParameters.MobileSpeed = mobile_speed; simParameters.MobileAltitude = mobile_altitude; simParameters.SatelliteAltitude = satellite_altitude; diff --git a/lab_4/lab_4.m b/lab_4/lab_4.m index 19dfff1..7577ba6 100644 --- a/lab_4/lab_4.m +++ b/lab_4/lab_4.m @@ -2,12 +2,24 @@ carrier_frequency = 2.4e9; wifi_be_subcarrier_spacing = 78.125e3; leo_altitude = 600e3; bandwidth = 20; -mcs = 2; +mcs_values = [2]; apep = 1000; tx_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"; seed = 666; @@ -16,28 +28,46 @@ ntn_tdl_delay_profiles = ["A" "B" "C" "D"]; [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerShift, chanBW] = ... create_baseline_configuration(ntn_tdl_delay_profiles(3), bandwidth, false, "None", ... - carrier_frequency, elevation_angle, 0, ... + carrier_frequency, 0, ... 0, leo_altitude, random_stream, ... 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: ") -disp(chInfo) -disp("Satellite Doppler Shift: " + satelliteDopplerShift) -disp("Normalized CFO: " + normalized_cfo) +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) -snrs = (0:1:40); -packets_per_snr = 250; -maxNumErrors = 10; - -errorCounts = zeros(size(snrs)); -for snrIndex = 1:length(snrs) - errorCounts(snrIndex) = simulateTransmission(cfgEHT, channel, snrs(snrIndex), packets_per_snr, maxNumErrors, simParameters, chanBW, snrIndex); +errorRates = zeros(numel(mcs_values), numel(snrs)); +for imcs = 1 : numel(mcs_values) + cfgEHT.User{1}.MCS = mcs_values(imcs); + parfor snr_idx = 1 : length(snrs) + local_channel = clone(channel) + [errorCount, packetCount] = simulateTransmission(cfgEHT, local_channel, maxChDelay, snrs(snr_idx), packets_per_snr, maxNumErrors, simParameters, chanBW, snr_idx, elevationAngles); + + errorCounts(snr_idx) = errorCount; + packetCounts(snr_idx) = packetCount; + errorRates(imcs, snr_idx) = errorCount / packetCount; + end end -errorRate = errorCounts / packets_per_snr; - -disp("ErrorRatePerSNR: " + errorRate); +markers = 'ox*sd^v> 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 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. diff --git a/lab_4/simulateTransmission.m b/lab_4/simulateTransmission.m index 783763e..a018f15 100644 --- a/lab_4/simulateTransmission.m +++ b/lab_4/simulateTransmission.m @@ -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; + numPacketsSimulated = 0; ofdmInfo = wlanEHTOFDMInfo('EHT-Data', 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); - for packetIdx = 1:packets - if numPacketErrors >= maxNumErrors - break; - end + 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(50, cfgEHT.NumTransmitAntennas)]; + txPad = [tx; zeros(maxChDelay, cfgEHT.NumTransmitAntennas)]; reset(channel); rx = awgn(channel(txPad), snrVal); @@ -37,12 +39,12 @@ function numPacketErrors = simulateTransmission(cfgEHT, channel, snr, packets, m coarseFrequencyOffset = wlanCoarseCFOEstimate(lstf, chanBW); 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); packetOffset = coarsePacketOffset + finePacketOffset; - if packetOffset > 50 + if packetOffset > maxChDelay numPacketErrors = numPacketErrors + 1; continue; end