i think that this is nearly the beginning of task 1
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
function result = calc_doppler_freq(rrv, carrier_freq)
|
||||
result = rrv * carrier_freq / physconst('LightSpeed');
|
||||
end
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user