Plug Custom Channel into Wireless Network Simulator
This example shows you how to plug a custom channel into the wireless network simulator by using 5G Toolbox™ and the Communications Toolbox™ Wireless Network Simulation Library.
Using this example, you can:
Create and configure a 5G network with new radio (NR) base station (gNB) and user equipment (UE) nodes.
Establish a connection between the gNB and UE nodes.
Create a custom channel, and plug it into the wireless network simulator.
Simulate a 5G network, and retrieve the statistics of the gNB and UE nodes.
Check if the Communications Toolbox Wireless Network Simulation Library support package is installed. If the support package is not installed, MATLAB® returns an error with a link to download and install the support package.
wirelessnetworkSupportPackageCheck
Create a wireless network simulator.
networkSimulator = wirelessNetworkSimulator.init;
Create a gNB node with these specifications.
Position: [–100 100 0]
Channel bandwidth: 20 MHz
Subcarrier spacing: 30 KHz
Duplex mode: Frequency division duplex
gnb = nrGNB(Position=[-100 100 0],ChannelBandwidth=20e6,DuplexMode="FDD",SubcarrierSpacing=30e3);
Create two UE nodes, specifying their positions in Cartesian coordinates.
ue = nrUE(Position=[100 100 0; 5000 100 0]); % In Cartesian x, y, and z coordinates.
Connect the UE nodes to the gNB node and enable full-buffer traffic in the downlink direction.
connectUE(gnb,ue,FullBufferTraffic="DL")
Add the nodes to the network simulator.
addNodes(networkSimulator,gnb) addNodes(networkSimulator,ue)
Create an individual downlink clustered delay line (CDL) channel for each UE node.
% Retrieve OFDM information based on the number of resource blocks and subcarrier spacing waveformInfo = nrOFDMInfo(gnb.NumResourceBlocks,gnb.SubcarrierSpacing/1e3); channelFilteringFlag = strcmp(gnb.PHYAbstractionMethod,"none"); % Calculate the total number of nodes by adding the number of gNBs and UEs numNodes=length(gnb)+length(ue); % Initialize the CDL channel cell array, maximum channel delay matrix, and the path filter cell array channelInfo.CDLChannels = cell(numNodes,numNodes); channelInfo.MaxChannelDelayMatrix = zeros(numNodes,numNodes); channelInfo.PathFilter = cell(numNodes,numNodes); for i=1:length(ue) % Create a CDL channel model by specifying sample rate and channel filtering option channelInfo.CDLChannels{gnb.ID, ue(i).ID} = nrCDLChannel(SampleRate=waveformInfo.SampleRate,ChannelFiltering=channelFilteringFlag); % Set the transmit antenna array size channelInfo.CDLChannels{gnb.ID, ue(i).ID}.TransmitAntennaArray.Size = [1 1 1 1 1]; % Set the receive antenna array size channelInfo.CDLChannels{gnb.ID, ue(i).ID}.ReceiveAntennaArray.Size = [1 1 1 1 1]; % Retrieve the channel information chInfo = info(channelInfo.CDLChannels{gnb.ID, ue(i).ID}); % Calculate the maximum channel delay and update the delay matrix channelInfo.MaxChannelDelayMatrix(gnb.ID, ue(i).ID) = ceil(max(chInfo.PathDelays*waveformInfo.SampleRate)) + chInfo.ChannelFilterDelay; % Obtain path filters channelInfo.PathFilter{gnb.ID,ue(i).ID} = getPathFilters(channelInfo.CDLChannels{gnb.ID,ue(i).ID}).'; end getSetChannelModel(channelInfo);
Add the custom channel to the wireless network simulator.
addChannelModel(networkSimulator,@addImpairment);
Specify the simulation time in seconds.
simulationTime = 0.05;
Run the simulation for the specified simulation time.
run(networkSimulator,simulationTime)
Obtain the statistics for the gNB and UE nodes.
gnbStats = statistics(gnb); ueStats = statistics(ue);
Clear persistent channel context
clear getSetChannelModel;
Follow these steps to create a custom channel model
Create a custom function with this syntax:
rxData = customFcnName(rxInfo,txData)
. TherxInfo
input (a structure) is the receiver node information, and thetxData
input (a structure) specifies the transmitted packets. The simulator automatically passes information about the receiver node and the packets transmitted by a transmitter node as inputs to the custom function. For more information about this, see theaddChannelModel
object function.Apply free space path loss between the base station and UE nodes.
Apply CDL channel to the transmitted packets.
function channelModelInfo = getSetChannelModel(varargin) persistent channelModels; if nargin == 1 % Set channelModels = varargin{1}; end channelModelInfo = channelModels; end function outputData = addImpairment(rxInfo,txData) outputData = txData; % Calculate path loss distance = norm(txData.TransmitterPosition - rxInfo.Position); % Distance between the transmitter and the receiver lambda = physconst('LightSpeed')/txData.CenterFrequency; % Wavelength calculation using the speed of light and center frequency. pathLoss = fspl(distance, lambda); % Free space path loss outputData.Power = outputData.Power - pathLoss; % Adjust the power of the output data based on the path loss % Retrieve the channel model information channelModelInfo = getSetChannelModel(); % Obtain the maximum channel delay matrix from the channel model information maxChannelDelayMatrix = channelModelInfo.MaxChannelDelayMatrix; % Obtain the path filter from the channel model information pathFilter = channelModelInfo.PathFilter; % Check if the CDL channel model exists for the given transmitter-receiver pair if ~isempty(channelModelInfo.CDLChannels{txData.TransmitterID,rxInfo.ID}) % A channel exists between the transmitter and receiver nodes channelModelInfo.CDLChannels{txData.TransmitterID,rxInfo.ID}.InitialTime = outputData.StartTime; if outputData.Abstraction == 0 % Full PHY rxWaveform = [txData.Data; zeros(maxChannelDelayMatrix(txData.TransmitterID,rxInfo.ID), ... size(txData.Data,2))]; [outputData.Data,outputData.Metadata.Channel.PathGains, outputData.Metadata.Channel.SampleTimes] = ... channelModelInfo.CDLChannels{txData.TransmitterID,rxInfo.ID}(rxWaveform); outputData.Data = outputData.Data.*db2mag(-pathLoss); outputData.Duration = outputData.Duration + ... (1/outputData.SampleRate)*maxChannelDelayMatrix(txData.TransmitterID,rxInfo.ID); else % Abstract PHY channelModelInfo.CDLChannels{txData.TransmitterID,rxInfo.ID}.NumTimeSamples = ... txData.Metadata.NumSamples + maxChannelDelayMatrix(txData.TransmitterID,rxInfo.ID); [outputData.Metadata.Channel.PathGains, outputData.Metadata.Channel.SampleTimes] = ... channelModelInfo.CDLChannels{txData.TransmitterID,rxInfo.ID}(); end outputData.Metadata.Channel.PathFilters = ... pathFilter{txData.TransmitterID,rxInfo.ID}; else % Set default values for channel parameters outputData.Metadata.Channel.PathGains = ... permute(ones(outputData.NumTransmitAntennas, ... rxInfo.NumReceiveAntennas), ... [3 4 1 2]) / sqrt(rxInfo.NumReceiveAntennas); outputData.Metadata.Channel.PathFilters = 1; outputData.Metadata.Channel.SampleTimes = 0; if outputData.Abstraction == 0 % Full PHY outputData.Data = outputData.Data.*db2mag(-pathLoss); numTxAnts = outputData.NumTransmitAntennas; numRxAnts = rxInfo.NumReceiveAntennas; H = fft(eye(max([numTxAnts numRxAnts]))); H = H(1:numTxAnts,1:numRxAnts); H = H/norm(H); outputData.Data = txData.Data*H; % Apply channel to the waveform end end end