HE/PassChannel.m
2024-03-30 16:35:40 +08:00

121 lines
4.3 KiB
Matlab

load('TXPackets\transmit_data.mat','tx_data','cfgUI');
snr = 30;
if cfgUI.numUsers == 1
CommMode = 'HE-SU';
else
CommMode = 'HE-MU';
end
%*****************************************
% number of (real + virtual) users
RU_index = RU_alloc(cfgUI);
allocInfo = wlan.internal.heAllocationInfo(RU_index);
cfgUI.numUsers = allocInfo.NumUsers;
%*****************************************
rx_data = chanPass(tx_data,cfgUI,snr,CommMode);
for i =1:cfgUI.numUsers
matName = ['rx_for_User',num2str(i),'.mat'];
if cfgUI.numUsers == 1
rx = rx_data;
save(['TXPackets\',matName],'rx');
else
rx = rx_data{i};
save(['TXPackets\',matName],'rx');
end
end
%%
function rx = chanPass(txPad,cfgUI,snr,CommMode)
numTx = cfgUI.numTx;
numRx = cfgUI.numRx;
guardInterval = 0.8;% Guard interval in Microseconds
cfgNDP = wlanHESUConfig('APEPLength',0,'GuardInterval',guardInterval); % No data in an NDP
cfgNDP.ChannelBandwidth = cfgUI.ChannelBandwidth;
cfgNDP.NumTransmitAntennas = numTx;
cfgNDP.NumSpaceTimeStreams = numRx;
if strcmp(CommMode,'HE-SU')
% Create and configure the TGax channel
chanBW = cfgNDP.ChannelBandwidth;
tgaxChannel = wlanTGaxChannel;
tgaxChannel.DelayProfile = 'Model-B';
tgaxChannel.NumTransmitAntennas = cfgNDP.NumTransmitAntennas;
tgaxChannel.NumReceiveAntennas = numRx;
tgaxChannel.TransmitReceiveDistance = 5; % Distance in meters for NLOS
tgaxChannel.ChannelBandwidth = chanBW;
tgaxChannel.LargeScaleFadingEffect = 'None';
fs = wlanSampleRate(cfgNDP);
tgaxChannel.SampleRate = fs;
tgaxChannel.RandomStream = 'mt19937ar with seed';
tgaxChannel.Seed = 5;
% Get occupied subcarrier indices and OFDM parameters
ofdmInfo = wlanHEOFDMInfo('HE-Data',cfgNDP);
stream = RandStream('combRecursive','Seed',99);
% stream.Substream = snr;
RandStream.setGlobalStream(stream);
% Create an instance of the AWGN channel per SNR point simulated
awgnChannel = comm.AWGNChannel;
awgnChannel.NoiseMethod = 'Signal to noise ratio (SNR)';
awgnChannel.SignalPower = 1/tgaxChannel.NumReceiveAntennas;
% Account for noise energy in nulls so the SNR is defined per
% active subcarrier
awgnChannel.SNR = snr-10*log10(ofdmInfo.FFTLength/ofdmInfo.NumTones);
% Pass through a fading indoor TGax channel
% reset(tgaxChannel); % Reset channel for different realization
rx = tgaxChannel(txPad);
% Pass the waveform through AWGN channel
rx = awgnChannel(rx);
elseif strcmp(CommMode,'HE-MU')
tgaxBase = wlanTGaxChannel;
tgaxBase.DelayProfile = 'Model-D'; % Delay profile
tgaxBase.NumTransmitAntennas = cfgNDP.NumTransmitAntennas; % Number of transmit antennas
tgaxBase.NumReceiveAntennas = numRx; % Each user has two receive antennas
tgaxBase.TransmitReceiveDistance = 10; % Non-line of sight distance
tgaxBase.ChannelBandwidth = cfgNDP.ChannelBandwidth;
tgaxBase.SampleRate = wlanSampleRate(cfgNDP);
% Set a fixed seed for the channel
tgaxBase.RandomStream = 'mt19937ar with seed';
% Generate per-user channels
numUsers = cfgUI.numUsers; % Number of users simulated in this example
tgax = cell(1,numUsers);
for userIdx = 1:numUsers
% tgaxBase.Seed = randi(100);
tgaxBase.Seed = userIdx;
tgax{userIdx} = clone(tgaxBase);
tgax{userIdx}.UserIndex = userIdx; % Set unique user index
end
awgnChannel = comm.AWGNChannel;
awgnChannel.NoiseMethod = 'Signal to noise ratio (SNR)';
awgnChannel.SignalPower = 1/numRx;
% Account for noise energy in nulls so the SNR is defined per
% active subcarrier
awgnChannel.SNR = snr;
rxUsers = cell(1,numUsers);
% allocInfo = ruInfo(cfgNDP);
% 使数据经过信道
for userIdx = 1:numUsers
tgaxClone = cloneChannels(tgax);
rxUsers{userIdx} = tgaxClone{userIdx}(txPad);
rxUsers{userIdx} = awgnChannel(rxUsers{userIdx});
end
rx = rxUsers;
end
end
function tgaxClone = cloneChannels(tgax)
% Clone the channels before running to ensure the same realization can be
% used in the next simulation
tgaxClone = cell(size(tgax));
numUsers = numel(tgax);
for i=1:numUsers
tgaxClone{i} = clone(tgax{i});
end
end