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
|
||||||
Binary file not shown.
Reference in New Issue
Block a user