diff --git a/lab_4/calc_doppler_freq.m b/lab_4/calc_doppler_freq.m new file mode 100644 index 0000000..c8736f1 --- /dev/null +++ b/lab_4/calc_doppler_freq.m @@ -0,0 +1,3 @@ +function result = calc_doppler_freq(rrv, carrier_freq) + result = rrv * carrier_freq / physconst('LightSpeed'); +end \ No newline at end of file diff --git a/lab_4/create_baseline_configuration.m b/lab_4/create_baseline_configuration.m new file mode 100644 index 0000000..dd21a9f --- /dev/null +++ b/lab_4/create_baseline_configuration.m @@ -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 \ No newline at end of file diff --git a/lab_4/lab_4.m b/lab_4/lab_4.m index e69de29..19dfff1 100644 --- a/lab_4/lab_4.m +++ b/lab_4/lab_4.m @@ -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); diff --git a/lab_4/link_level_measurements.md b/lab_4/link_level_measurements.md new file mode 100644 index 0000000..6578e57 --- /dev/null +++ b/lab_4/link_level_measurements.md @@ -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. diff --git a/lab_4/normalized_carrier_frequency_offset.m b/lab_4/normalized_carrier_frequency_offset.m new file mode 100644 index 0000000..db4e0d9 --- /dev/null +++ b/lab_4/normalized_carrier_frequency_offset.m @@ -0,0 +1,3 @@ +function result = normalized_carrier_frequency_offset(freq_doppler, delta_freq_subcarrier) + result = freq_doppler / delta_freq_subcarrier; +end \ No newline at end of file diff --git a/lab_4/simulateTransmission.m b/lab_4/simulateTransmission.m new file mode 100644 index 0000000..783763e --- /dev/null +++ b/lab_4/simulateTransmission.m @@ -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 diff --git a/tasks/04-wifi-ntn.pdf b/tasks/04-wifi-ntn.pdf index e5a04d8..52777b3 100644 Binary files a/tasks/04-wifi-ntn.pdf and b/tasks/04-wifi-ntn.pdf differ