i think that this is nearly the beginning of task 1

This commit is contained in:
ti_mo
2026-06-03 19:46:31 +02:00
parent 4395bbe0b1
commit 78b271247c
7 changed files with 200 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
function result = calc_doppler_freq(rrv, carrier_freq)
result = rrv * carrier_freq / physconst('LightSpeed');
end
+75
View File
@@ -0,0 +1,75 @@
function [cfgEHT, simParameters, channel, chInfo, maxChDelay, satelliteDopplerShift, chanBW] = create_baseline_configuration(profile, ...
bandwidth_mhz, ...
include_free_space_pathloss, ...
delay_model, ...
carrier_frequency, ...
elevation_angle, ...
mobile_speed, ...
mobile_altitude, ...
satellite_altitude, ...
random_stream, ...
seed, ...
tx_antenna_count, ...
rx_antenna_count, ...
apep, ...
mcs)
switch bandwidth_mhz
case 20
chanBW = 'CBW20';
case 40
chanBW = 'CBW40';
case 80
chanBW = 'CBW80';
case 160
chanBW = 'CBW160';
case 320
chanBW = 'CBW320';
otherwise
error("Not supported bandwidth!");
end
cfgEHT = wlanEHTMUConfig(chanBW);
cfgEHT.User{1}.APEPLength = apep;
cfgEHT.NumTransmitAntennas = tx_antenna_count;
cfgEHT.User{1}.NumSpaceTimeStreams = 1;
cfgEHT.User{1}.MCS = mcs;
fs = wlanSampleRate(chanBW);
simParameters.IncludeFreeSpacePathLoss = include_free_space_pathloss;
simParameters.DelayModel = delay_model;
simParameters.CarrierFrequency = carrier_frequency;
simParameters.ElevationAngle = elevation_angle;
simParameters.MobileSpeed = mobile_speed;
simParameters.MobileAltitude = mobile_altitude;
simParameters.SatelliteAltitude = satellite_altitude;
simParameters.SampleRate = fs;
simParameters.RandomStream = random_stream;
simParameters.Seed = seed;
simParameters.NumTransmitAntennas = tx_antenna_count;
simParameters.NumReceiveAntennas = rx_antenna_count;
simParameters.NTNChannelType = "TDL";
simParameters.DelayProfile = "NTN-TDL-" + profile;
simParameters.DelaySpread = 30e-9;
c = physconst("lightspeed");
satelliteDopplerShift = dopplerShiftCircularOrbit( ...
simParameters.ElevationAngle,simParameters.SatelliteAltitude, ...
simParameters.MobileAltitude,simParameters.CarrierFrequency);
channel = nrTDLChannel;
channel.DelayProfile = simParameters.DelayProfile;
channel.DelaySpread = simParameters.DelaySpread;
channel.SatelliteDopplerShift = satelliteDopplerShift;
channel.MaximumDopplerShift = simParameters.MobileSpeed*simParameters.CarrierFrequency/c;
channel.NumTransmitAntennas = simParameters.NumTransmitAntennas;
channel.NumReceiveAntennas = simParameters.NumReceiveAntennas;
channel.SampleRate = simParameters.SampleRate;
channel.RandomStream = simParameters.RandomStream;
channel.Seed = simParameters.Seed;
chInfo = info(channel);
maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay;
end
+43
View File
@@ -0,0 +1,43 @@
carrier_frequency = 2.4e9;
wifi_be_subcarrier_spacing = 78.125e3;
leo_altitude = 600e3;
bandwidth = 20;
mcs = 2;
apep = 1000;
tx_antenna_count = 1;
rx_antenna_count = 1;
elevation_angle = 50;
random_stream = "mt19937ar with seed";
seed = 666;
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, ...
0, leo_altitude, random_stream, ...
seed, tx_antenna_count, ...
rx_antenna_count, apep, mcs);
normalized_cfo = satelliteDopplerShift / wifi_be_subcarrier_spacing;
disp("Channel Info: ")
disp(chInfo)
disp("Satellite Doppler Shift: " + satelliteDopplerShift)
disp("Normalized CFO: " + normalized_cfo)
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);
end
errorRate = errorCounts / packets_per_snr;
disp("ErrorRatePerSNR: " + errorRate);
+4
View File
@@ -0,0 +1,4 @@
> This PDF will be a bit more 'well defined'
## 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.
@@ -0,0 +1,3 @@
function result = normalized_carrier_frequency_offset(freq_doppler, delta_freq_subcarrier)
result = freq_doppler / delta_freq_subcarrier;
end
+72
View File
@@ -0,0 +1,72 @@
function numPacketErrors = simulateTransmission(cfgEHT, channel, snr, packets, maxNumErrors, simParameters, chanBW, substreamIndex)
numPacketErrors = 0;
ofdmInfo = wlanEHTOFDMInfo('EHT-Data', cfgEHT);
ind = wlanFieldIndices(cfgEHT);
if nargin < 8
substreamIndex = 1;
end
stream = RandStream('combRecursive', Seed=simParameters.Seed);
stream.Substream = substreamIndex;
RandStream.setGlobalStream(stream);
snrVal = convertSNR(snr, "snrsc", "snr", FFTLength=ofdmInfo.FFTLength, NumActiveSubcarriers=ofdmInfo.NumTones);
for packetIdx = 1:packets
if numPacketErrors >= maxNumErrors
break;
end
txPSDU = randi([0 1], psduLength(cfgEHT) * 8, 1);
tx = wlanWaveformGenerator(txPSDU, cfgEHT);
txPad = [tx; zeros(50, 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.LSTF(2)), :);
finePacketOffset = wlanSymbolTimingEstimate(nonhtfields, chanBW);
packetOffset = coarsePacketOffset + finePacketOffset;
if packetOffset > 50
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);
rxData = rx(packetOffset + (ind.EHTData(1) : ind.EHTData(2)), :);
demodSym = wlanEHTDemodulate(rxData, "EHT-Data", cfgEHT);
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
Binary file not shown.